my php website :D https://j0.lol
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

not enough style tweaks

j0.lol 32046883 d915fc1c

+682 -69
+19 -1
Caddyfile
··· 1 - http://localhost:8080, http://127.0.0.1:8080 { 1 + http://localhost:8099, http://127.0.0.1:8099 { 2 + respond /health-check 200 3 + 2 4 #respond "j0.lol is down for rewrites. If you need me, shoot me a msg at me@j0.lol." 3 5 root * . 4 6 ··· 12 14 not file 13 15 path_regexp cached ~*(.+)\.(?:[0-9a-zA-Z]+)\.(js|css|jpg|svg|png) 14 16 } 17 + header @cachedFiles Cache-Control "no-store" # Dev Only 15 18 rewrite @cachedFiles {http.regexp.cached.1}.{http.regexp.cached.2} 16 19 17 20 root * ./static 18 21 file_server browse 22 + } 23 + # reverse_proxy https://plausible.j0.lol /js/script.js 24 + 25 + handle_path /pls/* { 26 + reverse_proxy https://plausible.j0.lol 27 + } 28 + 29 + @plausible path /js/script.js /api/event 30 + handle @plausible { 31 + # Change this if you use a different variant of the script 32 + # e.g. rewrite /js/script.js /js/script.outbound-links.js 33 + rewrite /js/script.js /js/script.js 34 + reverse_proxy https://plausible.j0.lol { 35 + header_up Host {http.reverse_proxy.upstream.hostport} 36 + } 19 37 } 20 38 }
+2 -6
posts/kegworks-winery.html
··· 23 23 <a href="https://brew.sh">brew</a> command they have on their GitHub. 24 24 <sup><a href="https://github.com/Kegworks-App">[src]</a></sup> 25 25 26 - <code> 27 - <pre class="language-sh"> 28 - brew upgrade 29 - brew install --cask --no-quarantine Kegworks-App/kegworks/kegworks</pre 30 - > 31 - </code> 26 + <pre class="language-bash"><code>brew upgrade 27 + brew install --cask --no-quarantine Kegworks-App/kegworks/kegworks</code></pre> 32 28 </li> 33 29 34 30 <li>
+3 -2
posts/spotlight-raycast.html
··· 22 22 23 23 <figure> 24 24 <img 25 + class="applerounded blackbg" 25 26 width="1500" 26 27 height="800" 27 - style="height: 20rem; width: auto; margin: 0 auto; display: block" 28 28 alt="A screenshot of the Shortcuts app showing a basic procedure to search a website from an input." 29 29 src="https://f004.backblazeb2.com/file/j0-lol-website/shortcutkagi.png" 30 30 /> ··· 39 39 </p> 40 40 41 41 <img 42 + class="superrounded blackbg" 42 43 width="1284" 43 44 height="116" 44 45 alt="A screenshot of Spotlight showing a shortcut asking for input." ··· 54 55 55 56 <figure> 56 57 <img 58 + class="applerounded blackbg" 57 59 width="1500" 58 60 height="800" 59 - style="height: 20rem; width: auto; margin: 0 auto; display: block" 60 61 alt="A screenshot of the Shortcuts app with all the Spotlight shortcuts." 61 62 src="https://f004.backblazeb2.com/file/j0-lol-website/spotlightshortcuts.png" 62 63 />
+22 -14
posts/swift-inline-array.html
··· 24 24 and <code>InlineArray</code> is stack-allocated. 25 25 </p> 26 26 27 - <pre><code class="language-swift">func array() { 27 + <pre><code class="language-swift"><!-- 28 + func array() { 28 29 var array = [4, 5, 6] 29 30 } 30 31 31 32 func inlineArray() { 32 - var array: InlineArray&lt;3, Int&gt; = [4, 5, 6] 33 - }</code></pre> 33 + var array: InlineArray<3, Int> = [4, 5, 6] 34 + } 35 + --></code></pre> 34 36 35 37 And let's compare to Rust: 36 38 37 - <pre><code class="language-rust">fn vec() { 38 - let mut vec = vec![4, 5, 6]; // I could wrap this in an Arc, but that's not really what real code would do. 39 + <pre><code class="language-rust"> 40 + fn vec() { 41 + // I could wrap this in an Arc, but 42 + // that's not really what real code would do. 43 + let mut vec = vec![4, 5, 6]; 39 44 } 40 45 41 46 fn array() { 42 47 let mut arr = [4, 5, 6]; 43 - }</code></pre> 48 + } 49 + </code></pre> 44 50 45 51 <p> 46 52 You can probably see the argument I'm going to make here — This is less ··· 58 64 </p> 59 65 60 66 <figure> 61 - <pre><code class="language-swift">// Safe usage of a buffer pointer 62 - func processUsingBuffer(_ array: [Int]) -> Int { 63 - array.withUnsafeBufferPointer { buffer in 64 - var result = 0 65 - for i in 0..&lt;buffer.count { 66 - result += calculate(using: buffer, at: i) 67 + <pre><code class="language-swift"> 68 + // Safe usage of a buffer pointer 69 + func processUsingBuffer(_ array: [Int]) -> Int { 70 + array.withUnsafeBufferPointer { buffer in 71 + var result = 0 72 + for i in 0..&lt;buffer.count { 73 + result += calculate(using: buffer, at: i) 74 + } 75 + return result 67 76 } 68 - return result 69 77 } 70 - }</code></pre> 78 + </code></pre> 71 79 72 80 <figcaption>Example from above WWDC talk, used as a reference.</figcaption> 73 81 </figure>
+1
posts/tahoe-beta.html
··· 15 15 16 16 <figure> 17 17 <img 18 + class="applerounded blackbg" 18 19 width="1840" 19 20 height="872" 20 21 src="https://f004.backblazeb2.com/file/j0-lol-website/newfinder.png"
-1
routes/blog-post.php
··· 1 1 <?php fragment("head"); ?> 2 2 3 3 <body> 4 - <script src="/static/prism.js"></script> 5 4 6 5 <div class="wrapper"> 7 6
+1 -1
routes/fragments/footer.php
··· 14 14 </a> 15 15 <a href="https://brainmade.org"> 16 16 <div style="display: flex; padding: 3px; background-color: #000"> 17 - <img class="raw" alt="The Brainmade Mark" src="/static/brainmade.svg" width=82 height=25> 17 + <img class="raw" alt="The Brainmade Mark" src="/static/badges/brainmade.svg" width=82 height=25> 18 18 </div> 19 19 </a> 20 20 </div>
+8 -7
routes/fragments/head.php
··· 4 4 <?php global $commit_hash; ?> 5 5 <meta charset="utf-8"> 6 6 <meta name="viewport" content="width=device-width"> 7 - <link href="/static/normalize.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 8 - <link href="/static/style.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 9 - <link href="/static/nav.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 10 - <link href="/static/dialog.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 7 + <link href="/static/css/normalize.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 8 + <link href="/static/css/style.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 9 + <link href="/static/css/nav.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 10 + <link href="/static/css/dialog.<?= $commit_hash ?>.css" type="text/css" rel="stylesheet"> 11 11 <meta name="theme-color" content="#b497ee"> 12 12 <meta name="apple-mobile-web-app-status-bar-style" content="#b497ee"> 13 - <script defer data-domain="j0.lol" src="https://plausible.j0.lol/js/script.js"></script> 14 - <script type="module" src="/static/bsky-comments.js"></script> 15 - <link href="https://prismjs.catppuccin.com/mocha.css" rel="stylesheet" /> 13 + <script defer data-domain="j0.lol" src="/js/script.js"></script> 14 + <script type="module" src="/static/js/bsky-comments.<?= $commit_hash ?>.js"></script> 15 + <link href="/static/css/prism-theme-mocha.css" rel="stylesheet" /> 16 + <script src="/static/js/prism.js"></script> 16 17 17 18 <?php 18 19 global $post_slug;
+4 -9
routes/home.php
··· 140 140 "contact" 141 141 ) ?>">contact me</a>, or check out my <a href="https://github.com/j0lol">git repos</a>! 142 142 </p> 143 - 144 - 143 + </main> 145 144 145 + <div style="background: var(--bg-surface1); padding: 0rem 1rem;" class="tablet-show"> 146 + <hr class="frontmatter pilcrow"> 146 147 147 - 148 - 149 - 150 - 151 - </main> 148 + </div> 152 149 153 150 <div class="page"> 154 151 ··· 161 158 <br> 162 159 <details> 163 160 <summary>Embed code for my website</summary> 164 - 165 - <script src="/static/prism.js"></script> 166 161 167 162 <pre><code class="language-html">&#x3C;a rel=&#x22;noreferrer&#x22; href=&#x22;https://j0.lol&#x22;&#x3E; 168 163 &#x3C;img src=&#x22;https://j0.lol/static/badges/j0.gif&#x22; alt=&#x22;Logo: j0, with subtitle &#x27;deer thing&#x27;. To the side, there is a purple deer with yellow features. Various elements flicker.&#x22;&#x3E;
static/brainmade.svg static/badges/brainmade.svg
+97 -23
static/bsky-comments.js static/js/bsky-comments.js
··· 1 + const icon_likes = `<span aria-label="Likes"><svg 2 + style="height: 1em; width: 1em; vertical-align: top;" 3 + viewBox="0 0 24 24" 4 + fill="none" 5 + xmlns="http://www.w3.org/2000/svg" 6 + > 7 + <path 8 + fill-rule="evenodd" 9 + clip-rule="evenodd" 10 + d="M12.0122 5.57169L10.9252 4.48469C8.77734 2.33681 5.29493 2.33681 3.14705 4.48469C0.999162 6.63258 0.999162 10.115 3.14705 12.2629L11.9859 21.1017L11.9877 21.0999L12.014 21.1262L20.8528 12.2874C23.0007 10.1395 23.0007 6.65711 20.8528 4.50923C18.705 2.36134 15.2226 2.36134 13.0747 4.50923L12.0122 5.57169ZM11.9877 18.2715L16.9239 13.3352L18.3747 11.9342L18.3762 11.9356L19.4386 10.8732C20.8055 9.50635 20.8055 7.29028 19.4386 5.92344C18.0718 4.55661 15.8557 4.55661 14.4889 5.92344L12.0133 8.39904L12.006 8.3918L12.005 8.39287L9.51101 5.89891C8.14417 4.53207 5.92809 4.53207 4.56126 5.89891C3.19442 7.26574 3.19442 9.48182 4.56126 10.8487L7.10068 13.3881L7.10248 13.3863L11.9877 18.2715Z" 11 + fill="currentColor" 12 + /> 13 + </svg></span>`; 14 + 15 + const icon_replies = `<span aria-label="Replies"><svg 16 + style="height: 1em; width: 1em; vertical-align: top;" 17 + viewBox="0 0 24 24" 18 + fill="none" 19 + xmlns="http://www.w3.org/2000/svg" 20 + > 21 + <path d="M17 9H7V7H17V9Z" fill="currentColor" /> 22 + <path d="M7 13H17V11H7V13Z" fill="currentColor" /> 23 + <path 24 + fill-rule="evenodd" 25 + clip-rule="evenodd" 26 + d="M2 18V2H22V18H16V22H14C11.7909 22 10 20.2091 10 18H2ZM12 16V18C12 19.1046 12.8954 20 14 20V16H20V4H4V16H12Z" 27 + fill="currentColor" 28 + /> 29 + </svg></span>`; 30 + 31 + const icon_reposts = `<span aria-label="Reposts"><svg 32 + style="height: 1em; width: 1em; vertical-align: top;" 33 + viewBox="0 0 24 24" 34 + viewBox="0 0 24 24" 35 + fill="none" 36 + xmlns="http://www.w3.org/2000/svg" 37 + > 38 + <path 39 + d="M18.3701 7.99993L13.8701 10.598V8.99993H6.88989V12.9999H4.88989V6.99993H13.8701V5.40186L18.3701 7.99993Z" 40 + fill="currentColor" 41 + /> 42 + <path 43 + d="M10.1299 16.9999H19.1101V10.9999H17.1101V14.9999H10.1299V13.4019L5.62988 15.9999L10.1299 18.598V16.9999Z" 44 + fill="currentColor" 45 + /> 46 + </svg></span>`; 47 + 1 48 class BskyComments extends HTMLElement { 2 49 constructor() { 3 50 super(); ··· 95 142 commentsContainer.appendChild(this.createCommentElement(reply)); 96 143 } 97 144 }); 145 + if (commentsContainer.children.length == 0) { 146 + commentsContainer.remove(); 147 + } 98 148 99 149 const showMoreButton = container.querySelector("#show-more"); 100 150 if (this.visibleCount >= sortedReplies.length) { 101 - showMoreButton.style.display = "none"; 151 + showMoreButton.remove(); 102 152 } 103 153 showMoreButton.addEventListener("click", () => { 104 154 this.visibleCount += 5; ··· 131 181 132 182 comment.innerHTML = ` 133 183 <div class="author"> 134 - <a href="https://bsky.app/profile/${author.did}" target="_blank" rel="noopener noreferrer"> 135 - ${author.avatar ? `<img width="22" src="${author.avatar}" />` : ""} 136 - ${author.displayName ?? author.handle}‭ @${author.handle} 137 - </a> 184 + 185 + <a class="noline" href="https://bsky.app/profile/${author.did}"> 186 + ${author.avatar ? `<div class="imgcontainer"><img width="22" src="${author.avatar}" /><div class="imgborder"></div></div>` : ""} 187 + <span><b class="author-nickname">${author.displayName ?? author.handle}‭</b> @${author.handle}</span> 188 + </a> 138 189 <p class="comment-text">${this.escapeHTML(text)}</p> 139 190 <small class="comment-meta"> 140 - ${reply.post.likeCount ?? 0} likes • ${reply.post.replyCount ?? 0} replies 191 + ${icon_likes} ${reply.post.likeCount ?? 0} &nbsp; ${icon_reposts} ${reply.post.repostCount ?? 0} &nbsp; ${icon_replies} ${reply.post.replyCount ?? 0} 141 192 </small> 142 193 </div> 143 194 `; ··· 178 229 --author-avatar-border-radius: 100%; 179 230 } 180 231 232 + a.noline { 233 + text-decoration: none; 234 + } 181 235 comments { 182 236 margin: 0 auto; 183 237 padding: 0; ··· 186 240 background-color: var(--background-color); 187 241 color: var(--text-color); 188 242 } 243 + 189 244 .reply-info { 190 245 font-size: 14px; 191 246 color: var(--text-color); 192 247 margin-top: 0; 193 248 } 249 + 250 + .reply-info:only-child { 251 + margin-bottom: 0; 252 + } 253 + 254 + /* Selecting the last comment if there is no show-more button */ 255 + #comments:not(:has(+ #show-more)) > .comment:last-child .author .comment-meta { 256 + margin-bottom: 0; 257 + } 258 + 194 259 #show-more { 195 260 margin-top: 10px; 196 261 width: 100%; ··· 220 285 text-decoration: none; 221 286 } 222 287 223 - &:hover { 224 - color: var(--link-hover-color); 288 + .author-nickname:hover { 289 + text-decoration: underline; 225 290 } 226 291 227 292 img { 228 - margin-right: 0.4em; 229 293 border-radius: var(--author-avatar-border-radius); 230 294 vertical-align: middle; 295 + width: 24px; 296 + height: 24px; 297 + border-radius: 12px; 298 + background-color: rgb(241, 243, 245); 299 + } 300 + .imgcontainer { 301 + width: 24px; 302 + height: 24px; 303 + position: relative; 304 + margin-right: 0.4em; 305 + display: inline-block; 306 + } 307 + .imgborder { 308 + position: absolute; 309 + inset: 0px; 310 + border: 1px solid rgb(212, 219, 226); 311 + opacity: 0.6; 312 + pointer-events: none; 313 + border-radius: 12px; 231 314 } 232 315 } 233 316 } ··· 240 323 display: block; 241 324 margin: 1em 0 2em; 242 325 } 243 - .replies-container { 244 - border-left: 1px solid var(--reply-border-color); 245 - margin-left: 1.6em; 246 - padding-left: 1.6em; 326 + .replies-container, #comments > .comment { 327 + border-left: 0.5px solid var(--reply-border-color); 328 + margin-left: 0rem; 329 + padding-left: 0.8rem; 247 330 } 248 331 .error { 249 332 color: var(--error-color); 250 333 } 251 - @media (width <= 27rem) { 252 - .replies-container { 253 - border-left: 1px solid var(--reply-border-color); 254 - margin-left: 0.4em; 255 - padding-left: 0.4em; 256 - } 257 - .comment-meta { 258 - margin: 0.5em 0 1em; 259 - } 260 - } 334 + 261 335 `; 262 336 this.shadowRoot.appendChild(style); 263 337 }
+135
static/css/prism-theme-mocha.css
··· 1 + code[class*="language-"], 2 + pre[class*="language-"] { 3 + color: #cdd6f4; 4 + } 5 + 6 + :not(pre) > code[class*="language-"], 7 + pre[class*="language-"] { 8 + background: #181825; 9 + } 10 + 11 + /* https://prismjs.com/tokens.html */ 12 + 13 + .token.keyword { 14 + color: #cba6f7; 15 + } 16 + 17 + .token.builtin { 18 + color: #f38ba8; 19 + } 20 + 21 + .token.class-name { 22 + color: #f9e2af; 23 + } 24 + 25 + .token.function { 26 + color: #89b4fa; 27 + } 28 + 29 + .token.boolean, 30 + .token.number { 31 + color: #fab387; 32 + } 33 + 34 + .token.string, 35 + .token.char { 36 + color: #a6e3a1; 37 + } 38 + 39 + .token.symbol { 40 + color: #f9e2af; 41 + } 42 + 43 + .token.regex { 44 + color: #f5c2e7; 45 + } 46 + 47 + .token.url { 48 + color: #a6e3a1; 49 + } 50 + 51 + .token.operator { 52 + color: #89dceb; 53 + } 54 + 55 + .token.variable { 56 + color: #cdd6f4; 57 + } 58 + 59 + .token.constant { 60 + color: #fab387; 61 + } 62 + 63 + .token.property { 64 + color: #89b4fa; 65 + } 66 + 67 + .token.punctuation { 68 + color: #9399b2; 69 + } 70 + 71 + .token.important { 72 + color: #cba6f7; 73 + } 74 + 75 + .token.comment { 76 + color: #9399b2; 77 + } 78 + 79 + .token.tag { 80 + color: #89b4fa; 81 + } 82 + 83 + .token.attr-name { 84 + color: #f9e2af; 85 + } 86 + 87 + .token.attr-value { 88 + color: #a6e3a1; 89 + } 90 + 91 + .token.namespace { 92 + color: #f9e2af; 93 + } 94 + 95 + .token.prolog, 96 + .token.doctype { 97 + color: #cba6f7; 98 + } 99 + 100 + .token.cdata { 101 + color: #94e2d5; 102 + } 103 + 104 + .token.entity { 105 + color: #f38ba8; 106 + } 107 + 108 + .token.atrule { 109 + color: #cba6f7; 110 + } 111 + 112 + .token.selector { 113 + color: #89b4fa; 114 + } 115 + 116 + /* Diff */ 117 + 118 + .token.deleted { 119 + color: #f38ba8; 120 + } 121 + 122 + .token.inserted { 123 + color: #a6e3a1 124 + } 125 + 126 + /* Other */ 127 + 128 + .token.important, 129 + .token.bold { 130 + font-weight: bold; 131 + } 132 + .token.italic { 133 + font-style: italic; 134 + } 135 +
static/dialog.css static/css/dialog.css
static/nav.css static/css/nav.css
static/normalize.css static/css/normalize.css
+350 -1
static/prism.js static/js/prism.js
··· 1 1 /* PrismJS 1.30.0 2 - https://prismjs.com/download#themes=prism&languages=markup+css+clike+javascript+java+markup-templating+php+rust+swift&plugins=show-language+toolbar */ 2 + https://prismjs.com/download#themes=prism-tomorrow&languages=markup+css+clike+javascript+bash+java+markup-templating+php+rust+swift&plugins=show-language+unescaped-markup+normalize-whitespace+toolbar */ 3 3 var _self = 4 4 "undefined" != typeof window 5 5 ? window ··· 761 761 "javascript", 762 762 )), 763 763 (Prism.languages.js = Prism.languages.javascript)); 764 + !(function (e) { 765 + var t = 766 + "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b", 767 + a = { 768 + pattern: /(^(["']?)\w+\2)[ \t]+\S.*/, 769 + lookbehind: !0, 770 + alias: "punctuation", 771 + inside: null, 772 + }, 773 + n = { 774 + bash: a, 775 + environment: { pattern: RegExp("\\$" + t), alias: "constant" }, 776 + variable: [ 777 + { 778 + pattern: /\$?\(\([\s\S]+?\)\)/, 779 + greedy: !0, 780 + inside: { 781 + variable: [ 782 + { pattern: /(^\$\(\([\s\S]+)\)\)/, lookbehind: !0 }, 783 + /^\$\(\(/, 784 + ], 785 + number: 786 + /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/, 787 + operator: 788 + /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/, 789 + punctuation: /\(\(?|\)\)?|,|;/, 790 + }, 791 + }, 792 + { 793 + pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/, 794 + greedy: !0, 795 + inside: { variable: /^\$\(|^`|\)$|`$/ }, 796 + }, 797 + { 798 + pattern: /\$\{[^}]+\}/, 799 + greedy: !0, 800 + inside: { 801 + operator: /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/, 802 + punctuation: /[\[\]]/, 803 + environment: { 804 + pattern: RegExp("(\\{)" + t), 805 + lookbehind: !0, 806 + alias: "constant", 807 + }, 808 + }, 809 + }, 810 + /\$(?:\w+|[#?*!@$])/, 811 + ], 812 + entity: 813 + /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/, 814 + }; 815 + ((e.languages.bash = { 816 + shebang: { pattern: /^#!\s*\/.*/, alias: "important" }, 817 + comment: { pattern: /(^|[^"{\\$])#.*/, lookbehind: !0 }, 818 + "function-name": [ 819 + { 820 + pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/, 821 + lookbehind: !0, 822 + alias: "function", 823 + }, 824 + { pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/, alias: "function" }, 825 + ], 826 + "for-or-select": { 827 + pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/, 828 + alias: "variable", 829 + lookbehind: !0, 830 + }, 831 + "assign-left": { 832 + pattern: /(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/, 833 + inside: { 834 + environment: { 835 + pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + t), 836 + lookbehind: !0, 837 + alias: "constant", 838 + }, 839 + }, 840 + alias: "variable", 841 + lookbehind: !0, 842 + }, 843 + parameter: { 844 + pattern: /(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/, 845 + alias: "variable", 846 + lookbehind: !0, 847 + }, 848 + string: [ 849 + { 850 + pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/, 851 + lookbehind: !0, 852 + greedy: !0, 853 + inside: n, 854 + }, 855 + { 856 + pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/, 857 + lookbehind: !0, 858 + greedy: !0, 859 + inside: { bash: a }, 860 + }, 861 + { 862 + pattern: 863 + /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/, 864 + lookbehind: !0, 865 + greedy: !0, 866 + inside: n, 867 + }, 868 + { pattern: /(^|[^$\\])'[^']*'/, lookbehind: !0, greedy: !0 }, 869 + { 870 + pattern: /\$'(?:[^'\\]|\\[\s\S])*'/, 871 + greedy: !0, 872 + inside: { entity: n.entity }, 873 + }, 874 + ], 875 + environment: { pattern: RegExp("\\$?" + t), alias: "constant" }, 876 + variable: n.variable, 877 + function: { 878 + pattern: 879 + /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/, 880 + lookbehind: !0, 881 + }, 882 + keyword: { 883 + pattern: 884 + /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/, 885 + lookbehind: !0, 886 + }, 887 + builtin: { 888 + pattern: 889 + /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/, 890 + lookbehind: !0, 891 + alias: "class-name", 892 + }, 893 + boolean: { 894 + pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/, 895 + lookbehind: !0, 896 + }, 897 + "file-descriptor": { pattern: /\B&\d\b/, alias: "important" }, 898 + operator: { 899 + pattern: 900 + /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/, 901 + inside: { "file-descriptor": { pattern: /^\d/, alias: "important" } }, 902 + }, 903 + punctuation: /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/, 904 + number: { pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/, lookbehind: !0 }, 905 + }), 906 + (a.inside = e.languages.bash)); 907 + for ( 908 + var s = [ 909 + "comment", 910 + "function-name", 911 + "for-or-select", 912 + "assign-left", 913 + "parameter", 914 + "string", 915 + "environment", 916 + "function", 917 + "keyword", 918 + "builtin", 919 + "boolean", 920 + "file-descriptor", 921 + "operator", 922 + "punctuation", 923 + "number", 924 + ], 925 + o = n.variable[1].inside, 926 + i = 0; 927 + i < s.length; 928 + i++ 929 + ) 930 + o[s[i]] = e.languages.bash[s[i]]; 931 + ((e.languages.sh = e.languages.bash), (e.languages.shell = e.languages.bash)); 932 + })(Prism); 764 933 !(function (e) { 765 934 var n = 766 935 /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/, ··· 1802 1971 }); 1803 1972 } else console.warn("Show Languages plugin loaded before Toolbar plugin."); 1804 1973 })(); 1974 + "undefined" != typeof Prism && 1975 + "undefined" != typeof document && 1976 + (Element.prototype.matches || 1977 + (Element.prototype.matches = 1978 + Element.prototype.msMatchesSelector || 1979 + Element.prototype.webkitMatchesSelector), 1980 + (Prism.plugins.UnescapedMarkup = !0), 1981 + Prism.hooks.add("before-highlightall", function (e) { 1982 + e.selector += 1983 + ', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]'; 1984 + }), 1985 + Prism.hooks.add("before-sanity-check", function (e) { 1986 + var t = e.element; 1987 + if (t.matches('script[type="text/plain"]')) { 1988 + var a = document.createElement("code"), 1989 + c = document.createElement("pre"); 1990 + c.className = a.className = t.className; 1991 + var n = t.dataset; 1992 + return ( 1993 + Object.keys(n || {}).forEach(function (e) { 1994 + Object.prototype.hasOwnProperty.call(n, e) && (c.dataset[e] = n[e]); 1995 + }), 1996 + (a.textContent = e.code = 1997 + e.code.replace(/&lt;\/script(?:>|&gt;)/gi, "<\/script>")), 1998 + c.appendChild(a), 1999 + t.parentNode.replaceChild(c, t), 2000 + void (e.element = a) 2001 + ); 2002 + } 2003 + if (!e.code) { 2004 + var o = t.childNodes; 2005 + 1 === o.length && 2006 + "#comment" == o[0].nodeName && 2007 + (t.textContent = e.code = o[0].textContent); 2008 + } 2009 + })); 2010 + !(function () { 2011 + if ("undefined" != typeof Prism) { 2012 + var e = 2013 + Object.assign || 2014 + function (e, t) { 2015 + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); 2016 + return e; 2017 + }, 2018 + t = { 2019 + "remove-trailing": "boolean", 2020 + "remove-indent": "boolean", 2021 + "left-trim": "boolean", 2022 + "right-trim": "boolean", 2023 + "break-lines": "number", 2024 + indent: "number", 2025 + "remove-initial-line-feed": "boolean", 2026 + "tabs-to-spaces": "number", 2027 + "spaces-to-tabs": "number", 2028 + }; 2029 + ((n.prototype = { 2030 + setDefaults: function (t) { 2031 + this.defaults = e(this.defaults, t); 2032 + }, 2033 + normalize: function (t, n) { 2034 + for (var r in (n = e(this.defaults, n))) { 2035 + var i = r.replace(/-(\w)/g, function (e, t) { 2036 + return t.toUpperCase(); 2037 + }); 2038 + "normalize" !== r && 2039 + "setDefaults" !== i && 2040 + n[r] && 2041 + this[i] && 2042 + (t = this[i].call(this, t, n[r])); 2043 + } 2044 + return t; 2045 + }, 2046 + leftTrim: function (e) { 2047 + return e.replace(/^\s+/, ""); 2048 + }, 2049 + rightTrim: function (e) { 2050 + return e.replace(/\s+$/, ""); 2051 + }, 2052 + tabsToSpaces: function (e, t) { 2053 + return ((t = 0 | t || 4), e.replace(/\t/g, new Array(++t).join(" "))); 2054 + }, 2055 + spacesToTabs: function (e, t) { 2056 + return ((t = 0 | t || 4), e.replace(RegExp(" {" + t + "}", "g"), "\t")); 2057 + }, 2058 + removeTrailing: function (e) { 2059 + return e.replace(/\s*?$/gm, ""); 2060 + }, 2061 + removeInitialLineFeed: function (e) { 2062 + return e.replace(/^(?:\r?\n|\r)/, ""); 2063 + }, 2064 + removeIndent: function (e) { 2065 + var t = e.match(/^[^\S\n\r]*(?=\S)/gm); 2066 + return t && t[0].length 2067 + ? (t.sort(function (e, t) { 2068 + return e.length - t.length; 2069 + }), 2070 + t[0].length ? e.replace(RegExp("^" + t[0], "gm"), "") : e) 2071 + : e; 2072 + }, 2073 + indent: function (e, t) { 2074 + return e.replace( 2075 + /^[^\S\n\r]*(?=\S)/gm, 2076 + new Array(++t).join("\t") + "$&", 2077 + ); 2078 + }, 2079 + breakLines: function (e, t) { 2080 + t = !0 === t ? 80 : 0 | t || 80; 2081 + for (var n = e.split("\n"), i = 0; i < n.length; ++i) 2082 + if (!(r(n[i]) <= t)) { 2083 + for ( 2084 + var o = n[i].split(/(\s+)/g), a = 0, l = 0; 2085 + l < o.length; 2086 + ++l 2087 + ) { 2088 + var s = r(o[l]); 2089 + (a += s) > t && ((o[l] = "\n" + o[l]), (a = s)); 2090 + } 2091 + n[i] = o.join(""); 2092 + } 2093 + return n.join("\n"); 2094 + }, 2095 + }), 2096 + "undefined" != typeof module && module.exports && (module.exports = n), 2097 + (Prism.plugins.NormalizeWhitespace = new n({ 2098 + "remove-trailing": !0, 2099 + "remove-indent": !0, 2100 + "left-trim": !0, 2101 + "right-trim": !0, 2102 + })), 2103 + Prism.hooks.add("before-sanity-check", function (e) { 2104 + var n = Prism.plugins.NormalizeWhitespace; 2105 + if ( 2106 + (!e.settings || !1 !== e.settings["whitespace-normalization"]) && 2107 + Prism.util.isActive(e.element, "whitespace-normalization", !0) 2108 + ) 2109 + if ((e.element && e.element.parentNode) || !e.code) { 2110 + var r = e.element.parentNode; 2111 + if (e.code && r && "pre" === r.nodeName.toLowerCase()) { 2112 + for (var i in (null == e.settings && (e.settings = {}), t)) 2113 + if (Object.hasOwnProperty.call(t, i)) { 2114 + var o = t[i]; 2115 + if (r.hasAttribute("data-" + i)) 2116 + try { 2117 + var a = JSON.parse(r.getAttribute("data-" + i) || "true"); 2118 + typeof a === o && (e.settings[i] = a); 2119 + } catch (e) {} 2120 + } 2121 + for ( 2122 + var l = r.childNodes, s = "", c = "", u = !1, m = 0; 2123 + m < l.length; 2124 + ++m 2125 + ) { 2126 + var f = l[m]; 2127 + f == e.element 2128 + ? (u = !0) 2129 + : "#text" === f.nodeName && 2130 + (u ? (c += f.nodeValue) : (s += f.nodeValue), 2131 + r.removeChild(f), 2132 + --m); 2133 + } 2134 + if (e.element.children.length && Prism.plugins.KeepMarkup) { 2135 + var d = s + e.element.innerHTML + c; 2136 + ((e.element.innerHTML = n.normalize(d, e.settings)), 2137 + (e.code = e.element.textContent)); 2138 + } else 2139 + ((e.code = s + e.code + c), 2140 + (e.code = n.normalize(e.code, e.settings))); 2141 + } 2142 + } else e.code = n.normalize(e.code, e.settings); 2143 + })); 2144 + } 2145 + function n(t) { 2146 + this.defaults = e({}, t); 2147 + } 2148 + function r(e) { 2149 + for (var t = 0, n = 0; n < e.length; ++n) 2150 + e.charCodeAt(n) == "\t".charCodeAt(0) && (t += 3); 2151 + return e.length + t; 2152 + } 2153 + })();
+40 -4
static/style.css static/css/style.css
··· 98 98 --border-header: rgb(var(--secondary-700)); 99 99 --plain-bg: light-dark(rgb(var(--primary-50)), rgb(var(--secondary-975))); 100 100 --bg: light-dark(rgb(var(--primary-200)), rgb(var(--secondary-950))); 101 + --bg-depth: light-dark(var(--bg), rgb(var(--secondary-925))); 101 102 --bg-surface0: light-dark( 102 103 rgb(var(--primary-100)), 103 104 rgb(var(--secondary-900)) ··· 293 294 max-width: 100%; 294 295 height: auto; 295 296 border: 1px solid rgb(53 50 68); 296 - border-radius: 0.5rem; 297 + border-radius: 0.2rem; 298 + max-height: 20rem; 299 + width: auto; 300 + height: auto; 301 + 302 + margin: 0 auto; 303 + display: block; 304 + 305 + background-color: var(--bg); 306 + } 307 + 308 + img:not(.raw) { 309 + box-shadow: 1px 2px var(--bg-depth); 310 + } 311 + 312 + img:not(.raw).applerounded { 313 + border-radius: 1.5rem; 314 + } 315 + 316 + img:not(.raw).superrounded { 317 + border-radius: 3rem; 318 + } 319 + 320 + img:not(.raw).blackbg { 321 + background-color: #000000; 297 322 } 298 323 299 324 abbr { ··· 448 473 position: absolute; 449 474 } 450 475 476 + main { 477 + container-type: inline-size; 478 + } 479 + @container (width < 28.5rem) { 480 + /* Specificity hack */ 481 + /* https://csswizardry.com/2014/07/hacks-for-dealing-with-specificity/ */ 482 + .card-stack.card-stack { 483 + grid-template-columns: 1fr; 484 + } 485 + } 486 + 451 487 .card-stack { 452 488 display: grid; 453 489 gap: 0.5em; 454 - grid-template-columns: repeat(auto-fill, 14em); 490 + grid-template-columns: repeat(auto-fill, 14rem); 455 491 justify-content: center; 456 492 } 457 493 ··· 560 596 bsky-comments { 561 597 --background-color: var(--bg-surface1); 562 598 --text-color: var(--text); 563 - --link-color: var(--anchor); 599 + --link-color: var(--subtext); 564 600 --link-hover-color: var(--anchor-active); 565 601 --comment-meta-color: var(--subtext); 566 - --reply-border-color: var(--border); 602 + --reply-border-color: var(--text); 567 603 } 568 604 569 605 figcaption {