Init zine
This commit is contained in:
parent
477b3c9a79
commit
c6fc0b093b
2
.vscode/settings.json
vendored
Normal file
2
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
249
assets/Temml-Local.css
Normal file
249
assets/Temml-Local.css
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
/*
|
||||||
|
Temml.woff2 is a clone of KaTeX_Script-Regular, except that the code points
|
||||||
|
have been changed from ASCII to Unicode Mathematical Alphanumeric Symbols Script capitals,
|
||||||
|
Unicode range 1D49C to 1D4B5.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Temml';
|
||||||
|
src: url('Temml.woff2') format('woff2');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
math {
|
||||||
|
font-family: "Cambria Math", 'STIXTwoMath-Regular', 'NotoSansMath-Regular', math;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: normal;
|
||||||
|
font-size-adjust: none;
|
||||||
|
text-indent: 0;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
direction: ltr;
|
||||||
|
/* Prevent Firefox from omitting the dot on i or j. */
|
||||||
|
font-feature-settings: "dtls" off;
|
||||||
|
}
|
||||||
|
|
||||||
|
math * {
|
||||||
|
border-color: currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next line is active in Firefox and Safari.
|
||||||
|
* Not in Chromium, which recognizes display: "block math" written inline. */
|
||||||
|
math.tml-display { display: block; }
|
||||||
|
|
||||||
|
*.mathcal {
|
||||||
|
/* NotoSans */
|
||||||
|
font-feature-settings: 'ss01';
|
||||||
|
}
|
||||||
|
|
||||||
|
math .mathscr {
|
||||||
|
font-family: "Temml";
|
||||||
|
}
|
||||||
|
|
||||||
|
mo.tml-prime {
|
||||||
|
font-family: Temml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent f' from overlapping in Chromium */
|
||||||
|
mo.prime-pad {
|
||||||
|
padding-left: 0.08em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* \cancel & \phase use background images. Get them to print. */
|
||||||
|
menclose {
|
||||||
|
-webkit-print-color-adjust: exact; /* Chrome & Edge */
|
||||||
|
print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Array cell justification in Firefox & WebKit */
|
||||||
|
.tml-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.tml-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for Chromium only */
|
||||||
|
@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
|
||||||
|
/* MathML Core & Chromium do not support the MathML 3.0 element <menclose> attributes. */
|
||||||
|
/* So use styles. */
|
||||||
|
menclose {
|
||||||
|
position: relative;
|
||||||
|
padding: 0.5ex 0ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tml-overline {
|
||||||
|
padding: 0.1em 0 0 0;
|
||||||
|
border-top: 0.065em solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tml-underline {
|
||||||
|
padding: 0 0 0.1em 0;
|
||||||
|
border-bottom: 0.065em solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tml-cancel {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
left: 0.5px;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: currentColor;
|
||||||
|
}
|
||||||
|
.upstrike {
|
||||||
|
clip-path: polygon(0.05em 100%, 0em calc(100% - 0.05em), calc(100% - 0.05em) 0em, 100% 0.05em);
|
||||||
|
}
|
||||||
|
.downstrike {
|
||||||
|
clip-path: polygon(0em 0.05em, 0.05em 0em, 100% calc(100% - 0.05em), calc(100% - 0.05em) 100%);
|
||||||
|
}
|
||||||
|
.sout {
|
||||||
|
clip-path: polygon(0em calc(55% + 0.0333em), 0em calc(55% - 0.0333em), 100% calc(55% - 0.0333em), 100% calc(55% + 0.0333em));
|
||||||
|
}
|
||||||
|
.tml-xcancel {
|
||||||
|
background: linear-gradient(to top left,
|
||||||
|
rgba(0,0,0,0) 0%,
|
||||||
|
rgba(0,0,0,0) calc(50% - 0.06em),
|
||||||
|
rgba(0,0,0,1) 50%,
|
||||||
|
rgba(0,0,0,0) calc(50% + 0.06em),
|
||||||
|
rgba(0,0,0,0) 100%),
|
||||||
|
linear-gradient(to top right,
|
||||||
|
rgba(0,0,0,0) 0%,
|
||||||
|
rgba(0,0,0,0) calc(50% - 0.06em),
|
||||||
|
rgba(0,0,0,1) 50%,
|
||||||
|
rgba(0,0,0,0) calc(50% + 0.06em),
|
||||||
|
rgba(0,0,0,0) 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
.longdiv-top {
|
||||||
|
border-top: 0.067em solid;
|
||||||
|
padding: 0.1em 0.2em 0.2em 0.433em;
|
||||||
|
}
|
||||||
|
.longdiv-arc {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0.1em;
|
||||||
|
left: -0.4em;
|
||||||
|
width: 0.7em;
|
||||||
|
border: 0.067em solid;
|
||||||
|
transform: translateY(-0.067em);
|
||||||
|
border-radius: 70%;
|
||||||
|
clip-path: inset(0 0 0 0.4em);
|
||||||
|
box-sizing: border-box;}
|
||||||
|
.menclose {display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phasor-bottom {
|
||||||
|
border-bottom: 0.067em solid;
|
||||||
|
padding: 0.2em 0.2em 0.1em 0.6em;
|
||||||
|
}
|
||||||
|
.phasor-angle {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
left: 0.5px;
|
||||||
|
bottom: -0.04em;
|
||||||
|
height: 100%;
|
||||||
|
aspect-ratio: 0.5;
|
||||||
|
background-color: currentColor;
|
||||||
|
clip-path: polygon(0.05em 100%, 0em calc(100% - 0.05em), calc(100% - 0.05em) 0em, 100% 0.05em);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tml-box {
|
||||||
|
padding: 3pt 0 3pt 0;
|
||||||
|
border: 1px solid;
|
||||||
|
}
|
||||||
|
.tml-fbox {
|
||||||
|
padding: 3pt;
|
||||||
|
border: 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle-pad {
|
||||||
|
padding: 0.267em;
|
||||||
|
}
|
||||||
|
.textcircle {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
border: 0.067em solid;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actuarial {
|
||||||
|
padding: 0.03889em 0.03889em 0 0.03889em;
|
||||||
|
border-width: 0.08em 0.08em 0em 0em;
|
||||||
|
border-style: solid;
|
||||||
|
margin-right: 0.03889em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stretch \widetilde */
|
||||||
|
.tml-crooked-2 {
|
||||||
|
transform: scale(2.0, 1.1)
|
||||||
|
}
|
||||||
|
.tml-crooked-3 {
|
||||||
|
transform: scale(3.0, 1.3)
|
||||||
|
}
|
||||||
|
.tml-crooked-4 {
|
||||||
|
transform: scale(4.0, 1.4)
|
||||||
|
}
|
||||||
|
/* set array cell justification */
|
||||||
|
.tml-right {
|
||||||
|
text-align: -webkit-right;
|
||||||
|
}
|
||||||
|
.tml-left {
|
||||||
|
text-align: -webkit-left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust WebKit accents */
|
||||||
|
@supports (-webkit-backdrop-filter: blur(1px)) {
|
||||||
|
.tml-xshift { transform: translate(0px, 0.45em) }
|
||||||
|
.tml-capshift { transform: translate(0px, 0.35em) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* flex-wrap for line-breaking in Chromium */
|
||||||
|
math {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: baseline;
|
||||||
|
}
|
||||||
|
math > mrow {
|
||||||
|
padding: 0.5ex 0ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default mtd top padding is 0.5ex per MathML-Core and user-agent CSS */
|
||||||
|
/* We adjust for jot and small */
|
||||||
|
mtable.tml-jot mtd {
|
||||||
|
padding-top: 0.7ex;
|
||||||
|
padding-bottom: 0.7ex;
|
||||||
|
}
|
||||||
|
mtable.tml-small mtd {
|
||||||
|
padding-top: 0.35ex;
|
||||||
|
padding-bottom: 0.35ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Firefox */
|
||||||
|
@-moz-document url-prefix() {
|
||||||
|
/* Avoid flex-wrap */
|
||||||
|
math { display: inline; }
|
||||||
|
math > mrow { padding: 0 }
|
||||||
|
/* Adjust Firefox spacing between array rows */
|
||||||
|
mtd, mtable.tml-small mtd { padding-top: 0; padding-bottom: 0; }
|
||||||
|
mtable.tml-jot mtd { padding-top: 0.2ex; padding-bottom: 0.ex; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* AMS environment auto-numbering via CSS counter. */
|
||||||
|
.tml-eqn::before {
|
||||||
|
counter-increment: tmlEqnNo;
|
||||||
|
content: "(" counter(tmlEqnNo) ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
counter-reset: tmlEqnNo;
|
||||||
|
}
|
BIN
assets/Temml.woff2
Normal file
BIN
assets/Temml.woff2
Normal file
Binary file not shown.
37
assets/highlight.css
Normal file
37
assets/highlight.css
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
:root {
|
||||||
|
--light-yellow: #e5c07b;
|
||||||
|
--dark-yellow: #d19a66;
|
||||||
|
--blue: #61afef;
|
||||||
|
--cyan: #56b6c2;
|
||||||
|
--light-red: #e06c75;
|
||||||
|
--dark-red: #be5046;
|
||||||
|
--comment-gray: #5c6370;
|
||||||
|
--magenta: #c678dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
border-top: 1px solid white;
|
||||||
|
border-bottom: 1px solid white;
|
||||||
|
padding: 10px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code.ziggy {
|
||||||
|
color: var(--cyan);
|
||||||
|
}
|
||||||
|
|
||||||
|
code.ziggy .keyword,
|
||||||
|
code.ziggy .type {
|
||||||
|
color: var(--light-yellow);
|
||||||
|
}
|
||||||
|
|
||||||
|
code.ziggy .string {
|
||||||
|
color: var(--dark-yellow);
|
||||||
|
}
|
||||||
|
|
||||||
|
code.ziggy .numeric.constant {
|
||||||
|
color: var(--magenta);
|
||||||
|
}
|
||||||
|
|
||||||
|
code.ziggy .function {
|
||||||
|
color: var(--blue);
|
||||||
|
}
|
8
assets/render-mathtex.js
Normal file
8
assets/render-mathtex.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
let eqns = document.querySelectorAll("script[type='math/tex']");
|
||||||
|
for (let i=eqns.length-1; i>=0; i--) {
|
||||||
|
let eqn = eqns[i];
|
||||||
|
let src = eqn.text;
|
||||||
|
let d = eqn.closest('p') == null;
|
||||||
|
eqn.outerHTML = temml.renderToString(src, { displayMode: d });
|
||||||
|
}
|
||||||
|
|
85
assets/style.css
Normal file
85
assets/style.css
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5 {
|
||||||
|
color: #ddd;
|
||||||
|
font-family: "Verdana", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
color: #ccc;
|
||||||
|
font-family: "Georgia", serif;
|
||||||
|
font-size: 1.2em;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 800px;
|
||||||
|
padding: 15px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-title {
|
||||||
|
font-size: 2.5em;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
/* text-align: center; */
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: left;
|
||||||
|
font-size: 1.2em;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block {
|
||||||
|
border: 1px dotted white;
|
||||||
|
padding: 5px 15px;
|
||||||
|
margin: 0 10px;
|
||||||
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block h1 {
|
||||||
|
font-size: 1em;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wave {
|
||||||
|
background: #111;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 10px #fff, 1px 1px 10px #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
margin-top: 30px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer hr {
|
||||||
|
width: 100%;
|
||||||
|
}
|
1
assets/temml.min.js
vendored
Normal file
1
assets/temml.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
assets/under-construction.gif
Normal file
BIN
assets/under-construction.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
56
content/about.smd
Normal file
56
content/about.smd
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
---
|
||||||
|
.title = "About",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "index.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
## About Zine
|
||||||
|
Zine is an MIT-licensed project created by [Loris Cro](https://kristoff.it) and
|
||||||
|
other contributors listed on the [official repository](https://github.com/kristoff-it/zine/contributors).
|
||||||
|
|
||||||
|
Zine is inspired by [Hugo](https://gohugo.io) but features an entirely custom set
|
||||||
|
of authoring languages:
|
||||||
|
|
||||||
|
- [Scripty](https://zine-ssg.io/docs/scripty/) is the small expression
|
||||||
|
language that both SuperHTML and SuperMD share to express templating logic.
|
||||||
|
|
||||||
|
- [SuperHTML](https://zine-ssg.io/docs/superhtml/) is the HTML templating
|
||||||
|
language used by Zine. Unlike most `{{curly braced}}` templating languages,
|
||||||
|
SuperHTML uses valid HTML syntax to express the templating logic, adding only
|
||||||
|
minor extensions to normal HTML.
|
||||||
|
Thanks to this approach, it offers instant
|
||||||
|
syntax checking and autoformatting via [a CLI tool](https://github.com/kristoff-it/superhtml) as well as Language Server support ([VScode Extension](https://marketplace.visualstudio.com/items?itemName=LorisCro.super)).
|
||||||
|
|
||||||
|
># [NOTE]($block)
|
||||||
|
>The correct file extension for SuperHTML templates is `.shtml`.
|
||||||
|
|
||||||
|
- [SuperMD](https://zine-ssg.io/docs/supermd/) is a superset of Markdown
|
||||||
|
that, instead of relying on inline HTML, offers new constructs for expressing
|
||||||
|
content embeds without pulling into your content needless layouting concerns.
|
||||||
|
A CLI tool and language server for SuperMD is in the works.
|
||||||
|
|
||||||
|
># [NOTE]($block)
|
||||||
|
>The correct file extension for SuperMD pages is `.smd`.
|
||||||
|
|
||||||
|
## Zine is alpha software
|
||||||
|
|
||||||
|
Zine is not yet complete. The main functionality is present and you will be able
|
||||||
|
to build even moderately complex static websites without issue.
|
||||||
|
|
||||||
|
That said using Zine today does imply participating in the development process
|
||||||
|
to some degree, which usually means inquiring about the development status of
|
||||||
|
a feature you need, or reporting a bug.
|
||||||
|
|
||||||
|
|
||||||
|
Here are some quicklinks related to Zine:
|
||||||
|
|
||||||
|
- Official Website: https://zine-ssg.io/
|
||||||
|
- Source Code: https://github.com/kristoff-it/zine/
|
||||||
|
- Discord: https://discord.com/invite/B73sGxF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
content/blog/first-post/fanzine.jpg
Normal file
BIN
content/blog/first-post/fanzine.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 122 KiB |
110
content/blog/first-post/index.smd
Normal file
110
content/blog/first-post/index.smd
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
---
|
||||||
|
.title = "First Post: What's A Zine?",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "post.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
This is a sample first post for your blog.
|
||||||
|
|
||||||
|
This post is defined in `content/blog/first-post/` and contains the following
|
||||||
|
files:
|
||||||
|
|
||||||
|
- `index.smd`
|
||||||
|
- `fanzine.jpg`
|
||||||
|
|
||||||
|
Another interesting thing about this post is that it uses the `layouts/post.shtml`
|
||||||
|
template which adds at the bottom page navigation within the blog section.
|
||||||
|
|
||||||
|
Enough about Zine, let's talk about zines.
|
||||||
|
|
||||||
|
## Fanzines
|
||||||
|
|
||||||
|
A zine (short for *fanzine*, from "fan" + "magazine") is a non-professional
|
||||||
|
publication created by people that want to express themselves in paper form,
|
||||||
|
usually in relation to a cultural phenomenon of some kind.
|
||||||
|
|
||||||
|
[An example of zine from 1976.](<$image.asset("fanzine.jpg").alt("A photo of a black and white flyer. The main title reads 'A night of pure energy' and the rest of the page contains a mix of pictures of guitarists interleaved with other text snippets, some seemingly taken from a professional publication of some kind, and some handwritten to announce concert night dates, presumably for the musicians in the picture.")>)
|
||||||
|
|
||||||
|
## Zines in the digital era
|
||||||
|
|
||||||
|
In the digital age, some of the cultural impetus behind zines got redirected to
|
||||||
|
personal blogs and similar digital, non-professional publications. The 90's and
|
||||||
|
early 00's are famous for their whacky websites full of clip art, wordart text
|
||||||
|
and "under construction" animated gifs.
|
||||||
|
|
||||||
|
This initial organic exploration didn't last for too long as the rise of social
|
||||||
|
media diverted a lot of self-expression energy towards walled gardens, a change
|
||||||
|
that was also fueled by the much tighter and intense feedback loop that those
|
||||||
|
platform enable.
|
||||||
|
|
||||||
|
In the 90's the stongest dopamine hit you could get was adding a visit counter
|
||||||
|
to your altavista website and watch it go up, slowly, mostly because of your own
|
||||||
|
accesses. In modern times views are almost meaningless and interactions such as
|
||||||
|
*likes*, *retweets* and *comments* provide much stronger positive feedback.
|
||||||
|
|
||||||
|
An unfortunate side effect of this new cultural wave centered around social media
|
||||||
|
is that not only you end up gifting your content to platform owners, but you also
|
||||||
|
participate in a system where the *language* of the social media site shapes your
|
||||||
|
thoughts and experience in specific, and often user-hostile, ways.
|
||||||
|
|
||||||
|
Art, just like liquids, takes the shape of the container you put it in. A mobile
|
||||||
|
game that lives off of in app purchases will never be truly great because of the
|
||||||
|
tension between making the game entertaining enough to keep players engaged, and
|
||||||
|
the need to make it boring enough so that they will want to buy upgrades to make
|
||||||
|
the game more fun.
|
||||||
|
|
||||||
|
Similarly, self-expression on Twitter is encouraged to take the shape of short,
|
||||||
|
hyperbolic hot takes that forgo nuance in order to create catchy quips that can
|
||||||
|
be used for hasty decision making.
|
||||||
|
|
||||||
|
Likewise, [corpowave]($text.attrs('wave')) never goes out of style on LinkedIn.
|
||||||
|
Spend enough time in there and you will become a character from Severance.
|
||||||
|
|
||||||
|
## We're not in 1990 anymore
|
||||||
|
|
||||||
|
Despite all the issues with social media, there is no point in thinking of the
|
||||||
|
90's as a better time. It was not. And despite the winks at the past, Zine is
|
||||||
|
not a tool for indulging in nostalgia.
|
||||||
|
|
||||||
|
**The goal is to make art**: the act of inducing a change in others through
|
||||||
|
our self-expression.
|
||||||
|
|
||||||
|
You could argue that the 90's excelled at self-expression, but in doing so you
|
||||||
|
would also have to accept that social media is infinitely more effective at
|
||||||
|
inducing change in others (albeit at the expense of freedom of expression).
|
||||||
|
|
||||||
|
Once you realize that, the path forward is clear:
|
||||||
|
|
||||||
|
1. Own your content.
|
||||||
|
2. Create new social systems that optimize for creating art over engagement.
|
||||||
|
|
||||||
|
Owning your content means that you will be unaffected by enshittification of
|
||||||
|
platforms that would otherwise keep your data hostage. It also is the single
|
||||||
|
most effective thing you can do as an individual to take power away from
|
||||||
|
platforms, all while protecting your own immediate interests.
|
||||||
|
|
||||||
|
Creation of new social systems is a *slightly more hairy* problem than self
|
||||||
|
hosting a static website, but it's something that can be done. Over the years
|
||||||
|
we've had plenty of social outlets that have allowed people to socialize through
|
||||||
|
their homemade games, music, drawings, fanfics, etc; and chances are that we
|
||||||
|
have yet many more of these outlets ahead of us to create.
|
||||||
|
|
||||||
|
Zine gives you a small puzzle piece to help you inch closer toward a better
|
||||||
|
future, partially by providing you with a new iteration over tried and true
|
||||||
|
patterns (e.g. by facilitating content creation by separating content from
|
||||||
|
layouting concerns as much as possible), and also by being a bit experimental
|
||||||
|
with the concept of a devlog, something that you wouldn't normally expect to
|
||||||
|
find on a static website.
|
||||||
|
|
||||||
|
Lastly, Zine makes sure your content (both blog and devlog, but also any
|
||||||
|
other content format you might come up with yourself) is available via RSS
|
||||||
|
syndication. RSS feeds are far from a winning technology in the fight against
|
||||||
|
the ebb and *enshitty*flow of social media, but they are another small puzzle
|
||||||
|
piece that costs nothing to maintain and that might turn out to be critical once
|
||||||
|
enough other preconditions are met.
|
||||||
|
|
||||||
|
With that in mind, **go make art with your words**.
|
||||||
|
|
||||||
|
-- Loris
|
40
content/blog/index.smd
Normal file
40
content/blog/index.smd
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
.title = "Blog",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "blog.shtml",
|
||||||
|
.alternatives = [{
|
||||||
|
.name = "rss",
|
||||||
|
.layout = "blog.xml",
|
||||||
|
.output = "index.xml",
|
||||||
|
}],
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
This page defines the blog section and lists all posts in it.
|
||||||
|
|
||||||
|
A "site section" in Zine is a group of pages that form a logical subtree of the
|
||||||
|
website. It's related to directory structure, but it's not an entirely 1:1 mapping.
|
||||||
|
|
||||||
|
What defines a site section in Zine is the presence of `index.smd` files. You
|
||||||
|
can learn more [in the official Zine docs](https://zine-ssg.io/docs/).
|
||||||
|
|
||||||
|
Take also a look at `layouts/blog.shtml` to get an idea of how to render a page
|
||||||
|
list in a SuperHTML template.
|
||||||
|
|
||||||
|
The blog section also has an [RSS feed]($link.alternative('rss')).
|
||||||
|
|
||||||
|
In Zine, RSS feeds are considered "alternative" versions of an existing page. In
|
||||||
|
concrete defines the blog section and that lists all pages in it, is rendered in
|
||||||
|
two versions: HTML for human readers, and XML for RSS readers.
|
||||||
|
|
||||||
|
This is the SuperMD frontmatter code that defines the RSS feed:
|
||||||
|
|
||||||
|
```ziggy
|
||||||
|
.alternatives = [{
|
||||||
|
.name = "rss",
|
||||||
|
.layout = "rss.xml",
|
||||||
|
.output = "index.xml",
|
||||||
|
}],
|
||||||
|
```
|
||||||
|
[(btw syntax highlighting is done statically in Zine, no need for javascript libraries, unless you want to)]($text.attrs('small'))
|
28
content/blog/second-post.smd
Normal file
28
content/blog/second-post.smd
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
.title = "Second Post",
|
||||||
|
.date = @date("1990-01-02T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "post.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
This second post is mainly here to show you that you can also create single file
|
||||||
|
posts for convenience. The first post contains more interesting content.
|
||||||
|
|
||||||
|
Don't forget to read [the official SuperMD
|
||||||
|
docs](https://zine-ssg.io/docs/supermd/) to know how to *style* your content.
|
||||||
|
|
||||||
|
|
||||||
|
Btw this sample website also includes the JS/CSS dependencies required to render
|
||||||
|
math:
|
||||||
|
|
||||||
|
```=mathtex
|
||||||
|
\begin{aligned}
|
||||||
|
f(t) &= \int_{-\infty}^\infty F(\omega) \cdot (-1)^{2 \omega t} \mathrm{d}\omega \\
|
||||||
|
F(\omega) &= \int_{-\infty}^\infty f(t) \div (-1)^{2 \omega t} \mathrm{d}t \\
|
||||||
|
\end{aligned}
|
||||||
|
```
|
||||||
|
|
||||||
|
This: [`(-1)^x = \cos(\pi x) + i\sin(\pi x)`]($mathtex) is an inline equation
|
||||||
|
instead!
|
||||||
|
|
18
content/devlog/1989.smd
Normal file
18
content/devlog/1989.smd
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
.title = "Devlog - 1989",
|
||||||
|
.date = @date("1989-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "devlog.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
[]($section.id('about'))
|
||||||
|
## About this Devlog
|
||||||
|
This is a non-exhaustive, curated list of changes meant to help users quickly see what has improved since they last checked.
|
||||||
|
|
||||||
|
You can [subscribe the latest devlog via RSS]($link.page('devlog').alternative('rss')).
|
||||||
|
|
||||||
|
This page lists entries for the year 1989, for past or future entries consult the
|
||||||
|
[devlog archive](/devlog/).
|
||||||
|
|
||||||
|
## [Hello 1989]($section.id("1989-01-01T00:00:00"))
|
||||||
|
This is a sample entry.
|
38
content/devlog/1990.smd
Normal file
38
content/devlog/1990.smd
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
.title = "Devlog - 1990",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "devlog.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
[]($section.id('about'))
|
||||||
|
## About this Devlog
|
||||||
|
|
||||||
|
This is where you should describe to your users what your devlog is about.
|
||||||
|
Refer to the corresponding section in the home page to learn more about devlogs.
|
||||||
|
|
||||||
|
For example this is how the Zine devlog describes itself:
|
||||||
|
|
||||||
|
> This is a non-exhaustive, curated list of changes meant to help users quickly see what has improved since they last checked.
|
||||||
|
>
|
||||||
|
> You can [subscribe to this page via RSS]($link.page('devlog').alternative('rss')).
|
||||||
|
>
|
||||||
|
> This page lists entries for the current year, for past entries consult the
|
||||||
|
[devlog archive](/devlog/).
|
||||||
|
|
||||||
|
Feel free to tweak it to your specific use case or replace it entirely as you
|
||||||
|
see fit.
|
||||||
|
|
||||||
|
Regardless of what you decide, you might want to make sure you preserve the
|
||||||
|
links to the RSS feed and to the devlog archive from the copy above.
|
||||||
|
|
||||||
|
|
||||||
|
## [Third Entry]($section.id("1990-01-03T00:00:00"))
|
||||||
|
This is the third entry.
|
||||||
|
|
||||||
|
## [Second Entry]($section.id("1990-01-02T00:00:00"))
|
||||||
|
This is the second entry.
|
||||||
|
|
||||||
|
## [Hello Zine]($section.id("1990-01-01T00:00:00"))
|
||||||
|
This is the first entry in this year's devlog created with
|
||||||
|
[Zine](https://zine-ssg.io)!
|
32
content/devlog/index.smd
Normal file
32
content/devlog/index.smd
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
.title = "Devlog Archive",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "devlog-archive.shtml",
|
||||||
|
.alternatives = [{
|
||||||
|
.name = "rss",
|
||||||
|
.layout = "devlog.xml",
|
||||||
|
.output = "index.xml",
|
||||||
|
}],
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
This page lists all the devlog years that are present on this site.
|
||||||
|
Note how the top navigation menu doesn't link to this page, but instead links
|
||||||
|
to the latest devlog year directly.
|
||||||
|
|
||||||
|
The reason for adopting this structure is to make sure that links that exist in
|
||||||
|
the wild to entries to our devlog don't become invalidated when a new year comes
|
||||||
|
around and we rotate the devlog feed.
|
||||||
|
|
||||||
|
Devlog rotation ensures that you don't have a single page that grows
|
||||||
|
indefinitely, eventually compromising your editing expreience and worsening your
|
||||||
|
user's browsing experience. You can use any arbitrary policy (even deleting old
|
||||||
|
entries if you are fine with having a more ephemeral devlog), but cutting them
|
||||||
|
by year is a good default option.
|
||||||
|
|
||||||
|
When rotating a devlog all you have to do is create a new page with a newer
|
||||||
|
date set in the frontmatter `date` field, and update the page description to let
|
||||||
|
people know that this page is not the current year's devlog anymore.
|
||||||
|
|
||||||
|
The latest devlog year is also available [via RSS feed]($link.alternative('rss')).
|
88
content/index.smd
Normal file
88
content/index.smd
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
.title = "Homepage",
|
||||||
|
.date = @date("1990-01-01T00:00:00"),
|
||||||
|
.author = "Sample Author",
|
||||||
|
.layout = "index.shtml",
|
||||||
|
.draft = false,
|
||||||
|
---
|
||||||
|
|
||||||
|
This sample website showcases:
|
||||||
|
|
||||||
|
- A couple simple pages
|
||||||
|
- `content/index.smd`
|
||||||
|
- `content/about.smd`
|
||||||
|
- A blog
|
||||||
|
- `content/blog/index.smd`
|
||||||
|
- `content/blog/first-post/index.smd`
|
||||||
|
- `content/blog/second-post.smd`
|
||||||
|
- A devlog
|
||||||
|
- `content/devlog/index.smd`
|
||||||
|
- `content/devlog/1990.smd`
|
||||||
|
- `content/devlog/1989.smd`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## About Devlogs
|
||||||
|
|
||||||
|
While a blog has each entry be a separate page, a devlog is one single page with
|
||||||
|
a list of smaller entries in it, making it a form of microblogging. The relative
|
||||||
|
RSS feed will generate a separate item per devlog entry, creating a
|
||||||
|
"twitter-like" feed.
|
||||||
|
|
||||||
|
This can be a useful pattern for thoughts that are too small for a full blog post
|
||||||
|
so consider giving it a try!
|
||||||
|
|
||||||
|
The name "devlog" comes from the fact that this kind of microblogging feed works
|
||||||
|
well when you have an open source project and you want to give small updates to
|
||||||
|
your users, but it might work equally well for other domains, depending on your
|
||||||
|
interests and audience. Maybe a "foodlog", a "catlog" or a "treklog" could also
|
||||||
|
work well.
|
||||||
|
|
||||||
|
The devlog section contains more information about how devlogs can be implemented
|
||||||
|
in Zine.
|
||||||
|
|
||||||
|
Some examples of devlogs in the wild:
|
||||||
|
- https://zine-ssg.io/log/
|
||||||
|
- https://ziglang.org/devlog/
|
||||||
|
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
|
||||||
|
Make sure to read the [official Zine docs](https://zine-ssg.io/docs/)
|
||||||
|
and then start editing this website!
|
||||||
|
|
||||||
|
Start by putting the correct information in `zine.ziggy` and then start editing
|
||||||
|
the existing pages. Before deleting existing copy consider giving it a brief
|
||||||
|
look as it will show you some SuperMD specific syntax.
|
||||||
|
|
||||||
|
HTML markup in Zine is defined via SuperHTML templates:
|
||||||
|
- `layouts/index.shtml`
|
||||||
|
- `layouts/page.shtml`
|
||||||
|
- `layouts/post.shtml`
|
||||||
|
- `layouts/blog.shtml`
|
||||||
|
- `layouts/blog.xml`
|
||||||
|
- `layouts/devlog.shtml`
|
||||||
|
- `layouts/devlog.xml`
|
||||||
|
- `layouts/devlog-archive.shtml`
|
||||||
|
- `layouts/templates/base.shtml`
|
||||||
|
|
||||||
|
**If you're running the Zine development server (by running `zine`), then all
|
||||||
|
changes you make will be picked up immediately, causing the website to rebuild
|
||||||
|
and the page in your browser to refresh**.
|
||||||
|
|
||||||
|
You can learn more about SuperMD and SuperHTML in [/about/](/about/).
|
||||||
|
|
||||||
|
Lastly, this sample website also includes the following asset files:
|
||||||
|
|
||||||
|
- `assets/style.css`
|
||||||
|
- `assets/hightlight.css`
|
||||||
|
- `assets/under-construction.gif`
|
||||||
|
- `assets/katex-tag.js`
|
||||||
|
- `assets/katex0.16.21.css`
|
||||||
|
- `assets/katex0.16.21.js`
|
||||||
|
- `content/blog/first-post/fanzine.jpg`
|
||||||
|
|
||||||
|
The first few asset files are **site assets**, while the last is a **page asset** that belongs to the "first post" page.
|
||||||
|
|
||||||
|
The Zine docs contain more information about [dealing with assets](https://zine-ssg.io/docs/assets/).
|
||||||
|
|
25
layouts/blog.shtml
Normal file
25
layouts/blog.shtml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
<style>
|
||||||
|
.date {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title h3{
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 :text="$page.title"></h1>
|
||||||
|
<div :html="$page.content()"></div>
|
||||||
|
<div>
|
||||||
|
<h2>Post list</h2>
|
||||||
|
<div :loop="$page.subpages()">
|
||||||
|
<span class="date" :text="$loop.it.date.format('January 02, 2006')"></span>
|
||||||
|
<a class="title" href="$loop.it.link()">
|
||||||
|
<h3 :text="$loop.it.title"></h3>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
19
layouts/blog.xml
Normal file
19
layouts/blog.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<rss version="2.0">
|
||||||
|
<channel>
|
||||||
|
<title :text="$site.title"></title>
|
||||||
|
<link :text="$site.host_url"></link>
|
||||||
|
<description :text="$site.title.suffix(' - Blog')"></description>
|
||||||
|
<generator>Zine -- https://zine-ssg.io</generator>
|
||||||
|
<language>en-US</language>
|
||||||
|
<lastBuildDate :text="$build.generated.formatHTTP()"></lastBuildDate>
|
||||||
|
<ctx :loop="$page.subpages()">
|
||||||
|
<item>
|
||||||
|
<title :text="$loop.it.title"></title>
|
||||||
|
<description :text="$loop.it.content()"></description>
|
||||||
|
<link :text="$site.host_url.addPath($loop.it.link())"></link>
|
||||||
|
<pubDate :text="$loop.it.date.formatHTTP()"></pubDate>
|
||||||
|
<guid :text="$site.host_url.addPath($loop.it.link())"></guid>
|
||||||
|
</item>
|
||||||
|
</ctx>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
25
layouts/devlog-archive.shtml
Normal file
25
layouts/devlog-archive.shtml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
<style>
|
||||||
|
.date {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title h3{
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 :text="$page.title"></h1>
|
||||||
|
<div :html="$page.content()"></div>
|
||||||
|
<div>
|
||||||
|
<h2>Past years</h2>
|
||||||
|
<div :loop="$page.subpages()">
|
||||||
|
<span class="date" :text="$loop.it.date.format('Year 2006')"></span>
|
||||||
|
<a class="title" href="$loop.it.link()">
|
||||||
|
<h3 :text="$loop.it.title"></h3>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
45
layouts/devlog.shtml
Normal file
45
layouts/devlog.shtml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
<style>
|
||||||
|
.feed {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feed>div {
|
||||||
|
margin: 0 -20px;
|
||||||
|
padding: 5px 20px;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feed>div>h2 {
|
||||||
|
margin-top: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feed>div[id]:target {
|
||||||
|
animation: pulse-div 2s ease-in-out 1 forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse-div {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
background-color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
background-color: #111;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 class="title" :text="$page.title"></h1>
|
||||||
|
<div :html="$page.contentSection('about')"></div>
|
||||||
|
<div class="feed" :loop="$page.contentSections().slice(1)">
|
||||||
|
<div id="$loop.it.id">
|
||||||
|
<span :text="$loop.it.id.parseDate().format('January 02, 2006')"></span>
|
||||||
|
<h2><a href="$loop.it.id.prefix('#')" :html="$loop.it.heading()"></a></h2>
|
||||||
|
<ctx :html="$loop.it.htmlNoHeading()"></ctx>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
21
layouts/devlog.xml
Normal file
21
layouts/devlog.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<rss version="2.0">
|
||||||
|
<channel>
|
||||||
|
<title :text="$site.title"></title>
|
||||||
|
<link :text="$site.host_url"></link>
|
||||||
|
<description :text="$site.title.suffix(' - Devlog')"></description>
|
||||||
|
<generator>Zine -- https://zine-ssg.io</generator>
|
||||||
|
<language>en-US</language>
|
||||||
|
<lastBuildDate :text="$build.generated.formatHTTP()"></lastBuildDate>
|
||||||
|
<ctx :if="$page.subpages().first?()">
|
||||||
|
<ctx :loop="$if.contentSections().slice(1)">
|
||||||
|
<item>
|
||||||
|
<title :text="$loop.it.heading()"></title>
|
||||||
|
<description :text="$loop.it.html()"></description>
|
||||||
|
<link :text="$site.host_url.addPath($page.link().suffix('#', $loop.it.id))"></link>
|
||||||
|
<pubDate :text="$loop.it.id.parseDate().formatHTTP()"></pubDate>
|
||||||
|
<guid :text="$site.host_url.addPath($page.link().suffix('#', $loop.it.id))"></guid>
|
||||||
|
</item>
|
||||||
|
</ctx>
|
||||||
|
</ctx>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
7
layouts/index.shtml
Normal file
7
layouts/index.shtml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 :text="$page.title"></h1>
|
||||||
|
<div :html="$page.content()"></div>
|
||||||
|
</body>
|
7
layouts/page.shtml
Normal file
7
layouts/page.shtml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 :text="$page.title"></h1>
|
||||||
|
<div :html="$page.content()"></div>
|
||||||
|
</body>
|
40
layouts/post.shtml
Normal file
40
layouts/post.shtml
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<extend template="base.shtml">
|
||||||
|
<head id="head">
|
||||||
|
<style>
|
||||||
|
#prev-next {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
align-self: center;
|
||||||
|
text-align: center;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post {
|
||||||
|
display:flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 :text="$page.title"></h1>
|
||||||
|
<div class="post" :html="$page.content()"></div>
|
||||||
|
<div id="prev-next">
|
||||||
|
<div :if="$page.prevPage?()">
|
||||||
|
<a href="$if.link()">
|
||||||
|
←
|
||||||
|
<span :text="$if.title"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div :if="$page.nextPage?()">
|
||||||
|
<a href="$if.link()">
|
||||||
|
<span :text="$if.title"></span>
|
||||||
|
→
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
36
layouts/templates/base.shtml
Normal file
36
layouts/templates/base.shtml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head id="head">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="initial-scale=1">
|
||||||
|
<title :text="$site.title"></title>
|
||||||
|
<link type="text/css" rel="stylesheet" href="$site.asset('style.css').link()">
|
||||||
|
<link type="text/css" rel="stylesheet" href="$site.asset('highlight.css').link()">
|
||||||
|
<!-- mathtex -->
|
||||||
|
<link type="text/css" rel="stylesheet" href="$site.asset('Temml-Local.css').link()">
|
||||||
|
<script defer src="$site.asset('temml.min.js').link()"></script>
|
||||||
|
<script defer src="$site.asset('render-mathtex.js').link()"></script>
|
||||||
|
<!-- /mathtex -->
|
||||||
|
<super>
|
||||||
|
</head>
|
||||||
|
<body id="body">
|
||||||
|
<h1 class="site-title" :text="$site.title"></h1>
|
||||||
|
<nav>
|
||||||
|
<a href="$site.page('').link()">Home</a>
|
||||||
|
•
|
||||||
|
<a href="$site.page('about').link()">About</a>
|
||||||
|
•
|
||||||
|
<a href="$site.page('blog').link()">Blog</a>
|
||||||
|
<ctx :if="$site.page('devlog').subpages().first?()">
|
||||||
|
•
|
||||||
|
<a href="$if.link()">Devlog</a>
|
||||||
|
</ctx>
|
||||||
|
</nav>
|
||||||
|
<super>
|
||||||
|
<footer>
|
||||||
|
<hr>
|
||||||
|
<h5>SITE UNDER CONSTRUCTION</h5>
|
||||||
|
<img src="$site.asset('under-construction.gif').link()" width=90>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
10
zine.ziggy
Normal file
10
zine.ziggy
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Site {
|
||||||
|
.title = "Welcome to Zine!",
|
||||||
|
.host_url = "https://example.com",
|
||||||
|
.content_dir_path = "content",
|
||||||
|
.layouts_dir_path = "layouts",
|
||||||
|
.assets_dir_path = "assets",
|
||||||
|
.static_assets = [
|
||||||
|
"Temml.woff2",
|
||||||
|
],
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user