[WIP] lots of cleanup and polish
This commit is contained in:
parent
19dcdc48a2
commit
f2c7629ba6
69 changed files with 580 additions and 131 deletions
|
@ -67,4 +67,11 @@ article[autonumbering] {
|
|||
content: "Figure " counter(figure) ": ";
|
||||
}
|
||||
}
|
||||
/* footnotes */
|
||||
#footnotes h2 {
|
||||
counter-reset: h2;
|
||||
&:before {
|
||||
content: ''
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
content: " [";
|
||||
}
|
||||
&:after {
|
||||
content: "] "
|
||||
content: "] ";
|
||||
}
|
||||
}
|
||||
.footnotes {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
--background: hsl(210, 100%, 90%);
|
||||
--text: hsl(210, 100%, 10%);
|
||||
|
||||
// TODO: make this color palette actually usable
|
||||
--error: #cc0000;
|
||||
--keyword: hsl(210, 100%, 25%);
|
||||
--name: green;
|
||||
|
@ -22,6 +23,7 @@
|
|||
--background: hsl(210, 100%, 15%);
|
||||
--text: hsl(210, 100%, 80%);
|
||||
|
||||
// TODO: test this color palette with more languages
|
||||
--error: #cc0000;
|
||||
--keyword: hsl(210, 100%, 75%);
|
||||
--name: lightgreen;
|
||||
|
@ -48,6 +50,7 @@
|
|||
line-height: 1.5;
|
||||
}
|
||||
.line {
|
||||
white-space: pre;
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
}
|
||||
|
@ -55,29 +58,24 @@
|
|||
grid-column: 1;
|
||||
font-size: 1em;
|
||||
background: var(--linenos-background);
|
||||
padding-block: 0.25em;
|
||||
color: var(--linenos);
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
align-items: start;
|
||||
margin: 0;
|
||||
white-space: pre;
|
||||
user-select: none;
|
||||
padding-inline: 0.5em;
|
||||
}
|
||||
.cl { // code line
|
||||
grid-column: 2;
|
||||
> * {
|
||||
display: inline-flex;
|
||||
height: 100%;
|
||||
align-items: center;
|
||||
}
|
||||
padding-inline: 0.5em;
|
||||
}
|
||||
|
||||
.line:first-child .cl {
|
||||
padding-block-start: 1em;
|
||||
.line:first-child .ln, .line:first-child .cl {
|
||||
padding-block-start: 0.5em;
|
||||
}
|
||||
.line:last-child .cl {
|
||||
padding-block-end: 1em;
|
||||
}
|
||||
:is(.line:first-child, .line:last-child) .ln ~ .cl {
|
||||
padding-block: 0em;
|
||||
.line:last-child .ln, .line:last-child .cl {
|
||||
padding-block-end: 0.5em;
|
||||
}
|
||||
.hl > * { // highlight
|
||||
background: var(--highlight);
|
||||
|
@ -85,16 +83,16 @@
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: extract the below rules and integrate them into the scss above?
|
||||
|
||||
/* Background */ .bg { background-color: var(--background); }
|
||||
/* PreWrapper */ .chroma { background-color: var(--background); }
|
||||
/* Other */ .chroma .x { color: var(--text) }
|
||||
/* Error */ .chroma .err { color: var(--error) }
|
||||
/* CodeLine */ .chroma .cl { color: var(--text) }
|
||||
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||
/* LineTableTD */ .chroma .lntd { padding: 0; margin: 0; border: 0; }
|
||||
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
||||
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: var(--linenos) }
|
||||
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: var(--linenos) }
|
||||
/* Line */ .chroma .line { white-space: pre }
|
||||
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-inline-end: 0.4em; padding: 0 0.4em 0 0.4em;color: var(--linenos) }
|
||||
/* Keyword */ .chroma .k { color: var(--keyword); font-weight: bold }
|
||||
/* KeywordConstant */ .chroma .kc { color: var(--keyword); font-weight: bold }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: var(--keyword); font-weight: bold }
|
||||
|
@ -105,7 +103,7 @@
|
|||
/* Name */ .chroma .n { color: var(--name) }
|
||||
/* NameAttribute */ .chroma .na { color: var(--name) }
|
||||
/* NameBuiltin */ .chroma .nb { color: var(--name) }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { color: #3465a4 }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { color: var(--name) }
|
||||
/* NameClass */ .chroma .nc { color: var(--name) }
|
||||
/* NameConstant */ .chroma .no { color: var(--name) }
|
||||
/* NameDecorator */ .chroma .nd { color: var(--class); font-weight: bold }
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
&__anchor-link {
|
||||
grid-column: 2;
|
||||
line-height: 1em;
|
||||
margin-top: 0.15em;
|
||||
margin-block-start: 0.15em;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
align-self: start;
|
||||
|
|
|
@ -26,6 +26,19 @@
|
|||
.list-permalink {
|
||||
.u-url {font-family: monospace;}
|
||||
}
|
||||
.list-alt-formats {
|
||||
.path {font-family: monospace;}
|
||||
p {
|
||||
margin-block-end: 0;
|
||||
}
|
||||
.alt-formats-list {
|
||||
margin-block-start: 0;
|
||||
&-item {
|
||||
margin-block: 0;
|
||||
a {}
|
||||
}
|
||||
}
|
||||
}
|
||||
.list-pages {
|
||||
max-width: 80ch;
|
||||
margin-inline: auto;
|
||||
|
@ -33,14 +46,19 @@
|
|||
list-style: none;
|
||||
padding-inline-start: 0;
|
||||
&__item {
|
||||
line-height: 1.5;
|
||||
margin-inline-start: 0;
|
||||
margin-block: 1em;
|
||||
.u-url {display: inline;}
|
||||
.p-name {
|
||||
font-weight: bold;
|
||||
font-size: 1em;
|
||||
margin: 0;
|
||||
display: inline;
|
||||
}
|
||||
.p-summary {
|
||||
font-style: italic;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,18 @@
|
|||
align-self: end;
|
||||
.u-url {font-family: monospace;}
|
||||
}
|
||||
.page-syndication {
|
||||
p {margin-block-end: 0;}
|
||||
.syndication-list {
|
||||
margin-block-start: 0;
|
||||
&-item {
|
||||
margin-block: 0;
|
||||
.u-syndication {}
|
||||
}
|
||||
}
|
||||
}
|
||||
.page-series {
|
||||
hr {display: none;}
|
||||
// background: var(--ui-overlay);
|
||||
// color: var(--ui-overlay-text);
|
||||
.container {
|
||||
|
@ -85,6 +96,27 @@
|
|||
max-width: 80ch;
|
||||
margin-inline: auto;
|
||||
}
|
||||
.page-footer {
|
||||
hr {display: none;}
|
||||
width: 100%;
|
||||
max-width: 80ch;
|
||||
margin-inline: auto;
|
||||
#footnotes h2 {
|
||||
font-size: 1rem;
|
||||
font-weight: 900;
|
||||
text-transform: uppercase;
|
||||
position: relative;
|
||||
&:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset-inline-end: 0;
|
||||
inset-block-start: calc(50% - 1px);
|
||||
background: var(--ui-overlay);
|
||||
block-size: 1px;
|
||||
inline-size: calc(100% - 12ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
.page[has-toc] {
|
||||
padding-block-end: 4em;
|
||||
}
|
||||
|
@ -97,13 +129,13 @@
|
|||
display: block;
|
||||
position: fixed;
|
||||
z-index: 10;
|
||||
bottom: 6em;
|
||||
inset-block-end: 6em;
|
||||
height: max-content;
|
||||
width: 80%;
|
||||
max-width: 20em;
|
||||
max-height: #{min}(40em, 70vh);
|
||||
overflow-y: scroll;
|
||||
right: 1em;
|
||||
inset-inline-end: 1em;
|
||||
background: var(--ui-overlay);
|
||||
border-radius: 1em;
|
||||
@include shadow-low;
|
||||
|
@ -115,8 +147,8 @@
|
|||
}
|
||||
label[for="toc-toggle"] {
|
||||
position: fixed;
|
||||
bottom: 1em;
|
||||
right: 1em;
|
||||
inset-block-end: 1em;
|
||||
inset-inline-end: 1em;
|
||||
z-index: 5;
|
||||
background: var(--ui-overlay);
|
||||
padding: 1em;
|
||||
|
@ -154,7 +186,7 @@
|
|||
.page[has-toc] {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr minmax(37em, 80ch) minmax(17em, 20em) 1fr;
|
||||
grid-template-rows: auto 1fr;
|
||||
grid-template-rows: auto auto auto;
|
||||
gap: 2em;
|
||||
padding-block-end: unset;
|
||||
.page-header {
|
||||
|
@ -171,9 +203,9 @@
|
|||
.table-of-contents {
|
||||
display: block;
|
||||
grid-column: 3;
|
||||
grid-row: 2;
|
||||
grid-row: 2 / span 2;
|
||||
position: sticky;
|
||||
top: 2em;
|
||||
inset-block-start: 2em;
|
||||
align-self: start;
|
||||
justify-self: start;
|
||||
max-width: unset;
|
||||
|
@ -193,10 +225,19 @@
|
|||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
max-width: unset;
|
||||
padding-block-start: 0.5rem;
|
||||
padding-block-end: 0;
|
||||
.toc {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.page-footer {
|
||||
grid-column: 2;
|
||||
grid-row: 3;
|
||||
max-width: unset;
|
||||
#footnotes h2 {margin-block-start: 0;}
|
||||
padding-block: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@
|
|||
color: inherit;
|
||||
display: contents;
|
||||
&:after {
|
||||
display: none; // suppress "external links" icon
|
||||
display: none !important; // suppress "external links" icon
|
||||
}
|
||||
}
|
||||
&__avatar {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.layout-wiki-single {
|
||||
.content {
|
||||
padding-top: 0;
|
||||
padding-block-start: 0;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,6 @@
|
|||
title = "Worse is worse"
|
||||
date = 2024-10-12T13:03:23-06:00
|
||||
toc = true
|
||||
draft = true
|
||||
+++
|
||||
|
||||
sure, "worse is better", but also, worse is worse.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "an analogy between activitypub and programming languages"
|
||||
summary = "you don't say \"compatible with c++\" you say \"written in/with c++\". similarly, we might say that fedi is \"written with activitypub\" or \"implemented using activitypub\""
|
||||
date = "2023-03-28T09:13:00-06:00"
|
||||
date = 2023-03-28T09:13:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110101321320240671"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "art is not a commodity"
|
||||
summary = "the real answer to making sure artists get paid is to actually pay them for the work they do, not to commodify what they produce"
|
||||
date = "2023-01-02T21:00:00-06:00"
|
||||
date = 2023-01-02T21:00:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109623038871646811"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "blocked"
|
||||
summary = "it's the finality of such a situation that bothers me the most; the knowledge that no amount of apology will matter, nor will any attempt at reconciliation even be seen"
|
||||
date = "2018-02-27T21:23:00-00:00"
|
||||
date = 2018-02-27T15:23:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99599426061591957"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "boktai deserved better"
|
||||
summary = "where do you go to find quirky existentialist video games based on norse mythology and spaghetti westerns in the year of your lord 2018, you ask? you don't ;_;"
|
||||
date = "2018-04-15T19:54:00-00:00"
|
||||
date = 2018-04-15T14:54:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99865201213509948"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "don't worry about camera gear"
|
||||
summary = "I wouldn't recommend going for ILCs unless you have a dedicated use case [...] Once you've picked a niche, then the gear choices will result naturally."
|
||||
date = "2018-04-09T22:28:00-00:00"
|
||||
date = 2018-04-09T17:28:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99831836537266861"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
+++
|
||||
title = "stop using crossposters"
|
||||
summary = "crossposts really don't engender organic engagement. They feel robotic and distant, largely because they're just that"
|
||||
date = "2017-11-26T02:20:00-06:00"
|
||||
date = 2017-11-26T02:20:00-06:00
|
||||
updated = 2017-11-30T07:36:00-06:00
|
||||
source = [
|
||||
"https://mastodon.social/@trwnh/99069749589979672",
|
||||
"https://mastodon.social/@trwnh/99093644445157168",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "nothing is truly forever"
|
||||
summary = "At some point, the final copy of any given data will be deleted. Or it will lose relevance. Or it will slip into obscurity."
|
||||
date = "2017-12-20T04:53:00-06:00"
|
||||
date = 2017-12-20T04:53:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99206247716252048"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "defining quote posts"
|
||||
summary = "to me, the way i see quote posts is essentially as a \"loud reply\" or as a \"breakout thread\""
|
||||
date = "2023-05-01T12:07:00-06:00"
|
||||
date = 2023-05-01T12:07:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110294523321644375"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "fedi as a reformist option"
|
||||
summary = "[...] it's holding us back from better things. it's like the \"reform\" option when we need radical change. and it keeps getting \"worse\" [...] ad-free and chronological ain't enough."
|
||||
date = 2023-04-30T20:27:00-06:00
|
||||
date = 2023-04-30T20:27:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110290827199480228"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "fedi vs web"
|
||||
summary = "this is the fundamental divide between #fediverse thinking and #Web thinking, where #ActivityPub straddles the line between both."
|
||||
date = "2024-09-24T07:06:00-06:00"
|
||||
date = 2024-09-24T07:06:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/113192442723669483"
|
||||
series = "fedi and the social web 2024"
|
||||
series_part = "1"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "gun culture in america"
|
||||
summary = "a reactionary gun culture that perceives any attempt to curb it as an assault on their very identity"
|
||||
date = "2018-02-18T01:48:00-00:00"
|
||||
date = 2018-02-18T19:56:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99543874314017409"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "collections should be explicitly managed"
|
||||
summary = "the way to maintain an authoritative collection is [...] not to have everyone send out Create and then expect everyone else to reconstruct the collection for themselves [...] we're just replicating stuff around and then every server assembles it however it *thinks* it should be put together."
|
||||
date = "2023-03-18T03:51:00-06:00"
|
||||
date = 2023-03-18T03:51:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110043428576595588"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "liberalism and the rise of trump"
|
||||
summary = "there's some broad historical revisionism going on"
|
||||
date = "2018-01-14T10:35:00-00:00"
|
||||
date = 2018-01-14T04:35:00-06:00
|
||||
source = [
|
||||
"https://mastodon.social/@trwnh/99347736716090638",
|
||||
"https://mastodon.social/@trwnh/99355650165263881",
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
+++
|
||||
title = "mainstreaming mastodon"
|
||||
summary = "[...] one of the replies was something along the lines of how we should be \"turning Mastodon from a small platform for the fringes and oppressed minorities to a platform that welcomes more mainstream members\" and i legit shuddered while reading that. what a terrifying thought."
|
||||
date = "2023-02-02T08:40:00-06:00"
|
||||
source = "private"
|
||||
date = 2023-02-02T03:17:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109794389005775846"
|
||||
+++
|
||||
|
||||
the shit i see on the mastodon issue tracker is driving me to just build my own thing because i honestly think whatever good culture mastodon has is quite possibly not long for this world
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "the primary value of mastodon is in its api"
|
||||
summary = "mastodon isn't really all that special [...] but the second you try to have a mobile app, you immediately recognize the value of the mastodon api [...] it's a shame it isn't a real standard..."
|
||||
date = "2023-02-06T00:56:00Z"
|
||||
date = 2023-02-05T18:56:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109815069913581608"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "mastodon as a twitter do-over"
|
||||
summary = "it would probably behoove us all to consider what mistakes twitter did and how we can avoid them."
|
||||
date = "2018-01-12T06:20:00-06:00"
|
||||
date = 2018-01-12T06:20:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99336824877757248"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "re: starting to investigate other protocols"
|
||||
summary = "The main thing I'm trying to formulate right now is a generic understanding of what is a protocol and what makes up a protocol [...] The \"implicit protocol of the fediverse\" is not sufficiently described by \"the ActivityPub specification\""
|
||||
date = "2024-09-29T19:53:00-06:00"
|
||||
date = 2024-09-29T19:53:00-05:00
|
||||
source = "https://socialhub.activitypub.rocks/t/socialwebfoundation-what-do-people-think/4564/13"
|
||||
series = "fedi and the social web 2024"
|
||||
series_part = "2.5"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "multiple accounts"
|
||||
summary = "why/when do people use multiple accounts, and what features can be implemented to reduce the friction in using just one account?"
|
||||
date = "2017-12-17T03:55:00-06:00"
|
||||
date = 2017-12-17T03:55:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99189033326279405"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "fedi nation-states"
|
||||
summary = "i forgot we live in a geopolitical climate of tens of thousands of digital nation-states each with their own culture and borders. for a second there i thought i was using a general communication service"
|
||||
date = 2023-03-24T10:25:00-06:00
|
||||
date = 2023-03-24T10:25:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110078954614492914"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "necromancy"
|
||||
summary = "\"i saw the soul of my grandpa and he told me to keep working hard\" is almost mystic and folkloric, not really like \"i summoned the soul of my grandpa to give me encouragement\" and still one step removed from \"i inserted my grandpa's soul into a corpse / some bones to give him physical form\""
|
||||
date = "2018-04-12T07:31:00-00:00"
|
||||
date = 2018-04-12T02:31:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99845293118930539"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "what is neoliberalism"
|
||||
summary = "in short, everything is a market and the experts should decide the best policies to help the market"
|
||||
date = "2018-03-14T08:10:00-00:00"
|
||||
date = 2018-03-14T03:10:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99681239150233207"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "the day net neutrality was repealed"
|
||||
summary = "The Open Internet Order of 2015 which was just repealed was not too much. It was not enough."
|
||||
date = "2017-12-15T01:35:00-00:00"
|
||||
date = 2017-12-15T07:35:00-06:00
|
||||
source = [
|
||||
"https://mastodon.social/@trwnh/99175742733649566",
|
||||
"https://mastodon.social/@trwnh/99175781630692764",
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "a thematic breakdown of one piece"
|
||||
summary = "east blue = dreams. paradise = family. new world = liberation."
|
||||
date = 2024-09-30T11:22:54-06:00
|
||||
date = 2024-09-30T11:22:54-05:00
|
||||
source = "original"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
+++
|
||||
title = "physical bodies are so encumbering"
|
||||
summary = "it would be great to never again have to feel pain from a stomach too empty, or perhaps too full; to never have crusty eyes after sleeping too much, or perhaps too little; to never suffer from physiology that at best will decay, and at worst will actively punish us."
|
||||
date = "2018-05-09T14:42:00-00:00"
|
||||
date = 2018-05-09T09:42:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99999872996282760"
|
||||
+++
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "product vs profit"
|
||||
summary = "There will inevitably be a point where it is unprofitable to improve a product any further."
|
||||
date = "2017-12-22T12:06:00-00:00"
|
||||
date = 2017-12-22T06:06:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99217860566004390"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "publishing vs discussing"
|
||||
summary = "eventually this kind of \"posting\" we have today would be split up and merged into the two new things. the UI would give you an option: do you want to publish a Post, or do you want to start a Discussion?"
|
||||
date = 2023-03-24T10:33:00-06:00
|
||||
date = 2023-03-24T10:33:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110078983668243890"
|
||||
+++
|
||||
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
+++
|
||||
title = "quote semantics"
|
||||
summary = "it could be just a link with a rich preview. or it could be more than that."
|
||||
date = 2024-10-15T12:39:00-05:00
|
||||
source = "https://discord.com/channels/1100160301254590525/1185342677974270092/1295803370988113941"
|
||||
+++
|
||||
|
||||
> But all of this is why our work right now is on studying what other software do [regarding quotes], so we have a good view of whats in the wild, what works, and what we should do
|
||||
|
||||
is the consideration only for other software or are you willing to consider general fundamental reality
|
||||
|
||||
by which i mean: you can’t stop anyone referring/linking to you as long as they have an identifier/link. it is fundamentally a dead end to try to prevent that especially in a decentralized open world, so you need to reframe the question outside of your ux assumptions. what you need is something to prove. for replies, this means checking the replies collection instead of re/assembling every inReplyTo yourself. at a ux level the question of “what are the replies to this post” should translate to “what is in the replies collection” at a protocol level. which is not the same as “which posts do i know exist that have this inReplyTo”. do you see the difference in framing? deferring to the canonical replies collection respects the authority of the owner to manage it, while the latter option is to ignore their authority entirely. it’s a similar thing with a Follow activity not being enough to tell you that someone is a follower — you don’t know the contents of the collection.
|
||||
|
||||
for “quotes”, then you need to be very precise about what a “quote” is and how do you “prove” a quote by that definition. otherwise none of the explorations you’re doing make any sense.
|
||||
|
||||
for what it’s worth, i think you could define a “quoteOf” property and a corresponding “quotes” collection but you shouldn’t codify a ux assumption as a generic semantic relationship. because what does it mean for something to be a “quoteOf” something? what are you trying to convey on a semantic level, outside of your app-specific ux concerns?
|
||||
|
||||
something that might also be workable is to build on e232 and a) define a Quote type as a subtype of Link, b) use the preview property of Link to point to the status being quoted, c) require some proof to be attached to that Link/Quote or the preview itself. if it went directly on the tag it would be a “previewProof” property. otherwise maybe use Verifiable Presentations.
|
||||
|
||||
[...]
|
||||
|
||||
this is why "controls" is the wrong way to look at it, and "verification"/"proof"/"stamp"/etc is the correct way to look at it. another way to frame it is, given only the activity or "post" object, do you have enough information to know that the preview is genuine?
|
||||
|
||||
like, this is closer to the generic link preview case or possibly "how do i markup a blockquote" levels of problem, not trying to prevent the mere existence of a link
|
||||
|
||||
> you always do, because quotes work by referencing the original post object, and you consider it trustworthy because you've fetched it yourself from its origin server
|
||||
|
||||
referencing the original post is not enough information, nor is it enough for a "quote". a reference is just a reference.
|
||||
|
||||
if you think a "quote" is just a link then i can see why you think this is all pointless
|
||||
|
||||
> yes, it's just a link that's rendered differently
|
||||
|
||||
i'm talking semantics here. like how inReplyTo carries the semantics of "i am responding to this". a "quote" can be defined as just a link with a rich preview, but i think there's more to it
|
||||
|
||||
in other words what does it mean to "quote" something
|
||||
|
||||
at the simplest level you can treat it as a rich preview of a generic link, but there's more complexity you can add. what if the quote is citing or reproducing only part of the content? this is a common thing on forums for example. what if you quote multiple things, or quote the same thing multiple times? what if you edit the content of the quote? what if you substantially edit the content of the quote? what if you don't have the original resource? what if you want to handle quoting private resources within certain contexts?
|
||||
|
||||
i am personally not interested in being limited to twitter-style quote tweets. that (anti-)feature is nothing more than taking the link at the end of a post and giving it a rich preview. it could be handled by opengraph tags for all i care. i am far more interested in modeling precise semantics. this is why i think it could be done as `tag[].Link.preview` where there is either an accompanying previewProof or otherwise relying on Verifiable Presentations or something similar, where whatever the preview is, it has some associated signature with it.
|
||||
|
||||
the general idea or flow is something like
|
||||
- you send the authority some material to sign
|
||||
- the authority sends back the signed material
|
||||
- you attach the signed material to your activity
|
||||
|
||||
that material could be a preview object or it could be your full activity or whatever
|
||||
|
||||
the "point" of all this is to establish consent
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "reading theory"
|
||||
summary = "the point of reading theory is to see what ideas other people already came up with, so you don't have to spend time formulating them yourselves."
|
||||
date = "2018-01-27T08:44:00-00:00"
|
||||
date = 2018-01-27T02:44:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99420908783601966"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "fully responsive web design"
|
||||
summary = "my pipe dream is to redesign my website to be fully responsive -- not across mere pixel widths, but by aspect ratio and overall size"
|
||||
date = "2018-04-22T15:42:00-00:00"
|
||||
date = 2018-04-22T10:42:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99903847448978099"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "services aren't communities"
|
||||
summary = "imo the biggest mistake of fedi is tying together the social and technical layers [...] some people want services and some people want communities and they are not the same thing"
|
||||
date = "2023-05-07T17:39:00-06:00"
|
||||
date = 2023-05-07T17:39:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/110329802576726213"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "shorts are too long"
|
||||
summary = "if you're going to take away the video controls, prevent me from seeking, maybe autoloop? then i am NOT sitting there for a whole minute while you fail to get to the point."
|
||||
date = "2023-01-25T08:40:00-06:00"
|
||||
date = 2023-01-25T08:40:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109750363384335885"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "i hate the smartphone market"
|
||||
summary = "profit motives means that the entire market has abandoned me"
|
||||
date = "2018-05-07T08:13:00-00:00"
|
||||
date = 2018-05-07T03:13:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99987017261137486"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "social media is fundamentally flawed"
|
||||
summary = "in pure terms you might send a message or publish a resource. but with these social networks [...] you're never unambiguously sending a message or publishing a resource, but instead, some weird hybrid that we call a \"post\". not quite message, not quite resource"
|
||||
date = "2023-02-16T19:43:00-06:00"
|
||||
date = 2023-02-16T19:43:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109877540362444317"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "specs aren't enough"
|
||||
summary = "the question of \"interoperability\" makes no sense on its own. you must always ask, interoperability with what? and on which conditions? [...] is your view of the \"fediverse\" limited only to the conceptual space of existing projects? and, if so, then which ones?"
|
||||
date = "2023-03-06T18:37:00-06:00"
|
||||
date = 2023-03-06T18:37:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109979200684979970"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "syndicalism in the 21st century"
|
||||
summary = "syndicalism is dead because the labor industry is dead. it's been replaced by the service industry today"
|
||||
date = "2018-01-03T19:42:00-06:00"
|
||||
date = 2018-01-03T19:42:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/99289017794408922"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "the problem with universal basic income"
|
||||
summary = "market forces on basic needs need to be abolished"
|
||||
date = "2018-03-16T02:00:00-00:00"
|
||||
date = 2018-03-15T21:00:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99691112300163044"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "voluntarism vs socialism"
|
||||
summary = "If two people are inequal, then they can never come to a voluntary agreement -- the power of one will coerce the other"
|
||||
date = "2018-04-06T23:19:00-00:00"
|
||||
date = 2018-04-06T18:19:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/99815047195372515"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "http uri maximalism"
|
||||
summary = "if you just wanna obtain a resource from a given organization or whatever, it is generally a given that the org has its own domain name and can assign ids on that domain. but the whole thing falls apart when you need a global namespace that can be requested from multiple domains"
|
||||
date = "2023-02-18T09:20:00-06:00"
|
||||
date = 2023-02-18T09:20:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109886416964217719"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "the web is not only for profit"
|
||||
summary = "i just want to find some inspiration on how to express myself, not market myself"
|
||||
date = "2023-01-03T01:58:00-06:00"
|
||||
date = 2023-01-03T01:58:00-06:00
|
||||
source = "https://mastodon.social/@trwnh/109624210338690804"
|
||||
+++
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "what is web"
|
||||
summary = "the many webs interpretation, what \"web\" means to me, and how do we build the \"social web\""
|
||||
date = "2024-09-26T11:57:00-06:00"
|
||||
date = 2024-09-26T11:57:00-05:00
|
||||
source = "https://matrix.to/#/!uHqAjmOtrLtidOiczC:matrix.org/$RwgyjnqW51n_VwkSwWXP3cewn-VLZ_20jIowiprYdSQ?via=matrix.org&via=mozilla.org&via=decentsocial.net"
|
||||
series = "fedi and the social web 2024"
|
||||
series_part = "2"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "worse is worse"
|
||||
summary = "sure, \"worse is better\", but also, worse is worse. the main thesis is that a) we keep dooming ourselves to \"worse\" futures than what could have been, b) we ought not to \"settle\" for the \"worse\" thing, c) things can be \"worse\" but do they really have to be *that much* \"worse\"?"
|
||||
date = "2024-10-12T11:56:00-06:00"
|
||||
date = 2024-10-12T11:56:00-05:00
|
||||
source = "https://mastodon.social/@trwnh/113295504458006091"
|
||||
+++
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
+++
|
||||
title = "Evolving OrderedCollection to be more useful"
|
||||
date = 2024-10-04T21:50:07-06:00
|
||||
summary = "Declaring the type of ordering, plus defining an extension SortedCollection. Some exploration of inserting items at specific positions, as well as reordering items."
|
||||
date = 2024-10-04T21:50:07-05:00
|
||||
toc = true
|
||||
autonumbering = true
|
||||
streams = ["all"]
|
|
@ -0,0 +1,61 @@
|
|||
+++
|
||||
title = "Disambiguating various interpretations of a \"quote\" feature"
|
||||
summary = "Broadly speaking, there are [...] Quote replies (reply with adjacent contextual preview) [...] Quote tags (rich quotes embedded in content) [...] [and] Quote boosts (reshare with comment)"
|
||||
date = 2023-07-18T21:17:00-05:00
|
||||
toc = true
|
||||
autonumbering = false
|
||||
streams = ["all"]
|
||||
tags = ["quote post", "quote tweet", "quote reply", "quote boost", "reshare with comment", "activitypub", "as2", "fedi"]
|
||||
[[params.inReplyTo]]
|
||||
[[params.syndication]]
|
||||
name = "Original post on SocialHub"
|
||||
url = "https://socialhub.activitypub.rocks/t/disambiguating-various-interpretations-of-a-quote-feature-pre-fep/3426"
|
||||
+++
|
||||
|
||||
Broadly speaking, there are a lot of different, maybe mutually exclusive or incompatible ideas of what a "quote" is, or what it should do, or what it should look like, and so on. Many people, when asking for such a "quote" feature, are drawing inspiration from past features, perhaps more commonly the Twitter "quote tweet" or perhaps alternatively the forum-style "quote" as can be seen on this very Discourse forum. This pre-FEP aims to describe all possible approaches, as well as describing the pros and cons of each approach from both semantic and practical perspectives.
|
||||
|
||||
## Implementation approaches
|
||||
|
||||
### The quote reply
|
||||
|
||||
The semantic purpose of the `inReplyTo` is to denote that the current resource is "in reply to" or considered a response to the linked resource. Very often, a "quote" is semantically a response to the "quoted" resource. What actually makes it a "quote" is purely presentational or display-based; the "quoted" resource is embedded next to the "quote". This embed can be placed below or above the current resource; because reading often happens top-to-bottom, a placement below the current resource allows the "quote" to act as framing for the "quoted", while a placement above the current resource allows the "quoted" to provide a contextual preview for the "quote".
|
||||
|
||||
Some implementations differentiate between "replies" and "normal posts", while other implementations treat all posts the same regardless of whether they are in reply to anything or not. For example, at the time of writing this, Mastodon filters out "replies" from your timeline unless you follow the author of the post being replied to. Pleroma does no such filtering. Akkoma and Misskey make it a user choice. These are once again presentational choices, stemming from implementation-specific UX choices. For an AS2 producer which makes such distinctions, it may be helpful to signal a further distinction between "replies" and "quote replies"; a "quote reply" could be shown in timelines always, or considered the same as a "normal post". If, for example, Mastodon wanted to adopt this strategy, it could define an extension property like `http://joinmastodon.org/ns#quoteReply` which, if set to `true`, would treat the resource linked in `inReplyTo` as a "Mastodon quote post", opting into the rendering and timeline-filtering behavior associated with such a concept. An AS2 consumer sharing Mastodon's UX choices and aware of this property would interpret objects with `toot:quoteReply = true` as "Mastodon-style quote posts". An AS2 consumer not sharing Mastodon's UX choices can render the reply metadata as it wishes; it is possible to render *all* replies as "quote replies" by simply embedding a preview of the replied-to resource above the current resource.
|
||||
|
||||
### The quote tag
|
||||
|
||||
The purpose of `tag` is to markup the natural-language properties of `name`, `summary`, and `content`. In particular, substrings of `content` are often associated with richer metadata. Most commonly, tags of type `Mention` are used to associate a specific substring following a *microsyntax*, `@mention`, with a specialized Link that is intended to denote a "mention".[^what-are-mentions] Following this logic, Mastodon's implementation of ActivityPub defined extensions for `https://www.w3.org/ns/activitystreams#Hashtag`[^as-hashtag] and `http://joinmastodon.org/ns#Emoji`. The `Hashtag` type is used to associate the `#hashtag` microsyntax with a "hashtag", which is a reference to some string. The `Emoji` type is used to associate an `:emoji:` microsyntax with a "custom emoji", which is an inline image with a square aspect ratio and the same height as a single line of text. In each of these cases, the `name` of the tag denotes the microsyntax, and this substring of the (sometimes plain-textified and HTML-stripped)[^sanitizing-content] `content` can be replaced with a richer entity. FEP-e232 follows this logic as well; "object links" are tagged as a `Link` (or subtype) with appropriate `mediaType`, and the `name` is used to denote any applicable microsyntax such as `RE: <url>`, especially coupled with the use of `rel` to specify the link relation.
|
||||
|
||||
It is possible to build on FEP-e232 by using "object links" with a link relation specifically denoting a "quote" relationship. Some software such as Foundkey uses the rel-value `https://misskey-hub.net/ns#_misskey_quote` to denote a "Misskey quote", while also accepting `http://fedibird.com/ns#quoteUri` and `https://www.w3.org/ns/activitystreams#quoteUrl` as equivalent. All three of these IRIs have historically been used as properties to express the same or nearly-identical concept -- a single "post" that will be embedded as a preview below yours, separately from what you are replying to, intended to send a notification to the author of the quoted post that they've been quoted. It is possible to define standardized semantics using an IRI as a property or as a type, e.g. a `Quote` type.
|
||||
|
||||
[^what-are-mentions]: (The exact meaning of a "mention" is not entirely clear. AS2-Vocab ties the definition to the `@mention` microsyntax, but provides no additional guidance on its intended functionality or meaning. At minimum, there is the implication that the Mention might denote an actor or a user, and might generate some notification that the mentioned entity has been mentioned. Software such as Mastodon follows this interpretation and uses mentions to generate notifications, but also goes further and *requires* tags of type `Mention` in order to determine delivery and addressing. Addressing someone in `to`/`cc` without mentioning them will create a "silent mention".)
|
||||
|
||||
[^as-hashtag]: (Mastodon defining `as:Hashtag` within the activitystreams namespace is technically lacking authority, as only the W3C SocialCG can adopt new terms into the activitystreams namespace or make modifications to the normative activitystreams context. In particular, `as:Hashtag` is an inline extension, and it is not defined in the normative context.)
|
||||
|
||||
[^sanitizing-content]: It is unclear when, how, or if such sanitiziation or stripping of `content` will take place. Current implementations are not entirely consistent with what they put into `name` (or `href`) compared to what they put into `content`.
|
||||
|
||||
### The quote boost
|
||||
|
||||
The purpose of a share (`Announce`) is to draw attention to, boost, or republish the referenced object. Functionally, when sent to the author of that object, the author can add the Announce activity to the `shares` collection on that object. This gets interpreted as a "boost" or "reblog" within most current implementations.[^announce-as-forwarding]
|
||||
|
||||
It is possible to add `content` to your `Announce` activity; a generic presentation of activities can use the natural-language properties `name`, `summary`, and `content` along with `actor` `type` `object` in order to generate a representation of the activity.
|
||||
|
||||
[^announce-as-forwarding]: Some software implementations *do not* use `Announce` as a reshare activity, and instead use it for other purposes outside of a publishing context, such as wrapping and forwarding someone else's activity. The intended specified mechanism for doing this is inbox forwarding.
|
||||
|
||||
## Comparison and analysis
|
||||
|
||||
### Quote replies (reply with adjacent contextual preview)
|
||||
|
||||
- (+) The quote reply maintains the best semantics in cases where the author is responding to the quoted object. It also falls back to a regular reply where not understood.
|
||||
- (+) The quote reply can easily inherit from "reply controls", which allow authors of objects to grant stamps of approval that offer proof for a given object's presence in the `replies` collection.
|
||||
- (-) The quote reply is practically (but not theoretically) limited to one "quoted" resource per post. It is possible to reply to multiple objects, although it is not immediately clear how this should be rendered or presented; adding a "quote reply" boolean property would limit the "quote" presentation to an all-or-nothing case, and selecting only *some* linked resources to be rendered as "quotes" would best be served by one of the other approaches.
|
||||
|
||||
### Quote tags (rich quotes embedded in content)
|
||||
|
||||
- (+) Multiple quote tags would be supported.
|
||||
- (~) Semantics can be signaled with `rel` or with extension types, but it is important to avoid proliferation of similar or identical semantic IRIs.
|
||||
|
||||
### Quote boosts (reshare with comment)
|
||||
|
||||
- (~) Might be semantically appropriate, if the "sharing" aspect of the "quote post" is what you intended.
|
||||
- (-) Falls back to a normal boost, without displaying the added content at all.
|
|
@ -1,7 +1,7 @@
|
|||
+++
|
||||
title = "Marking up quotes"
|
||||
summary = "In which I explore the semantics and properties of a quote, and how it differs from a citation or reference"
|
||||
date = "2024-10-12T18:07:26-06:00"
|
||||
summary = "Exploring the semantics and properties of a quote, and how it differs from a citation or reference"
|
||||
date = 2024-10-12T18:07:26-05:00
|
||||
streams = ["all"]
|
||||
toc = true
|
||||
autonumbering = false
|
|
@ -0,0 +1,55 @@
|
|||
+++
|
||||
title = "Exploring \"quote proofs\""
|
||||
summary = "Evaluating potential mechanisms to seek and signal the consent of the quoted person for the quoted segment"
|
||||
date = 2024-10-15T15:29:07-05:00
|
||||
toc = true
|
||||
autonumbering = false
|
||||
streams = ["all"]
|
||||
tags = ["activitypub", "as2", "fedi", "quote post", "quote tweet", "proofs"]
|
||||
[[params.inReplyTo]]
|
||||
name = "Disambiguating various interpretations of a \"quote\" feature"
|
||||
pageRef = "quote-feature-disambiguation"
|
||||
[[params.syndication]]
|
||||
name = "Original post on SocialHub"
|
||||
url = "https://socialhub.activitypub.rocks/t/disambiguating-various-interpretations-of-a-quote-feature-pre-fep/3426/7"
|
||||
+++
|
||||
|
||||
## Proving "quote replies" and "Announce with content"
|
||||
|
||||
The prior post explores various approaches to defining what is a "quote", but one thing that was left out of the original post was any sort of consideration of how to "prove" any or all such definitions of a "quote". More precisely, it is generally desirable to have some mechanism to seek and signal the consent of the quoted person for the quoted segment. In the case of quotes, there is no special collection for tracking `quotes`, so an approach like https://w3id.org/fep/0391 is not applicable here unless a) you limit yourself to quote replies or Announce-with-content, which inherit the same "proof" considerations as any other item in `replies` or `shares`, or b) you define exactly such a `quotes` special collection, and probably a corresponding semantic property `quoteOf` which works similarly to `inReplyTo`... assuming you can precisely define what it means to "quote" something, semantically speaking. But in any case, we have other approaches than simply trying to establish membership in a special collection.
|
||||
|
||||
## Proving "quote tags"
|
||||
|
||||
A "quote tag" was defined previously as a rich `tag` entity that can be embedded in the rendered `content` by processing microsyntax in ways similar to other `tag` entities. Prior work on FEP-e232 uses a `Link` in `tag` with the AS2/AP `mediaType`, but we can extend the semantics as previously described, either through the use of a `rel` link relation like the `_misskey_quote` one, or by defining something like a `Quote` type which may be a subtype of `Link`, intended to represent what is more or less a blockquote with probably a source or cite. This is mostly besides the point, though; the interesting question that I'd like to explore here is how to obtain and signal consent for such "quote tags".
|
||||
|
||||
### Using the `preview` property of Link?
|
||||
|
||||
A possible extension to FEP-e232 would be to use the `preview` property on a Link in `tag`, signaling that the link is intended to have a rich preview. This is an alternative to fetching any/all links yourself and parsing for OpenGraph or meta tags in the HTML head (in the case of a `Link` where the `mediaType` is `text/html` or assumed to be so). A common problem this would address is the "thundering herd" issue where linking to something on the fediverse often triggers a lot of GET requests to the linked resource, within close temporal proximity of each other, to the point that it can cause unintentional service degradation for the linked resource's provider if their service is not optimized to handle a large volume of requests within a short period of time (for example, by utilizing a static cache). However, it would create a new trust issue for anyone who wants to consume such a `Link.preview`. Exploring a credibility or reputation mechanism to discourage activity/object producers from lying about link previews is out of scope of this post, but it could be done.
|
||||
|
||||
#### Obtaining a `previewProof`
|
||||
|
||||
An extension property `previewProof` could exist directly on the Link/Quote tag. What this points to is left open, but it should in some way be associated with the `preview`.
|
||||
|
||||
#### Signing the preview directly or using a Verifiable Presentation
|
||||
|
||||
Or, the proof could instead be part of the preview itself. One way to do this is with Verifiable Presentations.
|
||||
|
||||
https://www.w3.org/TR/vc-data-model-2.0/#verifiable-presentations
|
||||
|
||||
This data model comes with its own mechanisms for establishing proof. Some entity with a key defined as an `assertionMethod` could assert that it approves of the `preview`. (The VCDI stuff is also the foundation https://w3id.org/fep/8b32 styled "data integrity proofs", but they can be used in other ways as well.)
|
||||
|
||||
The generic way you'd obtain and use such a proof could be described as follows:
|
||||
|
||||
- You send some authority some material to sign, as well as potentially supporting information on how you're going to use the resulting signed material.
|
||||
- The authority sends back the signed material. This step could be subject to either an automatic action or a manual human-approved one.
|
||||
- You attach the signed material to your activity, where appropriate. You can now send your activity to your desired arbitrary audience, and any recipient can verify that the proof is valid for the signed material.
|
||||
|
||||
There is still a potential consideration for the lifetime of the proof, as well as revoking an earlier proof. For this, I point to the concept of a "credential status" from the VC Data Model:
|
||||
|
||||
https://www.w3.org/TR/vc-data-model-2.0/#status
|
||||
|
||||
Basically, you can link to an external "status" indicator, or some other external "revocation list", by which you can detect when the signed material is no longer to be trusted.
|
||||
|
||||
Alternatively, you can establish a system where the Verifiable Presentation is fetched directly from the issuer of the associated credential.
|
||||
|
||||
The exact mechanics of these suggestions is left out of scope for now.
|
|
@ -1,6 +1,7 @@
|
|||
baseURL = "https://trwnh.com/"
|
||||
languageCode = "en-us"
|
||||
defaultContentLanguage = "en"
|
||||
timeZone = "America/Chicago"
|
||||
title = "~a"
|
||||
|
||||
capitalizeListTitles = false
|
||||
|
@ -26,6 +27,9 @@ startLevel = 2
|
|||
endLevel = 6
|
||||
ordered = true
|
||||
|
||||
[mediaTypes."application/rss+xml"]
|
||||
suffixes = ["rss"]
|
||||
|
||||
[mediaTypes."application/atom+xml"]
|
||||
suffixes = ["atom"]
|
||||
|
||||
|
@ -38,7 +42,7 @@ suffixes = ["json"]
|
|||
[mediaTypes."application/ld+json"]
|
||||
suffixes = ["jsonld"]
|
||||
|
||||
[outputs]
|
||||
[outputs] # TODO: finish templating these in layouts/_default
|
||||
home = ["html", "lunr", "as2"]
|
||||
section = ["html", "lunr", "rss", "atom", "jsonfeed", "as2"]
|
||||
taxonomy = ["html", "rss", "atom", "jsonfeed", "as2"]
|
||||
|
@ -50,28 +54,30 @@ rss = ["rss"]
|
|||
mediaType = "application/json"
|
||||
baseName = "index.lunr"
|
||||
isPlainText = true
|
||||
notAlternative = true
|
||||
|
||||
[outputFormats.rss]
|
||||
baseName = "index.rss"
|
||||
mediaType = "application/rss+xml"
|
||||
baseName = "feed"
|
||||
|
||||
[outputFormats.atom]
|
||||
mediaType = "application/atom+xml"
|
||||
baseName = "index"
|
||||
baseName = "feed"
|
||||
isPlainText = true
|
||||
|
||||
[outputFormats.jsonfeed]
|
||||
mediaType = "application/feed+json"
|
||||
baseName = "index.jsonfeed"
|
||||
baseName = "feed"
|
||||
isPlainText = true
|
||||
|
||||
[outputFormats.jf2]
|
||||
mediaType = "application/jf2feed+json"
|
||||
baseName = "index.jf2"
|
||||
baseName = "jf2feed"
|
||||
isPlainText = true
|
||||
|
||||
[outputFormats.as2]
|
||||
mediaType = "application/ld+json"
|
||||
baseName = "index.as2"
|
||||
baseName = "as2"
|
||||
isPlainText = true
|
||||
|
||||
[taxonomies]
|
||||
|
@ -79,6 +85,6 @@ tag = "tags"
|
|||
series = "series"
|
||||
stream = "streams"
|
||||
|
||||
[params.author]
|
||||
[params.author] # TODO: what other params make sense here? should probably also allow setting this in .Site.Data or maybe even in a /people taxonomy?
|
||||
name = "a"
|
||||
# url = ""
|
|
@ -10,7 +10,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta name="color-scheme" content="dark light" />
|
||||
<meta name="color-scheme" content="dark light" />{{/* TODO: make this configurable? */}}
|
||||
{{ "<!-- styles and scripts -->" | safeHTML }}
|
||||
{{- $screen := resources.Get "styles/screen.scss" | toCSS | minify | fingerprint }}
|
||||
<link rel="stylesheet"
|
||||
|
|
|
@ -94,7 +94,7 @@
|
|||
h2 {
|
||||
background-color: var(--color-titlebar);
|
||||
padding: 1rem;
|
||||
margin-left: -1rem;
|
||||
margin-inline-start: -1rem;
|
||||
border-radius: 0 100rem 100rem 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
"mediaType": "text/html"
|
||||
}
|
||||
{{- end }}{{/* end if Permalink */}}
|
||||
{{- with .Pages }},
|
||||
{{- with .RegularPages }},{{- /* TODO: make a separate section.as2.jsonld template for sections that gets all RegularPages in CurrentSection? or otherwise detect sections in this template */}}
|
||||
"orderedItems": [
|
||||
{{- range $index, $item := . }}
|
||||
{{- $itemId := "" }}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{{/* TODO: all of this */}}
|
|
@ -15,8 +15,18 @@
|
|||
{{- .Content }}
|
||||
</div>
|
||||
<p class="list-permalink">h-feed URL: <a href="{{.Permalink}}" rel="self" class="u-url">{{.Permalink}}</a></p>
|
||||
{{- with .AlternativeOutputFormats }}
|
||||
<div class="list-alt-formats">
|
||||
<p>Alternate formats:</p>
|
||||
<ul class="alt-formats-list">
|
||||
{{- range . }}
|
||||
<li class="alt-formats-list-item"><a href="{{.Permalink}}" rel="alternate">{{.Name}} ({{.MediaType}}): <span class="path">{{.RelPermalink}}</span></a></li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{- end }}
|
||||
<hr>
|
||||
</div>
|
||||
</header>
|
||||
{{ "<!-- list the pages in this section/taxonomy/term/etc -->" | safeHTML }}
|
||||
<section class="list-pages section">
|
||||
|
@ -35,24 +45,31 @@
|
|||
</header>
|
||||
</article>
|
||||
</li>
|
||||
{{- else }}{{/* indieweb post kind is probably note */}}
|
||||
{{- else }}{{/* indieweb post kind is probably note */}}
|
||||
{{- if eq .Content (truncate 1000 "..." .Content) }}{{/* if it's short enough, render the whole thing. */}}
|
||||
<li class="pages-list__item">
|
||||
<article class="h-entry hentry">
|
||||
<header>
|
||||
<p><span><time class="dt-published published" datetime="{{.Date.Format "2006-01-02T15:04:05Z"}}">{{.Date.Format "2006-01-02"}}</time>: <a href="{{.Permalink}}">untitled post</a></span></p>
|
||||
</header>
|
||||
|
||||
<section class="p-content entry-content">
|
||||
<p>
|
||||
{{- .Summary }}
|
||||
</p>
|
||||
<section class="e-content entry-content">
|
||||
{{- .Content }} {{/* TODO: better representation? */}}
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<a href="{{.Permalink}}">Read more</a>{{/* then we need a read-more link. */ -}}
|
||||
</footer>
|
||||
</article>
|
||||
</li>
|
||||
{{- else }}{{/* otherwise render a truncated summary. */}}
|
||||
<li class="pages-list__item">
|
||||
<article class="h-entry hentry">
|
||||
<header>
|
||||
<p><span><time class="dt-published published" datetime="{{.Date.Format "2006-01-02T15:04:05Z"}}">{{.Date.Format "2006-01-02"}}</time>: <a href="{{.Permalink}}">untitled post</a></span></p>
|
||||
</header>
|
||||
<section class="e-content entry-content">
|
||||
{{- .Summary }} {{/* TODO: better representation? */}}
|
||||
<p><a href="{{.Permalink}}">Read more</a></p>
|
||||
</section>
|
||||
</article>
|
||||
</li>
|
||||
{{- end }}
|
||||
{{- end }}{{/* end if-title post type check */ -}}
|
||||
{{- end }}{{/* end range over pages */ -}}
|
||||
</ol>
|
||||
|
|
|
@ -0,0 +1,100 @@
|
|||
{{/* TODO: read the spec and write this template layout */}}
|
||||
{
|
||||
"version": "https://jsonfeed.org/version/1.1",
|
||||
"title": {{ .Title | jsonify }},
|
||||
"home_page_url": "{{ .Permalink }}",
|
||||
"feed_url": "{{ (.OutputFormats.Get "jsonfeed").Permalink }}"
|
||||
{{- with (.Summary | jsonify) }},
|
||||
"description": {{.}}
|
||||
{{- end }},
|
||||
"user_comment": "does anyone even use jsonfeed lmao",
|
||||
{{- /* next_url = allows for pagination but i don't think i have to worry about that yet. TODO:?*/}}
|
||||
"icon": "https://trwnh.com/.assets/icon.png", {{- /* TODO: make this variable (512x512?) */}}
|
||||
"favicon": "https://trwnh.com/.assets/icon.png", {{- /* TODO: make this variable and also 64x64 */}}
|
||||
"authors": [ {{- /* TODO: make this variable and also loopable? */}}
|
||||
{
|
||||
"name": {{ (or .Params.author.name .Site.Params.author.name ) | jsonify }},
|
||||
"url": {{ (or .Params.author.url .Site.Params.author.url .Site.Home.Permalink .Site.BaseURL) | jsonify }},
|
||||
"icon": "https://trwnh.com/.assets/icon.png" {{- /* TODO: make this variable (512x512?) */}}
|
||||
}
|
||||
],
|
||||
"author": { {{- /* TODO: make this variable */}}
|
||||
"name": {{ (or .Params.author.name .Site.Params.author.name ) | jsonify }},
|
||||
"url": {{ (or .Params.author.url .Site.Params.author.url .Site.Home.Permalink .Site.BaseURL) | jsonify }},
|
||||
"icon": "https://trwnh.com/.assets/icon.png" {{- /* TODO: make this variable (512x512?) */}}
|
||||
},
|
||||
"language": {{ (or .Language.LanguageCode .Site.Language.LanguageCode) | jsonify }},
|
||||
"expired": false, {{- /* TODO: allow for marking feeds as disabled? */}}
|
||||
"hubs": [], {{- /* TODO: allow defining rsscloud or websub hub with `type` and `url` */}}
|
||||
"items": [
|
||||
{{- range $index, $item := .RegularPages }} {{- /* TODO: if/when i paginate this i need to range over the paginator instead of pages */}}
|
||||
{
|
||||
"id": "{{.Permalink}}",
|
||||
"url": "{{.Permalink}}"
|
||||
{{- with "" }}, {{- /* TODO: "this is useful for linkblogs" -- wtf is a linkblog exactly? look into this. is it more or less the same as inReplyTo? */}}
|
||||
"external_url": "{{.}}"
|
||||
{{- end }}
|
||||
{{- with .Title }},
|
||||
"title": {{ . | jsonify }}
|
||||
{{- end }}
|
||||
{{- with .Content }},
|
||||
"content_html": {{. | jsonify}} {{- /* TODO: handle the content_text case for plaintext content. (how to detect if content is plainifyable? just do it always? when to omit content_html? never?) */}}
|
||||
{{ else }}, {{- /* if there isn't any content, we still have to put something bc it's a required field */}}
|
||||
"content_text": ""
|
||||
{{- end }}
|
||||
{{- if isset .Params "summary" }}
|
||||
{{- with .Summary }},
|
||||
"summary": {{ . | jsonify }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with "" }}, {{- /* TODO: handle featured images */}}
|
||||
"image": "{{.}}"
|
||||
{{- end }}
|
||||
{{- with "" }}, {{- /* TODO: wtf is this */}}
|
||||
"banner_image": "{{.}}"
|
||||
{{- end }}
|
||||
{{- with .Date }},
|
||||
"date_published": "{{.Format "2006-01-02T15:04:05-07:00"}}"
|
||||
{{- end }}
|
||||
{{- with .Lastmod }}, {{- /* TODO: should this only be present if the post was edited? */}}
|
||||
"date_modified": "{{.Format "2006-01-02T15:04:05-07:00"}}"
|
||||
{{- end }},
|
||||
"authors": [ {{- /* TODO: make this variable and also loopable? or should this be omitted since it's implied by the top-level prop? maybe omit it only when it's equal? */}}
|
||||
{
|
||||
"name": {{ (or .Params.author.name .Site.Params.author.name ) | jsonify }},
|
||||
"url": {{ (or .Params.author.url .Site.Params.author.url .Site.Home.Permalink .Site.BaseURL) | jsonify }},
|
||||
"icon": "https://trwnh.com/.assets/icon.png" {{- /* TODO: make this variable (512x512?) */}}
|
||||
}
|
||||
],
|
||||
"author": { {{- /* TODO: make this variable? or should this be omitted since it's implied by the top-level prop? maybe omit it only when it's equal? */}}
|
||||
"name": {{ (or .Params.author.name .Site.Params.author.name ) | jsonify }},
|
||||
"url": {{ (or .Params.author.url .Site.Params.author.url .Site.Home.Permalink .Site.BaseURL) | jsonify }},
|
||||
"icon": "https://trwnh.com/.assets/icon.png" {{- /* TODO: make this variable (512x512?) */}}
|
||||
}
|
||||
{{- with .Params.tags }},
|
||||
"tags": {{. | jsonify}}
|
||||
{{- end }}
|
||||
{{- with (or .Language.LanguageCode .Site.Language.LanguageCode) }}, {{- /* TODO: should this only be present if it differs from top-level feed language? */}}
|
||||
"language": {{. | jsonify}}
|
||||
{{- end }}
|
||||
} {{- if ne $index (sub (len $.RegularPages) 1)}},{{end}}
|
||||
{{- end }}
|
||||
]
|
||||
{{- with "" }},
|
||||
"attachments": [ {{- /* TODO: what to use for this? detect "podcast" or similar cases where there are "related resources" to be listed */}}
|
||||
{{- range . }}
|
||||
"url": {{.Permalink|jsonify}},
|
||||
"mime_type": "application/octet-stream" {{- /* TODO: detect this. it's required. */}}
|
||||
{{- with .Name }},
|
||||
"title": {{.|jsonify}}
|
||||
{{- end }}
|
||||
{{- with "" }}, {{- /* TODO: detect this optionally. */}}
|
||||
"size_in_bytes": {{.|jsonify}}
|
||||
{{- end }}
|
||||
{{- with "" }}, {{- /* TODO: detect this optionally. */}}
|
||||
"duration_in_seconds": {{.|jsonify}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
]
|
||||
{{- end }}
|
||||
}
|
61
unified.test.hugo/layouts/_default/list.rss.xml
Normal file
61
unified.test.hugo/layouts/_default/list.rss.xml
Normal file
|
@ -0,0 +1,61 @@
|
|||
{{- $authorEmail := "" }}
|
||||
{{- with site.Params.author }}
|
||||
{{- if reflect.IsMap . }}
|
||||
{{- with .email }}
|
||||
{{- $authorEmail = . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- $authorName := "" }}
|
||||
{{- with site.Params.author }}
|
||||
{{- if reflect.IsMap . }}
|
||||
{{- with .name }}
|
||||
{{- $authorName = . }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- $authorName = . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- $pctx := . }}
|
||||
{{- if .IsHome }}{{ $pctx = .Site }}{{ end }}
|
||||
{{- $pages := slice }}
|
||||
{{- if or $.IsHome $.IsSection }}
|
||||
{{- $pages = $pctx.RegularPages }}
|
||||
{{- else }}
|
||||
{{- $pages = $pctx.Pages }}
|
||||
{{- end }}
|
||||
{{- $limit := .Site.Config.Services.RSS.Limit }}
|
||||
{{- if ge $limit 1 }}
|
||||
{{- $pages = $pages | first $limit }}
|
||||
{{- end }}
|
||||
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ .Site.Title }}{{ end }}</title>
|
||||
<link>{{ .Permalink }}</link>
|
||||
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ .Site.Title }}</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
|
||||
<managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
|
||||
<webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with .Site.Copyright }}
|
||||
<copyright>{{ . }}</copyright>{{ end }}{{ if not .Date.IsZero }}
|
||||
<lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
|
||||
{{- with .OutputFormats.Get "RSS" }}
|
||||
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
||||
{{- end }}
|
||||
{{- range $pages }}
|
||||
<item>
|
||||
<title>{{ .Title }}</title>
|
||||
<link>{{ .Permalink }}</link>
|
||||
<pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
|
||||
{{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
|
||||
<guid>{{ .Permalink }}</guid>
|
||||
{{- if isset .Params "summary"}}
|
||||
<description>{{ .Summary | transform.XMLEscape | safeHTML }}</description>
|
||||
{{- end }}
|
||||
</item>
|
||||
{{- end }}
|
||||
</channel>
|
||||
</rss>
|
|
@ -4,6 +4,7 @@
|
|||
{{- define "body" }}
|
||||
<body class="layout-_default-single">
|
||||
<main id="main">
|
||||
{{ "<!-- begin article -->" | safeHTML }}
|
||||
<article class="page h-entry hentry" {{- if .Param "autonumbering" }} autonumbering {{- end }}{{- if .Param "toc" }} has-toc {{- end }}>
|
||||
<header class="page-header section">
|
||||
<div class="container">
|
||||
|
@ -18,20 +19,39 @@
|
|||
{{- end }}
|
||||
{{- with .Date }}
|
||||
<p class="page-date">
|
||||
<time class="dt-published published" datetime="{{.UTC.Format "2006-01-02T03:04:05Z"}}"><span class="time">{{ .Format "3:04 PM" }}</span> on <span class="date">{{ .Format "Mon Jan 2, 2006"}}</span></time>
|
||||
<time class="dt-published published" datetime="{{.Format "2006-01-02T15:04:05-07:00"}}"><span class="time">{{ .Format "3:04 PM" }}</span> on <span class="date">{{ .Format "Mon Jan 2, 2006"}}</span></time>
|
||||
</p>
|
||||
{{- end }}
|
||||
{{- with .Params.inReplyTo }}
|
||||
{{- range . }}
|
||||
{{- $name := or .name "[link]" }}
|
||||
{{- $href := "" }}
|
||||
{{- if .pageRef }}
|
||||
{{- $href = ref $ .pageRef }}
|
||||
{{- else }}
|
||||
{{- $href = .url }}
|
||||
{{- end }}
|
||||
<p class="page-inreplyto">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" class="reply-icon" aria-hidden="true"><path fill="currentColor" d="M19 19v-4q0-1.25-.875-2.125T16 12H6.825l3.6 3.6L9 17l-6-6l6-6l1.425 1.4l-3.6 3.6H16q2.075 0 3.538 1.463T21 15v4z"/></svg>
|
||||
<span>In response to: <a class="u-in-reply-to" href="{{with .url}}{{.}}{{end}}">{{with .name}}<span>{{.}}</span>{{else}}<span>[link]</span>{{end}}</a></span>
|
||||
<span>In response to: <a class="u-in-reply-to"{{with $href}} href="{{.}}"{{end}}><span>{{$name}}</span></a></span>
|
||||
</p>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Permalink }}
|
||||
<p class="page-permalink">h-entry URL: <a class="u-url url" href="{{.}}">{{.}}</a></p>
|
||||
{{- end -}}
|
||||
{{- end }}
|
||||
{{- with .Params.syndication }}
|
||||
<aside class="page-syndication">
|
||||
<p>This entry has been posted elsewhere:</p>
|
||||
<ul class="syndication-list">
|
||||
{{- range . }}
|
||||
<li class="syndication-list-item">
|
||||
<a{{with .url}} href="{{.}}" rel="syndication" class="u-syndication"{{end}}>{{or .name .url}}</a>
|
||||
</li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</aside>
|
||||
{{- end }}
|
||||
{{/* {{ with .Params.source }}
|
||||
{{ $type := (printf "%T" .) }}
|
||||
{{ if eq $type "string"}}
|
||||
|
@ -43,35 +63,36 @@
|
|||
{{ end }}
|
||||
{{ end }} */}}
|
||||
</div>
|
||||
<hr>
|
||||
<hr />
|
||||
</header>
|
||||
{{- if .Params.series }}
|
||||
{{ "<!-- article aside: this article is part of a series -->" | safeHTML }}
|
||||
<aside class="page-series section">
|
||||
<div class="container">
|
||||
{{ with .Site.Taxonomies.series }}
|
||||
{{ range $term, $weightedpages := . }}
|
||||
{{- with .Site.Taxonomies.series }}
|
||||
{{- range $term, $weightedpages := . }}
|
||||
<p class="page-series__hint">This post is part of a series: <a href="{{.Page.Permalink}}">{{.Page.LinkTitle}}</a></p>
|
||||
<ol class="series">
|
||||
{{ range $weightedpages.Pages.ByWeight.Reverse }}
|
||||
{{- range $weightedpages.Pages.ByWeight.Reverse }}
|
||||
<li class="series-post">
|
||||
{{- if eq .File.UniqueID $.File.UniqueID -}}
|
||||
{{ with .Params.series_part }}
|
||||
{{- with .Params.series_part }}
|
||||
<span class="series-post__part">Part {{.}}: </span>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
<span class="series-post__title current-post">{{.Title}}</span>
|
||||
{{ else }}
|
||||
{{ with .Params.series_part }}
|
||||
{{- else }}
|
||||
{{- with .Params.series_part }}
|
||||
<span class="series-post__part">Part {{.}}: </span>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
<a href="{{.Permalink}}" class="series-post__link"><span class="series-post__title">{{.Title}}</span></a>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
</ol>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
</div>
|
||||
<hr />
|
||||
</aside>
|
||||
{{- end }}
|
||||
{{- if .Params.toc }}
|
||||
|
@ -84,10 +105,23 @@
|
|||
{{ "<!-- article content -->" | safeHTML }}
|
||||
<section class="page-content section">
|
||||
<div class="container e-content entry-content hugo-content">
|
||||
{{ .Content -}}
|
||||
{{ replaceRE `(?s)<div class="footnotes".*` "" .Content | safeHTML -}}
|
||||
</div>
|
||||
</section>
|
||||
{{ "<!-- article footer -->" | safeHTML }}
|
||||
<footer class="page-footer section">
|
||||
<div class="container">
|
||||
<hr />
|
||||
{{- with (index (.RawContent | .RenderString | findRE `(?s)<div class="footnotes".*`) 0 | safeHTML) }}
|
||||
<section id="footnotes">
|
||||
<h2>Footnotes</h2>
|
||||
{{ . | replaceRE `<hr>\n` "" | safeHTML -}}
|
||||
</section>
|
||||
{{- end }}
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
{{ "<!-- end article -->" | safeHTML }}
|
||||
</main>
|
||||
</body>
|
||||
{{ end }}
|
||||
{{ end }}
|
|
@ -34,11 +34,11 @@
|
|||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 1rem;
|
||||
margin-top: 1rem;
|
||||
margin-block-start: 1rem;
|
||||
}
|
||||
hr {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
margin-block-start: 1rem;
|
||||
margin-block-end: 1rem;
|
||||
}
|
||||
</style>
|
||||
</body>
|
||||
|
|
|
@ -156,7 +156,7 @@
|
|||
{{ with .OutputFormats.Get "Sitemap" -}}
|
||||
<link rel="sitemap" type="application/xml" title="Sitemap" href="{{ .Permalink }}" />
|
||||
{{- end -}}
|
||||
|
||||
{{/* TODO: more output formats? or possibly loop/iterate over all output formats? (probably not, don't want to link to lunr.json do we?) */ -}}
|
||||
{{/* robots */ -}}
|
||||
{{ "<!-- robots -->" | safeHTML }}
|
||||
<meta name="robots" content="index,follow" />
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<style>
|
||||
a[href]:after {
|
||||
a[href]:not(.footnote-ref):after {
|
||||
content: '';
|
||||
display: inline-grid;
|
||||
width: 1rem;
|
||||
|
@ -10,8 +10,8 @@ a[href]:after {
|
|||
mask-repeat: no-repeat;
|
||||
}
|
||||
|
||||
a[href^="{{.Site.BaseURL}}"]:after,
|
||||
a[href^="#"]:after
|
||||
a[href^="{{.Site.BaseURL}}"]:not(.footnote-ref):after,
|
||||
a[href^="#"]:not(.footnote-ref):after
|
||||
{
|
||||
background-image: none !important;
|
||||
display: none;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
font-family: zii;
|
||||
font-size:2em;
|
||||
letter-spacing: 0.125em;
|
||||
padding-left: 1rem;
|
||||
padding-inline-start: 1rem;
|
||||
}
|
||||
h1 span {
|
||||
display: block;
|
||||
|
|
|
@ -23,15 +23,15 @@ html {font-family: -apple-system, BlinkMacSystemFont,
|
|||
/* typography */
|
||||
header h1 {font-size: clamp(1.5rem, 10vw, 3rem); line-height: 1.333}
|
||||
header p {font-size: clamp(1em, 5vw, 1.5rem); line-height: 1.5; max-width: 32ch}
|
||||
h2 {font-size: 1.5rem; line-height: 1.333; margin-bottom: 1rem; max-width: 35ch}
|
||||
h2 {font-size: 1.5rem; line-height: 1.333; margin-block-end: 1rem; max-width: 35ch}
|
||||
p {font-size: 1rem; line-height: 1.5}
|
||||
/* layout */
|
||||
body {margin: auto; min-height: 100vh}
|
||||
section, footer {margin-top: 2.5rem}
|
||||
footer {padding-bottom: 1rem; display: flex; justify-content: center}
|
||||
section, footer {margin-block-start: 2.5rem}
|
||||
footer {padding-block-end: 1rem; display: flex; justify-content: center}
|
||||
.container {padding: 0 1rem; height: 100%;}
|
||||
header {position: relative;}
|
||||
header .container {position: absolute; bottom: 0; width: 100%; height: fit-content}
|
||||
header .container {position: absolute; inset-block-end: 0; width: 100%; height: fit-content}
|
||||
header img {width: 100vw; height: 100vw; max-width: 100%; max-height: 600px; object-fit: cover; object-position: bottom}
|
||||
header h1 {grid-row: 2}
|
||||
header p {grid-row: 3}
|
||||
|
@ -39,7 +39,7 @@ dl {display: grid; grid-template-columns: 6.5rem 1fr}
|
|||
dt {grid-column: 1; font-weight: 700; line-height: 1.5}
|
||||
dd {grid-column: 2; line-height: 1.5; display: flex; justify-content: end}
|
||||
dd a {display: block; max-width: max-content}
|
||||
dt, dd {margin-top: 0.5rem}
|
||||
dt, dd {margin-block-start: 0.5rem}
|
||||
dl p {grid-column: span 2; max-width: 18rem}
|
||||
.links {display: flex; flex-flow: column; gap: 1rem}
|
||||
.links a {display: flex; max-width: max-content; gap: 1rem}
|
||||
|
@ -52,8 +52,8 @@ body:before {
|
|||
position: fixed;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
left: 0;
|
||||
top: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-block-start: 0;
|
||||
background: url(./.assets/images/sunset-square-bg-blue.min.jpg);
|
||||
background-size: cover; background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
|
@ -70,7 +70,7 @@ img {color: white}
|
|||
@media (min-width: 30rem) {
|
||||
#gaming .container {display: flex; justify-content: space-between}
|
||||
#gaming .links span {flex-grow: unset}
|
||||
#gaming h2 {margin-bottom: 0}
|
||||
#gaming h2 {margin-block-end: 0}
|
||||
}
|
||||
@media (min-width: 35rem) {
|
||||
.container {padding: 0 2rem}
|
||||
|
@ -81,7 +81,7 @@ img {color: white}
|
|||
}
|
||||
@media (max-height: 30rem) and (min-aspect-ratio: 1) {
|
||||
header img {width: 100vw; height: 100vh; object-position: center}
|
||||
header .container {bottom: 1rem}
|
||||
header .container {inset-block-end: 1rem}
|
||||
}
|
||||
</style>
|
||||
<!-- end default styling ------------------------------------------->
|
||||
|
|
|
@ -94,7 +94,7 @@
|
|||
h2 {
|
||||
background-color: var(--color-titlebar);
|
||||
padding: 1rem;
|
||||
margin-left: -1rem;
|
||||
margin-inline-start: -1rem;
|
||||
border-radius: 0 100rem 100rem 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue