Nuxt Content 3 migration #12

Merged
eggy merged 81 commits from js into master 2022-08-10 18:38:39 -04:00
169 changed files with 9366 additions and 799 deletions

View File

@ -1,76 +0,0 @@
const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight')
const markdownIt = require('markdown-it')
const markdownItAnchor = require('markdown-it-anchor')
const htmlmin = require("html-minifier")
module.exports = function(eleventyConfig) {
// Plugins
eleventyConfig.addPlugin(syntaxHighlight)
eleventyConfig.addTransform("htmlmin", (content, outputPath) => {
if (outputPath.endsWith(".html")) {
return htmlmin.minify(content, {
collapseWhitespace: true,
removeComments: true,
useShortDoctype: true,
});
}
return content;
});
// To enable merging of tags
eleventyConfig.setDataDeepMerge(true)
// Copy these static files to _site folder
eleventyConfig.addPassthroughCopy('src/assets')
eleventyConfig.addPassthroughCopy('src/manifest.json')
// To create excerpts
eleventyConfig.setFrontMatterParsingOptions({
excerpt: true,
excerpt_alias: 'post_excerpt',
excerpt_separator: '<!-- excerpt -->'
})
// To create a filter to determine duration of post
eleventyConfig.addFilter('readTime', (value) => {
const content = value
const textOnly = content.split(" ") // content.replace(/(<([^>]+)>)/gi, '')
const readingSpeedPerMin = 200
return Math.max(1, Math.floor(textOnly.length / readingSpeedPerMin))
})
// get proper date in utc
eleventyConfig.addFilter('realDate', (value) => {
const actualDate = new Date(value);
actualDate.setDate(actualDate.getDate() + 1);
return actualDate;
})
// Enable us to iterate over all the tags, excluding posts and all
eleventyConfig.addCollection('tagList', collection => {
const tagsSet = new Set()
collection.getAll().forEach(item => {
if (!item.data.tags) return
item.data.tags
.filter(tag => !['posts', 'all'].includes(tag))
.forEach(tag => tagsSet.add(tag))
})
return Array.from(tagsSet).sort()
})
const md = markdownIt({ linkify: true, html: true })
md.use(markdownItAnchor, { level: [1, 2], permalink: true, permalinkBefore: false, permalinkSymbol: '#' })
eleventyConfig.setLibrary('md', md)
// asset_img shortcode
eleventyConfig.addLiquidShortcode('asset_img', (filename, css) => {
return `<img class="my-4" src="/assets/img/posts/${filename}" style="${css}" />`
})
return {
dir: {
input: 'src'
}
}
}

View File

@ -1,2 +0,0 @@
_site/*
!.eleventy.js

View File

@ -1,34 +0,0 @@
{
"env": {
"browser": true,
"commonjs": true,
"es2020": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 11
},
"rules": {
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"never"
],
"array-element-newline": ["error", {
"ArrayExpression": "consistent",
"ArrayPattern": { "minItems": 3 }
}]
}
}

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
yarn.lock binary
package-lock.json binary

9
.gitignore vendored
View File

@ -1,3 +1,8 @@
package-lock.json
_site
node_modules node_modules
*.log*
.nuxt
.nitro
.cache
.output
.env
dist

3
.nuxtignore Normal file
View File

@ -0,0 +1,3 @@
pages/ignore/*.vue
layouts/*-ignore.vue

661
LICENSE Normal file
View File

@ -0,0 +1,661 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

View File

@ -1,3 +1,44 @@
# public # Nuxt 3 Minimal Starter
Site at [https://eggworld.tk](https://eggworld.tk) **WARN: Volar 0.40.0 breaks everything and I don't know why — stick with Volar 0.39.5.**
Look at the [nuxt 3 documentation](https://v3.nuxtjs.org) to learn more.
## Setup
Make sure to install the dependencies:
```bash
# yarn
yarn install
# npm
npm install
# pnpm
pnpm install --shamefully-hoist
```
## Development Server
Start the development server on http://localhost:3000
```bash
npm run dev
```
## Production
Build the application for production:
```bash
npm run build
```
Locally preview production build:
```bash
npm run preview
```
Checkout the [deployment documentation](https://v3.nuxtjs.org/guide/deploy/presets) for more information.

31
app.vue Normal file
View File

@ -0,0 +1,31 @@
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
<style>
* {
box-sizing: border-box;
/* for that cool wave dark mode effect */
z-index: 1;
position: relative;
}
html,
body,
div#__nuxt {
height: 100%;
width: 100%;
}
:root {
--text-color: #243746;
--bg: #f1e7d0;
}
.dark {
--text-color: #ebf4f1;
--bg: #091a28;
}
</style>

3
assets/images/moon.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 11.807C10.7418 10.5483 9.88488 8.94484 9.53762 7.1993C9.19037 5.45375 9.36832 3.64444 10.049 2C8.10826 2.38205 6.3256 3.33431 4.92899 4.735C1.02399 8.64 1.02399 14.972 4.92899 18.877C8.83499 22.783 15.166 22.782 19.072 18.877C20.4723 17.4805 21.4245 15.6983 21.807 13.758C20.1625 14.4385 18.3533 14.6164 16.6077 14.2692C14.8622 13.9219 13.2588 13.0651 12 11.807V11.807Z" />
</svg>

After

Width:  |  Height:  |  Size: 490 B

7
assets/images/sun.svg Normal file
View File

@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.995 12C6.995 14.761 9.241 17.007 12.002 17.007C14.763 17.007 17.009 14.761 17.009 12C17.009 9.239 14.763 6.993 12.002 6.993C9.241 6.993 6.995 9.239 6.995 12ZM11 19H13V22H11V19ZM11 2H13V5H11V2ZM2 11H5V13H2V11ZM19 11H22V13H19V11Z" />
<path d="M5.63702 19.778L4.22302 18.364L6.34402 16.243L7.75802 17.657L5.63702 19.778Z" />
<path d="M16.242 6.34405L18.364 4.22205L19.778 5.63605L17.656 7.75805L16.242 6.34405Z" />
<path d="M6.34402 7.75902L4.22302 5.63702L5.63802 4.22302L7.75802 6.34502L6.34402 7.75902Z" />
<path d="M19.778 18.3639L18.364 19.7779L16.242 17.6559L17.656 16.2419L19.778 18.3639Z" />
</svg>

After

Width:  |  Height:  |  Size: 712 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

View File

@ -0,0 +1,54 @@
<script setup lang="ts">
import type { BlogParsedContent } from "@/shared/types";
import { calcReadingTime, getPrettyDate } from "@/shared/metadata";
const docs = await queryContent<BlogParsedContent>("/blog")
.sort({ date: 1 })
.where({ _draft: false })
.find();
const latest = docs.at(-1) as BlogParsedContent;
const prettyDate = getPrettyDate(latest);
</script>
<template>
<div class="prose dark:prose-invert flex">
<HomeStatBox
:href="latest._path"
color="lightblue"
darkcolor="#497482"
title="Latest blog post"
>
<h2 class="m-0 mt-4 mb-1">{{ latest.title }}</h2>
<p class="text-sm text-gray-500 dark:text-gray-400 m-0">
{{ prettyDate }} · {{ calcReadingTime(latest).minutes }} min read
</p>
<div class="tag-list mt-1">
<Tag
v-for="(tag, index) in latest.tags"
:key="index"
:dest="`/tags/blog/${tag}`"
>
{{ tag }}
</Tag>
</div>
<ContentRenderer
tag="article"
:value="latest"
:excerpt="true"
class="text-gray-600 dark:text-gray-300 text-base m-0 mt-5"
>
<ContentRendererMarkdown :value="latest" :excerpt="true" />
<template #empty>
<p>No description found.</p>
</template>
</ContentRenderer>
</HomeStatBox>
</div>
</template>
<style scoped>
h2 {
overflow-wrap: break-word;
}
</style>

View File

@ -0,0 +1,34 @@
<template>
<a href="#" class="go-top" />
</template>
<style scoped>
.go-top {
--offset: 20rem;
position: sticky;
bottom: 1rem;
left: 1rem;
margin-right: 1rem;
place-self: end;
margin-top: calc(100vh + var(--offset));
width: 2rem;
height: 2rem;
background: #ff8b24;
border-radius: 1rem;
box-shadow: 0 0.1rem 0.5rem 0 gray;
z-index: 2;
}
html.dark .go-top {
box-shadow: 0 0.1rem 0.5rem 0 black;
}
.go-top:before {
content: "";
position: absolute;
inset: 30%;
transform: translateY(20%) rotate(-45deg);
border-top: 0.35rem solid #fff;
border-right: 0.35rem solid #fff;
}
</style>

112
components/ColourPicker.vue Normal file
View File

@ -0,0 +1,112 @@
<script setup lang="ts">
import { ref } from "vue";
import IconSun from "@/assets/images/sun.svg?component";
import IconMoon from "@/assets/images/moon.svg?component";
const colorMode = useColorMode();
const isToggled = ref(colorMode.value === "dark");
const toggle = () => {
isToggled.value = !isToggled.value;
colorMode.preference = isToggled.value ? "dark" : "light";
};
/*
// it unchecks on refresh and i can't make it automatically
// check itself
const darkToggleEl: Ref<HTMLInputElement> = ref(null);
onMounted(() => {
if (isToggled.value) {
darkToggleEl.value.checked = true;
}
});
*/
</script>
<template>
<label for="toggle" :class="['toggle-wrapper']">
<div :class="['toggle', isToggled ? 'enabled' : 'disabled']">
<div class="icons">
<IconMoon />
<IconSun />
</div>
<input
id="toggle"
name="toggle"
type="checkbox"
:checked="isToggled"
ref="darkToggleEl"
@click="toggle"
/>
</div>
</label>
</template>
<style scoped>
.toggle-wrapper {
width: 6rem;
display: block;
--black: #333333;
--white: #f5f5f5;
--scale: 2rem;
--transition: 0.2s ease;
--bg: var(--white);
--fg: var(--black);
}
html.dark .toggle-wrapper {
--black: #f5f5f5;
--white: #333333;
}
.toggle {
height: var(--scale);
width: calc(var(--scale) * 2);
background: var(--fg);
border-radius: var(--scale);
padding: calc(var(--scale) * 0.175);
position: relative;
margin: auto;
cursor: pointer;
transition: background var(--transition);
}
.toggle::before {
content: "";
display: block;
height: calc(var(--scale) * 0.65);
width: calc(var(--scale) * 0.65);
border-radius: 50%;
background: var(--bg);
position: absolute;
z-index: 2;
transform: translate(0);
transition: transform var(--transition), background var(--transition);
}
.toggle.enabled::before {
transform: translateX(calc(var(--scale)));
}
.toggle input {
position: absolute;
top: 0;
opacity: 0;
}
.toggle .icons {
display: flex;
justify-content: space-between;
align-items: center;
height: 100%;
}
.toggle .icons svg {
transform: scale(0.7);
z-index: 0;
fill: var(--bg);
}
</style>

View File

@ -0,0 +1,40 @@
<script setup lang="ts">
import type { GithubPushEvent } from "@/shared/github";
import type { Ref } from "vue";
const FEED_URL = "https://api.github.com/users/potatoeggy/events";
const imgUrl = ref("");
const href = ref("");
onMounted(async () => {
const results = (await useFetch(FEED_URL, { initialCache: false }))
.data as Ref<GithubPushEvent[]>;
const latestEvent = results.value.find(
(event) => event.type === "PushEvent"
) as GithubPushEvent;
const latestCommit = latestEvent.payload.commits[0];
imgUrl.value = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
href.value = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
});
</script>
<template>
<div class="prose dark:prose-invert">
<HomeStatBox
:href="href"
color="lightgray"
darkcolor="slategray"
title="Latest commit"
:clearstyles="true"
>
<img class="m-0 w-full h-full" :src="imgUrl" />
<!--
<div>
<h2>{{ title }}</h2>
<p v-if="description">{{ description }}</p>
</div>
-->
<noscript> Enable JavaScript to see the latest commit! </noscript>
</HomeStatBox>
</div>
</template>

View File

@ -0,0 +1,193 @@
<script setup lang="ts">
import { navItems } from "@/data/navItems";
const getSvgIcon = async (name: string) => {
const module = await import(
`../assets/images/nav/${name.toLowerCase()}.svg?raw`
);
return module.default;
};
</script>
<template>
<div class="hamburger">
<input class="checkbox" type="checkbox" id="checkbox" />
<label class="checkbox-label" for="checkbox">
<svg class="ham ham-rotate" viewBox="0 0 100 100" width="60">
<path
class="line top"
d="m 30,33 h 40 c 0,0 9.044436,-0.654587 9.044436,-8.508902 0,-7.854315 -8.024349,-11.958003 -14.89975,-10.85914 -6.875401,1.098863 -13.637059,4.171617 -13.637059,16.368042 v 40"
/>
<path class="line middle" d="m 30,50 h 40" />
<path
class="line bottom"
d="m 30,67 h 40 c 12.796276,0 15.357889,-11.717785 15.357889,-26.851538 0,-15.133752 -4.786586,-27.274118 -16.667516,-27.274118 -11.88093,0 -18.499247,6.994427 -18.435284,17.125656 l 0.252538,40"
/>
</svg>
</label>
<div class="drawer prose dark:prose-invert">
<li class="m-0" v-for="(item, index) in navItems" :key="index">
<!-- stupid vite doesn't let require work
i should have just hardcoded the navbar items -->
<a :href="item.href" class="p-2 flex gap-2">
<img
:src="`/nav/${item.title.toLowerCase()}.svg`"
class="m-0"
preload="auto"
/>
{{ item.title }}
</a>
<hr class="m-0 m-2" v-if="index !== navItems.length - 1" />
</li>
</div>
</div>
</template>
<style scoped>
input.checkbox {
outline: none;
width: 0;
opacity: 0;
}
input.checkbox ~ .drawer {
opacity: 0;
right: 0;
top: 0;
position: absolute;
transform: scale(0);
}
input.checkbox:checked ~ .drawer,
.drawer:hover {
/** input.checkbox:focus:not(:checked) ~ .drawer,
* input.checkbox:hover ~ .drawer,
*
* play with focus to make it so that you can click outside
* of the hamburger to close it
* problem with focus is that pressing the menu again doesn't close it
* also so that you can hover over it to open it these are
* surprisingly annoying
*/
opacity: 1;
transform: scale(1) translate(0.5rem, 3.25rem);
}
.drawer {
--drawer-bg: white;
--drawer-border-bg: gray;
transition: transform var(--trans), opacity var(--trans), border var(--trans),
background var(--trans);
padding: 1rem;
right: 0;
background: var(--drawer-bg);
border: 1px solid var(--drawer-border-bg);
display: flex;
flex-direction: column;
align-items: center;
border-radius: 0.5rem;
width: 12rem;
--drawer-drop-color: gray;
box-shadow: 0 0.25rem 0.5rem 0 var(--drawer-drop-color);
}
html.dark .drawer {
--drawer-bg: #222;
--drawer-border-bg: darkslategray;
--drawer-drop-color: black;
}
.drawer::before {
content: "";
width: 0;
height: 0;
position: absolute;
--tri-size: 0.6rem;
border-left: var(--tri-size) solid transparent;
border-right: var(--tri-size) solid transparent;
border-bottom: var(--tri-size) solid var(--drawer-border-bg);
right: 1.75rem;
top: calc(-1 * var(--tri-size));
transition: border var(--trans);
}
.drawer::after {
content: "";
width: 0;
height: 0;
position: absolute;
--tri-size: 0.56rem;
border-left: var(--tri-size) solid transparent;
border-right: var(--tri-size) solid transparent;
border-bottom: var(--tri-size) solid var(--drawer-bg);
right: 1.8rem;
top: -0.53rem; /*calc(-1 * var(--tri-size));*/
transition: border var(--trans);
}
.drawer li {
list-style: none;
width: 100%;
}
.drawer li a {
/* overwrite tailwind */
text-decoration: none;
border-radius: 0.5rem;
width: 100%;
}
.drawer li a:hover,
.drawer li a:active {
--drawer-active-color: lightgray;
background: var(--drawer-active-color);
}
html.dark .drawer li a {
--drawer-active-color: darkslategray;
}
html.dark .drawer img {
filter: invert(1); /* brightness didn't work */
}
/* hamburger animation */
.ham {
cursor: pointer;
transition: transform 400ms;
user-select: none;
height: 3.75rem;
}
.line {
fill: none;
transition: stroke-dasharray 400ms, stroke-dashoffset 400ms;
stroke: #000;
stroke-width: 5.5;
stroke-linecap: round;
}
html.dark .line {
stroke: #fff;
}
.ham .top {
stroke-dasharray: 40 139;
}
.ham .bottom {
stroke-dasharray: 40 180;
}
input.checkbox:checked ~ label.checkbox-label .ham .top {
stroke-dashoffset: -98px;
}
input.checkbox:checked ~ label.checkbox-label .ham .bottom {
stroke-dashoffset: -138px;
}
input.checkbox:checked ~ label.checkbox-label .ham-rotate {
transform: rotate(45deg);
}
</style>

View File

@ -0,0 +1,92 @@
<script setup lang="ts">
import type { Color, ViewportLength } from "csstype";
// fix ReferenceError: _unref is not defined
// https://github.com/nuxt/framework/issues/5546
import { unref as _unref } from "vue";
const {
href,
color = "pink",
darkcolor = "#c88994",
title,
clearstyles = false,
forceheight,
} = defineProps<{
href?: string;
color?: Color;
darkcolor?: Color;
title?: string;
clearstyles?: boolean;
forceheight?: ViewportLength<"rem">;
}>();
const padding = clearstyles ? "0" : "1rem";
const height = forceheight ?? "100%";
// v-bind DOES NOT WORK on initial render
// so unfortunately we have to use the old way
const cssVars = {
"--padding": padding,
"--height": height,
"--color": color,
"--darkcolor": darkcolor,
};
</script>
<template>
<a class="no-underline inline-block flex flex-col items-stretch" :href="href">
<div class="container box" :style="cssVars">
<p class="m-0 w-full title">{{ title }}</p>
<div class="main-content">
<slot />
</div>
</div>
</a>
</template>
<style scoped>
.container {
/* make sure width is good for fullscreen 1080p,
* fullscreen 1080p at 1.25 scaling,
* mobile
*/
width: 28rem;
height: var(--height);
border: 0.5rem solid var(--color);
border-radius: 0.5rem;
transition: transform 0.2s ease;
box-shadow: 0 0.1rem 0.5rem 0 gray;
}
.container:hover,
.container:active {
transform: scale(1.05);
}
html.dark .container {
border: 0.5rem solid var(--darkcolor);
box-shadow: 0 0.1rem 0.5rem 0 black;
}
.main-content {
padding: var(--padding);
padding-top: 0;
overflow-wrap: break-word;
}
.title {
background: var(--color);
}
html.dark .title {
background: var(--darkcolor);
}
@media screen and (max-width: 600px) {
.container {
width: 90vw;
}
}
</style>

121
components/Navbar.vue Normal file
View File

@ -0,0 +1,121 @@
<script setup lang="ts">
import ColourPicker from "./ColourPicker.vue";
import { navItems } from "@/data/navItems";
const props = defineProps<{ activeItem?: string }>();
</script>
<template>
<nav class="flex items-center justify-between">
<ul>
<li class="home-text"><a href="/">Eggworld</a></li>
<li v-for="(item, index) in navItems" :key="index">
<a :href="item.href" class="flex gap-2">
<img :src="`/nav/${item.title.toLowerCase()}.svg`" />
{{ item.title }}</a
>
</li>
</ul>
<div class="flex items-center">
<ColourPicker />
<div class="hamburger">
<HamburgerMenu />
</div>
</div>
</nav>
</template>
<style scoped>
nav {
--nav-drop-color: lightgray;
height: 4rem;
width: 100%;
box-shadow: 0 0.25rem 0.5rem 0 var(--nav-drop-color);
padding: 1rem;
/* main stuff is z-index 1 and the hamburger must be above everything else */
z-index: 2;
}
html.dark nav {
--nav-drop-color: black;
}
html.dark nav img {
filter: invert(1);
}
ul {
display: flex;
align-items: center;
gap: 1rem;
}
li {
font-size: large;
border-radius: 0.5rem;
padding: 0.5rem;
padding-left: 1rem;
padding-right: 1rem;
}
li:hover:not(.home-text),
li:active:not(.home-text) {
--nav-active-color: lightgray;
background: var(--nav-active-color);
}
html.dark li:hover,
html.dark li:active {
--nav-active-color: darkslategray;
}
li.home-text {
font-size: x-large;
font-weight: bold;
}
.hamburger {
width: 0rem;
opacity: 0;
}
* {
--trans: 0.2s ease;
--box-trans-time: 0.4s;
transition: opacity var(--trans), transform var(--trans), gap var(--trans),
width var(--trans), box-shadow var(--box-trans-time) ease,
filter var(--trans), padding-left var(--trans), padding-right var(--trans);
}
@media screen and (max-width: 600px) {
.hamburger {
display: flex;
width: 4rem;
opacity: 1;
}
li:not(.home-text) {
width: 0;
opacity: 0;
padding: 0;
padding-left: 0;
padding-right: 0;
/* accessibility? screw accessibility
* i want my pretty animations
*/
}
ul {
gap: 0rem;
}
nav {
padding-left: 0;
padding-right: 0;
}
}
html.dark svg {
fill: white;
}
</style>

View File

@ -0,0 +1,61 @@
<script setup lang="ts">
import type { StoryParsedContent, BlogParsedContent } from "@/shared/types";
import { calcReadingTime, getPrettyDate } from "@/shared/metadata";
const { post, type, highlighttags } = defineProps<{
post: StoryParsedContent | BlogParsedContent;
type: "stories" | "blog";
highlighttags?: string[];
}>();
const readingTime = calcReadingTime(post);
const descText =
type === "stories"
? `${readingTime.words.total} words`
: `${readingTime.minutes} min read`;
</script>
<template>
<div class="story-card p-4">
<h3 class="m-0">
<a
:href="post._path"
class="no-underline text-left text-2xl sm:text-2xl font-bold hover:text-blue-700 dark:hover:text-blue-400 leading-tight transition"
>
{{ post.title }}
</a>
</h3>
<p class="my-1 text-sm">{{ getPrettyDate(post) }} · {{ descText }}</p>
<div class="flex flex-wrap">
<Tag
:dest="`/tags/${type}/${tag}`"
v-for="(tag, index) in post.tags"
:key="index"
:highlight="highlighttags?.includes(tag)"
>
{{ tag }}
</Tag>
</div>
<ContentRenderer :value="post" :excerpt="true" tag="article">
<template #empty>No excerpt available.</template>
</ContentRenderer>
<!--<p v-if="!post.nopreview" class="m-0"></p>-->
<div class="text-right" v-if="!post.nopreview">
<a
:href="post._path"
class="no-underline hover:underline font-semibold text-blue-700 dark:text-blue-400"
>
Continue reading
</a>
</div>
</div>
</template>
<style scoped>
.story-card {
border: 0.1rem solid gray;
max-width: 100%;
border-radius: 0.5rem;
overflow-wrap: break-word;
}
</style>

141
components/ProjectCard.vue Normal file
View File

@ -0,0 +1,141 @@
<script setup lang="ts">
import type { Project } from "@/data/projects";
const { project, reverse = false } = defineProps<{
project: Project;
reverse?: boolean;
}>();
const imgUrl = `url(/images/projects/${project.img ?? "unknown.png"})`;
</script>
<template>
<a :href="project.href" class="no-underline project-anchor">
<div class="card flex items-center justify-between">
<div class="card-text h-full px-4 py-2">
<div class="h-full flex flex-col justify-between">
<div>
<h3 class="m-0">{{ project.name }}</h3>
<div class="flex gap-1 items-center flex-nowrap">
<img
class="h-5 w-5 m-0"
:src="`/images/langs/${lang}.svg`"
v-for="(lang, index) in project.langs"
:key="index"
/>
<span
class="text-xs text-gray-500 dark:text-gray-300 whitespace-nowrap"
>· {{ project.license ?? "no license" }}</span
>
</div>
</div>
<div class="flex flex-col justify-between grow">
<p
class="desc-text text-gray-600 dark:text-gray-200 mt-3 mb-0 text-left text-sm"
>
{{ project.description }}
</p>
<p
class="desc-text text-gray-600 dark:text-gray-200 text-left text-sm m-0 whitespace-nowrap"
>
{{ project.longDescription }}
</p>
</div>
</div>
</div>
<div class="card-img h-full p-4 flex" />
</div>
</a>
</template>
<style scoped>
.project-anchor {
display: inline-block;
width: 100%;
}
.card {
border: 0.2rem solid pink;
background: white;
border-radius: 1.5rem 0 1.5rem 0;
height: 12rem;
line-height: 1.25;
transition: all 0.2s ease;
box-shadow: 0 0.1rem 0.5rem 0 gray;
}
html.dark .card {
border: 0.2rem solid rgb(126, 93, 98);
background: #444;
box-shadow: 0 0.1rem 0.5rem 0 black;
}
.card:hover,
.card:active {
transform: scale(1.03);
}
.card-text {
width: 25%;
background: white;
border-radius: 1.5rem 0 0 0;
transition: width 0.2s ease;
}
html.dark .card-text {
background: #444;
}
.card-img {
width: 75%;
background: v-bind(imgUrl);
background-color: rgb(255, 237, 241);
background-position: right 90% top 15%;
background-size: cover;
background-repeat: no-repeat;
border-radius: 0 0 1.5rem 100%;
transition: width 0.2s ease;
}
html.dark .card-img {
background-color: rgb(180, 136, 143);
}
.desc-text {
width: 139%;
/* 140% is too close */
transition: width 0.2s ease;
}
a.unclickable {
pointer-events: none;
}
@media screen and (max-width: 720px) {
.card-text {
width: 30%;
}
.card-img {
width: 70%;
}
.desc-text {
width: 135%;
}
}
@media screen and (max-width: 540px) {
.card-text {
width: 45%;
}
.card-img {
width: 55%;
}
.desc-text {
width: 120%;
font-size: 0.72rem;
}
}
</style>

View File

@ -0,0 +1,63 @@
<script setup lang="ts">
const props = defineProps<{
name: string;
href: string;
img: string;
unclickable?: boolean;
}>();
const imgUrl = `/images/services/${props.img}`;
</script>
<template>
<a :href="unclickable ? '' : href" :class="['no-underline', { unclickable }]">
<div class="card flex flex-col items-center justify-around">
<img class="m-0" :src="imgUrl" />
<h3 class="m-0">{{ props.name }}</h3>
<p class="desc-text text-gray-600 dark:text-gray-200"><slot /></p>
</div>
</a>
</template>
<style scoped>
img {
width: 6rem;
}
.card {
padding: 1rem;
border: 0.2rem solid pink;
background: rgb(255, 237, 241);
border-radius: 0.5rem;
width: 12rem;
height: 12rem;
line-height: 1.25;
transition: all 0.2s ease;
box-shadow: 0 0.1rem 0.5rem 0 gray;
}
html.dark .card {
border: 0.2rem solid rgb(126, 93, 98);
background: rgb(110, 90, 92);
box-shadow: 0 0.1rem 0.5rem 0 black;
}
.card:hover,
.card:active {
transform: scale(1.05);
}
.desc-text {
font-size: 0.8rem;
margin: 0;
text-align: center;
}
a.unclickable {
pointer-events: none;
}
a.unclickable .card {
box-shadow: none;
}
</style>

View File

@ -0,0 +1,55 @@
<script setup lang="ts">
import { type StoryParsedContent } from "@/shared/types";
import { calcReadingTime, getPrettyDate } from "@/shared/metadata";
const docs = await queryContent<StoryParsedContent>("/stories")
.sort({ date: 1 })
.where({ _draft: false })
.find();
const latest = docs.at(-1) as StoryParsedContent;
const prettyDate = getPrettyDate(latest);
</script>
<template>
<div class="prose dark:prose-invert flex">
<HomeStatBox
:href="latest._path"
color="lightgreen"
darkcolor="#2c8a2c"
title="Latest story"
>
<h2 class="m-0 mt-4 mb-1">{{ latest.title }}</h2>
<p class="text-sm text-gray-500 dark:text-gray-400 m-0">
{{ prettyDate }} · {{ calcReadingTime(latest).words.total }} words
</p>
<div class="tag-list mt-1">
<Tag
v-for="(tag, index) in latest.tags"
:key="index"
:dest="`/tags/stories/${tag}`"
>
{{ tag }}
</Tag>
</div>
<ContentRenderer
tag="article"
:value="latest"
:excerpt="true"
class="text-gray-600 dark:text-gray-300 text-base m-0 mt-5 text-ellipsis"
>
<ContentRendererMarkdown :value="latest" :excerpt="true" />
<template #empty>
<p>No description found.</p>
</template>
</ContentRenderer>
</HomeStatBox>
</div>
</template>
<style scoped>
h2 {
overflow-wrap: break-word;
}
</style>

19
components/Tag.vue Normal file
View File

@ -0,0 +1,19 @@
<script setup lang="ts">
const { dest, highlight = false } = defineProps<{
dest: string;
highlight?: boolean;
}>();
</script>
<template>
<a :href="dest">
<div
:class="[
'inline-block text-xs rounded-full py-1 px-2 mt-1 mr-1 bg-gray-300 dark:bg-gray-500 transition',
{ 'bg-yellow-200 dark:bg-yellow-700 shadow-lg': highlight },
]"
>
<slot />
</div>
</a>
</template>

View File

@ -0,0 +1,15 @@
<script setup lang="ts">
const { src } = defineProps<{ src: string }>();
const imgSrc =
src.startsWith("http://") || src.startsWith("https://")
? src
: `/images/posts/${src}`;
</script>
<template>
<figure class="flex flex-col items-center">
<img :src="imgSrc" />
<figcaption class="text-center"><Markdown /></figcaption>
</figure>
</template>

View File

@ -0,0 +1,72 @@
<script setup lang="ts">
import { projects } from "@/data/projects";
</script>
<template>
<div class="prose dark:prose-invert w-full flex flex-col mt-9">
<h1 class="text-center mb-0">Fun things</h1>
<p class="text-center">(aka my programming projects)</p>
<div class="flex flex-col items-center justify-around gap-5 mt-6">
<ProjectCard
v-for="(proj, index) in projects"
:project="proj"
:key="index"
/>
</div>
<h1 id="about" class="text-center mb-4 mt-8">About</h1>
<!-- this could be in markdown but eh -->
<p>
Hello! It's very nice to meet you — I'm a student and Linux enthusiast who
is quite passionate about some subjects but is quite lazy in every other.
</p>
<p>
I've dabbled extensively and non-extensively in a variety of topics to
play with, including:
</p>
<ul>
<li>competitive programming on DMOJ</li>
<li>GUI toolkits very very briefly in GTK, Qt, and Swing</li>
<li>Linux and server administration</li>
<li>web development in the form of a Chrome extension and my sites</li>
<li>Godot Engine Cat Simulator DX</li>
<li>ski instruction</li>
<li>writing of literature</li>
<li>emulation</li>
</ul>
<p>and other things that I'm forgetting right now.</p>
<p>
I have two server machines at home a Dell OptiPlex 780 and a Dell
Latitude E5520. Yes, one of them is a laptop.
</p>
<h3>OptiPlex 780 ("asvyn")</h3>
<ul>
<li><strong>CPU:</strong> Intel Core 2 Duo E8400 (2c/2t)</li>
<li><strong>GPU:</strong> AMD ATI Radeon HD 3450</li>
<li><strong>RAM:</strong> 2× 1 GB DDR + 1× 2 GB DDR2</li>
<li><strong>Storage:</strong> Western Digital 150 GB hard drive</li>
<li><strong>OS:</strong> Arch Linux</li>
</ul>
<h3>Latitude E5520 ("panquia")</h3>
<ul>
<li><strong>CPU:</strong> Intel Core i5-3320M (2c/4t)</li>
<li><strong>GPU:</strong> Integrated</li>
<li><strong>RAM:</strong> 10 GB</li>
<li><strong>Storage:</strong> 300 GB hard drive</li>
<li><strong>OS:</strong> Arch Linux</li>
</ul>
</div>
</template>
<style scoped>
p {
margin: 0.5rem;
}
ul {
margin: 0;
line-height: 1.35;
}
</style>

View File

@ -0,0 +1,67 @@
<template>
<div
class="container prose dark:prose-invert w-full flex flex-col items-center mt-9"
>
<h1 class="m-0">Services</h1>
<p class="prose dark:prose-invert">
This site is statically generated using
<a href="https://v3.nuxtjs.org">Nuxt.js</a> with the help of templates and
Markdown because really, writing HTML by hand is tedious and I don't
know why I ever tried and its source is available
<a href="https://github.com/potatoeggy/public">here</a>.
</p>
<!-- i could make this a list but god i'm so tired with nuxt -->
<div class="flex justify-around flex-wrap gap-8 items-center">
<ServiceCard name="Gitea" href="https://git.eggworld.tk" img="gitea.png">
Self-hosted GitHub
</ServiceCard>
<ServiceCard
name="Eifueo"
href="https://eifueo.eggworld.tk"
img="eifueo.svg"
>
Note collection
</ServiceCard>
<ServiceCard
name="Primoprod"
href="https://primoprod.eggworld.tk"
img="primogem.png"
>
Wish simulator
</ServiceCard>
<ServiceCard
name="Calibre"
href="https://calibre.eggworld.tk"
img="calibre-web.png"
>
Kobo Cloud
</ServiceCard>
<ServiceCard name="Plex" href="https://plex.eggworld.tk" img="plex.png">
Ad-filled media server
</ServiceCard>
<ServiceCard
name="Jellyfin"
href="https://jellyfin.eggworld.tk"
img="jellyfin.png"
>
FOSS media server
</ServiceCard>
<ServiceCard
name="Minecraft"
href="minecraft.eggworld.tk"
img="minecraft.png"
:unclickable="true"
>
Whitelisted
</ServiceCard>
</div>
</div>
</template>
<style scoped>
.container {
max-width: unset;
}
</style>

16
composables/metadata.ts Normal file
View File

@ -0,0 +1,16 @@
/**
* Set the page title in the format [title] | Eggworld.
* @param title The title string.
*/
export function useTitle(title: string) {
useHead({
title: `${title} | Eggworld`,
link: [
{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
{
rel: "stylesheet",
href: "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css",
},
],
});
}

View File

@ -2,13 +2,12 @@
title: "3 Reasons to Switch to Linux" title: "3 Reasons to Switch to Linux"
date: "2021-10-30" date: "2021-10-30"
tags: tags:
- blog
- tech - tech
--- ---
In the computing world, Linux is already extremely widespread — it's near-ubiquitous on servers as well as many appliances such as smart fridges, [cars](https://www.zdnet.com/article/tesla-starts-to-release-its-cars-open-source-linux-software-code/), or even [Mars helicopters](https://www.theverge.com/2021/2/19/22291324/linux-perseverance-mars-curiosity-ingenuity) . If you have an Android phone, you're running Linux already. So why not give it a shot on your computer, too? In the computing world, Linux is already extremely widespread — it's near-ubiquitous on servers as well as many appliances such as smart fridges, [cars](https://www.zdnet.com/article/tesla-starts-to-release-its-cars-open-source-linux-software-code/), or even [Mars helicopters](https://www.theverge.com/2021/2/19/22291324/linux-perseverance-mars-curiosity-ingenuity) . If you have an Android phone, you're running Linux already. So why not give it a shot on your computer, too?
<!-- excerpt --> <!-- more -->
First, what is Linux? At its heart, it is a [kernel](https://en.wikipedia.org/wiki/Kernel_(operating_system)) that the rest of your operating system and software depends on, from drivers to the display manager to games. First, what is Linux? At its heart, it is a [kernel](https://en.wikipedia.org/wiki/Kernel_(operating_system)) that the rest of your operating system and software depends on, from drivers to the display manager to games.
@ -18,9 +17,9 @@ However, this article will largely focus on **desktop Linux**, which competes wi
Perhaps the biggest feature of Linux is its ability to do whatever you want, however you want. After a *tiny* bit of tinkering, you'll be able to set up your computer exactly how you'd like it! Perhaps the biggest feature of Linux is its ability to do whatever you want, however you want. After a *tiny* bit of tinkering, you'll be able to set up your computer exactly how you'd like it!
{% asset_img "sway-desktop.png" %} ::image{src=sway-desktop.png}
A terminal, an emulated Switch game, a game launcher, and a browser all automagically arranged by a tiling window manager. The currently playing song is in the top bar.
(caption: a terminal, an emulated Switch game, a game launcher, and a browser all automagically arranged by a tiling window manager. Click to enlarge. The currently playing song is in the top bar.) ::
Or, if you aren't the type to spend hours fiddling every little thing, you can choose from a variety of existing default desktop interfaces. Or, if you aren't the type to spend hours fiddling every little thing, you can choose from a variety of existing default desktop interfaces.
@ -34,7 +33,8 @@ Or Plasma's endless customisation:
![](https://upload.wikimedia.org/wikipedia/commons/9/94/KDE_Plasma_5.21_Breeze_Twilight_screenshot.png) ![](https://upload.wikimedia.org/wikipedia/commons/9/94/KDE_Plasma_5.21_Breeze_Twilight_screenshot.png)
![](https://www.omgubuntu.co.uk/wp-content/uploads/2019/07/kde-plasma-desktop.jpg) ::image{src=https://www.omgubuntu.co.uk/wp-content/uploads/2019/07/kde-plasma-desktop.jpg}
::
And this is only the beginning — it's not just appearance you have control over, although both GNOME and Plasma also come with their assortment of applications that have designs that perfectly mesh with the desktop, with global theming letting you click a single button in your settings menu to change colours or styles across all your apps. And this is only the beginning — it's not just appearance you have control over, although both GNOME and Plasma also come with their assortment of applications that have designs that perfectly mesh with the desktop, with global theming letting you click a single button in your settings menu to change colours or styles across all your apps.
@ -56,11 +56,13 @@ Here are just a couple of the graphical stores available:
GNOME Software for GNOME: GNOME Software for GNOME:
![](https://www.omgubuntu.co.uk/wp-content/uploads/2021/02/gnome-software-refresh.jpg) ::image{src=https://www.omgubuntu.co.uk/wp-content/uploads/2021/02/gnome-software-refresh.jpg}
::
Discover for Plasma: Discover for Plasma:
![](https://userbase.kde.org/images.userbase/thumb/2/2d/Discoverappfocus.png/500px-Discoverappfocus.png) ::image{src=https://userbase.kde.org/images.userbase/thumb/2/2d/Discoverappfocus.png/500px-Discoverappfocus.png}
::
By contrast, the Microsoft Store was (is) a complete and utter mess that is nowhere near the integration and experience Linux has had for decades. By contrast, the Microsoft Store was (is) a complete and utter mess that is nowhere near the integration and experience Linux has had for decades.

View File

@ -2,13 +2,12 @@
title: Being Complacent title: Being Complacent
date: 2021-05-21 date: 2021-05-21
tags: tags:
- blog
- misc - misc
--- ---
Imagine this: you think you're doing great in the world, and all your friends are telling you you're doing great in the world. But one day, you look outside the bubble you're in and realise just how far behind you really are. Imagine this: you think you're doing great in the world, and all your friends are telling you you're doing great in the world. But one day, you look outside the bubble you're in and realise just how far behind you really are.
<!-- excerpt --> <!-- more -->
This is what complacency leads to. By limiting your own perspective and telling yourself that you're doing great, you don't notice how everyone else is capable of so much more than you are. Even if you once had a near-insurmountable lead, by no longer applying pressure to keep moving forward, or by reducing pressure to the point that you *feel* like you're moving forward but are practically staying still, anyone can catch up should they decide to. This is what complacency leads to. By limiting your own perspective and telling yourself that you're doing great, you don't notice how everyone else is capable of so much more than you are. Even if you once had a near-insurmountable lead, by no longer applying pressure to keep moving forward, or by reducing pressure to the point that you *feel* like you're moving forward but are practically staying still, anyone can catch up should they decide to.

View File

@ -2,12 +2,13 @@
title: On the Topic of Dark Mode title: On the Topic of Dark Mode
date: 2021-04-07 date: 2021-04-07
tags: tags:
- blog
- misc - misc
nopreview: true
--- ---
On the desktop, dark mode is an abomination that should be eradicated from applications. On the desktop, dark mode is an abomination that should be eradicated from applications.
<!-- excerpt -->
Browsers, IDEs, and other applications must be freed from their shadowy chains and returned to light — where they truly belong. Browsers, IDEs, and other applications must be freed from their shadowy chains and returned to light — where they truly belong.
{% asset_img "light-discord.png" "Perfect." %} ::image{src=light-discord.png}
Perfect.
::

View File

@ -2,13 +2,12 @@
title: Handy Python Tips title: Handy Python Tips
date: 2021-05-29 date: 2021-05-29
tags: tags:
- blog
- tech - tech
--- ---
Python is a flexible programming language that is well-known for its simplicity and numerous features that make programming in it a lot faster. This article presents just a few that might speed up your productivity a little bit. Python is a flexible programming language that is well-known for its simplicity and numerous features that make programming in it a lot faster. This article presents just a few that might speed up your productivity a little bit.
<!-- excerpt --> <!-- more -->
## 1. Tuple expansion ## 1. Tuple expansion

View File

@ -2,16 +2,15 @@
title: An Introduction to the Objective-Subjective Scoring System title: An Introduction to the Objective-Subjective Scoring System
date: 2021-04-14 date: 2021-04-14
tags: tags:
- blog
- misc - misc
--- ---
It's difficult to fairly judge anything in a manner free from bias. It's even more difficult to do it for abstract and creative works such as literature or stories, as your own personal enjoyment can greatly affect how you view the work and any flaws it might have. The **Objective-Subjective Scoring System (OS3)** attempts to remedy this issue by separating as much bias as possible. It's difficult to fairly judge anything in a manner free from bias. It's even more difficult to do it for abstract and creative works such as literature or stories, as your own personal enjoyment can greatly affect how you view the work and any flaws it might have. The **Objective-Subjective Scoring System (OS3)** attempts to remedy this issue by separating as much bias as possible.
<!-- excerpt -->
The primary feature of OS3 is that it assigns two scores to a certain work with a small scale: the *objective score* and the *subjective score*, both inclusively ranging from 0 to 3. The primary feature of OS3 is that it assigns two scores to a certain work with a small scale: the *objective score* and the *subjective score*, both inclusively ranging from 0 to 3.
<!-- more -->
## The objective score ## The objective score
The objective score should be representative of a work's clear quality relative to other works and how "good" it is. It should be as free from bias as possible and should have clear, defined criteria so that the standard can be consistently applied to other works. Ideally, an objective score should not be controversial and others who consume the same work should assign the same score. A sample criteria which I use for stories is provided below: The objective score should be representative of a work's clear quality relative to other works and how "good" it is. It should be as free from bias as possible and should have clear, defined criteria so that the standard can be consistently applied to other works. Ideally, an objective score should not be controversial and others who consume the same work should assign the same score. A sample criteria which I use for stories is provided below:

View File

@ -4,7 +4,6 @@ date: 2021-08-21
tags: tags:
- primoprod - primoprod
- tech - tech
- blog
--- ---
Welcome to the very first [Primoprod](https://primoprod.eggworld.tk) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes. Welcome to the very first [Primoprod](https://primoprod.eggworld.tk) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes.
@ -13,7 +12,7 @@ In this hopefully small series of development notes, I'll be laying out my exper
This report will cover the beginnings of the project to the present day: 16 July - 20 August 2021. This report will cover the beginnings of the project to the present day: 16 July - 20 August 2021.
<!-- excerpt --> <!-- more -->
## Introduction ## Introduction
@ -35,11 +34,13 @@ At the time, coming from Python/Java, I opted in to the class components plugin
The [first few commits](https://github.com/potatoeggy/primoprod/commit/ed9d94b61bf91ea9b82ac4d832dfb2b9ff2efc59) had me playing around until I was comfortable enough to introduce my very [first component](https://github.com/potatoeggy/primoprod/commit/fcbb4068dd3b018db2809ccfcc5381d4ea3ae727): the WishButton. The [first few commits](https://github.com/potatoeggy/primoprod/commit/ed9d94b61bf91ea9b82ac4d832dfb2b9ff2efc59) had me playing around until I was comfortable enough to introduce my very [first component](https://github.com/potatoeggy/primoprod/commit/fcbb4068dd3b018db2809ccfcc5381d4ea3ae727): the WishButton.
{% asset_img "wish-button-emulated.png" %} ::image{src=wish-button-emulated.png}
::
I'd say it turned out pretty well! Since I wanted to emulate Genshin's UI, I wanted to match it as closely as I could. These two buttons are made of an image inside of a div relatively positioned with text absolutely positioned inside. Original image for comparison: I'd say it turned out pretty well! Since I wanted to emulate Genshin's UI, I wanted to match it as closely as I could. These two buttons are made of an image inside of a div relatively positioned with text absolutely positioned inside. Original image for comparison:
{% asset_img "wish-button-original.png" %} ::image{src=wish-button-original.png}
::
There are still some differences between the texts since Genshin uses antialiasing, and the alignment and shadow of the icon beside the wish quantity is slightly off too, but I would consider this result to be acceptable. There are still some differences between the texts since Genshin uses antialiasing, and the alignment and shadow of the icon beside the wish quantity is slightly off too, but I would consider this result to be acceptable.
@ -57,7 +58,8 @@ See [GemCounter](https://github.com/potatoeggy/primoprod/blob/master/src/compone
Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantastic tutorials/documentation a fair bit and used flexboxes and `rem` everywhere, I apparently did not catch `box-sizing: border-box` and the margins and padding just did not arrange themselves how they should have. Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantastic tutorials/documentation a fair bit and used flexboxes and `rem` everywhere, I apparently did not catch `box-sizing: border-box` and the margins and padding just did not arrange themselves how they should have.
{% asset_img "mdn-box-sizing-tip.png" %} ::image{src=mdn-box-sizing-tip.png}
::
:/ thanks MDN for letting me know :/ thanks MDN for letting me know
@ -67,11 +69,13 @@ Although I had read up on [MDN's](https://developer.mozilla.org/en-US/) fantasti
Designing the basic screen was pretty straightforward. For all its woes, pure CSS still works and is intuitive enough that my git history was only slightly too messy and I got my results. Designing the basic screen was pretty straightforward. For all its woes, pure CSS still works and is intuitive enough that my git history was only slightly too messy and I got my results.
{% asset_img "primoprod-wishbanners.png" %} ::image{src=primoprod-wishbanners.png}
::
Pretty good, right? Now, the design still isn't adaptive enough *since things get cut off for who knows why I thought flexboxes were supposed to solve all this* but for the most part it looks good enough. It appears I'll have to make a lot of exceptions for mobile devices… Pretty good, right? Now, the design still isn't adaptive enough *since things get cut off for who knows why I thought flexboxes were supposed to solve all this* but for the most part it looks good enough. It appears I'll have to make a lot of exceptions for mobile devices…
{% asset_img "primoprod-wishbanners-scaled.png" %} ::image{src=primoprod-wishbanners-scaled.png}
::
With some help taken by examining the assets of https://genshin.thekima.com and https://gi-wish-simulator.uzairashraf.dev, I grabbed a static background image as well as the videos! With some help taken by examining the assets of https://genshin.thekima.com and https://gi-wish-simulator.uzairashraf.dev, I grabbed a static background image as well as the videos!
@ -140,9 +144,11 @@ In fact, I consider those two to be 100% done unless I can find a way to apply a
But it looks great! But it looks great!
{% asset_img "itemdescriptionoverlay.png" %} ::image{src=itemdescriptionoverlay.png}
::
{% asset_img "itemobtainoverlay.png" %} ::image{src=itemobtainoverlay.png}
::
## Wrapping up ## Wrapping up

View File

@ -2,13 +2,12 @@
title: "Using IWD with YRDSB Wi-Fi" title: "Using IWD with YRDSB Wi-Fi"
date: "2021-09-14" date: "2021-09-14"
tags: tags:
- blog
- tech - tech
--- ---
The iNet Wireless Daemon (iwd) is a lightweight and stable Wi-Fi manager for Linux systems. However, some configuration is needed for it to work properly on WPA Enterprise (802.1X) networks. For YRDSB: The iNet Wireless Daemon (iwd) is a lightweight and stable Wi-Fi manager for Linux systems. However, some configuration is needed for it to work properly on WPA Enterprise (802.1X) networks. For YRDSB:
<!-- excerpt --> <!-- more -->
Create the file with the following contents at `/var/lib/iwd/<ssid>.8021x` Create the file with the following contents at `/var/lib/iwd/<ssid>.8021x`

View File

@ -2,13 +2,12 @@
title: Why Self-Host? title: Why Self-Host?
date: 2021-04-16 date: 2021-04-16
tags: tags:
- blog
- tech - tech
--- ---
There are a variety of services out there that make it easy for anyone to set up their own "cloud". From Google Drive for storage to Medium for blogs, there are unlimited options in putting content out there. So aside as a learning experience, why would you take on the burden of running a server on your own machine? There are a variety of services out there that make it easy for anyone to set up their own "cloud". From Google Drive for storage to Medium for blogs, there are unlimited options in putting content out there. So aside as a learning experience, why would you take on the burden of running a server on your own machine?
<!-- excerpt --> <!-- more -->
## Greater control ## Greater control

View File

@ -2,20 +2,20 @@
title: "Primoprod Progress Report 2" title: "Primoprod Progress Report 2"
date: "2022-01-15" date: "2022-01-15"
tags: tags:
- blog
- tech - tech
- primoprod - primoprod
--- ---
Six months have passed since the [first progress report](https://eggworld.tk/posts/2021/08/primoprod-progress-report/). Since then, a flood of changes have made it in, including hundredth-class Android support! Six months have passed since the [first progress report](/blog/2021/primoprod-progress-report/). Since then, a flood of changes have made it in, including hundredth-class Android support!
This report will cover from where the previous left off to the present day: 21 August 2021 - 15 January 2022. This report will cover from where the previous left off to the present day: 21 August 2021 - 15 January 2022.
<!-- excerpt --> <!-- more -->
## No more ## No more
{% asset_img "primoprod-itemrevealscreen.png" %} ::image{src="primoprod-itemrevealscreen.png"}
::
It's done. The pull screen is done. The element/weapon icon was added to the pull. Audio syncs up (well enough). The only thing missing is all of the fancy effects like glow and particles. It's done. The pull screen is done. The element/weapon icon was added to the pull. Audio syncs up (well enough). The only thing missing is all of the fancy effects like glow and particles.
@ -23,7 +23,8 @@ Nah, this is good enough.
## Take this! ## Take this!
{% asset_img "primoprod-questscreen.png" %} ::image{src="primoprod-questscreen.png"}
::
Until now, you had to manually edit the browser's `localStorage` to gain any currency. The quest screen makes primoprod finally usable as now you can make your own long-term "quests" that give 900 Primogems each as well as set four daily "tasks" that give 30 Primogems each plus 60 when all are done — if only the base game was this generous. These are editable and can have whatever title or description you want. The logic here went through several rewrites as the structure was finalised and an interface developed to the rest of primoprod. Dailies will automatically refresh themselves on the next day. Until now, you had to manually edit the browser's `localStorage` to gain any currency. The quest screen makes primoprod finally usable as now you can make your own long-term "quests" that give 900 Primogems each as well as set four daily "tasks" that give 30 Primogems each plus 60 when all are done — if only the base game was this generous. These are editable and can have whatever title or description you want. The logic here went through several rewrites as the structure was finalised and an interface developed to the rest of primoprod. Dailies will automatically refresh themselves on the next day.
@ -55,7 +56,8 @@ Sounds incredible, right? As it turns out, as you gain more experience with tech
This is why [the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ShopScreen.vue) and the [dialog to buy things from the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemPurchaseOverlay.vue) are so nicely done! It reused most of my types and was admittedly much simpler than some of the other screens, but I only ran into one insurmountable problem: range styling. This is why [the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ShopScreen.vue) and the [dialog to buy things from the shop](https://github.com/potatoeggy/primoprod/blob/master/src/components/ItemPurchaseOverlay.vue) are so nicely done! It reused most of my types and was admittedly much simpler than some of the other screens, but I only ran into one insurmountable problem: range styling.
{% asset_img "primoprod-itempurchaseoverlay.png" %} ::image{src="primoprod-itempurchaseoverlay.png"}
::
*I wish I was actually this rich in the base game.* *I wish I was actually this rich in the base game.*
@ -65,7 +67,8 @@ As you can see, the slider looks very out of place. Why? That's because [only Fi
Up until now, only one banner was supported. This was finally fixed in November with the addition of [banner headers](https://github.com/potatoeggy/primoprod/pull/25) to match the base game. Now, you can simultaneously roll for Qiqi on *both* banners! Up until now, only one banner was supported. This was finally fixed in November with the addition of [banner headers](https://github.com/potatoeggy/primoprod/pull/25) to match the base game. Now, you can simultaneously roll for Qiqi on *both* banners!
![img](http://localhost:8080/img/selected-wanderlust-invocation.2a74d787.png) ::image{src="selected-wanderlust-invocation.webp"}
::
On a side note, did you know that Vue puts all of their reactive things into Proxies? This means you can't simply `console.log(obj)` without going through five more clicks to find what you actually want. No, no. To properly print out the actual object, you have to *copy its contents to a clean, non-reactive Object* for this to work. Why?? On a side note, did you know that Vue puts all of their reactive things into Proxies? This means you can't simply `console.log(obj)` without going through five more clicks to find what you actually want. No, no. To properly print out the actual object, you have to *copy its contents to a clean, non-reactive Object* for this to work. Why??
@ -124,7 +127,8 @@ Back to laptop compilation we go!
Obviously, you aren't a *real* free and open source project if you don't have [pretty badges](https://github.com/potatoeggy/primoprod/blob/master/README.md) on your README. This was a major concern, so I copied Vue's style and now made primoprod a proper FOSS repo — build checkmark and badges and all! Obviously, you aren't a *real* free and open source project if you don't have [pretty badges](https://github.com/potatoeggy/primoprod/blob/master/README.md) on your README. This was a major concern, so I copied Vue's style and now made primoprod a proper FOSS repo — build checkmark and badges and all!
{% asset_img "primoprod-badges.png" %} ::image{src="primoprod-badges.png"}
::
## Kids and their phones ## Kids and their phones
@ -136,7 +140,8 @@ ItemRevealScreen? What's that? Now [WishBanners](https://github.com/potatoeggy/p
At last, though, we have a [proper mobile UI](https://github.com/potatoeggy/primoprod/pull/33). At last, though, we have a [proper mobile UI](https://github.com/potatoeggy/primoprod/pull/33).
{% asset_img "mobile-primoprod.png" %} ::image{src="mobile-primoprod.png"}
::
Still some niggles to work out, but it looks "good enough"! With the completion of proper mobile orientation came the merging of the [Android branch](https://github.com/potatoeggy/primoprod/pull/32) made with [Capacitor.js](https://capacitorjs.com/), basically the mobile equivalent of Electron. It has even more niggles than the web version does. Still some niggles to work out, but it looks "good enough"! With the completion of proper mobile orientation came the merging of the [Android branch](https://github.com/potatoeggy/primoprod/pull/32) made with [Capacitor.js](https://capacitorjs.com/), basically the mobile equivalent of Electron. It has even more niggles than the web version does.

View File

@ -1,18 +1,17 @@
--- ---
title: "BSSCC Linux Scavenger Hunt - Solutions" title: "BSSCC Linux Scavenger Hunt - Solutions"
date: "2022-04-07" date: 2022-04-07
tags: tags:
- blog
- tech - tech
- bsscc - bsscc
--- ---
SPOILERS if you haven't completed it. SPOILERS if you haven't completed it.
<!-- excerpt -->
Assume all part 1 commands here are run in the home directory. Assume all part 2 commands are run in the `part2` directory. Assume all part 1 commands here are run in the home directory. Assume all part 2 commands are run in the `part2` directory.
<!-- more -->
## Clue 1 ## Clue 1
#### Solution #### Solution

View File

@ -3,13 +3,13 @@ title: A Snowball Grows
date: 2021-01-29 date: 2021-01-29
tags: tags:
- poetry - poetry
- literature
--- ---
White falls from the sky \ White falls from the sky \
onto a mountain \ onto a mountain \
and so a snowball grows. and so a snowball grows.
<!-- excerpt -->
<!-- more -->
White falls from the sky \ White falls from the sky \
on the village beside \ on the village beside \

View File

@ -2,8 +2,10 @@
title: Run On title: Run On
date: 2020-04-16 date: 2020-04-16
tags: tags:
- literature - complete nonsense
- you could say that the story *ran on* badumtiss
- these are like ao3 tags now
nopreview: true
--- ---
I was running from a dark thing and it was all horrible when my eyes snapped open and I looked at my alarm clock, which said that it was ten in the morning, which meant that I was going to be late for school unless I teleported back in time, so I got up and rushed to put on my clothes and do everything, then I didnt even eat breakfast as I rushed to school before realising I could use my magical powers that I could as soon as I turned eleven to turn back time and avoid all this mess, so thats what I did, but only after I actually ate breakfast and took my time, then I looked deep into myself and used my powers from friendship and determination to go back three hours (my friends were the bestest ever after I saved their lives using my magical powers), and I walked calmly to school, trying not to blush at my boyfriend (who is actually the hottest werewolf ever) when he suddenly popped out of nowhere, and I clutched his hand because I loved him so much, then he said, “oh hi babe whats up?” then I said, “oh nothing,” then I giggled because he was so funny and then he laughed because I laughed then I laughed because he was laughing because I was giggling and everything was awesome, until suddenly a tree burst from the ground and we couldnt get to school because suddenly there were tree monsters everywhere and I got scared but I knew that John (the werewolf) would protect me because he was a werewolf and so he transformed into a blue wolf (the rarest and most powerful kind) and after that he used his magical powers to vaporise the tree monsters with flashes of light and they all disappeared, and then I hugged him because I was scared and I said, “I was scared, thank you,” to which he said, “oh its nothing I would always protect you, my love,” and then I giggled again because he was being so cute, so I stared into his brilliant blue eyes which I only just realised matched the colour of his wolf form and admired all his really big muscles which would save me from any tree monster, but then suddenly he tensed and I realised that he was tense so I ran behind him again and peeked out from behind his shoulder and saw that something terrible appeared (even worse than tree monsters!), it was a ghost, and that was the first time I saw my boyfriend scared, which I could feel using my psychic powers so I told him telepathically that it was going to be ok and I could handle it using my dark powers which were super effective against psychics, and I focused really hard but nothing happened, so I thought of the strong bond that I had with all my friends and begged them for their help because there was this ghost and it could destroy the world, then they sent all their power and my eyes glowed as I tapped into a part of my power that i had never seen before, but it was now unlocked because of my friends determination and courage that flowed through my veins, as a white light burst from my hands that I held outstretched in front of me when I realised that this was the dark thing I was running from in my dream this morning, which I would finally kill because of the power of my friends that I had to see at school today, and I shouted as I killed the ghost, “omae wa mo shindeiru,” and it exploded and so we celebrated with my friends and they were all super impressed as I told the story and smiled at my hot boyfriend. I was running from a dark thing and it was all horrible when my eyes snapped open and I looked at my alarm clock, which said that it was ten in the morning, which meant that I was going to be late for school unless I teleported back in time, so I got up and rushed to put on my clothes and do everything, then I didnt even eat breakfast as I rushed to school before realising I could use my magical powers that I could as soon as I turned eleven to turn back time and avoid all this mess, so thats what I did, but only after I actually ate breakfast and took my time, then I looked deep into myself and used my powers from friendship and determination to go back three hours (my friends were the bestest ever after I saved their lives using my magical powers), and I walked calmly to school, trying not to blush at my boyfriend (who is actually the hottest werewolf ever) when he suddenly popped out of nowhere, and I clutched his hand because I loved him so much, then he said, “oh hi babe whats up?” then I said, “oh nothing,” then I giggled because he was so funny and then he laughed because I laughed then I laughed because he was laughing because I was giggling and everything was awesome, until suddenly a tree burst from the ground and we couldnt get to school because suddenly there were tree monsters everywhere and I got scared but I knew that John (the werewolf) would protect me because he was a werewolf and so he transformed into a blue wolf (the rarest and most powerful kind) and after that he used his magical powers to vaporise the tree monsters with flashes of light and they all disappeared, and then I hugged him because I was scared and I said, “I was scared, thank you,” to which he said, “oh its nothing I would always protect you, my love,” and then I giggled again because he was being so cute, so I stared into his brilliant blue eyes which I only just realised matched the colour of his wolf form and admired all his really big muscles which would save me from any tree monster, but then suddenly he tensed and I realised that he was tense so I ran behind him again and peeked out from behind his shoulder and saw that something terrible appeared (even worse than tree monsters!), it was a ghost, and that was the first time I saw my boyfriend scared, which I could feel using my psychic powers so I told him telepathically that it was going to be ok and I could handle it using my dark powers which were super effective against psychics, and I focused really hard but nothing happened, so I thought of the strong bond that I had with all my friends and begged them for their help because there was this ghost and it could destroy the world, then they sent all their power and my eyes glowed as I tapped into a part of my power that i had never seen before, but it was now unlocked because of my friends determination and courage that flowed through my veins, as a white light burst from my hands that I held outstretched in front of me when I realised that this was the dark thing I was running from in my dream this morning, which I would finally kill because of the power of my friends that I had to see at school today, and I shouted as I killed the ghost, “omae wa mo shindeiru,” and it exploded and so we celebrated with my friends and they were all super impressed as I told the story and smiled at my hot boyfriend.

View File

@ -4,13 +4,13 @@ date: 2020-06-22
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Imperial Palace\ Imperial Palace\
1 Kansei Road\ 1 Kansei Road\
Emina, Asvyn Emina, Asvyn
<!-- excerpt -->
<!-- more -->
Mr. Brendan May\ Mr. Brendan May\
Chairman\ Chairman\

View File

@ -3,14 +3,14 @@ title: Crystal
date: 2020-06-13 date: 2020-06-13
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
The dark green sun shone on forests of the clearest blue as the rivers of the brightest yellow trickled down the hilly landscape. Unicorn after unicorn pranced alongside the riverbank, frolicking around. I hid in one of the bushes, not daring to take a breath as their playful behaviour brought them closer and closer to my hand. The dark green sun shone on forests of the clearest blue as the rivers of the brightest yellow trickled down the hilly landscape. Unicorn after unicorn pranced alongside the riverbank, frolicking around. I hid in one of the bushes, not daring to take a breath as their playful behaviour brought them closer and closer to my hand.
<!-- excerpt -->
*Just a little more…* *Just a little more…*
<!-- more -->
Right before I reached out to pet what would have been the most luxurious fur ever to be felt by mankind, my dreams were shattered. A sudden weight pressed upon my chest, and pain spasmed throughout my body before I opened my eyes to see my younger brother on my chest, grinning at my suffering. Right before I reached out to pet what would have been the most luxurious fur ever to be felt by mankind, my dreams were shattered. A sudden weight pressed upon my chest, and pain spasmed throughout my body before I opened my eyes to see my younger brother on my chest, grinning at my suffering.
“Jordan,” I groaned, slowly laying my head back down on my pillow, “now what did you have to do that for?” I reached for the edge of my blanket, trying to pull it over my head to escape the wrath of the evil sunbeams streaming through my window. “Jordan,” I groaned, slowly laying my head back down on my pillow, “now what did you have to do that for?” I reached for the edge of my blanket, trying to pull it over my head to escape the wrath of the evil sunbeams streaming through my window.

View File

@ -4,12 +4,10 @@ date: 2020-06-29
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Laveli Guild Headquarters\ Laveli Guild Headquarters\
Laveli Town, Eos Laveli Town, Eos
<!-- excerpt -->
Emp. Hina Asvyn\ Emp. Hina Asvyn\
Empress Regnant\ Empress Regnant\
@ -17,6 +15,8 @@ Asvish Empire\
1 Kansei Road\ 1 Kansei Road\
Emina, Asvyn Emina, Asvyn
<!-- more -->
Upon reviewing your first set of proposals regarding Asvyn's withdrawal from the Enigma Alliance ("the Alliance"), Eos would like to raise some concerns in sections 1 (one) and 3 (three). Upon reviewing your first set of proposals regarding Asvyn's withdrawal from the Enigma Alliance ("the Alliance"), Eos would like to raise some concerns in sections 1 (one) and 3 (three).
- To protect the sovereignty of Eos, Eos cannot permit "all regions of neighbouring Enigma territories within 10 (ten) kilometres of Asvyn" to be ceded to the Asvish Empire. Eos is open to further discussion to clearly define borders. - To protect the sovereignty of Eos, Eos cannot permit "all regions of neighbouring Enigma territories within 10 (ten) kilometres of Asvyn" to be ceded to the Asvish Empire. Eos is open to further discussion to clearly define borders.

View File

@ -4,11 +4,11 @@ date: 2020-07-01
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
A huge uproar erupts from the crowds of Saiyu as the results of the 2020 Weilamese election are revealed to the world. A huge uproar erupts from the crowds of Saiyu as the results of the 2020 Weilamese election are revealed to the world.
<!-- excerpt -->
<!-- more -->
"…and your new President of Weilam until 2024 is…Roy Tamino!" "…and your new President of Weilam until 2024 is…Roy Tamino!"

View File

@ -4,14 +4,14 @@ date: 2020-07-02
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Trumpets blare around the royal procession as Princess Dazel bows down in front of her father. Trumpets blare around the royal procession as Princess Dazel bows down in front of her father.
<!-- excerpt -->
"My daughter, what news have you brought for us today?" King Rambel Bheosetrawpe Mydrule leers imposingly in his startling green robes, staring down at the princess. "My daughter, what news have you brought for us today?" King Rambel Bheosetrawpe Mydrule leers imposingly in his startling green robes, staring down at the princess.
<!-- more -->
"Father, I have returned from the Waterfall of Fate, but…" Dazel lowers her head further, "I could not awaken my power." "Father, I have returned from the Waterfall of Fate, but…" Dazel lowers her head further, "I could not awaken my power."
The king lets out a long sigh, mouth set in a firm line, then places his hand on his daughter's shoulder, beckoning for her to stand up. "Rise, Dazel. We shall discuss this matter further in a more…secluded area." The king lets out a long sigh, mouth set in a firm line, then places his hand on his daughter's shoulder, beckoning for her to stand up. "Rise, Dazel. We shall discuss this matter further in a more…secluded area."

View File

@ -3,16 +3,16 @@ title: Honour
date: 2020-07-06 date: 2020-07-06
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
"Arro, since you're going to be the saviour of our world, you just have to know one thing. Under *no* circumstance will you reveal your abilities. Even though you held a *press conference* yesterday, there's still a chance we can keep you hidden a little longer. Is that clear?" "Arro, since you're going to be the saviour of our world, you just have to know one thing. Under *no* circumstance will you reveal your abilities. Even though you held a *press conference* yesterday, there's still a chance we can keep you hidden a little longer. Is that clear?"
<!-- excerpt -->
Arro nodded his head quickly. "Yes, sir. I'll make sure I only control one element in front of people." Arro nodded his head quickly. "Yes, sir. I'll make sure I only control one element in front of people."
"Good child," his master said, patting his head. "You understand what must be done." "Good child," his master said, patting his head. "You understand what must be done."
<!-- more -->
------ ------
"Welcome to the 2020 Kolaltan Magic Championship! We're going to start off with—on my left over here—the Groundhogs versus—on my right—the Electric Boogaloos!" The announcer gestured wildly at the two teams of five heading from opposite ends of the arena. The crowd cheered exuberantly. Arro, as the leader of the Electric Boogaloos, confidently smirked at the Groundhogs. "Welcome to the 2020 Kolaltan Magic Championship! We're going to start off with—on my left over here—the Groundhogs versus—on my right—the Electric Boogaloos!" The announcer gestured wildly at the two teams of five heading from opposite ends of the arena. The crowd cheered exuberantly. Arro, as the leader of the Electric Boogaloos, confidently smirked at the Groundhogs.

View File

@ -4,11 +4,11 @@ date: 2020-06-25
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
It is — unethical and *deeply* immoral to block our people from knowledge. Is Leeco not a free tribe? Do we not accept those in pursuit of information? We cannot block our citizens from learning more about the universe to further the human race. Our tribe was founded on the principle of helping each other learn and grow by education. We cannot learn if we never challenge our beliefs, no matter how deep their roots lie — you might remember how ingrained racism was in Leeco so many decades back — and we cannot grow as a society if we resist change! If we do not rapidly adapt to the world, the world will rapidly adapt around us. And that is unacceptable. It is — unethical and *deeply* immoral to block our people from knowledge. Is Leeco not a free tribe? Do we not accept those in pursuit of information? We cannot block our citizens from learning more about the universe to further the human race. Our tribe was founded on the principle of helping each other learn and grow by education. We cannot learn if we never challenge our beliefs, no matter how deep their roots lie — you might remember how ingrained racism was in Leeco so many decades back — and we cannot grow as a society if we resist change! If we do not rapidly adapt to the world, the world will rapidly adapt around us. And that is unacceptable.
<!-- excerpt -->
<!-- more -->
In order to face the changing world, we must cease our aimless — no, *destructive* actions of what can only be described as censorship — and allow Leecans to learn and share their knowledge of any topic they wish to! It is not the duty of that government to restrict what art or science one learns. It is not the responsibility of the government to hold still our way of life. The *people* influence the government, certainly not the other way around. To claim so is to be utterly incorrect in a free and just tribe. In order to face the changing world, we must cease our aimless — no, *destructive* actions of what can only be described as censorship — and allow Leecans to learn and share their knowledge of any topic they wish to! It is not the duty of that government to restrict what art or science one learns. It is not the responsibility of the government to hold still our way of life. The *people* influence the government, certainly not the other way around. To claim so is to be utterly incorrect in a free and just tribe.

View File

@ -4,13 +4,13 @@ date: 2020-06-19
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
*Test 19/20 failed: Memory access violation.* *Test 19/20 failed: Memory access violation.*
I let out a loud exhale as my fingers twitched in front of the keyboard. Someone else walked by. I let out a loud exhale as my fingers twitched in front of the keyboard. Someone else walked by.
<!-- excerpt -->
<!--more-->
“Um, Siava, are you all right?” “Um, Siava, are you all right?”

View File

@ -4,16 +4,16 @@ date: 2020-07-22
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
"…preserve, protect, and defend the Constitution of Weilam." "…preserve, protect, and defend the Constitution of Weilam."
<!-- excerpt -->
"…preserve, protect, and defend the Constitution of Weilam," I repeated. "…preserve, protect, and defend the Constitution of Weilam," I repeated.
"Congratulations, Mr. President," said the Chief Justice. I nodded, raising my hand above my head to take the taller man's hand. As we were released from the handshake, I took my other hand and waved at the crowd, who burst into cheers. "Congratulations, Mr. President," said the Chief Justice. I nodded, raising my hand above my head to take the taller man's hand. As we were released from the handshake, I took my other hand and waved at the crowd, who burst into cheers.
<!-- more -->
Standing off to the side, my parents tearfully clutched each other tightly, their faces smiling but white. Standing off to the side, my parents tearfully clutched each other tightly, their faces smiling but white.
My friends from school had gathered on the sidewalk. I thought I heard them cheering the loudest. My friends from school had gathered on the sidewalk. I thought I heard them cheering the loudest.

View File

@ -4,18 +4,18 @@ date: 2020-08-20
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Saiyu Sphere\ Saiyu Sphere\
1 Indigo Boulevard\ 1 Indigo Boulevard\
Saiyu, Weilam Saiyu, Weilam
<!-- excerpt -->
Mrs. Rio Nohigi\ Mrs. Rio Nohigi\
Prime Minister\ Prime Minister\
1 Apelio Avenue\ 1 Apelio Avenue\
Ciers Ciers
<!-- more -->
This letter is to inform you that Eos will not be able to hold this year's Continental Summit. The explosion detonated by Ptuyo has crippled large parts of the tribe, and I am deeply sorry to determine that this makes Eos unsafe for a gathering of world leaders. As per section 6 of the Saiyu Peace Agreement, responsibility for the organisation of the Summit will be transferred to Ciers. This letter is to inform you that Eos will not be able to hold this year's Continental Summit. The explosion detonated by Ptuyo has crippled large parts of the tribe, and I am deeply sorry to determine that this makes Eos unsafe for a gathering of world leaders. As per section 6 of the Saiyu Peace Agreement, responsibility for the organisation of the Summit will be transferred to Ciers.
This letter was sent on behalf of Eos by accelerated approval from the Ean High Representative of the Enigmatic Council. This letter was sent on behalf of Eos by accelerated approval from the Ean High Representative of the Enigmatic Council.

View File

@ -4,14 +4,14 @@ date: 2020-06-23
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
"Good morning, citizens of Ptuyo!" "Good morning, citizens of Ptuyo!"
<!-- excerpt -->
My phone's screen flickers once as the video I'm watching is replaced by the face of a young man with glasses, luxurious golden locks, and an exquisite moustache: Riley, Director of Public Affairs in our tribe. "I do hope you're all having a great day so far," he says excitedly, "but I'm afraid I must interrupt you for an important message from our Supreme Leader, Sebastian." My phone's screen flickers once as the video I'm watching is replaced by the face of a young man with glasses, luxurious golden locks, and an exquisite moustache: Riley, Director of Public Affairs in our tribe. "I do hope you're all having a great day so far," he says excitedly, "but I'm afraid I must interrupt you for an important message from our Supreme Leader, Sebastian."
<!-- more -->
Riley's face vanishes from my phone, and I take a moment to look around at everyone else. They're attached to their phones, too. Sebastian's stubbled face appears on all our displays. His grin is enthusiastic, and he spreads his hands at the camera before speaking. Riley's face vanishes from my phone, and I take a moment to look around at everyone else. They're attached to their phones, too. Sebastian's stubbled face appears on all our displays. His grin is enthusiastic, and he spreads his hands at the camera before speaking.
"Thank you, Riley! I know you're all doing really important things, but I'm afraid that I've got really important news! Right after this message from our Director of Defense, it's the one and only…Crow!" "Thank you, Riley! I know you're all doing really important things, but I'm afraid that I've got really important news! Right after this message from our Director of Defense, it's the one and only…Crow!"

View File

@ -4,16 +4,16 @@ date: 2020-06-20
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Light from the morning sun gently shone across my face as my curtains automatically opened to the start of the day. A steady beeping infiltrated my ears, rousing me from my sleep. Light from the morning sun gently shone across my face as my curtains automatically opened to the start of the day. A steady beeping infiltrated my ears, rousing me from my sleep.
<!-- excerpt -->
“Good morning, Alston. It is seven in the morning.” “Good morning, Alston. It is seven in the morning.”
I rubbed my eyes and sat up, stretching to get the sleep out of my muscles. “Good morning to you too, Bixby. What do I have on my schedule today?” I rubbed my eyes and sat up, stretching to get the sleep out of my muscles. “Good morning to you too, Bixby. What do I have on my schedule today?”
<!-- more -->
As I headed to my bathroom to freshen up leaving my house, my personal assistant said, “You have: one meeting with the Technological Officer of Demauge to discuss continuing exchanges of technology and information between Demauge and Xunil.” As I headed to my bathroom to freshen up leaving my house, my personal assistant said, “You have: one meeting with the Technological Officer of Demauge to discuss continuing exchanges of technology and information between Demauge and Xunil.”
I looked up from the heated toilet seat I had just sat down on. “Is that it?” I looked up from the heated toilet seat I had just sat down on. “Is that it?”

View File

@ -4,10 +4,9 @@ date: 2020-06-30
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Welcome to Herdit's Social Education Course! As the successful completion of this course is compulsory for acquiring citizenship in Herdit, we hope you learn from your experience in this program. Welcome to Herdit's Social Education Course! As the successful completion of this course is compulsory for acquiring citizenship in Herdit, we hope you learn from your experience in this program.
<!-- excerpt --> <!-- more -->
When you are admitted into Herdit, you will receive your very own hPhone, provided free-of-charge from the government! This phone comes with unlimited access to the internet as well as 500 gigabytes of storage for all your personal data. Herdit will use your hPhone to collect data for the sole purpose of adjusting your karmic score, colloquially known by the population as "karma". We use end-to-end encryption to keep all your data safe and secure on our servers. When you are admitted into Herdit, you will receive your very own hPhone, provided free-of-charge from the government! This phone comes with unlimited access to the internet as well as 500 gigabytes of storage for all your personal data. Herdit will use your hPhone to collect data for the sole purpose of adjusting your karmic score, colloquially known by the population as "karma". We use end-to-end encryption to keep all your data safe and secure on our servers.

View File

@ -3,14 +3,14 @@ title: Save File
date: 2020-07-22 date: 2020-07-22
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
The sun shone brightly through an open window and its rays bounced happily around Peanut's house before slamming into his eyes. The sun shone brightly through an open window and its rays bounced happily around Peanut's house before slamming into his eyes.
<!-- excerpt -->
"Argh!" Peanut shut his eyes, holding back a few tears. "Stupid sun… Let me play my games!" "Argh!" Peanut shut his eyes, holding back a few tears. "Stupid sun… Let me play my games!"
<!-- more -->
The sun no longer shone through the open window, its rays instead slamming into the thick curtains draped over the opening. Darkness reigned in the room for only a moment before electric lights illuminated a sleek-looking desktop computer setup. Sitting on a glossy wooden table, three large monitors displayed a video, collage of applications, and the desktop wallpaper, respectively. The sun no longer shone through the open window, its rays instead slamming into the thick curtains draped over the opening. Darkness reigned in the room for only a moment before electric lights illuminated a sleek-looking desktop computer setup. Sitting on a glossy wooden table, three large monitors displayed a video, collage of applications, and the desktop wallpaper, respectively.
Peanut blinked a few times to get the black spots out of his eyes, reclining all the way back in his gaming chair. It took a minute, but eventually he had dabbed all his salty eye fluids away. "Now, how do I install this…" he said, going back to clicking through his folder and files. "Maybe if I get rid of this and try again?" Peanut blinked a few times to get the black spots out of his eyes, reclining all the way back in his gaming chair. It took a minute, but eventually he had dabbed all his salty eye fluids away. "Now, how do I install this…" he said, going back to clicking through his folder and files. "Maybe if I get rid of this and try again?"

View File

@ -3,12 +3,13 @@ title: Slush
date: 2020-07-29 date: 2020-07-29
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
I poked at the green slush dripping down the table with a metal rod. "What…is this? It looks pretty tasty." I poked at the green slush dripping down the table with a metal rod. "What…is this? It looks pretty tasty."
<!-- excerpt -->
Dr. Brown grinned maniacally. "Why, it's my patented magic alien slush, of course! What else *could* it be?" Dr. Brown grinned maniacally. "Why, it's my patented magic alien slush, of course! What else *could* it be?"
<!-- more -->
The metal rod was instantly flung into the nearest hazardous waste disposal unit. "Huh. I thought it was a lime-flavoured snow cone. It looks pretty good, you know…" The metal rod was instantly flung into the nearest hazardous waste disposal unit. "Huh. I thought it was a lime-flavoured snow cone. It looks pretty good, you know…"
The doctor waved a finger at me, shaking his head. "The mystic slush is not for human consumption, my good man. It is the key to solving all the world's problems! It contains power you would not believe! We shall conquer the world with the slush—well, maybe not conquer, but we will save it, my friend!" The doctor waved a finger at me, shaking his head. "The mystic slush is not for human consumption, my good man. It is the key to solving all the world's problems! It contains power you would not believe! We shall conquer the world with the slush—well, maybe not conquer, but we will save it, my friend!"

View File

@ -4,11 +4,11 @@ date: 2020-06-14
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
I confidently strode up to my teacher, a fistful of papers in my left hand. Mrs. Lowshi smiled as I approached. “Good morning, Bobby. Are you here to hand in yesterdays homework?” I confidently strode up to my teacher, a fistful of papers in my left hand. Mrs. Lowshi smiled as I approached. “Good morning, Bobby. Are you here to hand in yesterdays homework?”
<!-- excerpt -->
<!-- more -->
Well, I had been playing video games all night. What use was homework anyway? I put on as convincing of a disappointed face as I could. “Im so sorry, Mrs. Lowshi, but I couldnt do it. Every time I tried, my dog ate it! Heres all I could salvage from his paper-thirsty mouth…” The fistful of shredded paper was dropped on Mrs. Lowshis desk, who brought hands up to her mouth in horror. Well, I had been playing video games all night. What use was homework anyway? I put on as convincing of a disappointed face as I could. “Im so sorry, Mrs. Lowshi, but I couldnt do it. Every time I tried, my dog ate it! Heres all I could salvage from his paper-thirsty mouth…” The fistful of shredded paper was dropped on Mrs. Lowshis desk, who brought hands up to her mouth in horror.

View File

@ -3,13 +3,12 @@ title: Wet Hair
date: 2020-06-26 date: 2020-06-26
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
*Splash!* *Splash!*
A flying projectile hits the back of Cloche's head. It explodes, soaking her whole body as she lurches forward from the impact, which is not quite strong enough to cause any lasting pain. She pauses for a moment, then slowly turns around to face the perpetrator. A flying projectile hits the back of Cloche's head. It explodes, soaking her whole body as she lurches forward from the impact, which is not quite strong enough to cause any lasting pain. She pauses for a moment, then slowly turns around to face the perpetrator.
<!-- excerpt --> <!-- more -->
Garson is smiling obliviously at her inner demons, and laughs at her misfortune. Garson is smiling obliviously at her inner demons, and laughs at her misfortune.

View File

@ -3,17 +3,16 @@ title: A Favour II
date: 2021-07-27 date: 2021-07-27
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
*Ring…ring…ring…* *Ring…ring…ring…*
Yellow! Are you there? Yellow! Are you there?
<!-- excerpt -->
Sorry, it's not about League today, haha. I was just talking to Blue the other day. Sorry, it's not about League today, haha. I was just talking to Blue the other day.
<!-- more -->
Listen, I think something's up with him. His voice was weird and raspy and there was clearly glass breaking in the background. He said it was Fortnite? I remember you were his best friend in university; do you know why he'd suddenly need a lot of money, by any chance? I know he wouldn't do anything like…*that*, but… Listen, I think something's up with him. His voice was weird and raspy and there was clearly glass breaking in the background. He said it was Fortnite? I remember you were his best friend in university; do you know why he'd suddenly need a lot of money, by any chance? I know he wouldn't do anything like…*that*, but…
Oh! That's good to hear. When my boyfriend dropped off the money he wanted, he mentioned that the place felt super shady, so I thought maybe… Oh! That's good to hear. When my boyfriend dropped off the money he wanted, he mentioned that the place felt super shady, so I thought maybe…

View File

@ -3,19 +3,18 @@ title: A Favour
date: 2021-06-20 date: 2021-06-20
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
*Ring…ring…ring…* *Ring…ring…ring…*
Hello? Hello?
<!-- excerpt -->
Oh, Blue! I almost didn't recognise your voice; it's been forever since we chatted! How've you been doing? Oh, Blue! I almost didn't recognise your voice; it's been forever since we chatted! How've you been doing?
Yeah, I know you have work and all, but…it's been, what, a year since we last played League together and it'd be great to get together again — remember that time when you were killed by a minion at bottom — Yeah, I know you have work and all, but…it's been, what, a year since we last played League together and it'd be great to get together again — remember that time when you were killed by a minion at bottom —
<!-- more -->
You don't play anymore? That's…a shame. Right, work and everything. So, uh, what'd you want to talk about? You don't play anymore? That's…a shame. Right, work and everything. So, uh, what'd you want to talk about?
A favour? Sure! What is it? A favour? Sure! What is it?

View File

@ -4,14 +4,13 @@ date: 2021-05-21
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
"On the red side we have your ten-year undefeated champion, Ping Pong! And her challenger, Markus Tennis! Will this be the year that the Crowne Cup finally switches hands?" "On the red side we have your ten-year undefeated champion, Ping Pong! And her challenger, Markus Tennis! Will this be the year that the Crowne Cup finally switches hands?"
<!-- excerpt -->
The stadium roars as Ping Pong strides over the carpet onto the battlefield. Her stance is ready, eyes drilled into her opponent who merely stares blankly at her. "Let's have a good fight." The stadium roars as Ping Pong strides over the carpet onto the battlefield. Her stance is ready, eyes drilled into her opponent who merely stares blankly at her. "Let's have a good fight."
<!-- more -->
"Agreed." Markus raises his paddle, bouncing on his knees. "Show me what you've got." "Agreed." Markus raises his paddle, bouncing on his knees. "Show me what you've got."
The ball starts on Ping's side. All is quiet on this battlefield except for the clicks of cell phone cameras. The ball starts on Ping's side. All is quiet on this battlefield except for the clicks of cell phone cameras.

View File

@ -4,7 +4,6 @@ date: 2021-05-28
tags: tags:
- ibia - ibia
- unstagnation - unstagnation
- literature
--- ---
He took a deep breath. He took a deep breath.
@ -14,10 +13,10 @@ Samuel continued to empty and fill his lungs until his hands stopped shaking.
Today was the last day. Today was the last day.
<!-- excerpt -->
The day that their city would be saved, or set for ruin. The council had chosen him to be the one to deliver the message. The day that their city would be saved, or set for ruin. The council had chosen him to be the one to deliver the message.
<!-- more -->
Samuel wrapped his coat tighter around him and firmly shoved the door open with one hand, the other occupied with holding a rolled-up scroll bound with warm red wax. The warm light from the rising sun cast his shadow behind him, as if he was a hero about to set off on his journey. Samuel wrapped his coat tighter around him and firmly shoved the door open with one hand, the other occupied with holding a rolled-up scroll bound with warm red wax. The warm light from the rising sun cast his shadow behind him, as if he was a hero about to set off on his journey.
The grueling trail to the shrine was covered with snow, and the downpour of snow kept getting in Samuel's eyes, making it near-impossible to see the road in front of him. The only way he was able to tell which way he was slowly trudging through the snow was by following the wide, empty space that was free of the crowded trees typically found in the forest. The grueling trail to the shrine was covered with snow, and the downpour of snow kept getting in Samuel's eyes, making it near-impossible to see the road in front of him. The only way he was able to tell which way he was slowly trudging through the snow was by following the wide, empty space that was free of the crowded trees typically found in the forest.

View File

@ -4,19 +4,18 @@ date: 2021-05-25
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Renge Academy\ Renge Academy\
No address\ No address\
Biyori, Asvyn Biyori, Asvyn
<!-- excerpt -->
Hina Asvyn\ Hina Asvyn\
Empress\ Empress\
1 Kansei Road\ 1 Kansei Road\
Emina, Asvyn Emina, Asvyn
<!-- more -->
Empress, Empress,
With all due respect, as one of Your Majesty's principal advisors, the mass annexation of Enigmatic territories is not only in grave violation of Section 2 of the Enigma Agreement, but has also led to Empire forces being stretched far too thin across the nation. The Principal of Intelligence informs me that they are unable to conduct adequate surveillance to prevent uprising. Combined with the Favonius resistance and ongoing struggle against Asvish control from the previously Enigmatic territories, I urge you to reconsider the attack on further Enigmatic territories lest they fully commit to war — a war we will be unable to defend against. With all due respect, as one of Your Majesty's principal advisors, the mass annexation of Enigmatic territories is not only in grave violation of Section 2 of the Enigma Agreement, but has also led to Empire forces being stretched far too thin across the nation. The Principal of Intelligence informs me that they are unable to conduct adequate surveillance to prevent uprising. Combined with the Favonius resistance and ongoing struggle against Asvish control from the previously Enigmatic territories, I urge you to reconsider the attack on further Enigmatic territories lest they fully commit to war — a war we will be unable to defend against.

View File

@ -4,13 +4,12 @@ date: 2021-08-19
tags: tags:
- ibia - ibia
- unstagnation - unstagnation
- literature
--- ---
"…And never come back again, boy!" "…And never come back again, boy!"
You fall to the ground with an *oof!* as the bartender tosses you out of the tavern. Scowling, you yell behind his retreating back, "You're wrong! All of the goddess cities are wrong! The only way for people like us to prosper is to take control of our own lives!" You fall to the ground with an *oof!* as the bartender tosses you out of the tavern. Scowling, you yell behind his retreating back, "You're wrong! All of the goddess cities are wrong! The only way for people like us to prosper is to take control of our own lives!"
<!-- excerpt --> <!-- more -->
It's been only a few hours since you entered the goddess city of Baccalor, but since then you've been forcibly removed from nearly every business you've gone into. How incredibly rude — but to be expected of a goddess city, filled with entitled, lazy sheep who refuse to look ahead past the blindfold in front of their faces. It's been only a few hours since you entered the goddess city of Baccalor, but since then you've been forcibly removed from nearly every business you've gone into. How incredibly rude — but to be expected of a goddess city, filled with entitled, lazy sheep who refuse to look ahead past the blindfold in front of their faces.

View File

@ -3,16 +3,15 @@ title: Magic Paint Gun Cartridges
date: 2021-05-31 date: 2021-05-31
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
*Pew pew!* *Pew pew!*
Splotches of colour cover the previously white wall until a coherent picture forms. Splotches of colour cover the previously white wall until a coherent picture forms.
<!-- excerpt -->
"Success!" Minestro steps back from his magic paint gun to admire his freshly painted Nyan Cat. Illuminated by harsh fluorescent lighting, to either side of the pixel art cat and stretching for many metres are recreations of other memes. To the right of the paint gun lies a stack of papers whose contents have already been scanned and blasted on the walls. "Success!" Minestro steps back from his magic paint gun to admire his freshly painted Nyan Cat. Illuminated by harsh fluorescent lighting, to either side of the pixel art cat and stretching for many metres are recreations of other memes. To the right of the paint gun lies a stack of papers whose contents have already been scanned and blasted on the walls.
<!-- more -->
Minestro takes the last picture to the left of the paint gun mounted on his table and feeds it into a scanner sitting beside it. "Last one and that'll be it for the day." Minestro takes the last picture to the left of the paint gun mounted on his table and feeds it into a scanner sitting beside it. "Last one and that'll be it for the day."
As soon as the scanner spits the picture back out at him, the gun beeps angrily. Reading the text with a frown, Minestro curses the fallacy of printers of any kind still being utterly useless even with modern technology and magic. As soon as the scanner spits the picture back out at him, the gun beeps angrily. Reading the text with a frown, Minestro curses the fallacy of printers of any kind still being utterly useless even with modern technology and magic.

View File

@ -3,11 +3,10 @@ title: Nora
date: 2021-05-23 date: 2021-05-23
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
Long ago, the gods wiped themselves out in a magical war of epic proportions, leaving the world in ruins. The remnants of the forces escaped to the stars and skies above, but the carnage had lasting effects on Earth. The age of the gods was over. Long ago, the gods wiped themselves out in a magical war of epic proportions, leaving the world in ruins. The remnants of the forces escaped to the stars and skies above, but the carnage had lasting effects on Earth. The age of the gods was over.
<!-- excerpt --> <!-- more -->
Many millennia later, the very first animals appeared, along with humans. They built a civilisation with elemental skills granted to them by the latent energies in the ground but attributed to gods in the sky. Some were able to control the flow of the rivers. Some were able to breathe life into flames. Others still had the ability to raise the earth. Yet most were powerless against the beast animals that attacked the people. Many millennia later, the very first animals appeared, along with humans. They built a civilisation with elemental skills granted to them by the latent energies in the ground but attributed to gods in the sky. Some were able to control the flow of the rivers. Some were able to breathe life into flames. Others still had the ability to raise the earth. Yet most were powerless against the beast animals that attacked the people.
@ -27,6 +26,6 @@ He and I...
The domain of the gods is ever so lonely. The domain of the gods is ever so lonely.
<hr> ---
This Unstagnation short was heavily influenced by one of the works of Nettlespike. This Unstagnation short was heavily influenced by one of the works of Nettlespike.

View File

@ -4,13 +4,12 @@ date: 2021-05-30
tags: tags:
- ibia - ibia
- unstagnation - unstagnation
- literature
--- ---
"Please hurry, goddess." "Please hurry, goddess."
What was this human thinking, pushing her around to "hurry"? She was one of the seven goddesses of the world! Even if she couldn't smite him on the spot, there were at least five ways she could think of off the top of her head to torture him until he begged her for mercy. What was this human thinking, pushing her around to "hurry"? She was one of the seven goddesses of the world! Even if she couldn't smite him on the spot, there were at least five ways she could think of off the top of her head to torture him until he begged her for mercy.
<!-- excerpt --> <!-- more -->
"Was it Kemia? Histia? Tell me exactly what my sister said," she demanded as she followed the running Samuel through the snowy forest. "Was it Kemia? Histia? Tell me exactly what my sister said," she demanded as she followed the running Samuel through the snowy forest.

View File

@ -3,12 +3,11 @@ title: Student Over Teacher
date: 2021-06-13 date: 2021-06-13
tags: tags:
- unstagnation - unstagnation
- literature
--- ---
"You have failed our people for the last time, Rooster." Yammy's declaration was intensified by the kneeling man with his hands tied before him. Briefly, a hole parted in the grey cloud cover, allowing a single sunbeam to illuminate Yammy's face as he looked out at the crowd assembled in front of him. "Out with the old and in with the new, as they say," he chuckled. "You have failed our people for the last time, Rooster." Yammy's declaration was intensified by the kneeling man with his hands tied before him. Briefly, a hole parted in the grey cloud cover, allowing a single sunbeam to illuminate Yammy's face as he looked out at the crowd assembled in front of him. "Out with the old and in with the new, as they say," he chuckled.
<!-- excerpt --> <!-- more -->
"Just you wait," spat Rooster, an angry and determined expression on his face disregarding the foot pressing the side of his head into the wooden stage. "You'll run down the village just like every other leader before you. Mark my words, you'll be overthrown one day — and that is when I shall return from my exile and restore balance." "Just you wait," spat Rooster, an angry and determined expression on his face disregarding the foot pressing the side of his head into the wooden stage. "You'll run down the village just like every other leader before you. Mark my words, you'll be overthrown one day — and that is when I shall return from my exile and restore balance."

View File

@ -4,20 +4,19 @@ date: 2021-06-16
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
Maquiate Todofuken Administration Centre\ Maquiate Todofuken Administration Centre\
1 Todofuken Road\ 1 Todofuken Road\
Maquiate, Asvyn Maquiate, Asvyn
<!-- excerpt -->
Hina Asvyn\ Hina Asvyn\
Empress\ Empress\
1 Kansei Road\ 1 Kansei Road\
Emina, Asvyn Emina, Asvyn
<!-- more -->
Empress, Empress,
I am pleased to report that the negotiations with the recently Enigma-seceded region of Maquiate have concluded very much in the favour of the Empire. The region has pledged allegiance to Emina and are currently assisting in driving out rebellious forces with their sizable military. It is predicted that the Empire will be unified within several days with the reinforcements from Maquiate. I am pleased to report that the negotiations with the recently Enigma-seceded region of Maquiate have concluded very much in the favour of the Empire. The region has pledged allegiance to Emina and are currently assisting in driving out rebellious forces with their sizable military. It is predicted that the Empire will be unified within several days with the reinforcements from Maquiate.

View File

@ -4,19 +4,18 @@ date: 2021-05-24
tags: tags:
- barin - barin
- unstagnation - unstagnation
- literature
--- ---
The Sinamaria Rose\ The Sinamaria Rose\
12 Dedication Road\ 12 Dedication Road\
Emina, Asvyn Emina, Asvyn
<!-- excerpt -->
Hina Asvyn\ Hina Asvyn\
Empress\ Empress\
1 Kansei Road\ 1 Kansei Road\
Emina, Asvyn Emina, Asvyn
<!-- more -->
Empress, Empress,
It has been observed that some regions in the state have been discouraged by the pace of the withdrawal from the Enigma Alliance. There is a threat that is provoking citizens and sparking unrest in areas of greatest tension, pressuring them to conduct trade with Preton in breach of Section 1 of the Saiyu Agreement, which remains in force until withdrawal negotiations are concluded and signed. The group calls themselves "Favonius". A status report of the group's activities and their impacts on each region are listed below. It has been observed that some regions in the state have been discouraged by the pace of the withdrawal from the Enigma Alliance. There is a threat that is provoking citizens and sparking unrest in areas of greatest tension, pressuring them to conduct trade with Preton in breach of Section 1 of the Saiyu Agreement, which remains in force until withdrawal negotiations are concluded and signed. The group calls themselves "Favonius". A status report of the group's activities and their impacts on each region are listed below.

29
content/test.md Normal file
View File

@ -0,0 +1,29 @@
# HOI HOI
```js
export default defineNuxtConfig({
content: {
highlight: {
// Theme used in all color schemes.
theme: 'github-light'
// OR
theme: {
// Default theme (same as single string)
default: 'github-light',
// Theme used if `html.dark`
dark: 'github-dark',
// Theme used if `html.sepia`
sepia: 'monokai'
}
}
}
})
```
for some reason **it no** work
hey wtf
- list test
- list test
- list test

23
create
View File

@ -1,23 +0,0 @@
#/bin/bash
TITLE=$@
TITLEF=$(echo $TITLE | tr " " "-")
YEAR=$(date +"%Y")
MONTH=$(date +"%m")
mkdir -p "src/posts/$YEAR/$MONTH"
FILENAME="src/posts/$YEAR/$MONTH/$TITLEF.md"
cat <<EOF > $FILENAME
---
title: "$TITLE"
date: "$(date '+%Y-%m-%d')"
tags:
-
---
<!-- excerpt -->
EOF
echo "Created new post at $FILENAME"

7
data/navItems.ts Normal file
View File

@ -0,0 +1,7 @@
export const navItems = [
{ href: "/#about", title: "About" },
{ href: "/blog", title: "Blog" },
{ href: "/stories", title: "Stories" },
];
export default navItems;

125
data/projects.ts Normal file
View File

@ -0,0 +1,125 @@
export type Language =
| "python"
| "javascript"
| "java"
| "typescript"
| "vue"
| "react"
| "markdown"
| "flutter"
| "android";
export interface Project {
name: string;
href: string;
img?: string;
description?: string;
longDescription?: string;
langs: Language[];
license?: "AGPL-3.0" | "GPL-3.0" | "MIT" | "LGPL-3.0";
}
export const projects: Project[] = [
{
name: "Mandown",
href: "https://github.com/potatoeggy/mandown",
description:
"A comic downloader and converter to CBZ / EPUB / PDF for my Kobo.",
longDescription: "Available via CLI and a Qt GUI!",
langs: ["python"],
license: "LGPL-3.0",
img: "mandown.webp",
},
{
name: "Noveldown",
href: "https://github.com/potatoeggy/noveldown",
langs: ["python"],
license: "LGPL-3.0",
description:
"A webnovel downloader and converter to EPUB for my Kobo, with lots of metadata!",
longDescription: "Heavily borrows Mandown's design.",
},
{
name: "Jeopardy",
href: "https://github.com/potatoeggy/jeopardy",
img: "jeopardy.webp",
langs: ["typescript", "vue"],
license: "AGPL-3.0",
description: "Kahoot-inspired Jeopardy! game, including Final Jeopardy!",
longDescription: "Created for Bayview's Computer Club.",
},
{
name: "Primoprod",
href: "https://github.com/potatoeggy/primoprod",
img: "primoprod.webp",
langs: ["typescript", "vue"],
license: "AGPL-3.0",
description:
"A game simulator to increase productivity with quests and gambling.",
longDescription: "My first project with a JS framework!",
},
{
name: "Eifueo",
href: "https://github.com/potatoeggy/eifueo",
langs: ["markdown"],
license: "GPL-3.0",
img: "eifueo.webp",
description: "A collection of rewritten notes to remember things better.",
longDescription: "THIS IS NOT A TEXTBOOK.",
},
{
name: "Napbot",
href: "https://github.com/potatoeggy/napbot",
langs: ["python"],
license: "AGPL-3.0",
description:
"A Discord bot initially to track sleep hours as friendly competition but is now a local music bot with synchronised lyrics!",
img: "napbot.webp",
},
{
name: "Resketch",
href: "https://github.com/anyuan-chen/resketch",
langs: ["typescript", "react"],
img: "resketch.webp",
description:
'A "reverse-Pictionary" where you compete to have an AI recognise your drawings.',
longDescription: "Written for YRHacks 2022.",
},
{
name: "Perdiem",
href: "https://github.com/anyuan-chen/perdiem",
langs: ["javascript", "react"],
license: "AGPL-3.0",
img: "perdiem.webp",
description:
"A pretty budget tracking app where I learned too much about server-side rendering.",
longDescription: "Written for StormHacks 2022.",
},
{
name: "RecipeReady",
href: "https://github.com/christopherlam888/recipe-ready-frontend",
langs: ["python", "android", "flutter"],
img: "recipeready.webp",
description:
"Android app to automagically plan meals and prepare a shopping list so you don't have to.",
longDescription: "Written for Hack the North 2021.",
},
{
name: "AutoFicFare",
href: "https://github.com/potatoeggy/autoficfare",
langs: ["python"],
license: "GPL-3.0",
description:
"Automatically update fanfiction in a Calibre database to instantly update them on your Kobo.",
},
{
name: "Website",
href: "https://github.com/potatoeggy/public",
description:
"This website! It's gone through three iterations before this one, and this one's the first to use a framework.",
langs: ["typescript", "vue"],
license: "AGPL-3.0",
img: "public.webp",
},
];
export default projects;

31
data/tagInfo.ts Normal file
View File

@ -0,0 +1,31 @@
export interface TagData {
name?: string;
description?: string;
}
export const tagInfo: Record<string, TagData> = {
barin: { name: "Barin" },
bsscc: {
name: "BSSCC",
description: "Posts related to Bayview's Computer Club.",
},
ibia: { name: "Ibia" },
misc: { name: "Miscellaneous" },
poetry: {
name: "Poetry",
description:
"Poetry is interesting in that there is a lot of implied stuff that is normally said directly in prose.",
},
primoprod: {
name: "Primoprod",
description:
'Reports following the development of <a href="https://github.com/potatoeggy/primoprod">Primoprod</a>.',
},
tech: { name: "Technology" },
unstagnation: {
name: "Unstagnation Short",
description:
"A collection of very short stories written to do something productive during JuneAugust 2020 and August 2021.",
},
};
export default tagInfo;

81
layouts/default.vue Normal file
View File

@ -0,0 +1,81 @@
<script setup lang="ts">
useHead({ title: "Eggworld" });
</script>
<template>
<div class="flex flex-col items-center w-full h-full justify-between">
<Navbar />
<slot />
<footer
class="flex flex-col items-center p-3 bg-gray-100 w-full text-sm dark:bg-gray-800"
>
<p> 2022 Daniel Chen</p>
<p>
Licensed under the AGPL-3.0 on
<a class="underline" href="https://github.com/potatoeggy/public">
GitHub</a
>
and
<a class="underline" href="https://git.eggworld.tk/eggy/public">
Gitea
</a>
</p>
</footer>
</div>
<slot name="top-button" />
</template>
<style>
html {
background: white;
color: black;
transition: color 0.2s ease, background 0.2s ease;
overflow-x: hidden;
overflow-y: scroll;
scroll-behavior: smooth;
}
html.dark {
background: #222;
color: white;
}
html::before {
content: "";
position: fixed;
height: 100%;
width: 100%;
background: #222;
transform: translateX(-100%);
transition: transform 0.2s ease;
z-index: 0;
}
html.dark::before {
transform: translateX(0);
}
main {
width: 80%;
max-width: 60rem;
margin: auto;
padding-top: 2rem;
}
footer {
--footer-drop-color: lightgray;
transition: background 0.2s ease;
box-shadow: 0 -0.05rem 0.75rem 0 var(--footer-drop-color);
margin-top: 2rem;
}
html.dark footer {
--footer-drop-color: black;
}
@media screen and (max-width: 600px) {
main {
width: 90%;
}
}
</style>

1
layouts/error.vue Normal file
View File

@ -0,0 +1 @@
<template>error!</template>

17
layouts/withtop.vue Normal file
View File

@ -0,0 +1,17 @@
<script setup lang="ts">
import Default from "./default.vue";
</script>
<template>
<Default>
<slot />
<template #top-button> <ButtonToTop /> </template>
</Default>
</template>
<style>
div#__nuxt {
display: grid;
grid-template-columns: auto 0;
}
</style>

86
nuxt.config.ts Normal file
View File

@ -0,0 +1,86 @@
import { defineNuxtConfig } from "nuxt";
import svgLoader from "vite-svg-loader";
// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
modules: [
"@nuxt/content",
"@nuxtjs/tailwindcss",
"@nuxtjs/color-mode",
"@nuxtjs/sitemap",
],
nitro: {
prerender: {
routes: ["/sitemap.xml"],
},
},
typescript: {
shim: false,
},
sitemap: {
hostname: process.env.BASE_URL || "https://eggworld.tk",
},
tailwindcss: {},
colorMode: {
classSuffix: "",
},
vite: {
plugins: [svgLoader()],
},
head: {
meta: [
{ name: "viewport", content: " width=device-width,initial-scale=1" },
],
link: [
{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
{
rel: "stylesheet",
href: "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css",
},
],
},
content: {
documentDriven: false,
highlight: {
theme: "dracula",
preload: [
"python",
"ts",
"js",
"sh",
"batch",
"c",
"cpp",
"dart",
"diff",
"docker",
"git-commit",
"git-rebase",
"go",
"ini",
"java",
"json",
"jsx",
"latex",
"md",
"nginx",
"rs",
"sql",
"toml",
"tsx",
"vue-html",
"vue",
"yaml",
"xml",
],
},
markdown: {
remarkPlugins: ["remark-math"],
rehypePlugins: [["rehype-katex", { output: "html" }]],
},
},
experimental: {
reactivityTransform: true,
},
target: "static",
ssr: true,
});

View File

@ -1,29 +1,27 @@
{ {
"name": "my-blog", "private": true,
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": { "scripts": {
"start": "npx @11ty/eleventy --serve & postcss ./tailwind.css --o _site/assets/styles/tailwind.css --watch", "build": "nuxt build",
"test": "echo \"Error: no test specified\" && exit 1", "dev": "nuxt dev",
"lint": "eslint .", "generate": "nuxt generate",
"lint:fix": "eslint . --fix", "preview": "nuxt preview"
"build": "npx @11ty/eleventy & postcss ./tailwind.css --o _site/assets/styles/tailwind.css"
}, },
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": { "devDependencies": {
"@11ty/eleventy": ">=0.11.1", "@nuxt/content": "npm:@nuxt/content-edge@latest",
"@11ty/eleventy-plugin-syntaxhighlight": ">=3.0.4", "@nuxtjs/color-mode": "^3.1.4",
"eslint": ">=7.12.1", "@nuxtjs/sitemap": "^2.4.0",
"html-minifier": ">=3.5.21" "@nuxtjs/tailwindcss": "^5.3.0",
"@tailwindcss/typography": "^0.5.2",
"nuxt": "npm:nuxt3@latest",
"reading-time": "^2.0.0-1",
"rehype-katex": "^6.0.2",
"remark-math": "^5.1.1",
"sitemap": "^7.1.1",
"typescript": "^4.7.4",
"unist-util-visit": "^4.1.0",
"vite-svg-loader": "^3.4.0"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/typography": "^0.4.0", "dayjs": "^1.11.4"
"autoprefixer": "^10.2.4",
"markdown-it-anchor": "^7.0.1",
"postcss-cli": "^8.3.1",
"tailwindcss": ">=2.0.2"
} }
} }

67
pages/[...slug].vue Normal file
View File

@ -0,0 +1,67 @@
<script setup lang="ts">
import type { BlogParsedContent, StoryParsedContent } from "@/shared/types";
import { calcReadingTime, getPrettyDate } from "@/shared/metadata";
type GeneralParsedContent = BlogParsedContent | StoryParsedContent;
const route = useRoute();
definePageMeta({
layout: "withtop",
});
// we're not using ContentDoc because i need control
const doc = await queryContent<GeneralParsedContent>(route.path).findOne();
const type = route.path.startsWith("/stories")
? "stories"
: route.path.startsWith("/blog")
? "blog"
: "unknown";
const descText =
type === "stories"
? `${calcReadingTime(doc).words.total} words`
: `${calcReadingTime(doc).minutes} min read`;
useTitle(doc.title);
const captionText =
type === "stories" ? "Story" : type === "blog" ? "Blog post" : "";
</script>
<template>
<div class="container prose dark:prose-invert w-full">
<p class="m-0 uppercase font-mono text-sm" v-if="captionText !== ''">
{{ captionText }}
</p>
<h1 class="m-0">{{ doc.title }}</h1>
<p class="my-2">{{ getPrettyDate(doc) }} · {{ descText }}</p>
<div class="flex flex-wrap">
<Tag
v-for="(tag, index) in doc.tags"
:dest="`/tags/${type}/${tag}`"
:key="index"
>
{{ tag }}
</Tag>
</div>
<ContentRenderer :value="doc" tag="article" class="pt-0 w-full">
<template #empty>
<p>No description found.</p>
</template>
<template #not-found>
<h1>404 - Not Found</h1>
</template>
</ContentRenderer>
</div>
</template>
<style scoped>
.container {
width: 80%;
max-width: 72ch;
padding-top: 2rem;
}
* {
transition: color 0.2s ease;
}
</style>

26
pages/blog.vue Normal file
View File

@ -0,0 +1,26 @@
<script setup lang="ts">
import type { BlogParsedContent } from "@/shared/types";
useTitle("Blog");
definePageMeta({ layout: "withtop" });
// TODO: paginate stories
const docs = await queryContent<BlogParsedContent>("/blog")
.sort({ date: -1 })
.where({ _draft: false })
.find();
</script>
<template>
<main
class="flex flex-col grow prose dark:prose-invert max-w-3xl gap-6 transition"
>
<h1 class="mb-0">Blog</h1>
<PostPreviewCard
v-for="(post, index) in docs"
:key="index"
:post="post"
type="blog"
/>
</main>
</template>

29
pages/index.vue Normal file
View File

@ -0,0 +1,29 @@
<script setup lang="ts">
import Services from "@/components/index/services.vue";
import About from "@/components/index/about.vue";
definePageMeta({ layout: "withtop" });
useTitle("Home");
</script>
<template>
<main class="flex flex-col items-center justify-around gap-8">
<h1>Welcome!</h1>
<p>What are you here to see?</p>
<div
class="flex justify-around items-stretch w-full flex-wrap gap-x-8 gap-y-10"
>
<BlogStatBox />
<StoryStatBox />
<CommitStatBox />
</div>
<Services />
<About />
</main>
</template>
<style scoped>
h1 {
font-size: 3rem;
}
</style>

26
pages/stories.vue Normal file
View File

@ -0,0 +1,26 @@
<script setup lang="ts">
import type { StoryParsedContent } from "@/shared/types";
useTitle("Stories");
definePageMeta({ layout: "withtop" });
// TODO: paginate stories
const docs = await queryContent<StoryParsedContent>("/stories")
.sort({ date: -1 })
.where({ _draft: false })
.find();
</script>
<template>
<main
class="flex flex-col grow prose dark:prose-invert max-w-3xl gap-6 transition"
>
<h1 class="mb-0">Stories</h1>
<PostPreviewCard
v-for="(story, index) in docs"
:key="index"
:post="story"
type="stories"
/>
</main>
</template>

39
pages/tags/blog/[tag].vue Normal file
View File

@ -0,0 +1,39 @@
<script setup lang="ts">
import { tagInfo, type TagData } from "@/data/tagInfo";
import type { BlogParsedContent } from "@/shared/types";
const route = useRoute();
definePageMeta({ layout: "withtop" });
const tag =
typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0];
const details: TagData = tagInfo[tag] ?? {};
const docs = await queryContent<BlogParsedContent>("/blog")
.sort({ date: -1 })
.where({ _draft: false, tags: { $contains: tag } })
.find();
</script>
<template>
<main
class="prose dark:prose-invert max-w-3xl flex flex-col grow gap-6 transition"
>
<div>
<h1 class="mb-0">{{ details.name ?? `"${tag}"` }} Posts</h1>
<p
v-if="details.description"
v-html="details.description"
class="mt-2"
></p>
</div>
<PostPreviewCard
v-for="(post, index) in docs"
:key="index"
:post="post"
:highlighttags="[tag]"
type="blog"
/>
</main>
</template>

View File

@ -0,0 +1,39 @@
<script setup lang="ts">
import { tagInfo, type TagData } from "@/data/tagInfo";
import type { StoryParsedContent } from "@/shared/types";
const route = useRoute();
definePageMeta({ layout: "withtop" });
const tag =
typeof route.params.tag === "string" ? route.params.tag : route.params.tag[0];
const details: TagData = tagInfo[tag] ?? {};
const docs = await queryContent<StoryParsedContent>("/stories")
.sort({ date: -1 })
.where({ _draft: false, tags: { $contains: tag } })
.find();
</script>
<template>
<main
class="prose dark:prose-invert max-w-3xl flex flex-col grow gap-6 transition"
>
<div>
<h1 class="mb-0">{{ details.name ?? `"${tag}"` }} Stories</h1>
<p
v-if="details.description"
v-html="details.description"
class="mt-2"
></p>
</div>
<PostPreviewCard
v-for="(story, index) in docs"
:key="index"
:post="story"
:highlighttags="[tag]"
type="stories"
/>
</main>
</template>

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: [
require(`tailwindcss`)(`./tailwind.config.js`),
require(`autoprefixer`),
],
};

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-147 -70 294 345">
<g fill="#a4c639">
<use stroke-width="14.4" xlink:href="#b" stroke="#FFF"/>
<use xlink:href="#a" transform="scale(-1,1)"/>
<g id="a" stroke="#FFF" stroke-width="7.2">
<rect rx="6.5" transform="rotate(29)" height="86" width="13" y="-86" x="14"/>
<rect id="c" rx="24" height="133" width="48" y="41" x="-143"/>
<use y="97" x="85" xlink:href="#c"/>
</g>
<g id="b">
<ellipse cy="41" rx="91" ry="84"/>
<rect rx="22" height="182" width="182" y="20" x="-91"/>
</g>
</g>
<g stroke="#FFF" stroke-width="7.2" fill="#FFF">
<path d="m-95 44.5h190"/><circle cx="-42" r="4"/><circle cx="42" r="4"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 745 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 32 32"><path d="M11.622 24.74s-1.23.748.855.962c2.51.32 3.847.267 6.625-.267a10.02 10.02 0 0 0 1.763.855c-6.25 2.672-14.16-.16-9.244-1.55zm-.8-3.473s-1.336 1.015.748 1.23c2.725.267 4.862.32 8.55-.427a3.26 3.26 0 0 0 1.282.801c-7.534 2.244-15.976.214-10.58-1.603zm14.747 6.09s.908.748-1.015 1.336c-3.58 1.07-15.014 1.39-18.22 0-1.122-.48 1.015-1.175 1.7-1.282.695-.16 1.07-.16 1.07-.16-1.23-.855-8.175 1.763-3.526 2.51 12.77 2.084 23.296-.908 19.983-2.404zM12.2 17.633s-5.824 1.39-2.084 1.87c1.603.214 4.755.16 7.694-.053 2.404-.214 4.81-.64 4.81-.64s-.855.374-1.443.748c-5.93 1.55-17.312.855-14.052-.748 2.778-1.336 5.076-1.175 5.076-1.175zm10.42 5.824c5.984-3.1 3.206-6.09 1.282-5.717-.48.107-.695.214-.695.214s.16-.32.534-.427c3.794-1.336 6.786 4.007-1.23 6.09 0 0 .053-.053.107-.16zm-9.83 8.442c5.77.374 14.587-.214 14.8-2.94 0 0-.427 1.07-4.755 1.87-4.916.908-11.007.8-14.587.214 0 0 .748.64 4.542.855z" fill="#4e7896"/><path d="M18.996.001s3.313 3.366-3.152 8.442c-5.183 4.114-1.175 6.465 0 9.137-3.046-2.725-5.236-5.13-3.74-7.373C14.294 6.893 20.332 5.3 18.996.001zm-1.7 15.335c1.55 1.763-.427 3.366-.427 3.366s3.954-2.03 2.137-4.542c-1.656-2.404-2.94-3.58 4.007-7.587 0 0-10.953 2.725-5.717 8.763z" fill="#f58219"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M0,0 L256,0 L256,256 L0,256 L0,0 Z" fill="#F7DF1E"></path>
<path d="M67.311746,213.932292 L86.902654,202.076241 C90.6821079,208.777346 94.1202286,214.447137 102.367086,214.447137 C110.272203,214.447137 115.256076,211.354819 115.256076,199.326883 L115.256076,117.528787 L139.313575,117.528787 L139.313575,199.666997 C139.313575,224.58433 124.707759,235.925943 103.3984,235.925943 C84.1532952,235.925943 72.9819429,225.958603 67.3113397,213.93026" fill="#000000"></path>
<path d="M152.380952,211.354413 L171.969422,200.0128 C177.125994,208.433981 183.827911,214.619835 195.684368,214.619835 C205.652521,214.619835 212.009041,209.635962 212.009041,202.762159 C212.009041,194.513676 205.479416,191.592025 194.481168,186.78207 L188.468419,184.202565 C171.111213,176.81473 159.597308,167.53534 159.597308,147.944838 C159.597308,129.901308 173.344508,116.153295 194.825752,116.153295 C210.119924,116.153295 221.117765,121.48094 229.021663,135.400432 L210.29059,147.428775 C206.166146,140.040127 201.699556,137.119289 194.826159,137.119289 C187.78047,137.119289 183.312254,141.587098 183.312254,147.428775 C183.312254,154.646349 187.78047,157.568406 198.089956,162.036622 L204.103924,164.614095 C224.553448,173.378641 236.067352,182.313448 236.067352,202.418387 C236.067352,224.071924 219.055137,235.927975 196.200432,235.927975 C173.860978,235.927975 159.425829,225.274311 152.381359,211.354413" fill="#000000"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="128" viewBox="0 0 208 128"><rect width="198" height="118" x="5" y="5" ry="10" stroke="#000" stroke-width="10" fill="none"/><path d="M30 98V30h20l20 25 20-25h20v68H90V59L70 84 50 59v39zm125 0l-30-33h20V30h20v35h20z"/></svg>

After

Width:  |  Height:  |  Size: 282 B

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="110px" height="110px" viewBox="0.21 -0.077 110 110" enable-background="new 0.21 -0.077 110 110" xml:space="preserve"><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="63.8159" y1="56.6829" x2="118.4934" y2="1.8225" gradientTransform="matrix(1 0 0 -1 -53.2974 66.4321)"> <stop offset="0" style="stop-color:#387EB8"/> <stop offset="1" style="stop-color:#366994"/></linearGradient><path fill="url(#SVGID_1_)" d="M55.023-0.077c-25.971,0-26.25,10.081-26.25,12.156c0,3.148,0,12.594,0,12.594h26.75v3.781 c0,0-27.852,0-37.375,0c-7.949,0-17.938,4.833-17.938,26.25c0,19.673,7.792,27.281,15.656,27.281c2.335,0,9.344,0,9.344,0 s0-9.765,0-13.125c0-5.491,2.721-15.656,15.406-15.656c15.91,0,19.971,0,26.531,0c3.902,0,14.906-1.696,14.906-14.406 c0-13.452,0-17.89,0-24.219C82.054,11.426,81.515-0.077,55.023-0.077z M40.273,8.392c2.662,0,4.813,2.15,4.813,4.813 c0,2.661-2.151,4.813-4.813,4.813s-4.813-2.151-4.813-4.813C35.46,10.542,37.611,8.392,40.273,8.392z"/><linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="97.0444" y1="21.6321" x2="155.6665" y2="-34.5308" gradientTransform="matrix(1 0 0 -1 -53.2974 66.4321)"> <stop offset="0" style="stop-color:#FFE052"/> <stop offset="1" style="stop-color:#FFC331"/></linearGradient><path fill="url(#SVGID_2_)" d="M55.397,109.923c25.959,0,26.282-10.271,26.282-12.156c0-3.148,0-12.594,0-12.594H54.897v-3.781 c0,0,28.032,0,37.375,0c8.009,0,17.938-4.954,17.938-26.25c0-23.322-10.538-27.281-15.656-27.281c-2.336,0-9.344,0-9.344,0 s0,10.216,0,13.125c0,5.491-2.631,15.656-15.406,15.656c-15.91,0-19.476,0-26.532,0c-3.892,0-14.906,1.896-14.906,14.406 c0,14.475,0,18.265,0,24.219C28.366,100.497,31.562,109.923,55.397,109.923z M70.148,101.454c-2.662,0-4.813-2.151-4.813-4.813 s2.15-4.813,4.813-4.813c2.661,0,4.813,2.151,4.813,4.813S72.809,101.454,70.148,101.454z"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-11.5 -10.23174 23 20.46348">
<title>React Logo</title>
<circle cx="0" cy="0" r="2.05" fill="#61dafb"/>
<g stroke="#61dafb" stroke-width="1" fill="none">
<ellipse rx="11" ry="4.2"/>
<ellipse rx="11" ry="4.2" transform="rotate(60)"/>
<ellipse rx="11" ry="4.2" transform="rotate(120)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 365 B

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="512" height="512" fill="none" version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<title>TypeScript logo</title>
<rect width="512" height="512" rx="50" fill="#3178c6"/>
<path d="m317 407v50c8.1 4.2 18 7.3 29 9.4s23 3.1 35 3.1c12 0 23-1.1 34-3.4 11-2.3 20-6.1 28-11 8.1-5.3 15-12 19-21s7.1-19 7.1-32c0-9.1-1.4-17-4.1-24s-6.6-13-12-18c-5.1-5.3-11-10-18-14s-15-8.2-24-12c-6.6-2.7-12-5.3-18-7.9-5.2-2.6-9.7-5.2-13-7.8-3.7-2.7-6.5-5.5-8.5-8.4-2-3-3-6.3-3-10 0-3.4 0.89-6.5 2.7-9.3s4.3-5.1 7.5-7.1c3.2-2 7.2-3.5 12-4.6 4.7-1.1 9.9-1.6 16-1.6 4.2 0 8.6 0.31 13 0.94 4.6 0.63 9.3 1.6 14 2.9 4.7 1.3 9.3 2.9 14 4.9 4.4 2 8.5 4.3 12 6.9v-47c-7.6-2.9-16-5.1-25-6.5s-19-2.1-31-2.1c-12 0-23 1.3-34 3.8s-20 6.5-28 12c-8.1 5.4-14 12-19 21-4.7 8.4-7 18-7 30 0 15 4.3 28 13 38 8.6 11 22 19 39 27 6.9 2.8 13 5.6 19 8.3s11 5.5 15 8.4c4.3 2.9 7.7 6.1 10 9.5 2.5 3.4 3.8 7.4 3.8 12 0 3.2-0.78 6.2-2.3 9s-3.9 5.2-7.1 7.2-7.1 3.6-12 4.8c-4.7 1.1-10 1.7-17 1.7-11 0-22-1.9-32-5.7-11-3.8-21-9.5-30-17zm-84-123h64v-41h-179v41h64v183h51z" clip-rule="evenodd" fill="#fff" fill-rule="evenodd" style="fill:#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 261.76 226.69" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.3333 0 0 -1.3333 -76.311 313.34)"><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-75.491l98.16-170.02 98.16 170.02z" fill="#41b883"/></g><g transform="translate(178.06 235.01)"><path d="m0 0-22.669-39.264-22.669 39.264h-36.227l58.896-102.01 58.896 102.01z" fill="#34495e"/></g></g></svg>

After

Width:  |  Height:  |  Size: 466 B

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 310 KiB

View File

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Some files were not shown because too many files have changed in this diff Show More