diff options
Diffstat (limited to 'assets')
-rw-r--r-- | assets/css/default-fast.css | 5 | ||||
-rw-r--r-- | assets/css/default-mathml.css | 26 | ||||
-rw-r--r-- | assets/css/default-simple.css | 79 | ||||
-rw-r--r-- | assets/css/default-syntax.css (renamed from assets/css/syntax-highlight-default.css) | 83 | ||||
-rw-r--r-- | assets/css/default.css | 1492 | ||||
-rw-r--r-- | assets/data/media/logo.png | bin | 170667 -> 9839 bytes | |||
-rw-r--r-- | assets/js/index.js | 1200 | ||||
-rw-r--r-- | assets/templates/markdown-feed.yaml | 17 |
8 files changed, 1896 insertions, 1006 deletions
diff --git a/assets/css/default-fast.css b/assets/css/default-fast.css new file mode 100644 index 0000000..8d9d4d1 --- /dev/null +++ b/assets/css/default-fast.css @@ -0,0 +1,5 @@ +@keyframes paint { + 0% { + opacity: 1; + } +} diff --git a/assets/css/default-mathml.css b/assets/css/default-mathml.css new file mode 100644 index 0000000..4aa437a --- /dev/null +++ b/assets/css/default-mathml.css @@ -0,0 +1,26 @@ +@namespace mathml url(http://www.w3.org/1998/Math/MathML); + +mathml|math { + display: block; + display: block math; +} + +mathml|mtd { + display: flex; + justify-content: center; + padding-right: 0.4em; + padding-left: 0.4em; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} + +@-moz-document url-prefix() { + mathml|mtd { + display: flex; + justify-content: center; + padding-right: 0.4em; + padding-left: 0.4em; + padding-bottom: 0.5ex; + padding-top: 0.5ex; + } +} diff --git a/assets/css/default-simple.css b/assets/css/default-simple.css new file mode 100644 index 0000000..29f7c0d --- /dev/null +++ b/assets/css/default-simple.css @@ -0,0 +1,79 @@ +column-base[position="left"], +column-base[position="right"] { + opacity: 0.1; + transition: 2s; +} + +column-base[position="left"]:hover, +column-base[position="right"]:hover { + opacity: 0.9; + transition: 0.1s; +} + +micro-card[id] > header, +micro-card[id] article math-ml figcaption { + display: block; +} + +micro-card[id] { + flex-direction: row; + padding: 1.25rem 1rem; +} + +micro-card[id] > article { + margin: auto 0; + min-width: 0; +} + +micro-card[id] > article > * { + width: 100%; +} + +micro-card[id] > article > :nth-last-child(2) { + margin-bottom: 0; +} + +micro-card[id] micro-tags, +micro-card[id] > header meta-data, +micro-card[id] > article figcaption, +[data-kind="page"] micro-card[id]:first-child > a { + display: none; +} + +micro-card[id] + > article + footer:not(blockquote footer):not(code-block + footer) { + display: none; +} + +micro-card[id] > a { + display: inline; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 1; +} + +micro-card[id] > a:focus { + background-color: transparent !important; + outline-offset: -0.15rem !important; +} + +micro-card[id] article p, +micro-card[id] article ul, +micro-card[id] article dl, +micro-card[id] article h1, +micro-card[id] article h2, +micro-card[id] article h3, +micro-card[id] article video, +micro-card[id] article iframe, +micro-card[id] article article, +micro-card[id] article details, +micro-card[id] article figcaption, +micro-card[id] header picture { + pointer-events: all; + position: relative; + z-index: 2; +} diff --git a/assets/css/syntax-highlight-default.css b/assets/css/default-syntax.css index 1552e5f..e6f7021 100644 --- a/assets/css/syntax-highlight-default.css +++ b/assets/css/default-syntax.css @@ -1,29 +1,52 @@ -/* ----- Colors ----- */ - /* ----- Format ----- */ .chroma .hl { - display: flex; padding: 0 0.5rem; margin: 0 -0.5rem; } +.chroma .line { + display: block; +} + +.chroma .hl > .cl:before, +.chroma .ln a:hover:before, +.chroma .ln:target a:before, +.chroma .line > .cl:hover:before { + content: ""; + position: absolute; + height: 1.5rem; + width: 100%; + left: 0; + z-index: -1; +} + .chroma .ln a { - background-color: #edf2f7; - padding: 0.2rem 0.75rem; + padding: 0.05rem 0.75rem; margin: 0 1rem 0 -0.75rem; user-select: none; text-decoration: none; + display: inline-block; } -.chroma .ln a:hover { +.chroma .ln a:hover, +.chroma .ln:target a { outline: 0.15rem solid !important; outline-offset: -0.3rem; } -.chroma .line:hover { +.chroma .line .cl:hover { + text-shadow: 0 0 currentColor; +} + +.chroma .ln a:hover:before, +.chroma .ln:target a:before, +.chroma .line > .cl:hover:before { background-color: #f2f2f2; - display: flex; +} + +code-block code { + position: relative; } code-block button { @@ -38,31 +61,29 @@ code-block header language-label a:hover { /* ------ Tokens ------ */ :root { - --code-chroma-background: #ffffff; - --code-chroma-foreground: #333333; - --code-chroma-error-background: #960050; - --code-chroma-error-foreground: #960050; - --code-chroma-label-background: #006894; - --code-chroma-label-foreground: #e6e6e6; - --code-chroma-line-highlight: #d9ddf2; - --code-chroma-line-number: #375462; - --code-chroma-line: var(--code-chroma-foreground); -} - -/* ChromaForeground */ code-block, .chroma, .highlight { color: #333333; color: var(--code-chroma-foreground); } -/* ChromaBackground */ code-block button, .chroma { background-color: #ffffff; background-color: var(--code-chroma-background); } -/* ChromaErrorBackground */ .chroma .err { color: #960050; color: var(--code-chroma-error-background); } -/* ChromaErrorForeground */ .chroma .err { color: #960050; color: var(--code-chroma-error-foreground); } -/* ChromaLabelBackground */ .chroma code:before { background-color: #006894; background-color: var(--code-chroma-label-background); } -/* ChromaLabelForeground */ .chroma code:before { color: #e6e6e6; color: var(--code-chroma-label-foreground); } -/* ChromaLine */ .chroma .line { color: #333333; color: var(--code-chroma-line); } -/* ChromaLineHighlight */ .chroma .hl { background-color: #d9ddf2; background-color: var(--code-chroma-line-highlight); } -/* ChromaLineNumber */ .chroma .ln a { color: #375462 !important; color: var(--code-chroma-line-number) !important; } - -.chroma .hl { - background-color: #fff8c5; +--code-chroma-background: #ffffff; +--code-chroma-foreground: #333333; +--code-chroma-error-background: #960050; +--code-chroma-error-foreground: #960050; +--code-chroma-label-background: #006894; +--code-chroma-label-foreground: #e6e6e6; +--code-chroma-line-highlight: #fff8c5; +--code-chroma-line-number: #375462; +--code-chroma-line-number-background: #edf2f7; +--code-chroma-line: var(--code-chroma-foreground); } +/* ChromaForeground */ code-block, .chroma, .highlight { color: #333333; color: var(--code-chroma-foreground); } +/* ChromaBackground */ code-block button, .chroma { background-color: #ffffff; background-color: var(--code-chroma-background); } +/* ChromaErrorBackground */ .chroma .err { color: #960050; color: var(--code-chroma-error-background); } +/* ChromaErrorForeground */ .chroma .err { color: #960050; color: var(--code-chroma-error-foreground); } +/* ChromaLabelBackground */ .chroma code:before { background-color: #006894; background-color: var(--code-chroma-label-background); } +/* ChromaLabelForeground */ .chroma code:before { color: #e6e6e6; color: var(--code-chroma-label-foreground); } +/* ChromaLine */ .chroma .line { color: #333333; color: var(--code-chroma-line); } +/* ChromaLineHighlight */ .chroma .hl > span:before { background-color: #fff8c5; background-color: var(--code-chroma-line-highlight); } +/* ChromaLineNumber */ .chroma .ln a { color: #375462 !important; color: var(--code-chroma-line-number) !important; } +/* ChromaLineNumberBackground */ .chroma .ln a { background-color: #edf2f7; background-color: var(--code-chroma-line-number-background); } + :root { --code-comment: #4f4f4f; --code-comment-hashbang: var(--code-comment); diff --git a/assets/css/default.css b/assets/css/default.css index f688eaf..d3d2b6f 100644 --- a/assets/css/default.css +++ b/assets/css/default.css @@ -20,71 +20,100 @@ text-shadow: 0 0 currentColor; } +@media (prefers-color-scheme: dark) { + ::selection { + color: #000; + background-color: #aaa; + text-shadow: 0 0 currentColor; + } + + ::-webkit-selection { + color: #000; + background-color: #aaa; + text-shadow: 0 0 currentColor; + } + + ::-moz-selection { + color: #000; + background-color: #aaa; + text-shadow: 0 0 currentColor; + } +} + /* ----- Colors ----- */ :root { --primary: 230; --secondary: 258; --accent: 217; - --foreground: hsl(var(--primary), 99%, 5%); - --fade: hsl(var(--primary), 35%, 30%); - --border-lighter: hsl(var(--primary), 35%, 92%); + --background-bolder: hsl(var(--secondary), 99%, 98%); + --background: hsl(var(--secondary), 99%, 99%); --border-darker: hsl(var(--primary), 35%, 80%); --border-darkest: hsl(var(--primary), 35%, 70%); - --background: hsl(var(--secondary), 99%, 99%); - --background-bolder: hsl(var(--secondary), 99%, 98%); - --widget-background: hsl(var(--secondary), 25%, 97%); - --hover-background: hsl(var(--secondary), 25%, 94%); - --focus-within-background: hsl(var(--secondary), 52%, 95%); - --table-even-background: hsl(var(--secondary), 25%, 99%); - --table-odd-background: hsl(var(--secondary), 25%, 97%); - --link: hsl(var(--accent), 99%, 37%); - --hover-background-alternate: hsl(var(--accent), 100%, 96%); - --active-background-alternate: hsl(var(--accent), 100%, 90%); - --button-background: #fff; + --border-lighter: hsl(var(--primary), 35%, 92%); + --button-background: hsl(var(--primary), 0%, 100%); --danger-background-lighter: #fff5f5; --danger-background: #fcd2cf; --danger: #8f0000; + --fade: hsl(var(--primary), 35%, 30%); + --focus-within-background: hsl(var(--secondary), 52%, 95%); + --foreground: hsl(var(--primary), 99%, 5%); + --hover-background-alternate: hsl(var(--accent), 100%, 96%); + --hover-background: hsl(var(--secondary), 25%, 94%); + --icon-focus-background: var(--icon-hover-background); + --icon-hover-background: hsl(var(--accent), 100%, 90%); + --link: hsl(var(--accent), 99%, 37%); --shadow: #00000060; - --spoiler: #444; + --spoiler: hsl(var(--primary), 0%, 27%); --success-background: #d5f3c4; --success: #1d3c0c; + --table-even-background: hsl(var(--secondary), 25%, 99%); + --table-odd-background: hsl(var(--secondary), 25%, 97%); + --text-background: var(--background); --warning-background: #ffe699; --warning: #332600; - color-scheme: light dark; + --widget-background: hsl(var(--secondary), 25%, 97%); + color-scheme: light; } @media (prefers-color-scheme: dark) { :root { - --active-background-alternate: #425a8a; - --background-bolder: #0d0d0d; - --background-rgb: 17, 17, 17; - --background: rgba(var(--background-rgb), 1); - --border-darker: #555; - --border-darkest: #999; - --border-lighter: #262626; - --button-background: #333; - --danger-background-lighter: #1b0404; + --primary: 0; + --secondary: 0; + --accent: 219; + --background-bolder: hsl(var(--secondary), 0%, 5%); + --background: hsl(var(--secondary), 0%, 7%); + --border-darker: hsl(var(--secondary), 0%, 33%); + --border-darkest: hsl(var(--secondary), 0%, 60%); + --border-lighter: hsl(var(--secondary), 0%, 15%); + --button-background: hsl(var(--secondary), 0%, 20%); + --danger-background-lighter: #261717; --danger-background: #4f1c1c; --danger: #ff9494; - --fade: rgba(var(--foreground-rgb), 0.75); + --fade: hsl(var(--secondary), 0%, 66%); --focus-within-background: #291933; - --foreground-rgb: 221, 221, 221; - --foreground: rgba(var(--foreground-rgb), 1); + --foreground: hsl(var(--secondary), 0%, 87%); --hover-background-alternate: #1c263a; - --hover-background: rgba(var(--foreground-rgb), 0.08); - --link: #a3c3ff; - --shadow: #000; - --spoiler: #aaa; + --hover-background: hsl(var(--secondary), 0%, 14%); + --icon-focus-background: #88aefb; + --icon-hover-background: hsl(var(--accent), 35%, 25%); + --link: hsl(var(--accent), 100%, 82%); + --shadow: hsl(var(--secondary), 0%, 0%); + --spoiler: hsl(var(--secondary), 0%, 67%); --success-background: #2d3e0f; --success: #d5f3c4; - --table-even-background: rgba(var(--foreground-rgb), 0.06); - --table-odd-background: rgba(var(--foreground-rgb), 0.02); + --table-even-background: hsl(var(--secondary), 0%, 12%); + --table-odd-background: hsl(var(--secondary), 0%, 9%); + --text-background: hsl(var(--secondary), 0%, 17%); --warning-background: #a89700; --warning: #000; - --widget-background: rgba(var(--foreground-rgb), 0.02); + --widget-background: hsl(var(--secondary), 0%, 9%); + color-scheme: dark; } - img { + kbd, + img, + video, + figure span { filter: brightness(75%); } code-block pre, @@ -107,38 +136,52 @@ vertical-align: inherit; } -:target::before { - content: ""; - display: block; - height: 4rem; - margin-top: -4rem; - visibility: hidden; +html, +:target:not(nav span) { + scroll-margin-top: 6rem; } -:not(#main):target micro-summary, -:not(#main):target micro-summary:hover { - background-color: transparent; +sup:target [role="doc-noteref"][href^="#fn\:"], +li:target [role="doc-backlink"][href^="#fnref\:"], +:focus:not(html):not(body):not(svg):not(pre):not(#search) { + outline: 0.15rem solid; + outline-offset: 0.05rem; + text-decoration: none; border-radius: 0.5rem; - outline-offset: -6px; - outline: 2px dashed #ccc; - outline: 2px dashed var(--border-darker); } -:focus:not(html):not(body):not(svg) { +sup:target [role="doc-noteref"][href^="#fn\:"], +li:target [role="doc-backlink"][href^="#fnref\:"] { + outline-offset: 1px; +} + +nav a:focus, +button:focus, +menu a:focus, +code-block a:focus, +gallery-images a:focus { + outline-offset: -0.2rem !important; +} + +pre:hover, +pre:focus, +pre:focus-within { outline: 0.15rem solid; - outline-offset: -0.15rem; text-decoration: none; } +sup:target [role="doc-noteref"][href^="#fn\:"], +li:target [role="doc-backlink"][href^="#fnref\:"], :focus:not(html):not(body):not(pre):not(svg):not(button):not(input):not(video) { - background-color: #ffe699; - background-color: var(--warning-background); - color: #111; - color: var(--warning); + background-color: #ffe699 !important; + background-color: var(--warning-background) !important; + color: #111 !important; + color: var(--warning) !important; } -:hover:not(a):not(s):not(img):not(summary):not(nav):not(abbr):not(form):not(code):not(mark):not(td):not(tab-bar):not(tab-bar - nav):not(blockquote p) { +:hover:not(a):not(s):not(span):not(img):not(summary):not(nav):not(abbr):not( + form + ):not(code):not(mark):not(td):not(nav):not(p):not(object):not(tab-bar) { border-radius: 0.5rem; } @@ -168,13 +211,47 @@ h3 { margin: 0; } -p, -ul, -dd, -ol, -figure, -blockquote { - margin: 0; +math { + font-family: "CMU Serif", serif; + font-size: 110%; +} + +micro-card[id] article h1, +micro-card[id] article h2, +micro-card[id] article h3 { + font-family: Charter, Georgia, "Book Antiqua", serif; + font-size: 125%; + font-weight: 700; +} + +micro-card[id] article h2, +micro-card[id] article h3 { + font-size: 115%; +} + +micro-card[id] article h3 { + font-style: italic; +} + +html, +samp, +blockquote span { + font-family: "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", + "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; +} + +pre, +kbd, +code, +svg text, +following-list details summary:after, +micro-card article details[data-disclosure] summary:after { + font-size: 0.95rem; + font-family: "Fira Code", "Lucida Console", "Andale Mono", "Roboto Mono", + "Ubuntu Monospace", "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } p:not(:last-child), @@ -184,10 +261,15 @@ dl:not(:last-child), table:not(:last-child), figure:not(:last-child), code-block:not(:last-child), -blockquote:not(:last-child) { +blockquote:not(:last-child), +article > mark[id]:not(:last-child) { margin-bottom: 0.75rem; } +dd { + margin: 0; +} + dl { margin: 0 0 0 1rem; } @@ -209,22 +291,37 @@ figcaption { text-align: center; } +sup, +sub { + display: inline-block; + vertical-align: bottom; +} + sup { - vertical-align: super; + vertical-align: text-top; font-size: 85%; } sub { - vertical-align: sub; font-size: 85%; } -sup, -sub { - display: inline-block; +article > mark[id] { + display: block; +} + +mark:target a { + color: inherit; + text-decoration-thickness: 2px; } -mark { +mark[id] { + background: none; + color: inherit; +} + +mark, +mark:target span { background: linear-gradient( to bottom, transparent 10%, @@ -239,8 +336,7 @@ mark { var(--warning-background) 90%, transparent 90% ); - color: #332600; - color: var(--warning); + color: #000; } ins { @@ -310,7 +406,7 @@ input[type="checkbox"] { -webkit-appearance: none; appearance: none; background-color: transparent; - border-radius: 0.5rem; + border-radius: 25%; border: 1px solid; border-color: inherit; height: 1.25rem; @@ -325,23 +421,27 @@ input[type="checkbox"]:checked { } input[type="checkbox"]:checked:after { - content: "\2714"; - display: flex; - align-items: center; - justify-content: center; - font-weight: 700; + border-bottom-style: solid; + border-left-style: solid; + border-width: 0.4rem; + content: ""; + display: block; height: 100%; - width: 100%; + margin: auto; + transform: scale(0.5, -0.5) rotateZ(145deg); + width: 70%; } blockquote { color: #444; color: var(--fade); + margin: 0; } -blockquote p { +blockquote p, +blockquote p:not(:last-child) { padding-left: 1rem; - margin-left: 1rem; + margin: 0 0 0 1rem; border-left: 2px solid; border-color: #eee; border-color: var(--border-darker); @@ -353,122 +453,113 @@ blockquote footer { } video { + width: 100%; color: #000; border-radius: 0.5rem; background-color: #000; + vertical-align: middle; box-shadow: 0 0 3px #00000060; box-shadow: 0 0 3px var(--shadow); } -video:hover { - box-shadow: 0 0 14px #00000060; - box-shadow: 0 0 14px var(--shadow); -} - video[data-orientation="portrait"] { width: 50%; } +video:focus { + filter: brightness(100%); +} + video-container { display: block; text-align: center; } kbd { - background-color: #eee; + background-color: #fff; border-radius: 0.25rem; - border: 1px solid #b4b4b4; - box-shadow: 0 1px 1px #737373, 0 2px 0 0 #f2f2f2 inset; + border: 1px solid #bbb; color: #333; display: inline-block; font-size: 0.85em; font-weight: 700; line-height: 1; - padding: 2px 4px; + padding: 0.1rem 0.25rem; white-space: nowrap; } /* ----- Elements ----- */ -html { - font-size: 95%; - line-height: 1.5; - word-break: break-word; - text-rendering: optimizeSpeed; - margin-left: calc(100vw - 100%); - margin-right: 0; -} - -html, -samp, -blockquote span { - font-family: "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", - Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", - "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", - "Segoe UI Symbol"; -} - -blockquote p { - font-family: Charter, Georgia, "Book Antiqua", serif; - font-size: 110%; -} - -pre, -kbd, -code, -svg text { - font-family: "Fira Code", "Lucida Console", "Andale Mono", "Roboto Mono", - "Ubuntu Monospace", "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace, - "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -} - -body, button, -input, -select, textarea { margin: 0; } ol { - counter-reset: ol; padding-left: 3.5rem; + list-style: none; + margin: 0; } ol li { overflow-wrap: break-word; word-break: break-word; - list-style: none; + position: relative; + min-height: 1rem; +} + +ol li + li { + margin-top: 0.5rem; } ol li:before { - border-radius: 100%; + border-radius: 0.5rem; border: 1px solid; - content: counter(ol); - counter-increment: ol; - margin-left: -2rem; + border-color: #111; + border-color: var(--foreground); font-size: 85%; - padding: 0 0.35rem; + font-weight: 700; + opacity: 0.85; + padding: 0 0.5rem; position: absolute; + right: 0; + margin-right: 100%; + margin-left: -100%; + font-variant-numeric: tabular-nums lining-nums slashed-zero; + height: 100%; + max-height: 1.5rem; + display: flex; + align-items: center; } -ol li + li { - margin-top: 0.5rem; +ol:not([start]) { + counter-reset: ol; } -main { - min-height: 100%; +ol:not([start]) li:before { + content: counter(ol); + counter-increment: ol; +} + +ol[start] li:before { + content: counter(list-item); } -main, details, +summary, code-block, +figure span, diagram-container { display: block; } -summary { - display: list-item; +main { + display: block; + min-height: 80vh; +} + +summary::-webkit-details-marker { + display: none; } cite { @@ -478,6 +569,7 @@ cite { ul { list-style: none; padding-left: 0; + margin: 0; } nav ol, @@ -503,8 +595,13 @@ q:after { content: "\201D"; } -details, -micro-metadata-menu context-control label { +pre code { + white-space: pre-line; +} + +summary, +abbr[title] label, +menu label { cursor: pointer; } @@ -521,10 +618,10 @@ a:hover { } a:hover, -micro-metadata-menu:hover span, -micro-metadata-view a:hover span, -micro-metadata-draft a:hover span, -micro-metadata-handle a:hover span { +menu:hover span, +meta-view a:hover span, +meta-draft a:hover span, +meta-handle a:hover span { text-decoration-thickness: 0.15rem !important; text-decoration-color: inherit !important; } @@ -549,15 +646,15 @@ document-attachment object p { margin: 1rem; } -column-left nav { +column-base[position="left"] nav { position: sticky; position: -webkit-sticky; - align-self: flex-start; top: 0.5rem; text-align: right; + font-size: 100%; } -column-left nav a { +column-base[position="left"] nav a { align-items: center; color: inherit; color: var(--foreground); @@ -569,28 +666,34 @@ column-left nav a { border-radius: 0.5rem; } -column-left nav li { +column-base[position="left"] nav li { margin-bottom: 0.25rem; } -column-left nav li:hover a { +column-base[position="left"] nav li:hover a { background-color: #eee; background-color: var(--hover-background); border-radius: 0.5rem; } -column-left nav li:hover svg { +column-base[position="left"] nav a:hover svg { + fill: #cce0ff; + fill: var(--icon-hover-background); + stroke-width: 0.1rem; +} + +column-base[position="left"] nav a:focus svg { fill: #cce1ff; - fill: var(--active-background-alternate); + fill: var(--icon-focus-background); } -column-left nav a span { +column-base[position="left"] nav a span { padding: 0 1rem; } -column-left nav a svg { - height: 1.5795rem; - width: 1.5795rem; +column-base[position="left"] nav a svg { + height: 1.5em; + width: 1.5em; } abbr[title] { @@ -606,6 +709,14 @@ input[type="checkbox"]:checked ~ abbr[title]::after { content: " (" attr(title) ")"; } +input[type="checkbox"]:checked ~ input[type="checkbox"] ~ abbr[title] { + cursor: text; +} + +input[type="checkbox"]:checked ~ input[type="checkbox"] ~ abbr[title] label { + pointer-events: none; +} + samp { font-variant: all-small-caps; letter-spacing: 0.05rem; @@ -621,26 +732,23 @@ small { opacity: 0.85; } -audio, -canvas, -iframe, -img, -svg, -video { +canvas { vertical-align: middle; } -video, audio { width: 100%; -} - -audio { margin: 0.75rem 0; + vertical-align: middle; } figure { text-align: center; + margin: 0; +} + +figure object { + pointer-events: none; } iframe { @@ -649,8 +757,10 @@ iframe { border: 2px solid #ccc; border: 2px solid var(--border-darker); background-color: #fefefe; - border-radius: 0.5rem !important; + border-radius: 0.5rem; min-height: 16rem; + user-select: none; + vertical-align: middle; } self-embed iframe { @@ -658,10 +768,12 @@ self-embed iframe { max-height: 11rem; } -img { +img, +figure object { height: auto; max-width: 100%; - border: 1px solid; + border-width: 1px; + border-style: solid; border-color: #ccc; border-color: var(--border-darker); border-radius: 0.5rem; @@ -671,24 +783,24 @@ img { justify-content: center; align-items: center; background-color: #fefefe; + user-select: none; + vertical-align: middle; } -img:hover { +img:hover, +video:hover, +figure span:hover { box-shadow: 0 0 14px #00000060; box-shadow: 0 0 14px var(--shadow); filter: brightness(90%); } -img, -iframe { - user-select: none; -} - p { - line-height: 1.4; + margin: 0; } svg { + vertical-align: middle; stroke-width: 0.08rem; } @@ -700,33 +812,35 @@ svg:not(:root) { overflow: hidden; } -button, input { + margin: 0; overflow: visible; } -button, select { text-transform: none; + margin: 0; } button, +summary:after, [type="reset"], [type="button"], [type="submit"], micro-tags a, -micro-expand label, -paginator-navigation a, -micro-author micro-summary > a { +nav[data-type="pagination"] a, +micro-author micro-card > a { align-items: center; appearance: none; background-color: #fff; background-color: var(--button-background); + border: 1px solid; border-radius: 0.5rem; - border: 1px solid #eee; - border: 1px solid var(--border-lighter); - box-shadow: 0 1px 2px #00000060; - box-shadow: 0 1px 2px var(--shadow); + border-color: #eee; + border-color: var(--border-darker); + border-top-color: var(--border-lighter); + border-left-color: var(--border-lighter); + border-right-color: var(--border-lighter); color: inherit; cursor: pointer; display: flex; @@ -734,6 +848,8 @@ micro-author micro-summary > a { height: 1.95rem; padding: 0.125rem 0.5rem; text-decoration: none; + text-transform: none; + overflow: visible; } button:hover, @@ -741,24 +857,34 @@ button:hover, [type="button"]:hover, [type="submit"]:hover, micro-tags a:hover, -micro-expand label:hover, -paginator-navigation a:hover, -micro-author micro-summary > a:hover { +nav[data-type="pagination"] a:hover, +micro-author micro-card > a:hover { border: 1px solid; border-color: #aaa; border-color: var(--border-darkest); } button svg, -paginator-navigation svg, -micro-author micro-summary > a svg { +micro-author micro-card a svg, +nav[data-type="pagination"] a svg { height: 1.25rem; width: 1.25rem; - margin: 0 0.25rem; +} + +micro-author a svg ~ span, +micro-author a span ~ svg, +nav[data-type="pagination"] a svg ~ span, +nav[data-type="pagination"] a span ~ svg { + margin-left: 0.25rem; } hr { + border: 0; border-top: 1px solid; + border-color: #ccc; + border-color: var(--border-darker); + opacity: 0.4; + margin: 0.5rem 0; } /* ----- Tables ----- */ @@ -821,6 +947,10 @@ tr:last-child td:last-child { /* ----- Print ----- */ +article a[href*="pdf"]::after { + content: " [pdf]"; +} + @media print { a[href^="http"]::after { content: " (" attr(href) ")"; @@ -833,50 +963,75 @@ tr:last-child td:last-child { /* ----- Base ----- */ +html { + font-size: 95%; + height: 100%; + line-height: 1.5; + margin: 0; + overflow-y: scroll; + text-rendering: optimizeSpeed; + word-break: break-word; +} + +html[data-document="html"], +html[data-document="xhtml"] { + height: auto; + margin-left: calc(100vw - 100%); + margin-right: 0; + overflow-y: visible; +} + +html[data-document="html"] body, +html[data-document="xhtml"] body { + display: flex; + margin: 0 auto; + max-width: 1250px; +} + body { background-color: #fefefe; background-color: var(--background); color: #111; color: var(--foreground); - display: flex; - margin: 0 auto; - max-width: 1250px; + margin: 0; + max-width: 600px; min-height: 100%; overflow-x: hidden; -webkit-text-size-adjust: none; } -column-left { - display: flex; +column-base[position="left"] { width: 14.25%; - justify-content: flex-end; } -column-right { +column-base[position="right"] { width: 28%; } -column-left, -column-right { +column-base[position="left"], +column-base[position="right"] { margin: 0.5rem 2rem; } -column-middle { +column-base[position="middle"] { max-width: 600px; min-height: 100vh; width: 100%; + height: fit-content; } micro-card, -micro-tags { +micro-tags, +profile-box { display: block; } -history-archive h1, -records-archive h1 { +source-files h1, +archive-list h1 { text-align: center; font-weight: 400; font-size: 150%; + font-variant: all-small-caps; } micro-tags { @@ -891,7 +1046,7 @@ micro-tags a { margin: 0 0.25rem 0.5rem 0; } -micro-summary { +micro-card { border-bottom: 1px solid; border-color: #eee; border-color: var(--border-lighter); @@ -901,59 +1056,80 @@ micro-summary { position: relative; } -micro-author micro-summary { - flex-direction: row; +micro-card > a { + display: none; +} + +micro-card:target { + border-radius: 0.5rem; + outline-offset: -6px; + outline: 2px dashed #ccc; + outline: 2px dashed var(--border-darker); } -micro-summary:hover { +micro-card:hover { background-color: #f5f9ff; background-color: var(--hover-background-alternate); } -micro-summary:focus-within { +micro-card:focus-within { background-color: #f0ecf9; background-color: var(--focus-within-background); } -micro-author micro-summary { +micro-author micro-card { + flex-direction: row; justify-content: start; align-items: center; border: none; } -micro-author micro-thumbnail { - flex: none; - margin-right: 0.5rem; +micro-author micro-card header, +micro-author micro-card > a, +micro-author micro-card > article, +micro-author micro-card > p:not(:last-child) { + margin: 0 0.5rem; +} + +micro-author micro-card p:not(:last-child) { + flex: 1.75; + color: #444; + color: var(--fade); + max-width: 20rem; } -micro-author micro-header { +micro-author article { flex: 1; min-width: 3rem; - margin-right: 0.75rem; } -micro-author micro-header h2 { - line-height: 1.25rem; +micro-author article h2 { + line-height: 1.25; } -micro-author micro-summary p:not(:last-child) { - flex: 1.75; - margin: 0 0.75rem 0 0; - color: #444; - color: var(--fade); - max-width: 20rem; +micro-author article h3 { + font-weight: 400; +} + +micro-author micro-card header figure:first-child { + margin: 0; } -micro-thumbnail figure { +micro-card header figure:first-child { margin: 0 0.75rem 0 0; } -micro-thumbnail figure > a { +micro-card header figure > a, +micro-card header figure > a:hover { + color: #000; display: block; + text-decoration: none; } tag-card figure img, -micro-thumbnail figure img { +micro-card header figure img, +micro-card header figure span, +micro-card header figure object { border-radius: 100%; min-width: 3.5rem; min-height: 3.5rem; @@ -961,37 +1137,35 @@ micro-thumbnail figure img { max-height: 3.5rem; } -micro-summary article { +micro-card > article { margin-left: 4.25rem; } -micro-summary article ul { +micro-card article ul { list-style-type: "\2012"; padding-left: 2rem; } -micro-summary article li { +micro-card article li { padding-left: 0.5rem; } -micro-summary article ul li + li { - margin-top: 0.25rem; +micro-card article li::marker { + opacity: 0.85; } -[data-kind] micro-summary article h1 a, -[data-kind] micro-summary article h2 a, -[data-kind] micro-summary article h3 a { - color: inherit; +micro-card article ul li + li { + margin-top: 0.25rem; } -micro-summary article figure img { +micro-card article figure img { border: none; margin: 0 auto; box-shadow: 0 0 3px #00000060; box-shadow: 0 0 3px var(--shadow); } -micro-summary article figure img:before { +micro-card article figure img:before { background-color: #fefefe; background-color: var(--background); border-radius: 0.5rem; @@ -1003,22 +1177,20 @@ micro-summary article figure img:before { margin: 1rem; } -micro-summary article figure > a { +micro-card article figure > a { border-radius: 0.5rem; display: inline-block; } -micro-summary article figure > a[data-orientation="landscape"] { +micro-card article figure > a[data-orientation="landscape"] { display: block; } -micro-summary article figure > a[data-orientation="landscape"] img { +micro-card article figure > a[data-orientation="landscape"] img { width: 100%; - max-height: 20rem; } -micro-metadata { - align-items: center; +micro-card header { color: #444; color: var(--fade); display: flex; @@ -1026,144 +1198,153 @@ micro-metadata { margin-bottom: 0.25rem; } -micro-metadata h2 { +micro-card header h2 { display: inline; } -micro-metadata header { +micro-card header meta-data { word-break: break-all; word-break: break-word; } -micro-metadata header a { +micro-card header meta-data a { color: inherit; } -micro-metadata header > *:not(:last-child) { +micro-card header meta-data > *:not(:last-child) { margin-right: 0.5rem; } -micro-metadata header > *:hover { +micro-card header meta-data > *:hover { color: #111; color: var(--foreground); } -micro-metadata-expiry, -micro-metadata-draft em, -micro-metadata-wordcount word-limit em { +meta-expiry, +meta-draft em, +meta-wordcount word-limit em { color: #8f0000; color: var(--danger); font-style: normal; } -micro-metadata-draft em { +meta-draft em { font-variant: all-small-caps; } -micro-header footer svg, -micro-metadata header svg { +profile-box footer svg, +micro-card header meta-data svg { height: 1rem; width: 1rem; - stroke-width: 0.1rem; + stroke-width: 0.105rem; } -micro-metadata-unlisted { +meta-unlisted { font-variant: all-small-caps; } s label, abbr[title], -abbr[title] label, -micro-metadata-expiry, -micro-metadata-readtime, -micro-metadata-datetime, -micro-metadata-unlisted, -micro-metadata-wordcount { +meta-expiry, +meta-readtime, +meta-datetime, +meta-unlisted, +meta-wordcount { cursor: help; } -micro-metadata-anchored { +meta-anchored { display: flex; margin-bottom: 0.25rem; width: 100%; } -micro-metadata-anchored > * { +meta-anchored > * { margin-right: 0.5rem; display: flex; flex-wrap: wrap; align-items: center; + text-decoration: none; } -micro-metadata-anchored svg { +meta-anchored svg { margin-right: 0.25rem; } -micro-metadata-menu { +meta-anchored a[data-anchored="pinned"] svg { + fill: #9ed1fa; +} + +meta-anchored a[data-anchored="marked"] svg { + fill: #cd5c5c; +} + +menu { display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; position: relative; } -micro-metadata-menu context-menu { +menu context-menu { min-width: 10rem; } -micro-metadata-menu context-menu svg { +menu context-menu svg { margin-right: 0.25rem; } -micro-metadata-menu context-menu a { +menu context-menu a { display: block; padding: 0.5rem 1rem; } -micro-metadata-menu context-menu a:hover { +menu context-menu a:hover { background-color: #eee; background-color: var(--hover-background); border-radius: 0.25rem; } -[data-kind] micro-summary article h1 a, -[data-kind] micro-summary article h2 a, -[data-kind] micro-summary article h3 a, -micro-metadata-view a, -micro-metadata-name a, -micro-metadata-draft a, -micro-metadata-handle a, -micro-metadata a:focus > span, -micro-metadata context-menu a, -micro-metadata context-menu a span { - text-decoration: none; -} - -[data-kind] micro-summary article h1 a:hover, -[data-kind] micro-summary article h2 a:hover, -[data-kind] micro-summary article h3 a:hover, -micro-metadata-menu span, -micro-metadata-view a span, -micro-metadata-name a:hover, -micro-metadata-draft a span, -micro-metadata-handle a span { - text-decoration: underline; +micro-card[id] article h1 a, +micro-card[id] article h2 a, +micro-card[id] article h3 a { + color: inherit; } -anchored-pinned svg { - fill: #9ed1fa; +meta-view a, +meta-name a, +meta-draft a, +meta-handle a, +micro-card[id] article h1 a, +micro-card[id] article h2 a, +micro-card[id] article h3 a, +micro-card header a:focus > span, +micro-card menu context-menu a, +micro-card menu context-menu a span { + text-decoration: none; } -anchored-liked svg { - fill: #cd5c5c; +menu span, +meta-view a span, +meta-name a:hover, +meta-draft a span, +meta-handle a span, +micro-card[id] article h1 a:hover, +micro-card[id] article h2 a:hover, +micro-card[id] article h3 a:hover { + text-decoration: underline; } -micro-header micro-header-banner img { +profile-box picture[data-type="banner"] img { background-color: transparent; border-radius: 0.125rem; - height: 12rem; + height: 10rem; width: 100%; border: none; } -micro-header micro-header-picture img { +profile-box picture[data-type="profile"] img { border-radius: 100%; height: 8rem; margin: -4rem 2rem 0 2rem; @@ -1172,104 +1353,134 @@ micro-header micro-header-picture img { padding: 0.25rem; } -micro-header section { +profile-box section { margin: 1rem 2rem 0 2rem; - line-height: 1; display: flex; align-items: baseline; } -micro-header-title { +profile-box section aside { flex: 1; line-height: 1.25; margin-right: 1rem; + display: inline; } -micro-header-description { +profile-box section p { flex: 6; } -micro-header h3 { +profile-box h3 { font-weight: 400; color: #444; color: var(--fade); } -micro-header footer, -micro-header footer code { +profile-box footer, +profile-box footer code { color: #444; color: var(--fade); } -micro-header footer { +profile-box footer { margin: 1.25rem 2rem 0.25rem 2rem; text-align: center; font-size: 95%; } -micro-header footer p { +profile-box footer p { margin: 0.75rem 0.5rem 0.25em 0; display: inline; } -micro-summary article details[data-disclosure] summary { - display: block; +micro-card details[data-disclosure] summary { + display: inline-block; margin: 0 -0.25rem 0.5rem -0.25rem; padding: 0.25rem; - outline-offset: 0.05rem; } -micro-summary article details[data-disclosure] summary:focus a, -micro-summary article details[data-disclosure] summary:focus:after, -micro-summary article details[data-disclosure][open] summary:focus:after { +micro-card details[data-disclosure] summary:focus a { color: inherit; - border-color: inherit; } -micro-summary article details[data-disclosure] summary:hover { - text-shadow: 0 0 currentColor; +following-list details summary:focus:after, +following-list details[open] summary:focus:after, +micro-card details[data-disclosure] summary:focus:after, +micro-card details[data-disclosure][open] summary:focus:after { + color: #111; + color: var(--foreground); + border-color: #111; } -micro-summary article details[data-disclosure] summary:after, -micro-summary article details[data-disclosure][open] summary:after { - padding: 0 0.5rem; - margin-left: 1ch; - border: 2px solid; - border-color: #ddd; - border-color: var(--border-darker); +following-list details summary:after, +following-list details[open] summary:after, +micro-card details[data-disclosure] summary:after, +micro-card details[data-disclosure][open] summary:after { border-radius: 0.5rem; - font-variant: small-caps; + display: inline; + vertical-align: bottom; } -micro-summary article details[data-disclosure] summary:after { - content: "show"; +micro-card details[data-disclosure] summary:hover, +micro-card details[data-disclosure] summary:hover:after { + text-shadow: 0 0 currentColor; } -micro-summary article details[data-disclosure][open] summary:after { - content: "hide"; +micro-card details[data-disclosure] summary:hover:after { + text-decoration: underline; } -micro-summary article details[data-disclosure] summary::-webkit-details-marker { - display: none; +micro-card details[data-disclosure] summary:after { + content: "HIDDEN"; } -micro-summary article details[data-disclosure] ~ *:not(micro-tags) { - display: none; +micro-card details[data-disclosure][open] summary:after { + content: "OPENED"; } -micro-summary article details[data-disclosure][open] ~ * { +micro-card details[data-disclosure][open] ~ details summary:after { + content: none; +} + +micro-card details[data-disclosure][open] ~ *:not(details):not(micro-tags) { display: inherit; } +micro-card + details[data-disclosure][open] + ~ *:not(details):not(micro-tags):not(math-ml) { + color: #444; + color: var(--fade); +} + +micro-card details[data-disclosure][open] ~ details summary { + cursor: text; +} + +micro-card details[data-disclosure] ~ *:not(details):not(micro-tags) { + display: none; +} + micro-thread related-content footer { font-size: 100%; border-bottom: 1px solid; - border-color: #ccc; + border-color: #eee; border-color: var(--border-lighter); margin: 0; padding: 0.5rem 0; } +micro-thread nav[data-type="pagination"] { + padding: 0.5rem 0; + border-bottom: 1px solid; + border-color: #eee; + border-color: var(--border-lighter); +} + +micro-thread > nav[data-type="pagination"]:last-child { + border: none; +} + tab-bar { display: inline-block; overflow-x: auto; @@ -1303,7 +1514,7 @@ tab-bar nav a { position: relative; text-decoration: none; top: 1px; - border-bottom: 2px solid var(--background); + border-bottom: 2px solid transparent; } tab-bar nav a:not(:last-child) { @@ -1315,11 +1526,34 @@ tab-bar nav a[data-draft] { color: var(--danger); } +tab-bar nav a:after { + content: attr(data-label); + display: block; + font-weight: 700; + height: 0; + overflow: hidden; + pointer-events: none; + user-select: none; + visibility: hidden; +} + tab-bar nav a:hover { text-decoration: underline; } -column-middle main > nav { +tab-bar nav a span[data-scroll] { + position: absolute; + top: -4.75rem; + left: 200%; + width: 0; + height: 0; +} + +tab-bar nav a:nth-child(-n + 3) span[data-scroll] { + left: -200%; +} + +column-base[position="middle"] > nav:first-child { align-items: center; background-color: #fefefe; background-color: var(--background); @@ -1332,31 +1566,39 @@ column-middle main > nav { top: 0; width: 100%; z-index: 100; - height: 4rem; + height: inherit; } -column-middle main > nav section h2, -column-middle main > nav section small { +column-base[position="middle"] > nav:first-child section h2, +column-base[position="middle"] > nav:first-child section small { margin: 0; } -micro-author micro-header h2, -micro-author micro-header h3, -micro-author micro-header time, -column-middle main > nav section h2, -column-middle main > nav section small { - white-space: nowrap; +micro-author article > *, +column-base[position="middle"] > nav:first-child section h2, +column-base[position="middle"] > nav:first-child section small { overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; } -column-middle main > nav section { +column-base[position="middle"] > nav:first-child section { line-height: 1.25; padding: 0 0.5rem; + margin-right: 0.5rem; +} + +column-base[position="middle"] > footer:last-child { + margin: 1rem 0.25rem 3rem 0.25rem; } -column-middle main > footer { - margin: 1rem 0; +column-base[position="middle"] main > footer:last-child { + padding: 2rem 0 1rem 0; +} + +icon-button, +icon-navigator { + height: 4rem; } icon-button a { @@ -1371,9 +1613,16 @@ icon-button a { padding: 0.5rem 0; } -icon-button, -icon-navigator { - height: 4rem; +icon-button a svg:nth-of-type(2), +icon-button a small:nth-of-type(2), +icon-button a[data-update="refresh"] svg:nth-of-type(1), +icon-button a[data-update="refresh"] small:nth-of-type(1) { + display: none; +} + +icon-button a[data-update="refresh"] svg:nth-of-type(2), +icon-button a[data-update="refresh"] small:nth-of-type(2) { + display: block; } icon-button a:hover { @@ -1413,6 +1662,7 @@ code-block pre code { border-top: 1px solid #ccc; border-top: 1px solid var(--border-darker); padding: 0.75rem; + white-space: pre; } code-block[data-lines] pre code { @@ -1421,7 +1671,7 @@ code-block[data-lines] pre code { code-block header { position: relative; - top: 1.85rem; + top: 2.125rem; margin-top: -1rem; height: 1rem; padding: 0 0.5rem; @@ -1432,50 +1682,40 @@ code-block header { } code-block header language-label { - padding: 0.125rem 1rem; font-variant: all-small-caps; } code-block header language-label a { text-decoration: none; + padding: 0.125rem 1rem; } code-block header language-label a:hover { text-decoration: underline; } -paginator-navigation { - padding: 1rem 0.25rem 0 0.25rem; +code-content { + width: 100%; +} + +nav[data-type="pagination"] { + padding: 1rem 0; display: flex; align-items: center; justify-content: center; flex-wrap: wrap; } -paginator-navigation a { - margin: 0 0.25rem 0.5rem 0.25rem; +nav[data-type="pagination"] a { + margin: 0.5rem 0.25rem; font-size: 85%; display: flex; align-items: center; justify-content: center; } -web-ring, -author-list, -following-list, -gallery-images { - padding-bottom: 1rem; - display: block; -} - -web-ring > h1, -author-list > h1, -following-list > h1, -gallery-images > h1 { - font-size: 95%; - margin: 0.5rem 0 1rem 0; - text-align: center; - text-transform: uppercase; +nav[data-type="pagination"] a[title="hidden"] { + visibility: hidden; } gallery-images aside { @@ -1487,10 +1727,10 @@ gallery-images aside { gallery-images a { display: flex; - flex-basis: 33.33%; + flex-basis: 25%; flex-grow: 1; height: 6rem; - width: 33.333%; + width: 25%; } gallery-images picture, @@ -1518,44 +1758,37 @@ gallery-overlay { z-index: 1; pointer-events: none; border: 1px solid; - border-color: #ccc; + border-color: #eee; border-color: var(--border-lighter); } -web-ring { +web-ring, +[data-kind="home"] author-list, +[data-kind="term"] author-list, +[data-kind="taxonomy"] author-list { border-radius: 1rem; position: sticky; position: -webkit-sticky; top: 1rem; } -web-ring header { - font-weight: 700; -} - web-ring time, -micro-author micro-header time { +micro-author article time { display: block; color: #444; color: var(--fade); } -web-ring time { - font-variant: small-caps; -} - -web-ring p, -web-ring time { - display: inline; -} - web-ring p:not(:last-child) { margin-bottom: 0; } -web-ring-item:not(:last-child) { - margin-bottom: 2rem; - display: block; +web-ring article:not(:last-child) { + margin-bottom: 1.5rem; +} + +web-ring aside { + padding: 1rem; } web-ring aside, @@ -1563,7 +1796,7 @@ author-list aside, following-list aside { background-color: #f9f9f9; background-color: var(--widget-background); - border-radius: 1rem; + border-radius: 0.5rem; } web-ring aside footer, @@ -1573,8 +1806,64 @@ following-list aside footer { background-color: var(--background); } -web-ring aside { - padding: 1rem; +web-ring, +author-list, +following-list, +gallery-images { + padding-bottom: 1rem; + display: block; +} + +web-ring > h1, +author-list > h1, +gallery-images > h1, +following-list details { + font-size: 95%; + margin: 0.5rem 0 1rem 0; + text-align: center; + text-transform: uppercase; +} + +following-list details h1 { + display: inline-block; +} + +following-list aside micro-author { + display: none; +} + +following-list details[open] + aside micro-author, +following-list aside micro-author:nth-child(-n + 3) { + display: inherit; +} + +following-list:hover details[open] + aside { + outline: 2px solid #ccc; + outline: 2px solid var(--border-darker); +} + +following-list details[data-expand="more"] summary:after { + content: "+"; +} + +following-list details[open][data-expand="more"] summary:after { + content: "-"; +} + +following-list details[data-expand="more"] summary:after, +following-list details[open][data-expand="more"] summary:after { + padding: 0 0.5rem; + font-size: 100%; + margin-left: 0.25rem; +} + +author-list:hover h1, +following-list:hover details h1 { + text-decoration: underline; +} + +author-list h1 a { + color: inherit; } author-list aside { @@ -1585,23 +1874,23 @@ author-list p { display: none; } -search-entry { +search-box { display: inherit; width: 100%; z-index: 1; } -search-entry[data-focus], -search-entry:focus-within { +search-box[data-focus], +search-box:focus-within { position: absolute; } -search-entry:focus-within form { +search-box:focus-within form { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } -search-entry form { +search-box form { background-color: #fefefe; background-color: var(--background); border-radius: 0.5rem; @@ -1609,12 +1898,12 @@ search-entry form { border-color: #ccc; border-color: var(--border-darker); display: inline-flex; - margin: 0 1rem; width: 100%; position: relative; + margin: 0 0.5rem; } -search-entry form button { +search-box form button[type="submit"] { background-color: transparent; border: none; box-shadow: none; @@ -1630,32 +1919,32 @@ search-entry form button { line-height: 1; } -search-entry form input { +search-box form input { -webkit-appearance: none; - background-color: #fefefe; - background-color: var(--background); border-bottom-left-radius: 0.5rem; border-top-left-radius: 0.5rem; border: none; font-size: 100%; - line-height: 1.5; + line-height: inherit; padding-left: 1rem; padding-right: 1rem; width: 100%; color: inherit; } -search-entry form button svg { - stroke-width: 0.1rem; +search-box form input, +search-box form input:focus { + outline: none; + background-color: #fefefe; + background-color: var(--text-background); } -search-entry form input:focus { - outline: none; - background-color: #fefefe !important; - background-color: var(--background) !important; +search-box form button svg { + stroke-width: 0.1rem; + width: 100%; } -search-entry ul { +search-box ul { position: absolute; background-color: inherit; padding-top: 2.9rem; @@ -1664,17 +1953,17 @@ search-entry ul { border-radius: 0.5rem; z-index: -1; margin-right: 1rem; - margin-left: -0.05rem; + margin-left: -0.065rem; width: 100.3%; box-shadow: 0 4px 6px #00000060; box-shadow: 0 4px 6px var(--shadow); } -search-entry ul li a span { +search-box ul li a span { font-weight: 400; } -search-entry ul li a { +search-box ul li a { font-weight: 700; color: inherit; text-decoration: none; @@ -1682,18 +1971,18 @@ search-entry ul li a { padding: 0.25rem 0.75rem; } -search-entry ul li:first-child a { +search-box ul li:first-child a { background-color: #ebf3ff; background-color: var(--hover-background-alternate); } -search-entry ul li:only-child a, -search-entry ul li:last-child a:hover { +search-box ul li:only-child a, +search-box ul li:last-child a:hover { border-bottom-right-radius: 0.5rem; border-bottom-left-radius: 0.5rem; } -search-entry ul li a:hover { +search-box ul li a:hover { background-color: #eee; background-color: var(--hover-background); } @@ -1719,8 +2008,7 @@ item-list li:hover span:last-child { text-decoration: underline; } -item-list li > a, -records-archive li { +item-list li > a { display: flex; text-decoration: none; align-items: baseline; @@ -1754,6 +2042,60 @@ item-list a:focus span:last-child { color: inherit; } +time-line h1 { + padding: 1rem; +} + +time-line ul { + padding: 0 0.5rem; +} + +time-line li:hover { + background-color: #eee; + background-color: var(--hover-background); +} + +time-line li a { + position: relative; + border-left: 1px solid; + border-color: #ccc; + border-color: var(--border-darker); + padding: 0.75rem 0.5rem; + display: flex; + text-decoration: none; +} + +time-line li a:before { + position: absolute; + background-color: #0149bc; + background-color: var(--link); + border-radius: 100%; + content: ""; + height: 1rem; + width: 1rem; + top: 1rem; + left: -0.5rem; + border: 0.3rem solid #fefefe; + border: 0.3rem solid var(--background); +} + +time-line a:focus time, +time-line a:focus section p { + color: inherit; +} + +time-line time, +time-line section p { + color: #444; + color: var(--fade); +} + +time-line time { + text-transform: uppercase; + white-space: nowrap; + margin: 0 1rem; +} + tag-deck { display: flex; flex-wrap: wrap; @@ -1822,21 +2164,21 @@ context-menu { opacity: 0; } -context-menu[right] { +context-menu[position="right"] { right: 0; } -context-menu[left] { +context-menu[position="left"] { left: 0; } -context-menu[anchor] { +context-menu[position="anchor"] { left: -125%; top: 0; } -context-menu[left], -context-menu[right] { +context-menu[position="left"], +context-menu[position="right"] { top: 1rem; } @@ -1869,7 +2211,7 @@ context-profile context-menu { top: 0.5rem; text-align: left; max-width: 20rem; - transition-delay: 0.3s; + transition-delay: 0.5s; } micro-card figure:hover context-menu, @@ -1890,27 +2232,27 @@ diagram-container svg { background-color: var(--background); } -reaction-tip { +tool-tip[data-type="reaction"] { text-decoration: underline; - -webkit-text-decoration-style: wavy; - text-decoration-style: wavy; + -webkit-text-decoration-style: dotted; + text-decoration-style: dotted; text-decoration-thickness: 0.05rem; - cursor: pointer; + cursor: default; position: relative; display: inline-block; } -reaction-tip:hover { +tool-tip[data-type="reaction"]:hover { text-decoration-thickness: 0.1rem; } -reaction-tip:hover img { +tool-tip[data-type="reaction"]:hover img { opacity: 1; visibility: visible; width: 100%; } -reaction-tip img { +tool-tip[data-type="reaction"] img { position: absolute; z-index: 99; visibility: hidden; @@ -1922,9 +2264,11 @@ reaction-tip img { transform: translateX(-50%); max-width: fit-content; border: none; + transition-delay: 0.5s; } -main micro-card:first-of-type reaction-tip img { +body micro-card:first-of-type tool-tip[data-type="reaction"] img, +main micro-card:first-of-type tool-tip[data-type="reaction"] img { bottom: 0; top: 100%; } @@ -1963,26 +2307,54 @@ link-card article a { display: block; } +math-ml:not(:last-child) { + margin-bottom: 0.75rem; +} + +math-ml figure[id] figure { + overflow-x: auto; + overflow-y: hidden; + border-radius: 0.5rem; + padding: 0.75rem 0.5rem; + background-color: #f9f9f9; + background-color: var(--widget-background); + border: 1px solid; + border-color: #ccc; + border-color: var(--border-darker); +} + +math-ml figure[id] a:first-child { + margin: 0 0.125rem; + padding: 0 0.25rem; + font-weight: 700; + color: #0149bc; + color: var(--link); +} + +math-ml figure[id]:target figure { + background-color: #ffe699; + background-color: var(--warning-background); + color: #000; + outline: 2px solid; + border-radius: 0.5rem; +} + /* ----- Attributes ----- */ [tabindex="-1"]:focus { outline: none; } -[hidden] { +[hidden], +nav[hidden] { display: none; } -[data-invisible] { - visibility: hidden; -} - [data-hover] { text-decoration: none; } [data-hover]:hover { - color: inherit; text-decoration: underline; } @@ -2006,74 +2378,93 @@ link-card article a { } [role="doc-endnotes"] hr { - border-top: 1px solid #ccc; - border-top: 1px solid var(--border-darker); margin-bottom: 0.75rem; - opacity: 0.25; } [role="doc-endnotes"] ol { + font-size: 90%; padding-left: 2rem; } -[xml-data] micro-summary { +[data-xml] micro-card { flex-direction: row; + align-items: center; } -[xml-data] micro-summary article { +[data-xml] micro-card article { margin-left: 0; } -[xml-data] micro-thumbnail { +[data-xml] micro-card header figure { display: block; } -[xml-data] column-middle nav section { +[data-xml] column-base[position="middle"] nav section { flex-grow: 1; } -[xml-data="sitemap"] main section { +[data-xml="sitemap"] main section { padding: 1rem; } -[xml-data="sitemap"] section a { +[data-xml="sitemap"] section a { text-decoration: none; } -[xml-data="sitemap"] section a:hover { +[data-xml="sitemap"] section a:hover { text-decoration: underline; } /* ----- Responsive ----- */ @media screen and (max-width: 1220px) { - column-left { + column-base[position="right"] { + width: 38%; + } + column-base[position="left"] { flex: none; - margin: 0.5rem; + width: auto; } - column-left nav a { + column-base[position="left"] nav a { flex-direction: column-reverse; justify-content: center; white-space: nowrap; overflow: hidden; } - column-left nav a span { + column-base[position="left"] nav a span { padding-top: 0.5rem; } + micro-author micro-card { + flex-direction: column; + text-align: center; + } + micro-author micro-card > *:not(:last-child), + micro-author micro-card > p:not(:last-child) { + margin-bottom: 0.5rem; + } + micro-author article { + flex: none; + } + micro-author article > * { + white-space: normal; + } + time-line ul { + padding: 0 2rem; + } } -@media screen and (max-width: 1055px) { - column-left, - search-entry, - column-middle main > nav section { +@media screen and (max-width: 1080px) { + search-box, + column-base[position="left"], + column-base[position="middle"] > nav:first-child section { display: none; } - column-middle main > nav { + column-base[position="middle"] > nav:first-child { justify-content: space-between; overflow-x: auto; overflow-y: hidden; } - column-middle main > nav icon-navigator[hidden] { + column-base[position="middle"] > nav:first-child icon-navigator[hidden] { display: inline; } tag-deck { @@ -2081,15 +2472,23 @@ link-card article a { } } -@media screen and (max-width: 925px) { - column-right { +@media screen and (max-width: 920px) { + html[data-document="html"], + html[data-document="xhtml"] { + margin: 0; + } + nav + main, + profile-box { + margin-top: 4rem; + } + column-base[position="right"] { display: none; } - column-middle { + column-base[position="middle"] { display: block; max-width: 100%; } - column-middle main > nav { + column-base[position="middle"] > nav:first-child { position: fixed; box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.2); } @@ -2097,59 +2496,40 @@ link-card article a { max-width: 600px; margin: 0 auto; } - micro-metadata { + micro-card header { line-height: inherit; } - micro-header section { + profile-box section { display: block; } - micro-author micro-header h2, - micro-author micro-header h3 { - white-space: initial; - } - micro-author micro-summary { + micro-author micro-card { flex-direction: column; text-align: center; border-bottom: 1px solid #eee; border-bottom: 1px solid var(--border-lighter); } - micro-author micro-summary micro-header, - micro-author micro-summary micro-thumbnail, - micro-author micro-summary p:not(:last-child) { + micro-author micro-card article, + micro-author micro-card header figure, + micro-author micro-card p:not(:last-child) { flex: auto; margin: 0 0 0.75rem 0; } - navigation-separator hr[hidden] { - border-color: transparent; - display: flex; - height: 0; - margin: 0; - padding-top: 4rem; - border: none; - } - html { - margin: 0; - } - body { - display: block; - overflow-y: scroll; - } tab-bar:active, tab-bar:hover, tab-bar:focus, tab-bar:focus-within, tab-bar:focus-visible, - column-middle main > nav:active, - column-middle main > nav:hover, - column-middle main > nav:focus, - column-middle main > nav:focus-within, - column-middle main > nav:focus-visible { + column-base[position="middle"] > nav:first-child:active, + column-base[position="middle"] > nav:first-child:hover, + column-base[position="middle"] > nav:first-child:focus, + column-base[position="middle"] > nav:first-child:focus-within, + column-base[position="middle"] > nav:first-child:focus-visible { box-shadow: 1rem -0.2rem 1rem -1rem inset, -1rem -0.2rem 1rem -1rem inset; } } @media screen and (max-width: 460px) { - micro-summary article { + micro-card > article { margin-left: 0; } tag-card { @@ -2161,23 +2541,25 @@ link-card article a { /* ----- Self Frames ----- */ @media (max-height: 12rem) { + nav + main { + margin-top: 0; + } micro-card { width: 100vw; padding-right: 1rem; } - micro-summary { + micro-card { min-height: 14rem; } - :not(#main):target micro-summary, - :not(#main):target micro-summary:hover { + :not(#main):target micro-card, + :not(#main):target micro-card:hover { outline: none; } :target::before { display: none; } - main > footer, - column-middle main > nav, - navigation-separator hr[hidden] { + column-base[position="middle"] > nav:first-child, + column-base[position="middle"] > footer:last-child { display: none; } } @@ -2186,124 +2568,156 @@ link-card article a { text-animation { height: 0; + cursor: default; } text-animation, text-animation span { display: inline-block; + text-decoration: underline; + -webkit-text-decoration-style: double; + text-decoration-style: double; } -text-animation[rattle], -text-animation[default] { - animation: tilt-rightward 0.15s infinite, tilt-leftward 0.2s infinite; +text-animation:hover, +text-animation:hover span { + text-decoration: none; } -text-animation[hang] { +text-animation[rattle]:hover, +text-animation[default]:hover { + animation: tilt-rightward 0.1s infinite, tilt-leftward 0.15s infinite; +} + +text-animation[hang]:hover { animation: tilt-rightward 1.3s infinite, tilt-leftward 1.8s infinite; } -text-animation[squeeze] { +text-animation[squeeze]:hover { animation: squeeze 1s infinite; } -text-animation[twitch] { +text-animation[twitch]:hover { animation: quiver 2.25s infinite, quiver 1.45s infinite; } -text-animation[tremble] { +text-animation[tremble]:hover { animation: leftward 0.1s infinite, quiver 0.75s infinite, quiver 1.35s infinite; } -text-animation[grow] { +text-animation[grow]:hover { animation: maximize 1.4s infinite; } -text-animation[shrink] { +text-animation[shrink]:hover { animation: minimize 1.25s infinite; } -text-animation[grow], -text-animation[shrink] { +text-animation[grow]:hover, +text-animation[shrink]:hover { transform-origin: right 1rem; } -text-animation[distort] span { +text-animation[distort]:hover span { animation: distort 0.25s infinite, distort 0.55s infinite, distort 0.75s infinite; } -text-animation[roll] span { - animation: rotateY 2s infinite; - animation-delay: calc(0.2s * var(--frame)); +text-animation[roll]:hover span { + animation: rotateY 1.5s infinite; + animation-delay: calc(0.1s * var(--frame)); } -text-animation[flip] span { - animation: rotateX 2.35s infinite; - animation-delay: calc(0.2s * var(--frame)); +text-animation[flip]:hover span { + animation: rotateX 1.5s infinite; + animation-delay: calc(0.1s * var(--frame)); } -text-animation[twirl] span { - animation: rotateZ 3s infinite; - animation-delay: calc(0.2s * var(--frame)); +text-animation[twirl]:hover span { + animation: rotateZ 1.5s infinite; + animation-delay: calc(0.1s * var(--frame)); } -text-animation[wave] span { +text-animation[wave]:hover span { animation: up 1s infinite; animation-delay: calc(0.1s * var(--frame)); } -text-animation[skip] span { +text-animation[skip]:hover span { animation: skip 1s infinite; animation-delay: calc(0.1s * var(--frame)); } -text-animation[jiggle] span { +text-animation[jiggle]:hover span { animation: up 0.2s infinite, down 0.3s infinite, leftward 0.25s infinite; animation-delay: calc(0.1s * var(--frame)); } -text-animation[float] span { +text-animation[float]:hover span { animation: up 1s infinite; } -text-animation[hop] span { +text-animation[hop]:hover span { animation: hop 1s infinite; } -text-animation[shake] span { +text-animation[shake]:hover span { animation: left 0.15s infinite; } -text-animation[waggle] span { +text-animation[waggle]:hover span { animation: left 0.5s infinite; } -text-animation[jump] span { +text-animation[jump]:hover span { animation: up 0.15s infinite; } -text-animation[vibrate] span { +text-animation[vibrate]:hover span { animation: up 0.125s infinite, left 0.15s infinite; } +main > * { + animation: paint ease-in 0.3s; +} + +tab-bar, +profile-box { + animation: paint ease-in 0.25s; +} + +column-base[position="right"] time { + animation: paint ease-in 0.15s; +} + +@keyframes paint { + 0%, + 90% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + @keyframes rotateY { 0%, - 50% { + 10% { transform: rotateY(360deg); } } @keyframes rotateX { 0%, - 50% { + 10% { transform: rotateX(360deg); } } @keyframes rotateZ { 0%, - 50% { + 10% { transform: rotateZ(360deg); } } diff --git a/assets/data/media/logo.png b/assets/data/media/logo.png Binary files differindex 51baf7d..98b4003 100644 --- a/assets/data/media/logo.png +++ b/assets/data/media/logo.png diff --git a/assets/js/index.js b/assets/js/index.js index cc61f84..d698127 100644 --- a/assets/js/index.js +++ b/assets/js/index.js @@ -3,41 +3,56 @@ if (cookiesDisabled) { document.cookie = "disabled"; document.cookie.indexOf("disabled"); - return console.log("Pager is disabled due to cookie restrictions."); + return console.warn("WARNING: Pager disabled due to cookie restrictions"); } - let settings = { - pager: {} + let seek; + let pager = {}; + const key = "config.scroll.pager.urls"; + if (!localStorage[key]) localStorage[key] = JSON.stringify(pager); + let url = function() { + return self.location.href.split("#")[0].split("?")[0]; }; - const url = self.location.href.split("#")[0].split("?")[0]; - const scrollRestore = (url)=>{ + const scrollHash = function(url) { + const hash = self.location.hash; + const fragment = hash.slice(1) && document.getElementById(hash.slice(1)); + const fragmented = hash.length > 0; + const hashed = fragmented && document.body.contains(fragment); + if (hashed) { + self.location.hash = hash; + self.location.href = hash; + if ("scroll-margin-top" in document.body.style === false && fragment.textContent !== "") { + self.scrollBy(0, -6 * parseFloat(getComputedStyle(document.documentElement).fontSize)); + } + } + return hashed; + }; + const scrollRestore = function(url) { if (history.scrollRestoration) history.scrollRestoration = "manual"; - if (localStorage["settings"]) { - settings = JSON.parse(localStorage["settings"]); - } - const fragment = document.getElementById(location.hash.slice(1)); - const fragmentInURL = self.location.hash.length > 0; - if (fragmentInURL && document.body.contains(fragment)) { - settings["pager"][url] = self.pageYOffset; - localStorage["settings"] = JSON.stringify(settings); - fragment.scrollIntoView(); - self.addEventListener("load", function() { - fragment.scrollIntoView(); - }); - return; - } - if (settings["pager"][url] > 0) { - self.scrollTo(0, settings["pager"][url]); - return; - } - settings["pager"][url] = self.pageYOffset; - localStorage["settings"] = JSON.stringify(settings); + if (scrollHash(url)) return; + pager = JSON.parse(localStorage[key]); + if (pager[url] > 0) { + clearInterval(seek); + self.scrollTo(0, pager[url]); + let i1 = 0; + return seek = setInterval(function(position) { + i1++; + if (i1 > 100) clearInterval(seek); + if (document.documentElement.scrollHeight >= position + document.documentElement.clientHeight) { + clearInterval(seek); + self.scrollTo(0, position); + } + }, 4, pager[url]); + } else self.scrollTo(0, 0); + pager[url] = self.pageYOffset; + localStorage[key] = JSON.stringify(pager); }; - const scrollTrack = (url)=>{ + const scrollTrack = function(url) { const currentPosition = self.pageYOffset; - settings["pager"][url] = currentPosition; - localStorage["settings"] = JSON.stringify(settings); + pager = JSON.parse(localStorage[key]); + pager[url] = currentPosition; + localStorage[key] = JSON.stringify(pager); }; - const backTrack = (back, up, event)=>{ + const scrollReverse = function(back, up, event) { if (document.body.contains(up) && up.contains(event.target)) { event.preventDefault(); window.scrollTo(0, 0); @@ -48,19 +63,106 @@ history.go(-1); } }; - self.addEventListener("DOMContentLoaded", function() { - scrollRestore(url); - self.addEventListener("click", function(event) { - const up = document.getElementById("top"); - const back = document.getElementById("back"); - backTrack(back, up, event); + [ + "DOMContentLoaded", + "pageshow", + "hashchange", + "URLChangedCustomEvent" + ].forEach(function(event) { + self.addEventListener(event, function(event) { + if (event.type === "pageshow") { + return event.persisted && self.scrollTo(0, pager[url()]); + } + if (event.type === "DOMContentLoaded") { + self.addEventListener("click", function(event) { + const up = document.getElementById("top"); + const back = document.getElementById("back"); + scrollReverse(back, up, event); + }); + } + scrollRestore(url()); }); }); + [ + "click", + "touchstart", + "scroll" + ].forEach(function(event) { + self.addEventListener(event, function() { + scrollTrack(url()); + }); + }); +})(); +(function() { + const cookiesDisabled = !navigator.cookieEnabled; + if (cookiesDisabled) { + document.cookie = "disabled"; + document.cookie.indexOf("disabled"); + return console.warn("WARNING: Update check disabled due to cookie restrictions"); + } + function fetch(url, method, callback) { + const http = new XMLHttpRequest(); + http.onreadystatechange = function() { + if (http.readyState === 4 && http.status === 200) { + if (callback) callback(http); + } + }; + http.open(method, url); + http.setRequestHeader("Pragma", "no-cache"); + http.setRequestHeader("Cache-Control", "no-cache"); + http.send(); + return http; + } + const key = "config.update"; + let stamps = {}; + if (!sessionStorage[key + ".urls"]) sessionStorage[key + ".urls"] = JSON.stringify(stamps); + function update() { + const url = self.location.href.split("#")[0].split("?")[0]; + const indicator = document.querySelector("a[data-update]"); + if (indicator === null || indicator.dataset.update === "refresh") return; + indicator.cloneNode(); + fetch(url, "HEAD", function(request) { + const local = document.querySelector('meta[name="last-modified"]').content || document.lastModified; + const remote = request.getResponseHeader("last-modified") || ''; + const modified = Date.parse(remote || local) > Date.parse(local); + const drift = Date.parse(remote || local) - Date.parse(local); + if (drift < 10000) return; + stamps = JSON.parse(sessionStorage[key + ".urls"]); + if (stamps[url] === remote) return; + stamps[url] = remote; + sessionStorage[key + ".urls"] = JSON.stringify(stamps); + if (remote && modified) { + fetch(url, "GET", function() { + indicator.href = url.replace(/^https:/, "http:"); + indicator.removeAttribute("id"); + indicator.dataset.update = "refresh"; + console.log("INFO: R: " + remote); + console.log("INFO: L: " + local); + console.log("INFO: D: " + drift); + console.log("INFO: M: " + modified); + }); + } + }); + } + let scrolled; + let delay = 1000; + let delayed = 0; self.addEventListener("scroll", function() { - scrollTrack(url); + if (scrolled) clearTimeout(scrolled); + scrolled = setTimeout(function() { + update(); + delay = delay + delayed; + delayed = delay - delayed; + }, delay); }); - self.addEventListener("hashchange", function() { - scrollRestore(url); + [ + "focus", + "load", + "URLChangedCustomEvent" + ].forEach(function(event) { + self.addEventListener(event, function() { + update(); + }); }); })(); (function() { @@ -95,217 +197,92 @@ } })(); (function() { - self.addEventListener("DOMContentLoaded", function() { - let mouseoverTimer; - let lastTouchTimestamp; - const prefetches = new Set(); - const prefetchElement = document.createElement("link"); - const isSupported = prefetchElement.relList && prefetchElement.relList.supports && prefetchElement.relList.supports("prefetch") && window.IntersectionObserver && "isIntersecting" in IntersectionObserverEntry.prototype; - const allowQueryString = "instantAllowQueryString" in document.body.dataset; - const allowExternalLinks = "instantAllowExternalLinks" in document.body.dataset; - const useWhitelist = "instantWhitelist" in document.body.dataset; - const mousedownShortcut = "instantMousedownShortcut" in document.body.dataset; - let delayOnHover = 65; - let useMousedown = false; - let useMousedownOnly = false; - let useViewport = false; - if ("instantIntensity" in document.body.dataset) { - const intensity = document.body.dataset.instantIntensity; - if (intensity.substr(0, "mousedown".length) == "mousedown") { - useMousedown = true; - if (intensity == "mousedown-only") { - useMousedownOnly = true; - } - } else if (intensity.substr(0, "viewport".length) == "viewport") { - if (!(navigator.connection && (navigator.connection.saveData || navigator.connection.effectiveType && navigator.connection.effectiveType.includes("2g")))) { - if (intensity == "viewport") { - if (document.documentElement.clientWidth * document.documentElement.clientHeight < 450000) { - useViewport = true; - } - } else if (intensity == "viewport-all") { - useViewport = true; - } - } - } else { - const milliseconds = parseInt(intensity); - if (!isNaN(milliseconds)) { - delayOnHover = milliseconds; - } - } - } - if (isSupported) { - const eventListenersOptions = { - capture: true, - passive: true + if (typeof Element !== "undefined") { + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + if (!Element.prototype.closest) { + Element.prototype.closest = function(s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + }while (el !== null && el.nodeType === 1) + return null; }; - if (!useMousedownOnly) { - document.addEventListener("touchstart", touchstartListener, eventListenersOptions); - } - if (!useMousedown) { - document.addEventListener("mouseover", mouseoverListener, eventListenersOptions); - } else if (!mousedownShortcut) { - document.addEventListener("mousedown", mousedownListener, eventListenersOptions); - } - if (mousedownShortcut) { - document.addEventListener("mousedown", mousedownShortcutListener, eventListenersOptions); - } - if (useViewport) { - let triggeringFunction; - if (window.requestIdleCallback) { - triggeringFunction = function(callback) { - requestIdleCallback(callback, { - timeout: 1500 - }); - }; - } else { - triggeringFunction = function(callback) { - callback(); - }; - } - triggeringFunction(function() { - const intersectionObserver = new IntersectionObserver(function(entries) { - entries.forEach(function(entry) { - if (entry.isIntersecting) { - const linkElement = entry.target; - intersectionObserver.unobserve(linkElement); - preload(linkElement.href); - } - }); - }); - document.querySelectorAll("a").forEach(function(linkElement) { - if (isPreloadable(linkElement)) { - intersectionObserver.observe(linkElement); - } - }); - }); - } } - function touchstartListener(event) { - lastTouchTimestamp = performance.now(); - const linkElement = event.target.closest("a"); - if (!isPreloadable(linkElement)) { - return; - } - preload(linkElement.href); - } - function mouseoverListener(event) { - if (performance.now() - lastTouchTimestamp < 1111) { - return; - } - const linkElement = event.target.closest("a"); - if (!isPreloadable(linkElement)) { - return; - } - linkElement.addEventListener("mouseout", mouseoutListener, { - passive: true + } + function fetch(url, method, callback) { + const http = new XMLHttpRequest(); + http.onreadystatechange = function() { + if (http.readyState === 4 && http.status === 200) { + if (callback) callback(http); + } + }; + http.open(method, url); + http.send(); + return http; + } + self.addEventListener("DOMContentLoaded", function() { + [ + "mouseout", + "mousedown", + "touchstart" + ].forEach(function(event) { + self.addEventListener(event, function(event) { + const url = event.target.closest("a"); + if (preloadable(url) === undefined) return; + preload(url.href); }); - mouseoverTimer = setTimeout(function() { - preload(linkElement.href); - mouseoverTimer = undefined; - }, delayOnHover); - } - function mousedownListener(event) { - const linkElement = event.target.closest("a"); - if (!isPreloadable(linkElement)) { - return; - } - preload(linkElement.href); - } - function mouseoutListener(event) { - if (event.relatedTarget && event.target.closest("a") == event.relatedTarget.closest("a")) { - return; - } - if (mouseoverTimer) { - clearTimeout(mouseoverTimer); - mouseoverTimer = undefined; - } - } - function mousedownShortcutListener(event) { - if (performance.now() - lastTouchTimestamp < 1111) { - return; - } - const linkElement = event.target.closest("a"); - if (event.which > 1 || event.metaKey || event.ctrlKey) { - return; - } - if (!linkElement) { - return; - } - linkElement.addEventListener("click", function(event) { - if (event.detail == 1337) { + }); + function preloadable(url) { + switch(true){ + case url === null || url.href === null: return; - } - event.preventDefault(); - }, { - capture: true, - passive: false, - once: true - }); - const customEvent = new MouseEvent("click", { - view: window, - bubbles: true, - cancelable: false, - detail: 1337 - }); - linkElement.dispatchEvent(customEvent); - } - function isPreloadable(linkElement) { - if (!linkElement || !linkElement.href) { - return; - } - if (useWhitelist && !("instant" in linkElement.dataset)) { - return; - } - if (!allowExternalLinks && linkElement.origin != location.origin && !("instant" in linkElement.dataset)) { - return; - } - if (![ - "http:", - "https:" - ].includes(linkElement.protocol)) { - return; - } - if (linkElement.protocol == "http:" && location.protocol == "https:") { - return; - } - if (!allowQueryString && linkElement.search && !("instant" in linkElement.dataset)) { - return; - } - if (linkElement.hash && linkElement.pathname + linkElement.search == location.pathname + location.search) { - return; - } - if ("noInstant" in linkElement.dataset) { - return; + case url.origin !== location.origin: + return; + case [ + "http:", + "https:" + ].includes(url.protocol) === null: + return; + case url.protocol === "http:" && location.protocol === "https:": + return; + case url.hash && url.pathname + url.search == location.pathname + location.search: + return; + default: + return true; } - return true; } function preload(url) { - if (prefetches.has(url)) { - return; - } const prefetcher = document.createElement("link"); - prefetcher.rel = "prefetch"; + prefetcher.rel = "custom-prefetch"; prefetcher.href = url; + const selector = 'link[rel="'.concat(prefetcher.rel, '"][href="').concat(prefetcher.href, '"]'); + const prefetched = document.head.contains(document.querySelector(selector)); + if (prefetched) { + return; + } document.head.appendChild(prefetcher); - prefetches.add(url); + fetch(url, "GET", function() {}); } }); })(); (function() { - const hide = (triggers)=>{ - for(let i = 0; i < triggers.length; i++){ - triggers[i].checked = false; + const hide = function(triggers) { + for(let i1 = 0; i1 < triggers.length; i1++){ + triggers[i1].checked = false; } }; - const hideIfClickedOutside = (menus, triggers, event)=>{ - for(let i = 0; i < menus.length; i++){ - const active = triggers[i].checked === true; - const outside = !menus[i].contains(event.target); + const hideIfClickedOutside = function(menus, triggers, event) { + for(let i1 = 0; i1 < menus.length; i1++){ + const active = triggers[i1].checked === true; + const outside = !menus[i1].contains(event.target); if (outside && active) hide(triggers); } }; self.addEventListener("scroll", function() { - const triggers = document.querySelectorAll("micro-metadata-menu input"); + const triggers = document.querySelectorAll("menu input"); hide(triggers); }); [ @@ -313,196 +290,512 @@ "touchstart" ].forEach(function(event) { self.addEventListener(event, function(event) { - const menus = document.querySelectorAll("micro-metadata-menu"); - const triggers = document.querySelectorAll("micro-metadata-menu input"); + const menus = document.querySelectorAll("menu"); + const triggers = document.querySelectorAll("menu input"); hideIfClickedOutside(menus, triggers, event); }); }); })(); (function() { - self.addEventListener("DOMContentLoaded", function() { - const form = document.getElementById("search-form"); - const query = document.getElementById("search-input"); - const submit = document.getElementById("search-submit"); - const dropdown = document.getElementById("search-results"); - const container = document.getElementById("search-frame"); - function first(element) { - return element.firstChild.nextElementSibling.firstChild.nextElementSibling; - } - function last(element) { - return element.lastElementChild.firstChild.nextElementSibling; - } - function next(element) { - return element.activeElement.parentElement.nextElementSibling.firstChild.nextElementSibling.focus(); - } - function previous(element) { - return element.activeElement.parentElement.previousElementSibling.firstChild.nextElementSibling.focus(); - } - function press(keyname) { - document.dispatchEvent(new KeyboardEvent("keydown", { - "key": keyname - })); - } - submit.addEventListener("click", function(event) { - first(dropdown).focus(); - press("ArrowDown"); - }); - form.addEventListener("focusin", function() { - container.setAttribute("data-focus", ""); - initialize(); - }); - form.addEventListener("submit", function(event) { - event.preventDefault(); - return false; - }); - form.addEventListener("keydown", function(event) { - const head = first(dropdown); - const tail = last(dropdown); - if (query.contains(event.target)) { - if (event.keyCode == 27) { - document.activeElement.blur(); - dropdown.setAttribute("hidden", ""); - container.removeAttribute("data-focus"); + [ + "DOMContentLoaded", + "URLChangedCustomEvent" + ].forEach(function(event) { + self.addEventListener(event, function() { + const container = document.querySelector("search-box"); + const dropdown = document.querySelector("search-box ul"); + const form = document.querySelector("search-box form"); + const query = document.querySelector("search-box input"); + const submit = document.querySelector("search-box button"); + function first(element) { + if (element.firstChild.nextElementSibling) { + return element.firstChild.nextElementSibling.firstChild.nextElementSibling; } } - if (event.keyCode == 40) { - event.preventDefault(); - if (document.activeElement == query) head.focus(); - else if (document.activeElement == tail) query.focus(); - else next(document); + function last(element) { + return element.lastElementChild.firstChild.nextElementSibling; } - if (event.keyCode == 38) { - event.preventDefault(); - if (document.activeElement == query) tail.focus(); - else if (document.activeElement == head) query.focus(); - else previous(document); + function next(element) { + return element.activeElement.parentElement.nextElementSibling.firstChild.nextElementSibling.focus(); } - if (event.keyCode == 8) { - if (document.activeElement != query) { + function previous(element) { + return element.activeElement.parentElement.previousElementSibling.firstChild.nextElementSibling.focus(); + } + function press(keyname) { + document.dispatchEvent(new KeyboardEvent("keydown", { + "key": keyname + })); + } + let selected; + if (submit === null) return; + submit.addEventListener("click", function(event) { + if (selected) { event.preventDefault(); - query.focus(); + selected.focus(); + return selected.click(); } - } - if (event.keyCode == 13) { - if (dropdown && document.activeElement == query) { + first(dropdown).focus(); + press("ArrowDown"); + document.activeElement.click(); + }); + [ + "keyup", + "click" + ].forEach(function(event) { + form.addEventListener(event, function() { + if (document.activeElement.nodeName === "A") { + return selected = document.activeElement; + } + selected = undefined; + }); + }); + form.addEventListener("focusin", function() { + container.setAttribute("data-focus", ""); + initialize(); + }); + form.addEventListener("submit", function(event) { + event.preventDefault(); + return false; + }); + form.addEventListener("keydown", function(event) { + if (form.contains(event.target)) { + if (event.keyCode == 27) { + document.activeElement.blur(); + dropdown.setAttribute("hidden", ""); + container.removeAttribute("data-focus"); + } + } + if (event.keyCode == 8) { + if (document.activeElement != query) { + event.preventDefault(); + query.focus(); + } + } + const head = first(dropdown); + const tail = last(dropdown); + if (event.keyCode == 40) { + event.preventDefault(); + if (document.activeElement == query) head.focus(); + else if (document.activeElement == tail) query.focus(); + else next(document); + } + if (event.keyCode == 38) { event.preventDefault(); - head.focus(); - self.window.location = document.activeElement.href; + if (document.activeElement == query) tail.focus(); + else if (document.activeElement == head) query.focus(); + else previous(document); + } + if (event.keyCode == 13) { + if (dropdown && document.activeElement == query) { + event.preventDefault(); + head.focus(); + head.click(); + } + } + }); + let scrolls = 0; + self.addEventListener("scroll", function() { + if (scrolls > 3) { + scrolls = 0; + document.activeElement.blur(); + dropdown.setAttribute("hidden", ""); + container.removeAttribute("data-focus"); } + scrolls++; + }); + self.addEventListener("click", function(event) { + if (!form.contains(event.target) && !(document.activeElement === query) && !(document.activeElement === submit)) { + dropdown.setAttribute("hidden", ""); + container.removeAttribute("data-focus"); + } + }); + function fetch(url, callback) { + const http = new XMLHttpRequest(); + http.onreadystatechange = function() { + if (http.readyState === 4 && http.status === 200 && callback) { + callback(http); + } + }; + http.open("GET", url); + http.send(); + } + function script(url) { + return new Promise(function(resolve, reject) { + const script = document.createElement("script"); + script.onerror = reject; + script.onload = resolve; + if (document.currentScript) { + document.currentScript.parentNode.insertBefore(script, document.currentScript); + } else document.head.appendChild(script); + script.src = url; + }); } - }); - let scrolls = 0; - self.addEventListener("scroll", function() { - if (scrolls > 3) { - scrolls = 0; - document.activeElement.blur(); - dropdown.setAttribute("hidden", ""); - container.removeAttribute("data-focus"); + let data = {}; + let boot = true; + const options = { + key: [ + "title" + ] + }; + function isEmpty(obj) { + return Object.keys(obj).length === 0; + } + function appendItemsTo(local, remote) { + const paginated = Object.keys(remote).includes("next_url"); + if (isEmpty(local)) { + local = remote; + } else { + local.items = local.items.concat(remote.items); + } + if (paginated) { + fetch(remote.next_url, function(request) { + appendItemsTo(local, JSON.parse(request.responseText)); + }); + } else search(query.value, data.items, options); + data = local; + } + function initialize() { + if (boot) { + script(window.location.origin + "/js/fuzzysort.js").then(function() { + fetch("/index.json", function(request) { + appendItemsTo({}, JSON.parse(request.responseText)); + search("", data.items, options); + boot = false; + }); + [ + "keyup", + "focusin" + ].forEach(function(event) { + query.addEventListener(event, function() { + if (data.items) search(query.value, data.items, options); + else { + boot = true; + initialize(); + } + }); + }); + }).catch(function(error) { + console.error("ERROR: Failed to load fuzzy search", error); + }); + } + } + function escape(text) { + const escaped = document.createElement("textarea"); + escaped.textContent = text; + return escaped.innerHTML; + } + function search(term, data, options) { + const results = fuzzysort.go(term, data, options); + let items = ""; + if (results.length === 0 && term.length >= 0) { + let separator = "—"; + if (term.length === 0) separator = ""; + items = '<li><a tabindex="0">'.concat(escape(term), " ").concat(separator, " No Results Found</a></li>"); + dropdown.removeAttribute("hidden"); + container.setAttribute("data-focus", ""); + } else { + dropdown.removeAttribute("hidden"); + for(var string in results.slice(0, 10)){ + const title = results[string].obj.title; + let highlight = fuzzysort.highlight(fuzzysort.single(escape(term), escape(title)), "<span>", "</span>"); + if (highlight === null) highlight = title; + items = items + '\n<li>\n<a href="'.concat(results[string].obj.url, '" tabindex="0">').concat(highlight, "</a>\n</li>\n"); + } + } + dropdown.innerHTML = items; } - scrolls++; }); - document.addEventListener("click", function(event) { - if (!form.contains(event.target)) { - dropdown.setAttribute("hidden", ""); - container.removeAttribute("data-focus"); + }); +})(); +(function() { + function viewport(element) { + const options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { + offset: { + top: -50, + left: 0, + bottom: -50, + right: 0 + } + }; + const view = element.getBoundingClientRect(); + return view.top >= -options.offset.top && view.left >= -options.offset.left && view.bottom <= (self.innerHeight || document.documentElement.clientHeight) + options.offset.bottom && view.right <= (self.innerWidth || document.documentElement.clientWidth) + options.offset.right; + } + [ + "scroll", + "DOMContentLoaded" + ].forEach(function(event) { + self.addEventListener(event, function() { + let first = true; + let videos = document.querySelectorAll("video"); + for(i = 0; i < videos.length; i++){ + videos[i].autoplay = true; + videos[i].controls = true; + videos[i].loop = true; + videos[i].muted = true; + videos[i].playsinline = true; + videos[i].setAttribute("autoplay", true); + videos[i].setAttribute("controls", true); + videos[i].setAttribute("loop", true); + videos[i].setAttribute("muted", true); + videos[i].setAttribute("playsinline", true); + const onscreen = viewport(videos[i]); + if (first && onscreen) { + videos[i].play(); + first = false; + } else { + videos[i].pause(); + } } }); - let data = {}; - function isEmpty(obj) { - return Object.keys(obj).length === 0; + }); +})(); +(function() { + if (typeof Element !== "undefined") { + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + if (!Element.prototype.closest) { + Element.prototype.closest = function(s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + }while (el !== null && el.nodeType === 1) + return null; + }; } - function appendItemsTo(local, remote) { - const paginated = Object.keys(remote).includes("next_url"); - if (isEmpty(local)) { - local = remote; - } else { - local.items = local.items.concat(remote.items); - } - if (paginated) { - fetchJson(remote.next_url, local); - } - data = local; + } + const disabled = "0s"; + function walk(children, callback) { + for(let i1 = 0; i1 < children.length; i1++){ + callback(children[i1]); + walk(children[i1].children, callback); } - function fetchJson(url, store) { - const httpRequest = new XMLHttpRequest(); - httpRequest.onreadystatechange = function() { - if (httpRequest.readyState === 4 && httpRequest.status === 200) { - appendItemsTo(store, JSON.parse(httpRequest.responseText)); + } + self.addEventListener("mousemove", function(event) { + if (typeof event.target.closest !== "function") return; + tree = event.target.closest("figure") || event.target.closest("article"); + if (tree !== null) { + walk(tree.children, function(element) { + const delay = self.getComputedStyle(element).getPropertyValue("transition-delay"); + if (delay !== disabled) { + element.style.setProperty("visibility", "hidden"); } - }; - httpRequest.open("GET", url); - httpRequest.send(); - } - function loadScript(url) { - return new Promise(function(resolve, reject) { - const script = document.createElement("script"); - script.onerror = reject; - script.onload = resolve; - if (document.currentScript) { - document.currentScript.parentNode.insertBefore(script, document.currentScript); - } else { - document.head.appendChild(script); + }); + walk(tree.children, function(element) { + const delay = self.getComputedStyle(element).getPropertyValue("transition-delay"); + if (delay !== disabled) { + element.style.removeProperty("visibility"); } - script.src = url; }); } - let firstRun = true; - function initialize() { - if (firstRun) { - loadScript(window.location.origin + "/js/fuzzysort.js").then(()=>{ - firstRun = false; - fetchJson("/index.json", {}); - const options = { - key: [ - "title" - ] - }; - query.addEventListener("keyup", function() { - search(query.value, data.items, options); - }); - query.addEventListener("focusin", function() { - search(query.value, data.items, options); - }); - search(query.value, data.items, options); - }).catch((error)=>{ - console.log("Error failed to load fuzzy sort: " + error); + }); +})(); +(function() { + const cookiesDisabled = !navigator.cookieEnabled; + if (cookiesDisabled) { + document.cookie = "disabled"; + document.cookie.indexOf("disabled"); + return console.warn("WARNING: Cannot persist form state due to cookie restrictions"); + } + const storage = document.createEvent("Event"); + storage.initEvent("storage", true, true); + [ + "pageshow", + "URLChangedCustomEvent", + "DOMContentLoaded" + ].forEach(function(event) { + self.addEventListener(event, function(event) { + const input = Array.prototype.slice.call(document.querySelectorAll("form input")); + const select = Array.prototype.slice.call(document.querySelectorAll("form select")); + const textarea = Array.prototype.slice.call(document.querySelectorAll("form textarea")); + const summary = Array.prototype.slice.call(document.querySelectorAll("details summary")); + const states = input.concat(select).concat(textarea); + for(var i1 = 0; i1 < states.length; i1++){ + const state = states[i1]; + const sync = i1 === states.length - 1; + if (localStorage[state.id]) { + if (state.type === "radio" || state.type === "checkbox") { + if (localStorage[state.id] === "on") state.checked = true; + } else state.value = localStorage[state.id]; + } + if (sync) self.dispatchEvent(storage); + state.addEventListener("change", function(event) { + localStorage[event.target.id] = event.target.value; + const group = document.querySelectorAll("input[name='".concat(event.target.name, "']")); + for(var j = 0; j < group.length; j++){ + const member = group[j]; + if ((member.type === "radio" || member.type === "checkbox") && !member.checked) { + localStorage[member.id] = "off"; + } + } + self.dispatchEvent(new Event("storage")); }); } - } - function escape(text) { - const escaped = document.createElement("textarea"); - escaped.textContent = text; - return escaped.innerHTML; - } - function search(term, data, options) { - const results = fuzzysort.go(term, data, options); - let items = ""; - if (results.length === 0 && term.length >= 0) { - let separator = "—"; - if (term.length === 0) separator = ""; - items = ` - <li> - <a href="javascript: void(0)" tabindex="0">${escape(term)} ${separator} No Results Found</a> - </li> - `; - dropdown.removeAttribute("hidden"); - container.setAttribute("data-focus", ""); - } else { - dropdown.removeAttribute("hidden"); - for(const string in results.slice(0, 10)){ - const title = results[string].obj.title; - let highlight = fuzzysort.highlight(fuzzysort.single(escape(term), escape(title)), "<span>", "</span>"); - if (highlight === null) { - highlight = title; + for(var k = 0; k < summary.length; k++){ + let child = summary[k]; + let details = child.parentElement; + if (details.id && details.nodeName === "DETAILS") { + sessionStorage[details.id] === "false" && details.removeAttribute("open"); + sessionStorage[details.id] === "true" && details.setAttribute("open", true); + child.addEventListener("click", function(event) { + let child = event.target.nodeName === "SUMMARY" && event.target || event.target.parentElement; + let details = child.parentElement; + if (details.id && details.nodeName === "DETAILS") { + sessionStorage[details.id] = !details.open; + } + }); + } + } + }); + }); + [ + "storage" + ].forEach(function(event) { + self.addEventListener(event, function() { + let stylesheet; + stylesheet = document.querySelector('link[href$="default-simple.css"]'); + if (localStorage["config.layout.simple"] === "on") stylesheet.rel = "stylesheet"; + if (localStorage["config.layout.default"] === "on") stylesheet.rel = "alternate stylesheet"; + stylesheet = document.querySelector('link[href$="default-fast.css"]'); + if (localStorage["config.navigation.fast"] === "on") stylesheet.rel = "stylesheet"; + if (localStorage["config.navigation.slow"] === "on") stylesheet.rel = "alternate stylesheet"; + for(var i1 = 0; i1 < document.styleSheets.length; i1++){ + let stylesheet = document.styleSheets[i1]; + for(var k = 0; k < stylesheet.rules.length; k++){ + let media = stylesheet.rules[k].media; + if (media && media.mediaText.includes("prefers-color-scheme")) { + if (localStorage["config.theme.light"] === "on") { + media.mediaText = "(prefers-color-scheme: dark)"; + if (getComputedStyle(document.body).getPropertyValue("color-scheme") === "dark") { + media.mediaText = "(prefers-color-scheme: light)"; + } + } + if (localStorage["config.theme.auto"] === "on") { + media.mediaText = "(prefers-color-scheme: dark)"; + } + if (localStorage["config.theme.dark"] === "on") { + media.mediaText = "(prefers-color-scheme: light)"; + if (getComputedStyle(document.body).getPropertyValue("color-scheme") === "light") { + media.mediaText = "(prefers-color-scheme: dark)"; + } + } } - items = items + ` - <li> - <a href="${results[string].obj.url}" tabindex="0">${highlight}</a> - </li> - `; } } - dropdown.innerHTML = items; + }); + }); + const early = setInterval(persistence, 4); + function persistence() { + if (document.styleSheets.length > 0) { + self.dispatchEvent(storage); + clearInterval(early); + } + } + self.addEventListener("DOMContentLoaded", function() { + self.dispatchEvent(storage); + clearInterval(early); + }); +})(); +(function() { + const timeout = 300; + const state = "on"; + const key = "config.navigation.fast"; + function fetch(url, method, callback) { + const http = new XMLHttpRequest(); + http.onreadystatechange = function() { + if (callback && http.readyState === 4) { + if (http.status === 200) callback(http); + else { + console.error("ERROR: Unable to navigate", http); + self.location.href = url; + } + } + }; + http.open(method, url); + http.timeout = timeout; + http.send(); + return http; + } + function styles(node) { + return node.nodeName === "LINK" && node.rel && node.rel.includes("stylesheet"); + } + function scripts(node) { + return node.nodeName === "SCRIPT" && node.hasAttribute("src"); + } + function filter(url, http) { + let live = document; + let node = live.head.childNodes.length; + let next = new DOMParser().parseFromString(http.responseText, "text/html"); + if (next.doctype === null || !http.getResponseHeader("content-type").includes("text/html")) return false; + while(node--){ + if (styles(live.head.childNodes[node]) || scripts(live.head.childNodes[node])) {} else { + live.head.removeChild(live.head.childNodes[node]); + } + } + while(next.head.firstChild){ + if (styles(next.head.firstChild) || scripts(next.head.firstChild)) { + next.head.removeChild(next.head.firstChild); + } else { + live.head.appendChild(next.head.firstChild); + } + } + while(live.documentElement.attributes.length > 0){ + live.documentElement.removeAttribute(live.documentElement.attributes[live.documentElement.attributes.length - 1].name); + } + while(next.documentElement.attributes.length > 0){ + live.documentElement.setAttribute(next.documentElement.attributes[next.documentElement.attributes.length - 1].name, next.documentElement.attributes[next.documentElement.attributes.length - 1].value); + next.documentElement.removeAttribute(next.documentElement.attributes[next.documentElement.attributes.length - 1].name); + } + live.body.parentElement.replaceChild(next.body, live.body); + } + function persist() { + let persist = document.createElement("link"); + persist.rel = "location"; + persist.target = JSON.stringify(self.location); + document.head.appendChild(persist); + } + self.addEventListener("DOMContentLoaded", function() { + if (localStorage[key] !== state) return; + persist(); + }); + self.addEventListener("popstate", function(event) { + if (localStorage[key] !== state) return; + const link = JSON.parse(document.querySelector('link[rel="location"]').target); + const url = event.target.location; + const hashed = link.pathname === url.pathname; + if (hashed) return; + fetch(url, "GET", function(http) { + if (filter(url, http) === false) return self.location.href = url; + persist(); + self.document.dispatchEvent(new CustomEvent("URLChangedCustomEvent", { + bubbles: true + })); + }); + }); + self.addEventListener("click", function(event) { + if (localStorage[key] !== state) return; + const links = document.querySelectorAll("a"); + for(let i1 = 0; i1 < links.length; i1++){ + const active = links[i1].contains(event.target); + const change = self.location.href !== links[i1].href; + const view = links[i1].attributes.hasOwnProperty("download") === false; + const local = self.location.origin === links[i1].origin && links[i1].target !== "_self"; + const hashed = self.location.pathname === links[i1].pathname && links[i1].href.includes("#"); + if (active && local && change && view && hashed === false) { + event.preventDefault(); + const url = links[i1].href; + links[i1].style.cursor = "wait"; + fetch(url, "GET", function(http) { + links[i1].removeAttribute("style"); + if (filter(url, http) === false) return self.location.href = url; + history.pushState({}, "", links[i1].href); + persist(); + self.document.dispatchEvent(new CustomEvent("URLChangedCustomEvent", { + bubbles: true + })); + }); + } } }); })(); @@ -512,56 +805,101 @@ numeric: "always", style: "long" }); - const date = ()=>{ - [ - ...document.querySelectorAll("time") - ].forEach((element)=>{ - try { - const time = new Date(element.dateTime) || new Date(); - const interval = (new Date().getTime() - time.getTime()) / 1000; - const seconds = Math.floor(interval); - const minutes = Math.floor(seconds / 60); - const hours = Math.floor(minutes / 60); - const days = Math.floor(hours / 24); - if (Math.sign(seconds) === 1) { - if (seconds <= 60) { - return element.textContent = relative.format(-1 * seconds, "second"); - } - if (minutes <= 120) { - return element.textContent = relative.format(-1 * minutes, "minute"); - } - if (hours <= 48) { - return element.textContent = relative.format(-1 * hours, "hour"); - } - if (days <= 60) { - return element.textContent = relative.format(-1 * days, "day"); + function viewport(element) { + const options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : { + offset: 250 + }; + const view = element.getBoundingClientRect(); + return view.top >= -options.offset && view.left >= -options.offset && view.bottom <= (self.innerHeight || document.documentElement.clientHeight) + options.offset && view.right <= (self.innerWidth || document.documentElement.clientWidth) + options.offset; + } + const date = function(update) { + const elements = document.querySelectorAll("time"); + for(let i1 = 0; i1 < elements.length; ++i1){ + const offscreen = !viewport(elements[i1]); + const hidden = elements[i1].offsetParent === null; + if (update === "viewport" && (offscreen || hidden)) continue; + (function(element) { + try { + if (element.dataset.type === "disabled") return; + const time = new Date(element.dateTime) || new Date(); + const interval = (new Date().getTime() - time.getTime()) / 1000; + const seconds = Math.round(interval); + const minutes = Math.round(seconds / 60); + const hours = Math.round(minutes / 60); + const days = Math.round(hours / 24); + const past = Math.sign(seconds) === 1; + const future = Math.sign(seconds) === -1; + let tiny = function(string, place) { + return string.split(" ").slice(0, place).join(" ") + string.split(" ")[place].charAt(0); + }; + if (element.dataset.type === "default") { + tiny = function(string) { + return string; + }; } - } - if (Math.sign(seconds) === -1) { - if (-1 * days >= 60) { - return element.textContent = relative.format(-1 * days, "day"); + if (element.dataset.type === "localDate") { + return element.textContent = new Intl.DateTimeFormat([], { + dateStyle: "medium" + }).format(time).replace(",", ""); } - if (-1 * hours >= 48) { - return element.textContent = relative.format(-1 * hours, "hour"); + if (element.dataset.type === "localTime") { + return element.textContent = new Intl.DateTimeFormat([], { + hour12: false, + timeStyle: "short" + }).format(time) + " " + new Intl.DateTimeFormat([], { + timeZoneName: "short" + }).format(time).split(" ")[1]; } - if (-1 * minutes >= 120) { - return element.textContent = relative.format(-1 * minutes, "minute"); + if (past) { + if (seconds <= 60) { + return element.textContent = tiny(relative.format(-1 * seconds, "second"), 1); + } + if (minutes <= 120) { + return element.textContent = tiny(relative.format(-1 * minutes, "minute"), 1); + } + if (hours <= 48) { + return element.textContent = tiny(relative.format(-1 * hours, "hour"), 1); + } + if (days <= 7) { + return element.textContent = tiny(relative.format(-1 * days, "day"), 1); + } } - if (-1 * seconds >= 0) { - return element.textContent = relative.format(-1 * seconds, "second"); + if (future) { + if (-1 * days >= 4) { + return element.textContent = tiny(relative.format(-1 * days, "day"), 2); + } + if (-1 * hours >= 3) { + return element.textContent = tiny(relative.format(-1 * hours, "hour"), 2); + } + if (-1 * minutes >= 2) { + return element.textContent = tiny(relative.format(-1 * minutes, "minute"), 2); + } + if (-1 * seconds >= 1) { + return element.textContent = tiny(relative.format(-1 * seconds, "second"), 2); + } } + } catch (error) { + console.error("ERROR: Relative time resolution failed", error); } - } catch (error) { - console.error("Error: Unable to resolve relative time format!", error); - } - }); + })(elements[i1]); + } }; const substitution = setInterval(date, 4); - self.addEventListener("load", ()=>{ - setTimeout(()=>{ + [ + "scroll", + "URLChangedCustomEvent" + ].forEach(function(event) { + self.addEventListener(event, function() { + date("viewport"); + }); + }); + self.addEventListener("DOMContentLoaded", function() { + setTimeout(function() { clearInterval(substitution); - setInterval(date, 1000); + setInterval(function() { + date("viewport"); + }, 1000); }, 1000); }); })(); -console.log("Surface Control: Complete");
\ No newline at end of file +console.log("INFO: Surface Control Complete");
\ No newline at end of file diff --git a/assets/templates/markdown-feed.yaml b/assets/templates/markdown-feed.yaml index fbe763b..ff0aae5 100644 --- a/assets/templates/markdown-feed.yaml +++ b/assets/templates/markdown-feed.yaml @@ -21,12 +21,19 @@ feed: {{ end -}} --- -{{ $content := .content | replaceRE "{" "{" | replaceRE "}" "}" -}} +{{ $content := .content }} + +{{- $content = replace $content "{" "{" -}} +{{- $content = replace $content "}" "}" -}} +{{- $content = replace $content "[" "[" -}} +{{- $content = replace $content "]" "]" -}} + {{ $content }} -{{- $enclosureDescription := "Image/Picture" -}} +{{- $caption := "Image/Picture" -}} + {{- with $content -}} - {{ $enclosureDescription = $content | truncate 80 "" }} + {{ $caption = $content | truncate 80 "" }} {{- end }} {{ with .enclosure -}} @@ -43,8 +50,8 @@ feed: (in . ".svg") (in . ".webp") -}} -![{{ $enclosureDescription }}]({{ . }} " - {{ $enclosureDescription }}" +![{{ $caption }}]({{ . }} " + {{ $caption }}" ) {{- end -}} {{- end }} |