@geekity/cms 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +177 -6
  2. package/admin/pages/account/login.njk +3 -0
  3. package/admin/pages/documents/editor.njk +7 -0
  4. package/admin/pages/indieauth/consent.njk +51 -0
  5. package/admin/pages/indieauth/refused.njk +11 -0
  6. package/admin/pages/settings/general.njk +9 -0
  7. package/admin/pages/settings/reading.njk +93 -0
  8. package/admin/pages/users/apps.njk +74 -0
  9. package/admin/pages/users/edit.njk +12 -0
  10. package/admin/static/admin.css +27 -0
  11. package/dist/admin/accounts.d.ts +3 -0
  12. package/dist/admin/accounts.d.ts.map +1 -1
  13. package/dist/admin/accounts.js +5 -0
  14. package/dist/admin/accounts.js.map +1 -1
  15. package/dist/admin/documents.d.ts +2 -0
  16. package/dist/admin/documents.d.ts.map +1 -1
  17. package/dist/admin/documents.js +17 -1
  18. package/dist/admin/documents.js.map +1 -1
  19. package/dist/admin/headers.d.ts +5 -1
  20. package/dist/admin/headers.d.ts.map +1 -1
  21. package/dist/admin/headers.js +7 -3
  22. package/dist/admin/headers.js.map +1 -1
  23. package/dist/admin/menu.d.ts.map +1 -1
  24. package/dist/admin/menu.js +2 -1
  25. package/dist/admin/menu.js.map +1 -1
  26. package/dist/admin/routes.d.ts.map +1 -1
  27. package/dist/admin/routes.js +48 -5
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/settings-general.js +1 -1
  30. package/dist/admin/settings-general.js.map +1 -1
  31. package/dist/admin/settings-reading.d.ts.map +1 -1
  32. package/dist/admin/settings-reading.js +15 -1
  33. package/dist/admin/settings-reading.js.map +1 -1
  34. package/dist/admin/settings.d.ts +79 -2
  35. package/dist/admin/settings.d.ts.map +1 -1
  36. package/dist/admin/settings.js +168 -2
  37. package/dist/admin/settings.js.map +1 -1
  38. package/dist/admin/templates.d.ts +3 -0
  39. package/dist/admin/templates.d.ts.map +1 -1
  40. package/dist/admin/templates.js +3 -0
  41. package/dist/admin/templates.js.map +1 -1
  42. package/dist/admin/users.d.ts +8 -0
  43. package/dist/admin/users.d.ts.map +1 -1
  44. package/dist/admin/users.js +9 -0
  45. package/dist/admin/users.js.map +1 -1
  46. package/dist/config.d.ts +30 -0
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +1 -0
  49. package/dist/config.js.map +1 -1
  50. package/dist/env.d.ts +14 -0
  51. package/dist/env.d.ts.map +1 -1
  52. package/dist/federation/article.d.ts.map +1 -1
  53. package/dist/federation/article.js +18 -5
  54. package/dist/federation/article.js.map +1 -1
  55. package/dist/images/icons.d.ts +44 -25
  56. package/dist/images/icons.d.ts.map +1 -1
  57. package/dist/images/icons.js +205 -60
  58. package/dist/images/icons.js.map +1 -1
  59. package/dist/images/index.d.ts +2 -2
  60. package/dist/images/index.d.ts.map +1 -1
  61. package/dist/images/index.js +1 -1
  62. package/dist/images/index.js.map +1 -1
  63. package/dist/images/markup.d.ts +14 -0
  64. package/dist/images/markup.d.ts.map +1 -1
  65. package/dist/images/markup.js +16 -11
  66. package/dist/images/markup.js.map +1 -1
  67. package/dist/images/variants.d.ts.map +1 -1
  68. package/dist/images/variants.js +3 -4
  69. package/dist/images/variants.js.map +1 -1
  70. package/dist/index.d.ts +14 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +28 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/indexnow.d.ts +34 -0
  75. package/dist/indexnow.d.ts.map +1 -0
  76. package/dist/indexnow.js +141 -0
  77. package/dist/indexnow.js.map +1 -0
  78. package/dist/indieauth/bearer.d.ts +39 -0
  79. package/dist/indieauth/bearer.d.ts.map +1 -0
  80. package/dist/indieauth/bearer.js +63 -0
  81. package/dist/indieauth/bearer.js.map +1 -0
  82. package/dist/indieauth/client.d.ts +61 -0
  83. package/dist/indieauth/client.d.ts.map +1 -0
  84. package/dist/indieauth/client.js +139 -0
  85. package/dist/indieauth/client.js.map +1 -0
  86. package/dist/indieauth/connected-apps.d.ts +23 -0
  87. package/dist/indieauth/connected-apps.d.ts.map +1 -0
  88. package/dist/indieauth/connected-apps.js +73 -0
  89. package/dist/indieauth/connected-apps.js.map +1 -0
  90. package/dist/indieauth/consent.d.ts +28 -0
  91. package/dist/indieauth/consent.d.ts.map +1 -0
  92. package/dist/indieauth/consent.js +185 -0
  93. package/dist/indieauth/consent.js.map +1 -0
  94. package/dist/indieauth/discovery.d.ts +87 -0
  95. package/dist/indieauth/discovery.d.ts.map +1 -0
  96. package/dist/indieauth/discovery.js +127 -0
  97. package/dist/indieauth/discovery.js.map +1 -0
  98. package/dist/indieauth/grants.d.ts +57 -0
  99. package/dist/indieauth/grants.d.ts.map +1 -0
  100. package/dist/indieauth/grants.js +35 -0
  101. package/dist/indieauth/grants.js.map +1 -0
  102. package/dist/indieauth/identity.d.ts +36 -0
  103. package/dist/indieauth/identity.d.ts.map +1 -0
  104. package/dist/indieauth/identity.js +78 -0
  105. package/dist/indieauth/identity.js.map +1 -0
  106. package/dist/indieauth/redeem.d.ts +47 -0
  107. package/dist/indieauth/redeem.d.ts.map +1 -0
  108. package/dist/indieauth/redeem.js +69 -0
  109. package/dist/indieauth/redeem.js.map +1 -0
  110. package/dist/indieauth/request.d.ts +47 -0
  111. package/dist/indieauth/request.d.ts.map +1 -0
  112. package/dist/indieauth/request.js +104 -0
  113. package/dist/indieauth/request.js.map +1 -0
  114. package/dist/indieauth/token.d.ts +19 -0
  115. package/dist/indieauth/token.d.ts.map +1 -0
  116. package/dist/indieauth/token.js +110 -0
  117. package/dist/indieauth/token.js.map +1 -0
  118. package/dist/indieauth/tokens.d.ts +131 -0
  119. package/dist/indieauth/tokens.d.ts.map +1 -0
  120. package/dist/indieauth/tokens.js +205 -0
  121. package/dist/indieauth/tokens.js.map +1 -0
  122. package/dist/web/archive.d.ts +1 -1
  123. package/dist/web/archive.d.ts.map +1 -1
  124. package/dist/web/archive.js +3 -2
  125. package/dist/web/archive.js.map +1 -1
  126. package/dist/web/context.d.ts +25 -0
  127. package/dist/web/context.d.ts.map +1 -1
  128. package/dist/web/context.js +18 -0
  129. package/dist/web/context.js.map +1 -1
  130. package/dist/web/feed-atom.d.ts.map +1 -1
  131. package/dist/web/feed-atom.js +3 -1
  132. package/dist/web/feed-atom.js.map +1 -1
  133. package/dist/web/feed-item.d.ts +11 -2
  134. package/dist/web/feed-item.d.ts.map +1 -1
  135. package/dist/web/feed-item.js +9 -3
  136. package/dist/web/feed-item.js.map +1 -1
  137. package/dist/web/feed-json.d.ts +4 -0
  138. package/dist/web/feed-json.d.ts.map +1 -1
  139. package/dist/web/feed-json.js +4 -1
  140. package/dist/web/feed-json.js.map +1 -1
  141. package/dist/web/feed-rss.d.ts.map +1 -1
  142. package/dist/web/feed-rss.js +16 -3
  143. package/dist/web/feed-rss.js.map +1 -1
  144. package/dist/web/feed-source.d.ts +28 -0
  145. package/dist/web/feed-source.d.ts.map +1 -1
  146. package/dist/web/feed-source.js +31 -0
  147. package/dist/web/feed-source.js.map +1 -1
  148. package/dist/web/feed-xml.d.ts +2 -0
  149. package/dist/web/feed-xml.d.ts.map +1 -1
  150. package/dist/web/feed-xml.js +2 -0
  151. package/dist/web/feed-xml.js.map +1 -1
  152. package/dist/web/feeds.d.ts.map +1 -1
  153. package/dist/web/feeds.js +8 -1
  154. package/dist/web/feeds.js.map +1 -1
  155. package/dist/web/index.d.ts +3 -1
  156. package/dist/web/index.d.ts.map +1 -1
  157. package/dist/web/index.js +2 -1
  158. package/dist/web/index.js.map +1 -1
  159. package/dist/web/indexnow.d.ts +9 -0
  160. package/dist/web/indexnow.d.ts.map +1 -0
  161. package/dist/web/indexnow.js +27 -0
  162. package/dist/web/indexnow.js.map +1 -0
  163. package/dist/web/llms.d.ts +58 -0
  164. package/dist/web/llms.d.ts.map +1 -0
  165. package/dist/web/llms.js +91 -0
  166. package/dist/web/llms.js.map +1 -0
  167. package/dist/web/locale.d.ts +41 -0
  168. package/dist/web/locale.d.ts.map +1 -0
  169. package/dist/web/locale.js +56 -0
  170. package/dist/web/locale.js.map +1 -0
  171. package/dist/web/manifest.d.ts +50 -0
  172. package/dist/web/manifest.d.ts.map +1 -0
  173. package/dist/web/manifest.js +56 -0
  174. package/dist/web/manifest.js.map +1 -0
  175. package/dist/web/negotiate.d.ts.map +1 -1
  176. package/dist/web/negotiate.js +6 -0
  177. package/dist/web/negotiate.js.map +1 -1
  178. package/dist/web/render.d.ts +6 -1
  179. package/dist/web/render.d.ts.map +1 -1
  180. package/dist/web/render.js +68 -22
  181. package/dist/web/render.js.map +1 -1
  182. package/dist/web/robots.d.ts +89 -0
  183. package/dist/web/robots.d.ts.map +1 -0
  184. package/dist/web/robots.js +259 -0
  185. package/dist/web/robots.js.map +1 -0
  186. package/dist/web/routes.d.ts.map +1 -1
  187. package/dist/web/routes.js +105 -6
  188. package/dist/web/routes.js.map +1 -1
  189. package/dist/web/share-image.d.ts +51 -0
  190. package/dist/web/share-image.d.ts.map +1 -0
  191. package/dist/web/share-image.js +43 -0
  192. package/dist/web/share-image.js.map +1 -0
  193. package/dist/web/sitemap.d.ts +0 -26
  194. package/dist/web/sitemap.d.ts.map +1 -1
  195. package/dist/web/sitemap.js +0 -44
  196. package/dist/web/sitemap.js.map +1 -1
  197. package/dist/web/templates.d.ts +16 -9
  198. package/dist/web/templates.d.ts.map +1 -1
  199. package/dist/web/templates.js +83 -55
  200. package/dist/web/templates.js.map +1 -1
  201. package/dist/web/themes.d.ts +33 -0
  202. package/dist/web/themes.d.ts.map +1 -1
  203. package/dist/web/themes.js +57 -0
  204. package/dist/web/themes.js.map +1 -1
  205. package/dist/webmention/discovery.d.ts +4 -2
  206. package/dist/webmention/discovery.d.ts.map +1 -1
  207. package/dist/webmention/discovery.js +14 -8
  208. package/dist/webmention/discovery.js.map +1 -1
  209. package/dist/webmention/fetch-public.d.ts +2 -0
  210. package/dist/webmention/fetch-public.d.ts.map +1 -1
  211. package/dist/webmention/fetch-public.js +1 -1
  212. package/dist/webmention/fetch-public.js.map +1 -1
  213. package/package.json +7 -2
  214. package/themes/default/README.md +320 -139
  215. package/themes/default/layouts/404.njk +2 -0
  216. package/themes/default/layouts/500.njk +2 -0
  217. package/themes/default/layouts/503.njk +2 -0
  218. package/themes/default/layouts/author.njk +3 -1
  219. package/themes/default/layouts/base.njk +96 -17
  220. package/themes/default/layouts/category.njk +4 -2
  221. package/themes/default/layouts/front-page.njk +7 -2
  222. package/themes/default/layouts/home.njk +10 -0
  223. package/themes/default/layouts/page.njk +7 -4
  224. package/themes/default/layouts/post.njk +35 -25
  225. package/themes/default/layouts/search.njk +5 -9
  226. package/themes/default/layouts/tag.njk +7 -1
  227. package/themes/default/partials/archive.njk +3 -1
  228. package/themes/default/partials/bio.njk +9 -2
  229. package/themes/default/partials/breadcrumbs.njk +20 -0
  230. package/themes/default/partials/comment-form.njk +8 -0
  231. package/themes/default/partials/contact-form.njk +3 -0
  232. package/themes/default/partials/conversation.njk +14 -4
  233. package/themes/default/partials/jsonld.njk +19 -4
  234. package/themes/default/partials/kicker.njk +36 -0
  235. package/themes/default/partials/lang.njk +7 -0
  236. package/themes/default/partials/post-list.njk +43 -47
  237. package/themes/default/partials/reply-context.njk +14 -5
  238. package/themes/default/src/style.css +1109 -0
  239. package/themes/default/static/style.css +2124 -1160
  240. package/themes/default/theme.json +3 -1
@@ -1,1378 +1,2342 @@
1
- /*
2
- * The default theme's only stylesheet. Plain CSS, no build step, no
3
- * dependencies: a site that wants something else puts its own
4
- * `static/style.css` in the theme it wears and this file is never read again.
5
- *
6
- * The design is the andrewshell.org one (decision-16): a serif body and sans
7
- * headings at an 18px root on a 1.2 minor-third scale, warm paper, near-black
8
- * text, a rust primary and a blue secondary, one column at 42rem, links that
9
- * invert on hover and a rule in the primary colour.
10
- *
11
- * The source is light only. The dark scheme below is the same design on dark
12
- * paper, with the rust and the blue lifted until every text and background pair
13
- * meets WCAG 2.2 AA — 4.5:1 for body text, 3:1 for large text, rules and focus
14
- * outlines — in both schemes. `src/web/theme-colors.test.ts` reads the custom
15
- * properties out of this file and computes the ratios, so a colour changed here
16
- * that breaks one fails the build rather than a reader.
17
- */
18
-
19
- :root {
20
- /* Light and dark are both drawn below, so a browser may paint its own form
21
- controls, scrollbars and spellcheck marks to match. */
22
- color-scheme: light dark;
23
-
24
- --maxWidth-xs: 20rem;
25
- --maxWidth-sm: 24rem;
26
- --maxWidth-md: 28rem;
27
- --maxWidth-lg: 32rem;
28
- --maxWidth-xl: 36rem;
29
- --maxWidth-2xl: 42rem;
30
- --maxWidth-3xl: 48rem;
31
- --maxWidth-4xl: 56rem;
32
- --maxWidth-wrapper: var(--maxWidth-2xl);
33
-
34
- --spacing-0: 0;
35
- --spacing-1: 0.25rem;
36
- --spacing-2: 0.5rem;
37
- --spacing-3: 0.75rem;
38
- --spacing-4: 1rem;
39
- --spacing-5: 1.25rem;
40
- --spacing-6: 1.5rem;
41
- --spacing-8: 2rem;
42
- --spacing-10: 2.5rem;
43
- --spacing-12: 3rem;
44
- --spacing-16: 4rem;
45
- --spacing-20: 5rem;
46
- --spacing-24: 6rem;
47
- --spacing-32: 8rem;
48
-
49
- --fontFamily-sans: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
50
- --fontFamily-serif: 'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif;
51
- --fontFamily-mono:
52
- ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
53
- --font-body: var(--fontFamily-serif);
54
- --font-heading: var(--fontFamily-sans);
55
-
56
- --fontWeight-normal: 400;
57
- --fontWeight-medium: 500;
58
- --fontWeight-semibold: 600;
59
- --fontWeight-bold: 700;
60
- --fontWeight-extrabold: 800;
61
- --fontWeight-black: 900;
62
-
63
- --fontSize-root: 18px;
64
- --lineHeight-none: 1;
65
- --lineHeight-tight: 1.1;
66
- --lineHeight-normal: 1.5;
67
- --lineHeight-relaxed: 1.625;
68
-
69
- /* 1.200 minor third type scale */
70
- --fontSize-0: 0.833rem;
71
- --fontSize-1: 1rem;
72
- --fontSize-2: 1.15rem;
73
- --fontSize-3: 1.31rem;
74
- --fontSize-4: 1.5rem;
75
- --fontSize-5: 1.72rem;
76
- --fontSize-6: 1.97rem;
77
- --fontSize-7: 2.25rem;
78
-
79
- --content-letter-spacing: -0.01em;
80
-
81
- /* Colours. `body` is the paper and `text` the ink; `base`, `base-2` and
82
- `base-3` are the surfaces that sit on the paper, warm, cool and raised.
83
- `code-background` and `code-text` are a block of code, named rather than
84
- folded into `base` so a highlighting theme has something to be measured
85
- against (TASK-86). */
86
- --color-body: #fdfcfb;
87
- --color-text: #240b00;
88
- --color-primary: #b33900;
89
- --color-secondary: #007ab3;
90
- --color-base: rgb(245 243 243);
91
- --color-base-2: rgb(247 248 249);
92
- --color-base-3: rgb(255 255 255);
93
- --color-code-background: #f6f3f1;
94
- --color-code-text: #240b00;
95
- --color-error: #b3261e;
96
-
97
- /* Syntax highlighting: the Tomorrow palette, light member (TASK-86). The
98
- names are what each colour marks up, and the base16 slot they come from is
99
- in the comment; the highlighter is highlight.js, whose base16 Tomorrow
100
- theme is the mapping these follow.
101
-
102
- Five of them are not the stock colour. Tomorrow was drawn for an editor,
103
- where a faint comment is a feature; on this paper the stock greys, orange,
104
- yellow, green and teal read at 1.7:1 to 3.5:1, so each was darkened along
105
- its own hue until it made 4.5:1 and no further. `src/web/theme-colors.test.ts`
106
- is what keeps that true. */
107
- --color-code-comment: #6c6d6a; /* base03, stock #8e908c */
108
- --color-code-tag: #6b6d6b; /* base04, stock #969896 */
109
- --color-code-name: #c82829; /* base08 */
110
- --color-code-literal: #a95608; /* base09, stock #f5871f */
111
- --color-code-class: #846700; /* base0A, stock #eab700 */
112
- --color-code-string: #5e7500; /* base0B, stock #718c00 */
113
- --color-code-support: #30767a; /* base0C, stock #3e999f */
114
- --color-code-function: #4271ae; /* base0D */
115
- --color-code-keyword: #8959a8; /* base0E */
116
- --color-code-meta: #945f52; /* base0F, stock #a3685a */
117
- --color-code-added-background: #dff0d8;
118
- --color-code-removed-background: #f8dcdc;
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties {
3
+ @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
4
+ *, :before, :after, ::backdrop {
5
+ --tw-outline-style: solid;
6
+ --tw-leading: initial;
7
+ --tw-font-weight: initial;
8
+ --tw-tracking: initial;
9
+ --tw-border-style: solid;
10
+ --tw-space-y-reverse: 0;
11
+ --tw-shadow: 0 0 #0000;
12
+ --tw-shadow-color: initial;
13
+ --tw-shadow-alpha: 100%;
14
+ --tw-inset-shadow: 0 0 #0000;
15
+ --tw-inset-shadow-color: initial;
16
+ --tw-inset-shadow-alpha: 100%;
17
+ --tw-ring-color: initial;
18
+ --tw-ring-shadow: 0 0 #0000;
19
+ --tw-inset-ring-color: initial;
20
+ --tw-inset-ring-shadow: 0 0 #0000;
21
+ --tw-ring-inset: initial;
22
+ --tw-ring-offset-width: 0px;
23
+ --tw-ring-offset-color: #fff;
24
+ --tw-ring-offset-shadow: 0 0 #0000;
25
+ --tw-scale-x: 1;
26
+ --tw-scale-y: 1;
27
+ --tw-scale-z: 1;
28
+ }
29
+ }
119
30
  }
120
31
 
121
- @media (prefers-color-scheme: dark) {
122
- :root {
123
- --color-body: #191110;
124
- --color-text: #f4ece7;
125
- --color-primary: #ef7a48;
126
- --color-secondary: #3ea0d8;
127
- --color-base: rgb(38 30 28);
128
- --color-base-2: rgb(34 33 36);
129
- --color-base-3: rgb(45 36 33);
130
- --color-code-background: rgb(30 24 22);
131
- --color-code-text: #f4ece7;
132
- --color-error: #ff8093;
133
-
134
- /* The other member of the family, Tomorrow Night — the palette both source
135
- sites highlighted with, and the one highlight.js ships under that name.
136
- Only base0F needed lifting off this darker paper. */
137
- --color-code-comment: #999999; /* base03 */
138
- --color-code-tag: #b4b7b4; /* base04 */
139
- --color-code-name: #f2777a; /* base08 */
140
- --color-code-literal: #f99157; /* base09 */
141
- --color-code-class: #ffcc66; /* base0A */
142
- --color-code-string: #99cc99; /* base0B */
143
- --color-code-support: #66cccc; /* base0C */
144
- --color-code-function: #6699cc; /* base0D */
145
- --color-code-keyword: #cc99cc; /* base0E */
146
- --color-code-meta: #ae786b; /* base0F, stock #a3685a */
147
- --color-code-added-background: rgb(32 54 34);
148
- --color-code-removed-background: rgb(64 30 30);
32
+ @layer theme {
33
+ :root, :host {
34
+ --spacing: .25rem;
35
+ --container-2xl: 42rem;
36
+ --text-xs: .75rem;
37
+ --text-xs--line-height: calc(1 / .75);
38
+ --text-sm: .875rem;
39
+ --text-sm--line-height: calc(1.25 / .875);
40
+ --text-base: 1rem;
41
+ --text-base--line-height: calc(1.5 / 1);
42
+ --text-lg: 1.125rem;
43
+ --text-lg--line-height: calc(1.75 / 1.125);
44
+ --text-xl: 1.25rem;
45
+ --text-xl--line-height: calc(1.75 / 1.25);
46
+ --text-2xl: 1.5rem;
47
+ --text-2xl--line-height: calc(2 / 1.5);
48
+ --text-3xl: 1.875rem;
49
+ --text-3xl--line-height: calc(2.25 / 1.875);
50
+ --text-4xl: 2.25rem;
51
+ --text-4xl--line-height: calc(2.5 / 2.25);
52
+ --text-5xl: 3rem;
53
+ --text-5xl--line-height: 1;
54
+ --font-weight-normal: 400;
55
+ --font-weight-medium: 500;
56
+ --font-weight-semibold: 600;
57
+ --font-weight-bold: 700;
58
+ --tracking-tight: -.025em;
59
+ --tracking-normal: 0em;
60
+ --leading-tight: 1.25;
61
+ --leading-snug: 1.375;
62
+ --leading-relaxed: 1.625;
63
+ --radius-xs: .125rem;
64
+ --radius-sm: .25rem;
65
+ --radius-md: .375rem;
66
+ --default-transition-duration: .15s;
67
+ --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);
68
+ --default-font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
69
+ --default-mono-font-family: ui-monospace, "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace;
149
70
  }
150
71
  }
151
72
 
152
- /* Reset. The source theme leans on a normalize file; the handful of rules it
153
- actually depends on are folded in here instead, so the theme is one file. */
73
+ @layer base {
74
+ *, :after, :before, ::backdrop {
75
+ box-sizing: border-box;
76
+ border: 0 solid;
77
+ margin: 0;
78
+ padding: 0;
79
+ }
154
80
 
155
- *,
156
- *::before,
157
- *::after {
158
- box-sizing: border-box;
159
- }
81
+ ::file-selector-button {
82
+ box-sizing: border-box;
83
+ border: 0 solid;
84
+ margin: 0;
85
+ padding: 0;
86
+ }
160
87
 
161
- body,
162
- h1,
163
- h2,
164
- h3,
165
- h4,
166
- h5,
167
- h6,
168
- p,
169
- figure,
170
- blockquote,
171
- dl,
172
- dd {
173
- margin: 0;
174
- }
88
+ html, :host {
89
+ -webkit-text-size-adjust: 100%;
90
+ tab-size: 4;
91
+ line-height: 1.5;
92
+ font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
93
+ font-feature-settings: var(--default-font-feature-settings, normal);
94
+ font-variation-settings: var(--default-font-variation-settings, normal);
95
+ -webkit-tap-highlight-color: transparent;
96
+ }
175
97
 
176
- /* HTML elements */
177
-
178
- /* `scrollbar-gutter` keeps the scrollbar's room whether or not the page is
179
- long enough to scroll, so moving from a short page to a long one does not
180
- shift the column sideways. */
181
- html {
182
- scrollbar-gutter: stable;
183
- font-size: var(--fontSize-root);
184
- line-height: var(--lineHeight-relaxed);
185
- -webkit-text-size-adjust: 100%;
186
- -webkit-font-smoothing: antialiased;
187
- -moz-osx-font-smoothing: grayscale;
188
- }
98
+ hr {
99
+ height: 0;
100
+ color: inherit;
101
+ border-top-width: 1px;
102
+ }
189
103
 
190
- body {
191
- background-color: var(--color-body);
192
- color: var(--color-text);
193
- font-family: var(--font-body);
194
- font-size: var(--fontSize-1);
195
- text-rendering: optimizeSpeed;
196
- }
104
+ abbr:where([title]) {
105
+ -webkit-text-decoration: underline dotted;
106
+ text-decoration: underline dotted;
107
+ }
197
108
 
198
- footer {
199
- padding: var(--spacing-6) var(--spacing-0);
200
- font-family: var(--fontFamily-sans);
201
- }
109
+ h1, h2, h3, h4, h5, h6 {
110
+ font-size: inherit;
111
+ font-weight: inherit;
112
+ }
202
113
 
203
- nav,
204
- .bio {
205
- font-family: var(--fontFamily-sans);
206
- }
114
+ a {
115
+ color: inherit;
116
+ -webkit-text-decoration: inherit;
117
+ -webkit-text-decoration: inherit;
118
+ -webkit-text-decoration: inherit;
119
+ text-decoration: inherit;
120
+ }
207
121
 
208
- hr {
209
- height: 1px;
210
- border: 0;
211
- background: var(--color-primary);
212
- }
122
+ b, strong {
123
+ font-weight: bolder;
124
+ }
213
125
 
214
- img {
215
- max-width: 100%;
216
- height: auto;
217
- }
126
+ code, kbd, samp, pre {
127
+ font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
128
+ font-feature-settings: var(--default-mono-font-feature-settings, normal);
129
+ font-variation-settings: var(--default-mono-font-variation-settings, normal);
130
+ font-size: 1em;
131
+ }
218
132
 
219
- figure {
220
- margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
221
- }
133
+ small {
134
+ font-size: 80%;
135
+ }
222
136
 
223
- figcaption {
224
- font-size: var(--fontSize-0);
225
- text-align: center;
226
- }
137
+ sub, sup {
138
+ vertical-align: baseline;
139
+ font-size: 75%;
140
+ line-height: 0;
141
+ position: relative;
142
+ }
227
143
 
228
- time {
229
- white-space: nowrap;
230
- }
144
+ sub {
145
+ bottom: -.25em;
146
+ }
231
147
 
232
- small,
233
- .small {
234
- font-size: var(--fontSize-0);
235
- }
148
+ sup {
149
+ top: -.5em;
150
+ }
236
151
 
237
- /* Headings */
238
-
239
- h1,
240
- h2,
241
- h3,
242
- h4,
243
- h5,
244
- h6 {
245
- margin-top: var(--spacing-12);
246
- margin-bottom: var(--spacing-6);
247
- color: var(--color-text);
248
- font-family: var(--font-heading);
249
- font-weight: var(--fontWeight-bold);
250
- line-height: var(--lineHeight-tight);
251
- letter-spacing: -0.025em;
252
- text-wrap: balance;
253
- }
152
+ table {
153
+ text-indent: 0;
154
+ border-color: inherit;
155
+ border-collapse: collapse;
156
+ }
254
157
 
255
- h1 {
256
- font-size: var(--fontSize-6);
257
- font-weight: var(--fontWeight-black);
258
- }
158
+ :-moz-focusring:where(:not(iframe)) {
159
+ outline: auto;
160
+ }
259
161
 
260
- h2 {
261
- font-size: var(--fontSize-5);
262
- }
162
+ progress {
163
+ vertical-align: baseline;
164
+ }
263
165
 
264
- h3 {
265
- font-size: var(--fontSize-3);
266
- }
166
+ summary {
167
+ display: list-item;
168
+ }
267
169
 
268
- h4,
269
- h5,
270
- h6 {
271
- font-size: var(--fontSize-1);
272
- }
170
+ ol, ul, menu {
171
+ list-style: none;
172
+ }
273
173
 
274
- h2 > a,
275
- h3 > a,
276
- h4 > a,
277
- h5 > a,
278
- h6 > a {
279
- color: inherit;
280
- text-decoration: none;
281
- }
174
+ img, svg, video, canvas, audio, iframe, embed, object {
175
+ vertical-align: middle;
176
+ display: block;
177
+ }
282
178
 
283
- /* Links. A link inverts on hover: the primary colour behind it and the paper
284
- colour on top, which is the source design's one flourish. `:focus-visible`
285
- draws an outline instead, so a keyboard reader sees where they are without
286
- the colour swapping under them. */
179
+ img, video {
180
+ max-width: 100%;
181
+ height: auto;
182
+ }
287
183
 
288
- a,
289
- a:visited {
290
- color: var(--color-primary);
291
- }
184
+ button, input, select, optgroup, textarea {
185
+ font: inherit;
186
+ font-feature-settings: inherit;
187
+ font-variation-settings: inherit;
188
+ letter-spacing: inherit;
189
+ color: inherit;
190
+ opacity: 1;
191
+ background-color: #0000;
192
+ border-radius: 0;
193
+ }
292
194
 
293
- a:hover,
294
- a:focus {
295
- background-color: var(--color-primary);
296
- color: var(--color-body);
297
- text-decoration: none;
298
- }
195
+ ::file-selector-button {
196
+ font: inherit;
197
+ font-feature-settings: inherit;
198
+ font-variation-settings: inherit;
199
+ letter-spacing: inherit;
200
+ color: inherit;
201
+ opacity: 1;
202
+ background-color: #0000;
203
+ border-radius: 0;
204
+ }
299
205
 
300
- a:focus-visible {
301
- outline: 2px solid var(--color-primary);
302
- outline-offset: 2px;
303
- background-color: transparent;
304
- color: var(--color-primary);
305
- }
206
+ :where(select:is([multiple], [size])) optgroup {
207
+ font-weight: bolder;
208
+ }
306
209
 
307
- /* The two links that are the page saying where it is rather than somewhere to
308
- go: the site title at the root and the small link home everywhere else. Both
309
- read as plain text, in the heading font the rules below give them.
310
-
311
- Named rather than reached for through the element they sit in (TASK-111). A
312
- bare `header a` also caught the site menu, which is navigation somebody is
313
- meant to use, and every link inside a post's own `<header>`. The `:visited`
314
- halves are here because `a:visited` outweighs a bare class, and the hover
315
- and focus halves because `a:focus-visible` outweighs one too: without them
316
- these two would take the outline rather than the flourish. */
317
-
318
- .main-heading a,
319
- .main-heading a:visited,
320
- .header-link-home,
321
- .header-link-home:visited {
322
- color: var(--color-text);
323
- text-decoration: none;
324
- }
210
+ :where(select:is([multiple], [size])) optgroup option {
211
+ padding-inline-start: 20px;
212
+ }
325
213
 
326
- .main-heading a:hover,
327
- .main-heading a:focus,
328
- .header-link-home:hover,
329
- .header-link-home:focus {
330
- background-color: var(--color-primary);
331
- color: var(--color-body);
332
- text-decoration: none;
333
- }
214
+ ::file-selector-button {
215
+ margin-inline-end: 4px;
216
+ }
334
217
 
335
- /* Prose */
218
+ ::placeholder {
219
+ opacity: 1;
220
+ }
336
221
 
337
- /* Prose wraps `pretty`, which keeps a paragraph from ending on one short word;
338
- headings wrap `balance` above. A browser without either wraps as it always
339
- did. */
222
+ @supports (not ((-webkit-appearance: -apple-pay-button))) or (contain-intrinsic-size: 1px) {
223
+ ::placeholder {
224
+ color: currentColor;
225
+ }
340
226
 
341
- p,
342
- li,
343
- dd {
344
- text-wrap: pretty;
345
- }
227
+ @supports (color: color-mix(in lab, red, red)) {
228
+ ::placeholder {
229
+ color: color-mix(in oklab, currentcolor 50%, transparent);
230
+ }
231
+ }
232
+ }
346
233
 
347
- p {
348
- margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
349
- padding: var(--spacing-0);
350
- line-height: var(--lineHeight-relaxed);
351
- }
234
+ textarea {
235
+ resize: vertical;
236
+ }
352
237
 
353
- ul,
354
- ol {
355
- margin-block: var(--spacing-0) var(--spacing-8);
356
- margin-inline: var(--spacing-4) var(--spacing-0);
357
- padding: var(--spacing-0);
358
- list-style-position: inside;
359
- list-style-image: none;
360
- }
238
+ ::-webkit-search-decoration {
239
+ -webkit-appearance: none;
240
+ }
361
241
 
362
- ul li,
363
- ol li {
364
- margin-bottom: var(--spacing-0);
365
- padding-inline-start: var(--spacing-0);
366
- }
242
+ ::-webkit-date-and-time-value {
243
+ min-height: 1lh;
244
+ text-align: inherit;
245
+ }
367
246
 
368
- li > p {
369
- display: inline;
370
- }
247
+ ::-webkit-datetime-edit {
248
+ display: inline-flex;
249
+ }
371
250
 
372
- li *:last-child {
373
- margin-bottom: var(--spacing-0);
374
- }
251
+ ::-webkit-datetime-edit-fields-wrapper {
252
+ padding: 0;
253
+ }
375
254
 
376
- details {
377
- margin-inline-start: var(--spacing-4);
378
- }
255
+ ::-webkit-datetime-edit {
256
+ padding-block: 0;
257
+ }
379
258
 
380
- details summary {
381
- cursor: pointer;
382
- }
259
+ ::-webkit-datetime-edit-year-field {
260
+ padding-block: 0;
261
+ }
383
262
 
384
- .list-none {
385
- list-style-type: none;
386
- }
263
+ ::-webkit-datetime-edit-month-field {
264
+ padding-block: 0;
265
+ }
387
266
 
388
- .hlist {
389
- display: flex;
390
- flex-wrap: wrap;
391
- margin: 0;
392
- }
267
+ ::-webkit-datetime-edit-day-field {
268
+ padding-block: 0;
269
+ }
393
270
 
394
- .hlist li {
395
- margin: 0;
396
- padding: 0;
397
- padding-inline-end: 0.5em;
398
- list-style-type: none;
399
- }
271
+ ::-webkit-datetime-edit-hour-field {
272
+ padding-block: 0;
273
+ }
400
274
 
401
- blockquote {
402
- margin-block: var(--spacing-8);
403
- margin-inline: var(--spacing-0) var(--spacing-8);
404
- padding: var(--spacing-0);
405
- padding-inline-start: var(--spacing-6);
406
- border-inline-start: var(--spacing-1) solid var(--color-secondary);
407
- color: var(--color-secondary);
408
- font-size: var(--fontSize-2);
409
- font-style: italic;
410
- }
275
+ ::-webkit-datetime-edit-minute-field {
276
+ padding-block: 0;
277
+ }
411
278
 
412
- blockquote > :last-child {
413
- margin-bottom: var(--spacing-0);
414
- }
279
+ ::-webkit-datetime-edit-second-field {
280
+ padding-block: 0;
281
+ }
282
+
283
+ ::-webkit-datetime-edit-millisecond-field {
284
+ padding-block: 0;
285
+ }
286
+
287
+ ::-webkit-datetime-edit-meridiem-field {
288
+ padding-block: 0;
289
+ }
290
+
291
+ ::-webkit-calendar-picker-indicator {
292
+ line-height: 1;
293
+ }
294
+
295
+ :-moz-ui-invalid {
296
+ box-shadow: none;
297
+ }
298
+
299
+ button, input:where([type="button"], [type="reset"], [type="submit"]) {
300
+ appearance: button;
301
+ }
302
+
303
+ ::file-selector-button {
304
+ appearance: button;
305
+ }
306
+
307
+ ::-webkit-inner-spin-button {
308
+ height: auto;
309
+ }
310
+
311
+ ::-webkit-outer-spin-button {
312
+ height: auto;
313
+ }
314
+
315
+ [hidden]:where(:not([hidden="until-found"])) {
316
+ display: none !important;
317
+ }
318
+
319
+ html {
320
+ -webkit-text-size-adjust: 100%;
321
+ -moz-text-size-adjust: 100%;
322
+ text-size-adjust: 100%;
323
+ scrollbar-gutter: stable;
324
+ font-size: 18px;
325
+ }
415
326
 
416
- blockquote > ul,
417
- blockquote > ol {
418
- list-style-position: inside;
327
+ body {
328
+ background-color: var(--color-body);
329
+ --tw-leading: var(--leading-relaxed);
330
+ font-family: Iowan Old Style, Palatino Linotype, Palatino, Book Antiqua, Georgia, serif;
331
+ line-height: var(--leading-relaxed);
332
+ color: var(--color-text);
333
+ -webkit-font-smoothing: antialiased;
334
+ -moz-osx-font-smoothing: grayscale;
335
+ }
336
+
337
+ h1, h2, h3, h4, h5, h6 {
338
+ --tw-font-weight: var(--font-weight-bold);
339
+ font-weight: var(--font-weight-bold);
340
+ --tw-tracking: var(--tracking-tight);
341
+ letter-spacing: var(--tracking-tight);
342
+ text-wrap: balance;
343
+ }
344
+
345
+ p, li, dd, blockquote, figcaption {
346
+ text-wrap: pretty;
347
+ }
348
+
349
+ a {
350
+ color: var(--color-primary);
351
+ text-decoration-line: underline;
352
+ -webkit-text-decoration-color: var(--color-primary);
353
+ -webkit-text-decoration-color: var(--color-primary);
354
+ text-decoration-color: var(--color-primary);
355
+ }
356
+
357
+ @supports (color: color-mix(in lab, red, red)) {
358
+ a {
359
+ -webkit-text-decoration-color: color-mix(in oklab, var(--color-primary) 40%, transparent);
360
+ -webkit-text-decoration-color: color-mix(in oklab, var(--color-primary) 40%, transparent);
361
+ text-decoration-color: color-mix(in oklab, var(--color-primary) 40%, transparent);
362
+ }
363
+ }
364
+
365
+ a {
366
+ text-underline-offset: 3px;
367
+ }
368
+
369
+ @media (prefers-reduced-motion: no-preference) {
370
+ a {
371
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
372
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
373
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
374
+ }
375
+ }
376
+
377
+ a:hover {
378
+ -webkit-text-decoration-color: var(--color-primary);
379
+ -webkit-text-decoration-color: var(--color-primary);
380
+ text-decoration-color: var(--color-primary);
381
+ }
382
+
383
+ :focus-visible {
384
+ border-radius: var(--radius-xs);
385
+ outline-style: var(--tw-outline-style);
386
+ outline-offset: 2px;
387
+ outline-width: 2px;
388
+ outline-color: var(--color-secondary);
389
+ }
390
+
391
+ hr {
392
+ margin-block: calc(var(--spacing) * 10);
393
+ border-style: var(--tw-border-style);
394
+ border-width: 0;
395
+ border-top-style: var(--tw-border-style);
396
+ border-top-width: 1px;
397
+ border-color: var(--color-rule);
398
+ }
399
+
400
+ ::selection {
401
+ background-color: var(--color-primary);
402
+ }
403
+
404
+ @supports (color: color-mix(in lab, red, red)) {
405
+ ::selection {
406
+ background-color: color-mix(in oklab, var(--color-primary) 20%, transparent);
407
+ }
408
+ }
409
+
410
+ code, kbd, samp, pre {
411
+ font-family: ui-monospace, SF Mono, Menlo, Consolas, DejaVu Sans Mono, monospace;
412
+ }
413
+
414
+ strong, b {
415
+ --tw-font-weight: var(--font-weight-bold);
416
+ font-weight: var(--font-weight-bold);
417
+ }
419
418
  }
420
419
 
421
- table {
422
- width: 100%;
423
- margin-bottom: var(--spacing-8);
424
- border-collapse: collapse;
425
- border-spacing: 0.25rem;
426
- }
420
+ @layer components {
421
+ .screen-reader-text {
422
+ clip-path: inset(50%);
423
+ white-space: nowrap;
424
+ border: 0;
425
+ width: 1px;
426
+ height: 1px;
427
+ margin: -1px;
428
+ padding: 0;
429
+ position: absolute;
430
+ overflow: hidden;
431
+ }
432
+
433
+ .screen-reader-text:focus {
434
+ z-index: 50;
435
+ background-color: var(--color-base-3);
436
+ width: auto;
437
+ height: auto;
438
+ padding: calc(var(--spacing) * 4);
439
+ --tw-font-weight: var(--font-weight-bold);
440
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
441
+ font-weight: var(--font-weight-bold);
442
+ color: var(--color-text);
443
+ clip-path: none;
444
+ margin: 0;
445
+ text-decoration-line: none;
446
+ display: block;
447
+ inset-block-start: .5rem;
448
+ inset-inline-start: .5rem;
449
+ }
450
+
451
+ .global-wrapper {
452
+ max-width: var(--container-2xl);
453
+ padding-inline: calc(var(--spacing) * 5);
454
+ padding-top: calc(var(--spacing) * 8);
455
+ padding-bottom: calc(var(--spacing) * 16);
456
+ margin-inline: auto;
457
+ }
458
+
459
+ @media (min-width: 40rem) {
460
+ .global-wrapper {
461
+ padding-inline: calc(var(--spacing) * 6);
462
+ }
463
+ }
464
+
465
+ .global-header {
466
+ margin-bottom: calc(var(--spacing) * 12);
467
+ }
468
+
469
+ .global-wrapper:not([data-is-root-path="true"]) .global-header {
470
+ align-items: baseline;
471
+ column-gap: calc(var(--spacing) * 6);
472
+ row-gap: calc(var(--spacing) * 2);
473
+ flex-wrap: wrap;
474
+ display: flex;
475
+ }
476
+
477
+ .global-wrapper[data-is-root-path="true"] .global-header {
478
+ margin-bottom: calc(var(--spacing) * 14);
479
+ }
480
+
481
+ .main-heading {
482
+ font-size: var(--text-4xl);
483
+ line-height: var(--tw-leading, var(--text-4xl--line-height));
484
+ --tw-leading: 1;
485
+ line-height: 1;
486
+ }
487
+
488
+ @media (min-width: 40rem) {
489
+ .main-heading {
490
+ font-size: var(--text-5xl);
491
+ line-height: var(--tw-leading, var(--text-5xl--line-height));
492
+ }
493
+ }
494
+
495
+ .main-heading a, .header-link-home {
496
+ color: var(--color-text);
497
+ text-decoration-line: none;
498
+ }
499
+
500
+ @media (hover: hover) {
501
+ :is(.main-heading a, .header-link-home):hover {
502
+ color: var(--color-primary);
503
+ text-underline-offset: 6px;
504
+ text-decoration-line: underline;
505
+ text-decoration-thickness: 2px;
506
+ }
507
+ }
508
+
509
+ :is(.main-heading a, .header-link-home):focus-visible {
510
+ text-decoration-line: underline;
511
+ text-decoration-thickness: 2px;
512
+ }
513
+
514
+ .header-link-home {
515
+ min-block-size: 24px;
516
+ min-inline-size: 24px;
517
+ font-size: var(--text-lg);
518
+ line-height: var(--tw-leading, var(--text-lg--line-height));
519
+ --tw-font-weight: var(--font-weight-bold);
520
+ font-weight: var(--font-weight-bold);
521
+ align-items: center;
522
+ display: inline-flex;
523
+ }
524
+
525
+ .site-tagline {
526
+ margin-top: calc(var(--spacing) * 3);
527
+ font-size: var(--text-lg);
528
+ line-height: var(--tw-leading, var(--text-lg--line-height));
529
+ color: var(--color-muted);
530
+ font-style: italic;
531
+ }
532
+
533
+ .hlist {
534
+ flex-wrap: wrap;
535
+ padding: 0;
536
+ list-style-type: none;
537
+ display: flex;
538
+ }
539
+
540
+ .site-nav ul {
541
+ column-gap: calc(var(--spacing) * 5);
542
+ row-gap: var(--spacing);
543
+ --tw-tracking: .12em;
544
+ letter-spacing: .12em;
545
+ text-transform: uppercase;
546
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
547
+ font-size: .78rem;
548
+ }
549
+
550
+ .site-nav a {
551
+ align-items: center;
552
+ min-block-size: 24px;
553
+ min-inline-size: 24px;
554
+ text-decoration-line: underline;
555
+ text-decoration-color: currentColor;
556
+ display: inline-flex;
557
+ }
558
+
559
+ @supports (color: color-mix(in lab, red, red)) {
560
+ .site-nav a {
561
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
562
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
563
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
564
+ }
565
+ }
566
+
567
+ .site-nav a {
568
+ text-underline-offset: 4px;
569
+ text-decoration-thickness: 1px;
570
+ }
571
+
572
+ @media (hover: hover) {
573
+ .site-nav a:hover {
574
+ color: var(--color-primary);
575
+ -webkit-text-decoration-color: var(--color-primary);
576
+ -webkit-text-decoration-color: var(--color-primary);
577
+ text-decoration-color: var(--color-primary);
578
+ text-decoration-thickness: 2px;
579
+ }
580
+ }
581
+
582
+ .site-nav a:focus-visible {
583
+ text-decoration-thickness: 2px;
584
+ }
585
+
586
+ .site-nav a {
587
+ color: var(--color-muted);
588
+ }
589
+
590
+ .site-nav a[aria-current="page"] {
591
+ --tw-font-weight: var(--font-weight-semibold);
592
+ font-weight: var(--font-weight-semibold);
593
+ color: var(--color-text);
594
+ }
595
+
596
+ .global-wrapper[data-is-root-path="true"] .global-header .site-nav {
597
+ margin-top: calc(var(--spacing) * 6);
598
+ border-top-style: var(--tw-border-style);
599
+ border-top-width: 1px;
600
+ border-color: var(--color-rule);
601
+ padding-top: calc(var(--spacing) * 4);
602
+ }
603
+
604
+ .global-wrapper > footer {
605
+ margin-top: calc(var(--spacing) * 20);
606
+ justify-content: space-between;
607
+ align-items: center;
608
+ gap: calc(var(--spacing) * 4);
609
+ border-top-style: var(--tw-border-style);
610
+ border-top-width: 1px;
611
+ border-color: var(--color-rule);
612
+ padding-top: calc(var(--spacing) * 6);
613
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
614
+ font-size: var(--text-sm);
615
+ line-height: var(--tw-leading, var(--text-sm--line-height));
616
+ color: var(--color-muted);
617
+ flex-wrap: wrap;
618
+ display: flex;
619
+ }
620
+
621
+ .global-wrapper > footer .site-nav ul {
622
+ column-gap: calc(var(--spacing) * 4);
623
+ font-size: var(--text-sm);
624
+ line-height: var(--tw-leading, var(--text-sm--line-height));
625
+ --tw-tracking: var(--tracking-normal);
626
+ letter-spacing: var(--tracking-normal);
627
+ text-transform: none;
628
+ }
629
+
630
+ .kicker {
631
+ margin-bottom: calc(var(--spacing) * 2);
632
+ align-items: center;
633
+ column-gap: calc(var(--spacing) * 2);
634
+ --tw-tracking: .14em;
635
+ letter-spacing: .14em;
636
+ color: var(--color-muted);
637
+ text-transform: uppercase;
638
+ flex-wrap: wrap;
639
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
640
+ font-size: .72rem;
641
+ display: flex;
642
+ }
643
+
644
+ .kicker a {
645
+ align-items: center;
646
+ min-block-size: 24px;
647
+ min-inline-size: 24px;
648
+ text-decoration-line: underline;
649
+ text-decoration-color: currentColor;
650
+ display: inline-flex;
651
+ }
652
+
653
+ @supports (color: color-mix(in lab, red, red)) {
654
+ .kicker a {
655
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
656
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
657
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
658
+ }
659
+ }
660
+
661
+ .kicker a {
662
+ text-underline-offset: 4px;
663
+ text-decoration-thickness: 1px;
664
+ }
665
+
666
+ @media (hover: hover) {
667
+ .kicker a:hover {
668
+ color: var(--color-primary);
669
+ -webkit-text-decoration-color: var(--color-primary);
670
+ -webkit-text-decoration-color: var(--color-primary);
671
+ text-decoration-color: var(--color-primary);
672
+ text-decoration-thickness: 2px;
673
+ }
674
+ }
675
+
676
+ .kicker a:focus-visible {
677
+ text-decoration-thickness: 2px;
678
+ }
679
+
680
+ .kicker a {
681
+ color: var(--color-muted);
682
+ }
683
+
684
+ .kicker-kind {
685
+ --tw-font-weight: var(--font-weight-semibold);
686
+ font-weight: var(--font-weight-semibold);
687
+ color: var(--color-primary);
688
+ }
689
+
690
+ .breadcrumbs ol {
691
+ margin-bottom: calc(var(--spacing) * 6);
692
+ column-gap: calc(var(--spacing) * 2);
693
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
694
+ font-size: var(--text-sm);
695
+ line-height: var(--tw-leading, var(--text-sm--line-height));
696
+ color: var(--color-muted);
697
+ }
698
+
699
+ .breadcrumbs a {
700
+ align-items: center;
701
+ min-block-size: 24px;
702
+ min-inline-size: 24px;
703
+ text-decoration-line: underline;
704
+ text-decoration-color: currentColor;
705
+ display: inline-flex;
706
+ }
707
+
708
+ @supports (color: color-mix(in lab, red, red)) {
709
+ .breadcrumbs a {
710
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
711
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
712
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
713
+ }
714
+ }
715
+
716
+ .breadcrumbs a {
717
+ text-underline-offset: 4px;
718
+ text-decoration-thickness: 1px;
719
+ }
720
+
721
+ @media (hover: hover) {
722
+ .breadcrumbs a:hover {
723
+ color: var(--color-primary);
724
+ -webkit-text-decoration-color: var(--color-primary);
725
+ -webkit-text-decoration-color: var(--color-primary);
726
+ text-decoration-color: var(--color-primary);
727
+ text-decoration-thickness: 2px;
728
+ }
729
+ }
730
+
731
+ .breadcrumbs a:focus-visible {
732
+ text-decoration-thickness: 2px;
733
+ }
734
+
735
+ .breadcrumbs a {
736
+ color: var(--color-muted);
737
+ }
738
+
739
+ .breadcrumbs-sep {
740
+ margin-inline-end: calc(var(--spacing) * 2);
741
+ }
742
+
743
+ .page-title {
744
+ margin-top: var(--spacing);
745
+ margin-bottom: calc(var(--spacing) * 8);
746
+ font-size: var(--text-4xl);
747
+ line-height: var(--tw-leading, var(--text-4xl--line-height));
748
+ --tw-leading: 1.08;
749
+ line-height: 1.08;
750
+ }
751
+
752
+ @media (min-width: 40rem) {
753
+ .page-title {
754
+ font-size: 2.75rem;
755
+ }
756
+ }
757
+
758
+ .section-title {
759
+ margin-top: calc(var(--spacing) * 14);
760
+ margin-bottom: calc(var(--spacing) * 6);
761
+ --tw-font-weight: var(--font-weight-semibold);
762
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
763
+ font-size: .72rem;
764
+ font-weight: var(--font-weight-semibold);
765
+ --tw-tracking: .14em;
766
+ letter-spacing: .14em;
767
+ color: var(--color-muted);
768
+ text-transform: uppercase;
769
+ }
770
+
771
+ .empty {
772
+ color: var(--color-muted);
773
+ font-style: italic;
774
+ }
775
+
776
+ .e-content > * + *, .page-body > * + * {
777
+ margin-top: calc(var(--spacing) * 5);
778
+ }
779
+
780
+ :is(.e-content, .page-body) :is(h2, h3, h4, h5, h6) {
781
+ margin-bottom: calc(var(--spacing) * 3);
782
+ }
783
+
784
+ :is(.e-content, .page-body) h2 {
785
+ margin-top: calc(var(--spacing) * 10);
786
+ font-size: var(--text-2xl);
787
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
788
+ }
789
+
790
+ :is(.e-content, .page-body) h3 {
791
+ margin-top: calc(var(--spacing) * 8);
792
+ font-size: var(--text-xl);
793
+ line-height: var(--tw-leading, var(--text-xl--line-height));
794
+ }
795
+
796
+ :is(.e-content, .page-body) :is(h4, h5, h6) {
797
+ margin-top: calc(var(--spacing) * 6);
798
+ font-size: var(--text-lg);
799
+ line-height: var(--tw-leading, var(--text-lg--line-height));
800
+ }
801
+
802
+ :is(.e-content, .page-body) ul {
803
+ padding-inline-start: calc(var(--spacing) * 6);
804
+ list-style-type: disc;
805
+ }
806
+
807
+ :is(.e-content, .page-body) ol {
808
+ padding-inline-start: calc(var(--spacing) * 6);
809
+ list-style-type: decimal;
810
+ }
811
+
812
+ :is(.e-content, .page-body) li + li, :is(.e-content, .page-body) li > :is(ul, ol), :is(.e-content, .page-body) li > p + p {
813
+ margin-top: calc(var(--spacing) * 2);
814
+ }
815
+
816
+ :is(.e-content, .page-body) blockquote {
817
+ margin-block: calc(var(--spacing) * 8);
818
+ border-inline-start-style: var(--tw-border-style);
819
+ border-inline-start-width: 2px;
820
+ border-color: var(--color-primary);
821
+ font-size: var(--text-xl);
822
+ line-height: var(--tw-leading, var(--text-xl--line-height));
823
+ --tw-leading: var(--leading-snug);
824
+ line-height: var(--leading-snug);
825
+ color: var(--color-muted);
826
+ padding-inline-start: calc(var(--spacing) * 5);
827
+ font-style: italic;
828
+ }
829
+
830
+ :is(.e-content, .page-body) blockquote > * + * {
831
+ margin-top: calc(var(--spacing) * 3);
832
+ }
833
+
834
+ :is(.e-content, .page-body) img, :is(.e-content, .page-body) video {
835
+ border-radius: var(--radius-md);
836
+ max-width: 100%;
837
+ height: auto;
838
+ }
839
+
840
+ :is(.e-content, .page-body) figcaption {
841
+ margin-top: calc(var(--spacing) * 2);
842
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
843
+ font-size: var(--text-sm);
844
+ line-height: var(--tw-leading, var(--text-sm--line-height));
845
+ color: var(--color-muted);
846
+ }
847
+
848
+ :is(.e-content, .page-body) hr {
849
+ margin-block: calc(var(--spacing) * 10);
850
+ }
851
+
852
+ :is(.e-content, .page-body) table {
853
+ border-collapse: collapse;
854
+ width: 100%;
855
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
856
+ font-size: var(--text-sm);
857
+ line-height: var(--tw-leading, var(--text-sm--line-height));
858
+ }
859
+
860
+ :is(.e-content, .page-body) :is(th, td) {
861
+ border-bottom-style: var(--tw-border-style);
862
+ border-bottom-width: 1px;
863
+ border-color: var(--color-rule);
864
+ padding-inline: calc(var(--spacing) * 2);
865
+ padding-block: calc(var(--spacing) * 1.5);
866
+ text-align: start;
867
+ vertical-align: top;
868
+ }
869
+
870
+ :is(.e-content, .page-body) th {
871
+ border-color: var(--color-edge);
872
+ --tw-font-weight: var(--font-weight-semibold);
873
+ font-weight: var(--font-weight-semibold);
874
+ }
875
+
876
+ :is(.e-content, .page-body) dt {
877
+ --tw-font-weight: var(--font-weight-bold);
878
+ font-weight: var(--font-weight-bold);
879
+ }
880
+
881
+ :is(.e-content, .page-body) dd {
882
+ padding-inline-start: calc(var(--spacing) * 6);
883
+ }
884
+
885
+ :is(.e-content, .page-body) details summary {
886
+ cursor: pointer;
887
+ }
888
+
889
+ :is(.e-content, .page-body) kbd {
890
+ border-radius: var(--radius-sm);
891
+ border-style: var(--tw-border-style);
892
+ border-width: 1px;
893
+ border-color: var(--color-edge);
894
+ padding-inline: var(--spacing);
895
+ font-size: .85em;
896
+ }
897
+
898
+ code {
899
+ border-radius: var(--radius-sm);
900
+ background-color: var(--color-code-background);
901
+ padding-inline: calc(var(--spacing) * 1.5);
902
+ padding-block: calc(var(--spacing) * .5);
903
+ color: var(--color-code-text);
904
+ overflow-wrap: break-word;
905
+ font-size: .85em;
906
+ }
907
+
908
+ pre {
909
+ border-radius: var(--radius-md);
910
+ border-style: var(--tw-border-style);
911
+ border-width: 1px;
912
+ border-color: var(--color-edge);
913
+ background-color: var(--color-code-background);
914
+ padding: calc(var(--spacing) * 4);
915
+ --tw-leading: var(--leading-relaxed);
916
+ font-size: .85rem;
917
+ line-height: var(--leading-relaxed);
918
+ color: var(--color-code-text);
919
+ overflow-x: auto;
920
+ }
921
+
922
+ pre code {
923
+ font-size: inherit;
924
+ overflow-wrap: normal;
925
+ background-color: #0000;
926
+ border-radius: 0;
927
+ padding: 0;
928
+ }
929
+
930
+ .footnotes {
931
+ margin-top: calc(var(--spacing) * 10);
932
+ border-top-style: var(--tw-border-style);
933
+ border-top-width: 1px;
934
+ border-color: var(--color-rule);
935
+ padding-top: calc(var(--spacing) * 6);
936
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
937
+ font-size: var(--text-sm);
938
+ line-height: var(--tw-leading, var(--text-sm--line-height));
939
+ }
940
+
941
+ .footnotes-sep {
942
+ display: none;
943
+ }
944
+
945
+ .footnote-item > p {
946
+ margin-top: 0;
947
+ }
948
+
949
+ .hljs-comment {
950
+ color: var(--color-code-comment);
951
+ }
952
+
953
+ .hljs-tag {
954
+ color: var(--color-code-tag);
955
+ }
956
+
957
+ .hljs-subst, .hljs-punctuation, .hljs-operator {
958
+ color: var(--color-code-text);
959
+ }
960
+
961
+ .hljs-bullet, .hljs-variable, .hljs-template-variable, .hljs-selector-tag, .hljs-name {
962
+ color: var(--color-code-name);
963
+ }
964
+
965
+ .hljs-symbol, .hljs-number, .hljs-link, .hljs-attr, .hljs-variable.constant_, .hljs-literal {
966
+ color: var(--color-code-literal);
967
+ }
968
+
969
+ .hljs-title, .hljs-class .hljs-title, .hljs-title.class_ {
970
+ color: var(--color-code-class);
971
+ }
972
+
973
+ .hljs-strong {
974
+ color: var(--color-code-class);
975
+ font-weight: 700;
976
+ }
977
+
978
+ .hljs-code, .hljs-string, .hljs-title.class_.inherited__ {
979
+ color: var(--color-code-string);
980
+ }
981
+
982
+ .hljs-built_in, .hljs-doctag, .hljs-quote, .hljs-regexp, .hljs-keyword.hljs-atrule {
983
+ color: var(--color-code-support);
984
+ }
985
+
986
+ .hljs-attribute, .hljs-function .hljs-title, .hljs-section, .hljs-title.function_ {
987
+ color: var(--color-code-function);
988
+ }
989
+
990
+ .hljs-keyword, .hljs-template-tag, .hljs-type {
991
+ color: var(--color-code-keyword);
992
+ }
993
+
994
+ .hljs-emphasis {
995
+ color: var(--color-code-keyword);
996
+ font-style: italic;
997
+ }
998
+
999
+ .hljs-meta, .hljs-meta .hljs-keyword, .hljs-meta .hljs-string {
1000
+ color: var(--color-code-meta);
1001
+ }
1002
+
1003
+ .hljs-addition, .hljs-deletion {
1004
+ color: var(--color-code-text);
1005
+ margin-inline: -1rem;
1006
+ padding-inline: 1rem;
1007
+ text-decoration: none;
1008
+ display: block;
1009
+ }
1010
+
1011
+ .hljs-addition {
1012
+ background-color: var(--color-code-added-background);
1013
+ }
1014
+
1015
+ .hljs-deletion {
1016
+ background-color: var(--color-code-removed-background);
1017
+ }
1018
+
1019
+ .feed {
1020
+ margin-top: calc(var(--spacing) * 2);
1021
+ }
1022
+
1023
+ .feed-separator {
1024
+ margin-block: calc(var(--spacing) * 9);
1025
+ }
1026
+
1027
+ .feed-title {
1028
+ margin-top: var(--spacing);
1029
+ margin-bottom: calc(var(--spacing) * 3);
1030
+ font-size: var(--text-3xl);
1031
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
1032
+ --tw-leading: var(--leading-tight);
1033
+ line-height: var(--leading-tight);
1034
+ }
1035
+
1036
+ .feed-title a {
1037
+ color: var(--color-text);
1038
+ text-decoration-line: none;
1039
+ }
1040
+
1041
+ @media (hover: hover) {
1042
+ .feed-title a:hover {
1043
+ color: var(--color-primary);
1044
+ text-underline-offset: 6px;
1045
+ text-decoration-line: underline;
1046
+ text-decoration-thickness: 2px;
1047
+ }
1048
+ }
1049
+
1050
+ .feed-title a:focus-visible {
1051
+ text-decoration-line: underline;
1052
+ text-decoration-thickness: 2px;
1053
+ }
1054
+
1055
+ .feed-excerpt.p-summary {
1056
+ font-size: 1.05rem;
1057
+ }
1058
+
1059
+ .feed-item > .e-content {
1060
+ --tw-leading: 1.6;
1061
+ font-size: 1.12rem;
1062
+ line-height: 1.6;
1063
+ }
1064
+
1065
+ .feed-more, .front-links {
1066
+ margin-top: calc(var(--spacing) * 3);
1067
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1068
+ font-size: var(--text-sm);
1069
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1070
+ }
1071
+
1072
+ .feed-more a, .front-links a {
1073
+ align-items: center;
1074
+ gap: var(--spacing);
1075
+ min-block-size: 24px;
1076
+ min-inline-size: 24px;
1077
+ display: inline-flex;
1078
+ }
1079
+
1080
+ @media (hover: hover) {
1081
+ :is(.feed-more a, .front-links a):hover {
1082
+ text-decoration-thickness: 2px;
1083
+ }
1084
+ }
1085
+
1086
+ .front-links {
1087
+ margin-top: calc(var(--spacing) * 10);
1088
+ column-gap: calc(var(--spacing) * 6);
1089
+ flex-wrap: wrap;
1090
+ display: flex;
1091
+ }
1092
+
1093
+ .cite {
1094
+ margin-block: calc(var(--spacing) * 3);
1095
+ border-inline-start-style: var(--tw-border-style);
1096
+ border-inline-start-width: 2px;
1097
+ border-color: var(--color-primary);
1098
+ padding-inline-start: calc(var(--spacing) * 4);
1099
+ }
1100
+
1101
+ .cite-line {
1102
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1103
+ font-size: var(--text-sm);
1104
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1105
+ color: var(--color-muted);
1106
+ }
1107
+
1108
+ .cite-line a {
1109
+ --tw-font-weight: var(--font-weight-medium);
1110
+ min-block-size: 24px;
1111
+ min-inline-size: 24px;
1112
+ font-weight: var(--font-weight-medium);
1113
+ align-items: center;
1114
+ text-decoration-line: underline;
1115
+ text-decoration-color: currentColor;
1116
+ display: inline-flex;
1117
+ }
1118
+
1119
+ @supports (color: color-mix(in lab, red, red)) {
1120
+ .cite-line a {
1121
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1122
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1123
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1124
+ }
1125
+ }
1126
+
1127
+ .cite-line a {
1128
+ text-underline-offset: 4px;
1129
+ text-decoration-thickness: 1px;
1130
+ }
1131
+
1132
+ @media (hover: hover) {
1133
+ .cite-line a:hover {
1134
+ color: var(--color-primary);
1135
+ -webkit-text-decoration-color: var(--color-primary);
1136
+ -webkit-text-decoration-color: var(--color-primary);
1137
+ text-decoration-color: var(--color-primary);
1138
+ text-decoration-thickness: 2px;
1139
+ }
1140
+ }
1141
+
1142
+ .cite-line a:focus-visible {
1143
+ text-decoration-thickness: 2px;
1144
+ }
1145
+
1146
+ .cite-line a {
1147
+ color: var(--color-text);
1148
+ }
1149
+
1150
+ .cite-quote {
1151
+ margin-top: var(--spacing);
1152
+ --tw-leading: var(--leading-snug);
1153
+ font-size: .98rem;
1154
+ line-height: var(--leading-snug);
1155
+ color: var(--color-muted);
1156
+ font-style: italic;
1157
+ }
1158
+
1159
+ .post-header {
1160
+ margin-bottom: calc(var(--spacing) * 8);
1161
+ }
1162
+
1163
+ .post-header h1 {
1164
+ margin-top: var(--spacing);
1165
+ font-size: var(--text-4xl);
1166
+ line-height: var(--tw-leading, var(--text-4xl--line-height));
1167
+ --tw-leading: 1.08;
1168
+ line-height: 1.08;
1169
+ }
1170
+
1171
+ @media (min-width: 40rem) {
1172
+ .post-header h1 {
1173
+ font-size: 2.75rem;
1174
+ }
1175
+ }
1176
+
1177
+ .post-deck {
1178
+ margin-top: calc(var(--spacing) * 4);
1179
+ font-size: var(--text-xl);
1180
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1181
+ --tw-leading: var(--leading-snug);
1182
+ line-height: var(--leading-snug);
1183
+ color: var(--color-muted);
1184
+ font-style: italic;
1185
+ }
1186
+
1187
+ .blog-post > .e-content {
1188
+ --tw-leading: 1.65;
1189
+ font-size: 1.08rem;
1190
+ line-height: 1.65;
1191
+ }
1192
+
1193
+ .blog-post > .screen-reader-text ~ .e-content {
1194
+ --tw-leading: 1.55;
1195
+ font-size: 1.3rem;
1196
+ line-height: 1.55;
1197
+ }
1198
+
1199
+ .entry-meta, .page-meta {
1200
+ margin-top: calc(var(--spacing) * 8);
1201
+ align-items: center;
1202
+ column-gap: calc(var(--spacing) * 2);
1203
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1204
+ font-size: var(--text-sm);
1205
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1206
+ color: var(--color-muted);
1207
+ flex-wrap: wrap;
1208
+ display: flex;
1209
+ }
1210
+
1211
+ .page-meta:empty {
1212
+ display: none;
1213
+ }
1214
+
1215
+ .entry-meta a, .page-meta a {
1216
+ align-items: center;
1217
+ min-block-size: 24px;
1218
+ min-inline-size: 24px;
1219
+ text-decoration-line: underline;
1220
+ text-decoration-color: currentColor;
1221
+ display: inline-flex;
1222
+ }
1223
+
1224
+ @supports (color: color-mix(in lab, red, red)) {
1225
+ .entry-meta a, .page-meta a {
1226
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1227
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1228
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1229
+ }
1230
+ }
1231
+
1232
+ .entry-meta a, .page-meta a {
1233
+ text-underline-offset: 4px;
1234
+ text-decoration-thickness: 1px;
1235
+ }
1236
+
1237
+ @media (hover: hover) {
1238
+ :is(.entry-meta a, .page-meta a):hover {
1239
+ color: var(--color-primary);
1240
+ -webkit-text-decoration-color: var(--color-primary);
1241
+ -webkit-text-decoration-color: var(--color-primary);
1242
+ text-decoration-color: var(--color-primary);
1243
+ text-decoration-thickness: 2px;
1244
+ }
1245
+ }
1246
+
1247
+ :is(.entry-meta a, .page-meta a):focus-visible {
1248
+ text-decoration-thickness: 2px;
1249
+ }
1250
+
1251
+ .entry-meta a, .page-meta a {
1252
+ color: var(--color-muted);
1253
+ }
1254
+
1255
+ .post-categories {
1256
+ margin-top: calc(var(--spacing) * 2);
1257
+ column-gap: calc(var(--spacing) * 3);
1258
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1259
+ font-size: var(--text-sm);
1260
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1261
+ flex-wrap: wrap;
1262
+ display: flex;
1263
+ }
1264
+
1265
+ .post-categories a {
1266
+ align-items: center;
1267
+ min-block-size: 24px;
1268
+ min-inline-size: 24px;
1269
+ text-decoration-line: underline;
1270
+ text-decoration-color: currentColor;
1271
+ display: inline-flex;
1272
+ }
1273
+
1274
+ @supports (color: color-mix(in lab, red, red)) {
1275
+ .post-categories a {
1276
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1277
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1278
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1279
+ }
1280
+ }
1281
+
1282
+ .post-categories a {
1283
+ text-underline-offset: 4px;
1284
+ text-decoration-thickness: 1px;
1285
+ }
1286
+
1287
+ @media (hover: hover) {
1288
+ .post-categories a:hover {
1289
+ color: var(--color-primary);
1290
+ -webkit-text-decoration-color: var(--color-primary);
1291
+ -webkit-text-decoration-color: var(--color-primary);
1292
+ text-decoration-color: var(--color-primary);
1293
+ text-decoration-thickness: 2px;
1294
+ }
1295
+ }
1296
+
1297
+ .post-categories a:focus-visible {
1298
+ text-decoration-thickness: 2px;
1299
+ }
1300
+
1301
+ .post-categories a {
1302
+ color: var(--color-secondary);
1303
+ }
1304
+
1305
+ .post-categories a[rel="tag"]:before {
1306
+ content: "#";
1307
+ }
1308
+
1309
+ .blog-post > hr {
1310
+ margin-top: calc(var(--spacing) * 10);
1311
+ margin-bottom: calc(var(--spacing) * 8);
1312
+ }
1313
+
1314
+ .blog-post-nav {
1315
+ margin-block: calc(var(--spacing) * 12);
1316
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1317
+ font-size: var(--text-sm);
1318
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1319
+ }
1320
+
1321
+ .blog-post-nav ul {
1322
+ gap: calc(var(--spacing) * 4);
1323
+ padding: 0;
1324
+ list-style-type: none;
1325
+ display: grid;
1326
+ }
1327
+
1328
+ @media (min-width: 40rem) {
1329
+ .blog-post-nav ul {
1330
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1331
+ }
1332
+
1333
+ .blog-post-nav li:has( > a[rel="next"]) {
1334
+ grid-column-start: 2;
1335
+ }
1336
+ }
1337
+
1338
+ .blog-post-nav a {
1339
+ border-radius: var(--radius-md);
1340
+ border-style: var(--tw-border-style);
1341
+ border-width: 1px;
1342
+ border-color: var(--color-edge);
1343
+ min-block-size: 24px;
1344
+ min-inline-size: 24px;
1345
+ width: 100%;
1346
+ height: 100%;
1347
+ padding: calc(var(--spacing) * 4);
1348
+ color: var(--color-text);
1349
+ flex-direction: column;
1350
+ align-items: flex-start;
1351
+ text-decoration-line: none;
1352
+ display: inline-flex;
1353
+ }
1354
+
1355
+ @media (hover: hover) {
1356
+ .blog-post-nav a:hover {
1357
+ border-style: var(--tw-border-style);
1358
+ border-width: 2px;
1359
+ border-color: var(--color-primary);
1360
+ color: var(--color-primary);
1361
+ padding: calc(1rem - 1px);
1362
+ }
1363
+ }
1364
+
1365
+ @media (min-width: 40rem) {
1366
+ .blog-post-nav a[rel="next"] {
1367
+ text-align: end;
1368
+ align-items: flex-end;
1369
+ }
1370
+ }
1371
+
1372
+ .blog-post-nav-label {
1373
+ margin-bottom: var(--spacing);
1374
+ --tw-tracking: .14em;
1375
+ letter-spacing: .14em;
1376
+ color: var(--color-muted);
1377
+ text-transform: uppercase;
1378
+ font-size: .7rem;
1379
+ display: block;
1380
+ }
1381
+
1382
+ .bio {
1383
+ align-items: flex-start;
1384
+ gap: calc(var(--spacing) * 4);
1385
+ display: flex;
1386
+ }
427
1387
 
428
- table thead tr th {
429
- border-bottom: 1px solid var(--color-primary);
430
- }
1388
+ .bio-avatar {
1389
+ flex-shrink: 0;
1390
+ }
431
1391
 
432
- pre,
433
- code,
434
- kbd,
435
- samp {
436
- font-family: var(--fontFamily-mono);
437
- }
1392
+ .bio-avatar img {
1393
+ width: calc(var(--spacing) * 14);
1394
+ height: calc(var(--spacing) * 14);
1395
+ object-fit: cover;
1396
+ border-radius: 3.40282e38px;
1397
+ }
438
1398
 
439
- code {
440
- padding: 0.1em 0.3em;
441
- border-radius: 4px;
442
- background-color: var(--color-code-background);
443
- color: var(--color-code-text);
444
- font-size: 0.9em;
445
- /* A file path or an identifier is one long word, and a narrow screen would
446
- otherwise carry it off the side of the page. A block of code scrolls
447
- instead — see `pre` below. */
448
- overflow-wrap: break-word;
449
- }
1399
+ .bio .p-name {
1400
+ --tw-font-weight: var(--font-weight-bold);
1401
+ font-weight: var(--font-weight-bold);
1402
+ color: var(--color-text);
1403
+ }
450
1404
 
451
- pre {
452
- overflow-x: auto;
453
- margin-bottom: var(--spacing-8);
454
- padding: var(--spacing-3) var(--spacing-4);
455
- border-radius: 6px;
456
- background-color: var(--color-code-background);
457
- color: var(--color-code-text);
458
- font-size: var(--fontSize-0);
459
- line-height: var(--lineHeight-normal);
460
- }
1405
+ .bio-note {
1406
+ margin-top: var(--spacing);
1407
+ color: var(--color-muted);
1408
+ font-size: .95rem;
1409
+ }
461
1410
 
462
- pre code {
463
- padding: 0;
464
- border-radius: 0;
465
- background: none;
466
- font-size: inherit;
467
- }
1411
+ .bio-links {
1412
+ margin-top: var(--spacing);
1413
+ column-gap: calc(var(--spacing) * 4);
1414
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1415
+ font-size: var(--text-sm);
1416
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1417
+ }
468
1418
 
469
- /* Syntax highlighting (TASK-86).
470
- *
471
- * The CMS renders a fenced block as `pre > code.language-x` and highlights
472
- * nothing; `static/highlight.js` marks the tokens up on the client, and these
473
- * are its colours. The scopes and the slots they map to are highlight.js's own
474
- * base16 Tomorrow theme, so a token it invents later lands somewhere sensible
475
- * rather than nowhere.
476
- *
477
- * Every colour is a custom property, so a site that wants another palette
478
- * redefines a dozen tokens instead of writing a syntax theme. Delimiters,
479
- * operators and substitutions are deliberately the block's own ink: they are
480
- * most of the characters on screen and a colour there is noise.
481
- */
482
-
483
- .hljs-comment {
484
- color: var(--color-code-comment);
485
- }
1419
+ .bio-links a {
1420
+ align-items: center;
1421
+ min-block-size: 24px;
1422
+ min-inline-size: 24px;
1423
+ display: inline-flex;
1424
+ }
486
1425
 
487
- .hljs-tag {
488
- color: var(--color-code-tag);
489
- }
1426
+ .global-wrapper[data-is-root-path="true"] .bio {
1427
+ margin-top: calc(var(--spacing) * 2);
1428
+ }
490
1429
 
491
- .hljs-subst,
492
- .hljs-punctuation,
493
- .hljs-operator {
494
- color: var(--color-code-text);
495
- }
1430
+ .archive-header .page-title {
1431
+ margin-bottom: calc(var(--spacing) * 4);
1432
+ }
496
1433
 
497
- .hljs-bullet,
498
- .hljs-variable,
499
- .hljs-template-variable,
500
- .hljs-selector-tag,
501
- .hljs-name {
502
- color: var(--color-code-name);
503
- }
1434
+ .archive-header {
1435
+ margin-bottom: calc(var(--spacing) * 10);
1436
+ }
504
1437
 
505
- .hljs-symbol,
506
- .hljs-number,
507
- .hljs-link,
508
- .hljs-attr,
509
- .hljs-variable.constant_,
510
- .hljs-literal {
511
- color: var(--color-code-literal);
512
- }
1438
+ .category-description {
1439
+ font-size: var(--text-lg);
1440
+ line-height: var(--tw-leading, var(--text-lg--line-height));
1441
+ color: var(--color-muted);
1442
+ font-style: italic;
1443
+ }
513
1444
 
514
- .hljs-title,
515
- .hljs-class .hljs-title,
516
- .hljs-title.class_ {
517
- color: var(--color-code-class);
518
- }
1445
+ .author-header + .bio {
1446
+ margin-bottom: calc(var(--spacing) * 12);
1447
+ }
519
1448
 
520
- .hljs-strong {
521
- color: var(--color-code-class);
522
- font-weight: var(--fontWeight-bold);
523
- }
1449
+ .archive h2 {
1450
+ margin-top: calc(var(--spacing) * 10);
1451
+ margin-bottom: calc(var(--spacing) * 3);
1452
+ font-size: var(--text-2xl);
1453
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
1454
+ }
524
1455
 
525
- .hljs-code,
526
- .hljs-string,
527
- .hljs-title.class_.inherited__ {
528
- color: var(--color-code-string);
529
- }
1456
+ .archive ol {
1457
+ list-style-type: none;
1458
+ }
530
1459
 
531
- .hljs-built_in,
532
- .hljs-doctag,
533
- .hljs-quote,
534
- .hljs-regexp,
535
- .hljs-keyword.hljs-atrule {
536
- color: var(--color-code-support);
537
- }
1460
+ :where(.archive ol > :not(:last-child)) {
1461
+ --tw-space-y-reverse: 0;
1462
+ margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse));
1463
+ margin-block-end: calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)));
1464
+ }
538
1465
 
539
- .hljs-attribute,
540
- .hljs-function .hljs-title,
541
- .hljs-section,
542
- .hljs-title.function_ {
543
- color: var(--color-code-function);
544
- }
1466
+ .archive ol {
1467
+ padding: 0;
1468
+ }
545
1469
 
546
- .hljs-keyword,
547
- .hljs-template-tag,
548
- .hljs-type {
549
- color: var(--color-code-keyword);
550
- }
1470
+ .archive a {
1471
+ align-items: center;
1472
+ min-block-size: 24px;
1473
+ min-inline-size: 24px;
1474
+ display: inline-flex;
1475
+ }
551
1476
 
552
- .hljs-emphasis {
553
- color: var(--color-code-keyword);
554
- font-style: italic;
555
- }
1477
+ .pagination {
1478
+ margin-top: calc(var(--spacing) * 12);
1479
+ gap: calc(var(--spacing) * 4);
1480
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1481
+ font-size: var(--text-sm);
1482
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1483
+ flex-wrap: wrap;
1484
+ display: flex;
1485
+ }
556
1486
 
557
- .hljs-meta,
558
- .hljs-meta .hljs-keyword,
559
- .hljs-meta .hljs-string {
560
- color: var(--color-code-meta);
561
- }
1487
+ .pagination a {
1488
+ align-items: center;
1489
+ gap: var(--spacing);
1490
+ min-block-size: 24px;
1491
+ min-inline-size: 24px;
1492
+ text-decoration-line: underline;
1493
+ text-decoration-color: currentColor;
1494
+ display: inline-flex;
1495
+ }
562
1496
 
563
- /* A diff reads by the line, not by the token, which is what prism-diff.css did
564
- * on the site this design comes from: the whole line takes a tint out to the
565
- * edges of the block — the negative margin cancels the `pre` padding and the
566
- * padding puts it back — and keeps the block's own ink, which is the pair the
567
- * contrast test checks. The `+` and the `-` stay in the text, so the meaning
568
- * does not rest on the colour alone.
569
- */
570
-
571
- .hljs-addition,
572
- .hljs-deletion {
573
- display: block;
574
- margin-inline: calc(-1 * var(--spacing-4));
575
- padding-inline: var(--spacing-4);
576
- color: var(--color-code-text);
577
- text-decoration: none;
578
- }
1497
+ @supports (color: color-mix(in lab, red, red)) {
1498
+ .pagination a {
1499
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1500
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1501
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1502
+ }
1503
+ }
579
1504
 
580
- .hljs-addition {
581
- background-color: var(--color-code-added-background);
582
- }
1505
+ .pagination a {
1506
+ text-underline-offset: 4px;
1507
+ text-decoration-thickness: 1px;
1508
+ }
583
1509
 
584
- .hljs-deletion {
585
- background-color: var(--color-code-removed-background);
586
- }
1510
+ @media (hover: hover) {
1511
+ .pagination a:hover {
1512
+ color: var(--color-primary);
1513
+ -webkit-text-decoration-color: var(--color-primary);
1514
+ -webkit-text-decoration-color: var(--color-primary);
1515
+ text-decoration-color: var(--color-primary);
1516
+ text-decoration-thickness: 2px;
1517
+ }
1518
+ }
587
1519
 
588
- /* Screen reader text. The skip link is this until it is focused, and then it
589
- is a box at the top left of the page. */
590
-
591
- .screen-reader-text {
592
- position: absolute;
593
- width: 1px;
594
- height: 1px;
595
- margin: -1px;
596
- padding: 0;
597
- overflow: hidden;
598
- border: 0;
599
- clip-path: inset(50%);
600
- word-wrap: normal !important;
601
- }
1520
+ .pagination a:focus-visible {
1521
+ text-decoration-thickness: 2px;
1522
+ }
602
1523
 
603
- .screen-reader-text:focus {
604
- display: block;
605
- width: auto;
606
- height: auto;
607
- inset-block-start: var(--spacing-2);
608
- inset-inline-start: var(--spacing-2);
609
- padding: var(--spacing-4);
610
- clip-path: none;
611
- background-color: var(--color-base-3);
612
- color: var(--color-text);
613
- font-size: var(--fontSize-1);
614
- font-weight: var(--fontWeight-bold);
615
- line-height: normal;
616
- text-decoration: none;
617
- z-index: 100000;
618
- }
1524
+ .pagination-next {
1525
+ margin-inline-start: auto;
1526
+ }
619
1527
 
620
- /* The page shell */
1528
+ .search-form {
1529
+ margin-bottom: calc(var(--spacing) * 8);
1530
+ gap: calc(var(--spacing) * 2);
1531
+ display: flex;
1532
+ }
621
1533
 
622
- .global-wrapper {
623
- max-width: var(--maxWidth-wrapper);
624
- margin: var(--spacing-0) auto;
625
- padding: var(--spacing-10) var(--spacing-5);
626
- }
1534
+ .search-form label {
1535
+ flex: 1;
1536
+ }
627
1537
 
628
- .global-wrapper[data-is-root-path='true'] .bio {
629
- margin-bottom: var(--spacing-20);
630
- }
1538
+ .search-summary {
1539
+ margin-bottom: calc(var(--spacing) * 8);
1540
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1541
+ font-size: var(--text-sm);
1542
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1543
+ color: var(--color-muted);
1544
+ }
631
1545
 
632
- .global-header {
633
- margin-bottom: var(--spacing-12);
634
- }
1546
+ .search-result + .search-result {
1547
+ margin-top: calc(var(--spacing) * 9);
1548
+ border-top-style: var(--tw-border-style);
1549
+ border-top-width: 1px;
1550
+ border-color: var(--color-rule);
1551
+ padding-top: calc(var(--spacing) * 9);
1552
+ }
635
1553
 
636
- .main-heading {
637
- margin: 0;
638
- font-size: var(--fontSize-7);
639
- }
1554
+ .search-result .feed-title {
1555
+ font-size: var(--text-2xl);
1556
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
1557
+ }
640
1558
 
641
- .header-link-home {
642
- font-family: var(--font-heading);
643
- font-size: var(--fontSize-2);
644
- font-weight: var(--fontWeight-bold);
645
- text-decoration: none;
646
- }
1559
+ .search-snippet mark {
1560
+ border-radius: var(--radius-xs);
1561
+ background-color: var(--color-primary);
1562
+ }
647
1563
 
648
- /* The site menu, which the header carries on every page (TASK-105). At the
649
- root the header is the site title with the tagline under it, and the menu
650
- is a line of its own under that.
1564
+ @supports (color: color-mix(in lab, red, red)) {
1565
+ .search-snippet mark {
1566
+ background-color: color-mix(in oklab, var(--color-primary) 20%, transparent);
1567
+ }
1568
+ }
651
1569
 
652
- No size of its own (TASK-111): a menu is navigation somebody is meant to
653
- use rather than a footnote, so it reads at the page's size, like the footer
654
- menu, which never had one. */
655
- .global-header .site-nav {
656
- margin-top: var(--spacing-2);
657
- }
1570
+ .search-snippet mark {
1571
+ padding-inline: calc(var(--spacing) * .5);
1572
+ color: var(--color-text);
1573
+ }
658
1574
 
659
- /* Everywhere else the header is the small link home, and the menu sits beside
660
- it on the same line — the two wrap onto a second line together rather than
661
- the menu dropping under the link on a narrow screen. */
662
- .global-wrapper:not([data-is-root-path='true']) .global-header {
663
- display: flex;
664
- flex-wrap: wrap;
665
- align-items: baseline;
666
- column-gap: var(--spacing-5);
667
- row-gap: var(--spacing-1);
668
- }
1575
+ :is(.not-found, .server-error, .maintenance) > p {
1576
+ font-size: 1.08rem;
1577
+ }
669
1578
 
670
- .global-wrapper:not([data-is-root-path='true']) .global-header .site-nav {
671
- margin-top: var(--spacing-0);
672
- }
1579
+ .reactions-section {
1580
+ margin-top: calc(var(--spacing) * 14);
1581
+ margin-bottom: calc(var(--spacing) * 10);
1582
+ column-gap: calc(var(--spacing) * 10);
1583
+ row-gap: calc(var(--spacing) * 4);
1584
+ flex-wrap: wrap;
1585
+ display: flex;
1586
+ }
673
1587
 
674
- /* An entry: a post or a page (TASK-83). The source design's own rules — the
675
- title tight against the words under it, a subtitle in the heading font —
676
- plus the small line the `e-content` ends on, which carries the permalink,
677
- the published date and, when it is a different day, the updated one. */
1588
+ .reaction-group {
1589
+ min-width: 0;
1590
+ }
678
1591
 
679
- .blog-post header h1 {
680
- margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
681
- }
1592
+ .reaction-title {
1593
+ margin-bottom: calc(var(--spacing) * 2);
1594
+ --tw-font-weight: var(--font-weight-normal);
1595
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1596
+ font-size: .72rem;
1597
+ font-weight: var(--font-weight-normal);
1598
+ --tw-tracking: .14em;
1599
+ letter-spacing: .14em;
1600
+ color: var(--color-muted);
1601
+ text-transform: uppercase;
1602
+ }
682
1603
 
683
- .blog-post header p {
684
- font-family: var(--font-heading);
685
- font-size: var(--fontSize-2);
686
- }
1604
+ .reaction-count {
1605
+ --tw-font-weight: var(--font-weight-semibold);
1606
+ font-weight: var(--font-weight-semibold);
1607
+ color: var(--color-text);
1608
+ margin-inline-start: var(--spacing);
1609
+ }
687
1610
 
688
- .entry-meta,
689
- .page-meta {
690
- margin-top: var(--spacing-8);
691
- }
1611
+ .facepile {
1612
+ flex-wrap: wrap;
1613
+ align-items: center;
1614
+ display: flex;
1615
+ }
692
1616
 
693
- /* A page usually carries no date, and then this line has nothing in it. The
694
- layout prints it anyway, so a site has one hook wherever it is; here is
695
- where it disappears. */
696
- .entry-meta:empty,
697
- .page-meta:empty {
698
- display: none;
699
- }
1617
+ .facepile > a, .facepile > span {
1618
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1619
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1620
+ --tw-ring-color: var(--color-body);
1621
+ border-radius: 3.40282e38px;
1622
+ margin-inline-start: calc(var(--spacing) * -2);
1623
+ position: relative;
1624
+ }
700
1625
 
701
- /* The bio, which the entry footer prints and an author archive heads with
702
- (TASK-83). */
1626
+ :is(.facepile > a, .facepile > span):first-child {
1627
+ margin-inline-start: 0;
1628
+ }
703
1629
 
704
- .bio {
705
- display: flex;
706
- align-items: center;
707
- margin-bottom: var(--spacing-16);
708
- }
1630
+ @media (hover: hover) {
1631
+ :is(.facepile > a, .facepile > span):hover {
1632
+ z-index: 10;
1633
+ }
1634
+ }
709
1635
 
710
- .bio p {
711
- margin-bottom: var(--spacing-0);
712
- }
1636
+ @media (prefers-reduced-motion: no-preference) {
1637
+ .facepile > a, .facepile > span {
1638
+ transition-property: transform, translate, scale, rotate;
1639
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
1640
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
1641
+ }
1642
+
1643
+ @media (hover: hover) {
1644
+ :is(.facepile > a, .facepile > span):hover {
1645
+ --tw-scale-x: 110%;
1646
+ --tw-scale-y: 110%;
1647
+ --tw-scale-z: 110%;
1648
+ scale: var(--tw-scale-x) var(--tw-scale-y);
1649
+ }
1650
+ }
1651
+ }
713
1652
 
714
- /* The name reads as the heading of the card; the source theme printed a
715
- <strong> around it, which is styling in the markup. */
716
- .bio .p-name {
717
- font-weight: var(--fontWeight-bold);
718
- }
1653
+ .facepile img {
1654
+ width: calc(var(--spacing) * 8);
1655
+ height: calc(var(--spacing) * 8);
1656
+ border-radius: 3.40282e38px;
1657
+ }
719
1658
 
720
- .bio-note {
721
- margin-top: var(--spacing-2);
722
- font-style: italic;
723
- }
1659
+ .facepile > :has(.reaction-name) {
1660
+ align-items: center;
1661
+ gap: var(--spacing);
1662
+ background-color: var(--color-base);
1663
+ min-block-size: 24px;
1664
+ min-inline-size: 24px;
1665
+ padding-inline: calc(var(--spacing) * 2);
1666
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1667
+ font-size: var(--text-sm);
1668
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1669
+ color: var(--color-text);
1670
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1671
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1672
+ margin-inline-start: var(--spacing);
1673
+ text-decoration-line: none;
1674
+ display: inline-flex;
1675
+ }
724
1676
 
725
- /* The links the person calls their own, under the credit: a horizontal list in
726
- the heading font, at the page's size like every other nav (TASK-111). The
727
- site menu used to share this rule; it is in the header now (TASK-105) and
728
- the bio carries nobody but the person. */
729
- .bio-links {
730
- margin-top: var(--spacing-2);
731
- }
1677
+ .facepile > :has(.reaction-name):first-child {
1678
+ margin-inline-start: 0;
1679
+ }
732
1680
 
733
- .bio-avatar {
734
- display: inline-block;
735
- min-width: 55px;
736
- margin-inline-end: var(--spacing-4);
737
- margin-bottom: var(--spacing-0);
738
- border: 3px solid var(--color-base-3);
739
- border-radius: 50%;
740
- }
1681
+ .reaction-icon {
1682
+ font-size: var(--text-xs);
1683
+ line-height: var(--tw-leading, var(--text-xs--line-height));
1684
+ }
741
1685
 
742
- .bio-avatar img {
743
- display: block;
744
- width: 50px;
745
- height: 50px;
746
- border-radius: 50%;
747
- }
1686
+ .comments-area {
1687
+ margin-top: calc(var(--spacing) * 14);
1688
+ }
748
1689
 
749
- .circle {
750
- border-radius: 50%;
751
- }
1690
+ .comments-title {
1691
+ margin-bottom: calc(var(--spacing) * 5);
1692
+ font-size: var(--text-xl);
1693
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1694
+ }
752
1695
 
753
- /* A listing: the feed of entries, and what heads one (TASK-82). The source
754
- design's own rules, on the tokens above. The feed itself takes no styling —
755
- it is a stack of articles at the measure — and what makes it read as a list
756
- is the rule between two of them and the small meta line under each. */
1696
+ .comment-list {
1697
+ margin: 0;
1698
+ list-style-type: none;
1699
+ }
757
1700
 
758
- .feed-title {
759
- margin: var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0);
760
- padding: var(--spacing-0);
761
- font-size: var(--fontSize-3);
762
- }
1701
+ :where(.comment-list > :not(:last-child)) {
1702
+ --tw-space-y-reverse: 0;
1703
+ margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));
1704
+ margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));
1705
+ }
763
1706
 
764
- .feed-separator {
765
- margin: var(--spacing-2) var(--spacing-0) var(--spacing-4) var(--spacing-0);
766
- }
1707
+ .comment-list {
1708
+ padding: 0;
1709
+ }
767
1710
 
768
- .feed-meta {
769
- display: flex;
770
- flex-wrap: wrap;
771
- gap: var(--spacing-2);
772
- align-items: baseline;
773
- font-size: 70%;
774
- }
1711
+ .comment-list .children {
1712
+ margin-top: calc(var(--spacing) * 6);
1713
+ list-style-type: none;
1714
+ }
775
1715
 
776
- .feed-meta p {
777
- margin: var(--spacing-0);
778
- }
1716
+ :where(.comment-list .children > :not(:last-child)) {
1717
+ --tw-space-y-reverse: 0;
1718
+ margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));
1719
+ margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
1720
+ }
779
1721
 
780
- .post-categories {
781
- margin-top: var(--spacing-2);
782
- margin-bottom: var(--spacing-0);
783
- font-size: 70%;
784
- }
1722
+ .comment-list .children {
1723
+ border-inline-start-style: var(--tw-border-style);
1724
+ border-inline-start-width: 1px;
1725
+ border-color: var(--color-rule);
1726
+ padding-inline-start: calc(var(--spacing) * 6);
1727
+ }
785
1728
 
786
- .post-categories a {
787
- display: inline-block;
788
- margin-inline-end: var(--spacing-2);
789
- }
1729
+ @media (min-width: 40rem) {
1730
+ .comment-list .children {
1731
+ padding-inline-start: calc(var(--spacing) * 12);
1732
+ }
1733
+ }
790
1734
 
791
- /* The categories are already small; inside the meta line they would be small
792
- twice over, so there they are the size of the line they sit on. */
793
- .feed-meta .post-categories {
794
- font-size: 100%;
795
- }
1735
+ .comment-body {
1736
+ gap: calc(var(--spacing) * 2);
1737
+ flex-direction: column;
1738
+ display: flex;
1739
+ }
796
1740
 
797
- .category-header {
798
- margin-bottom: var(--spacing-8);
799
- }
1741
+ .comment-meta {
1742
+ align-items: center;
1743
+ column-gap: calc(var(--spacing) * 3);
1744
+ row-gap: var(--spacing);
1745
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1746
+ font-size: var(--text-sm);
1747
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1748
+ flex-wrap: wrap;
1749
+ display: flex;
1750
+ }
800
1751
 
801
- .category-description {
802
- margin-top: var(--spacing-2);
803
- font-style: italic;
804
- }
1752
+ .comment-author {
1753
+ align-items: center;
1754
+ gap: calc(var(--spacing) * 2);
1755
+ display: flex;
1756
+ }
805
1757
 
806
- /* Pagination: two arrows under a listing, the previous one at the left edge
807
- and the next at the right however few there are. */
808
-
809
- .pagination {
810
- display: flex;
811
- gap: var(--spacing-4);
812
- align-items: baseline;
813
- justify-content: space-between;
814
- margin-top: var(--spacing-12);
815
- padding-top: var(--spacing-5);
816
- border-top: 1px solid var(--color-base);
817
- font-family: var(--font-heading);
818
- font-size: var(--fontSize-0);
819
- }
1758
+ .comment-author .avatar, .comment-avatar-empty {
1759
+ width: calc(var(--spacing) * 8);
1760
+ height: calc(var(--spacing) * 8);
1761
+ border-radius: 3.40282e38px;
1762
+ flex-shrink: 0;
1763
+ }
820
1764
 
821
- .pagination-previous {
822
- margin-inline-end: auto;
823
- }
1765
+ .comment-avatar-empty {
1766
+ background-color: var(--color-base);
1767
+ --tw-font-weight: var(--font-weight-semibold);
1768
+ font-weight: var(--font-weight-semibold);
1769
+ color: var(--color-muted);
1770
+ justify-content: center;
1771
+ align-items: center;
1772
+ display: inline-flex;
1773
+ }
824
1774
 
825
- .pagination-next {
826
- margin-inline-start: auto;
827
- }
1775
+ .comment-author a {
1776
+ align-items: center;
1777
+ min-block-size: 24px;
1778
+ min-inline-size: 24px;
1779
+ text-decoration-line: underline;
1780
+ text-decoration-color: currentColor;
1781
+ display: inline-flex;
1782
+ }
828
1783
 
829
- /* Where a post links its neighbours, which the entry layout prints (TASK-83). */
1784
+ @supports (color: color-mix(in lab, red, red)) {
1785
+ .comment-author a {
1786
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1787
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1788
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1789
+ }
1790
+ }
830
1791
 
831
- .blog-post-nav {
832
- font-family: var(--font-heading);
833
- font-size: var(--fontSize-0);
834
- }
1792
+ .comment-author a {
1793
+ text-underline-offset: 4px;
1794
+ text-decoration-thickness: 1px;
1795
+ }
835
1796
 
836
- .blog-post-nav ul {
837
- display: flex;
838
- flex-wrap: wrap;
839
- justify-content: space-between;
840
- margin: var(--spacing-0);
841
- padding: 0;
842
- list-style: none;
843
- }
1797
+ @media (hover: hover) {
1798
+ .comment-author a:hover {
1799
+ color: var(--color-primary);
1800
+ -webkit-text-decoration-color: var(--color-primary);
1801
+ -webkit-text-decoration-color: var(--color-primary);
1802
+ text-decoration-color: var(--color-primary);
1803
+ text-decoration-thickness: 2px;
1804
+ }
1805
+ }
844
1806
 
845
- /* Titles: what heads a listing, a 404 and an author archive. The source theme
846
- prints none of these — it has no archive heading at all — so they are the
847
- theme's own, sized off the same scale. An entry's own title is
848
- `.blog-post header h1` above. */
1807
+ .comment-author a:focus-visible {
1808
+ text-decoration-thickness: 2px;
1809
+ }
849
1810
 
850
- .page-title {
851
- margin: 0 0 var(--spacing-2);
852
- font-size: var(--fontSize-6);
853
- }
1811
+ .comment-author a {
1812
+ color: var(--color-text);
1813
+ }
854
1814
 
855
- .empty {
856
- font-family: var(--font-heading);
857
- font-size: var(--fontSize-0);
858
- }
1815
+ .comment-metadata a {
1816
+ align-items: center;
1817
+ min-block-size: 24px;
1818
+ min-inline-size: 24px;
1819
+ text-decoration-line: underline;
1820
+ text-decoration-color: currentColor;
1821
+ display: inline-flex;
1822
+ }
859
1823
 
860
- /* The search box (TASK-22): a field and a button on one line, at the top of
861
- the search page and nowhere else (TASK-105). The field is drawn the way the
862
- comment form's are, so the site has one look for a place to type. */
1824
+ @supports (color: color-mix(in lab, red, red)) {
1825
+ .comment-metadata a {
1826
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1827
+ -webkit-text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1828
+ text-decoration-color: color-mix(in oklab, currentcolor 50%, transparent);
1829
+ }
1830
+ }
863
1831
 
864
- .search-form {
865
- display: flex;
866
- gap: var(--spacing-2);
867
- margin: 0 0 var(--spacing-4);
868
- font-family: var(--font-heading);
869
- }
1832
+ .comment-metadata a {
1833
+ text-underline-offset: 4px;
1834
+ text-decoration-thickness: 1px;
1835
+ }
870
1836
 
871
- .search-form label {
872
- flex: 1;
873
- min-width: 0;
874
- }
1837
+ @media (hover: hover) {
1838
+ .comment-metadata a:hover {
1839
+ color: var(--color-primary);
1840
+ -webkit-text-decoration-color: var(--color-primary);
1841
+ -webkit-text-decoration-color: var(--color-primary);
1842
+ text-decoration-color: var(--color-primary);
1843
+ text-decoration-thickness: 2px;
1844
+ }
1845
+ }
875
1846
 
876
- .search-form input[type='search'] {
877
- width: 100%;
878
- padding: var(--spacing-2);
879
- border: 1px solid var(--color-base);
880
- background-color: var(--color-base-3);
881
- color: var(--color-text);
882
- font-family: var(--font-body);
883
- font-size: var(--fontSize-1);
884
- }
1847
+ .comment-metadata a:focus-visible {
1848
+ text-decoration-thickness: 2px;
1849
+ }
885
1850
 
886
- .search-form input[type='search']:focus-visible {
887
- outline: 2px solid var(--color-primary);
888
- outline-offset: -1px;
889
- border-color: var(--color-primary);
890
- }
1851
+ .comment-metadata a, .comment-metadata {
1852
+ color: var(--color-muted);
1853
+ }
891
1854
 
892
- .search-form button {
893
- padding: var(--spacing-2) var(--spacing-4);
894
- border: none;
895
- background-color: var(--color-primary);
896
- color: var(--color-body);
897
- font-family: var(--font-heading);
898
- font-size: var(--fontSize-1);
899
- cursor: pointer;
900
- }
1855
+ .comment-source {
1856
+ color: var(--color-muted);
1857
+ font-style: italic;
1858
+ }
901
1859
 
902
- .search-form button:hover,
903
- .search-form button:focus-visible {
904
- opacity: 0.85;
905
- }
1860
+ .comment-content {
1861
+ font-size: 1.02rem;
1862
+ }
906
1863
 
907
- .search-summary {
908
- font-family: var(--font-heading);
909
- font-size: var(--fontSize-0);
910
- }
1864
+ .reply {
1865
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1866
+ font-size: var(--text-sm);
1867
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1868
+ }
911
1869
 
912
- .search-result {
913
- margin: 0 0 var(--spacing-8);
914
- }
1870
+ .reply a {
1871
+ align-items: center;
1872
+ min-block-size: 24px;
1873
+ min-inline-size: 24px;
1874
+ display: inline-flex;
1875
+ }
915
1876
 
916
- .search-result .feed-title {
917
- margin-bottom: var(--spacing-2);
918
- }
1877
+ .no-comments {
1878
+ margin-top: calc(var(--spacing) * 8);
1879
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1880
+ font-size: var(--text-sm);
1881
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1882
+ color: var(--color-muted);
1883
+ font-style: italic;
1884
+ }
919
1885
 
920
- /* A matched word is marked by weight and an underline in the primary colour
921
- rather than by a highlighter background, so it adds no colour pair the
922
- contrast test would have to prove in both schemes. */
1886
+ .comment-respond {
1887
+ margin-top: calc(var(--spacing) * 12);
1888
+ border-top-style: var(--tw-border-style);
1889
+ border-top-width: 1px;
1890
+ border-color: var(--color-rule);
1891
+ padding-top: calc(var(--spacing) * 10);
1892
+ }
923
1893
 
924
- .search-snippet mark {
925
- background-color: transparent;
926
- color: inherit;
927
- font-weight: var(--fontWeight-bold);
928
- text-decoration: underline var(--color-primary);
929
- text-underline-offset: 0.15em;
930
- }
1894
+ .comment-reply-title, .contact-form-title {
1895
+ margin-bottom: calc(var(--spacing) * 5);
1896
+ font-size: var(--text-xl);
1897
+ line-height: var(--tw-leading, var(--text-xl--line-height));
1898
+ }
931
1899
 
932
- /* An author archive (TASK-67): the person above their posts. The same URL is
933
- their ActivityPub actor, so this is the page a follower sees when they click
934
- through from somewhere else on the fediverse. The person themselves is the
935
- bio above; this is only what is left, the heading over it. */
1900
+ .comment-help {
1901
+ margin-top: calc(var(--spacing) * -3);
1902
+ margin-bottom: calc(var(--spacing) * 5);
1903
+ color: var(--color-muted);
1904
+ font-size: .95rem;
1905
+ }
936
1906
 
937
- .author-header {
938
- margin-bottom: var(--spacing-4);
939
- }
1907
+ .comment-respond form {
1908
+ gap: calc(var(--spacing) * 4);
1909
+ flex-direction: column;
1910
+ display: flex;
1911
+ }
940
1912
 
941
- /* The front page (TASK-85): the site's own words, then Recent Posts, then
942
- where to go next. Almost nothing is needed — the words are `.e-content`
943
- below, the posts are the feed above, and the heading over them is an
944
- ordinary `h2` — so this is only the line of links, which follows a feed
945
- rather than a paragraph and needs the air a paragraph would already have. */
1913
+ .field-row {
1914
+ column-gap: calc(var(--spacing) * 4);
1915
+ row-gap: calc(var(--spacing) * 4);
1916
+ display: grid;
1917
+ }
946
1918
 
947
- .front-links {
948
- margin-top: var(--spacing-8);
949
- }
1919
+ @media (min-width: 40rem) {
1920
+ .field-row {
1921
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1922
+ }
1923
+ }
950
1924
 
951
- /* An archive page: every post there has ever been, under a heading per month.
952
- The source design's essays page is plain headings over `ol.list-none` and
953
- nothing else, so the prose rules draw it; what is here only closes the gap
954
- between a month and its own posts, which at the prose spacing reads as two
955
- things rather than as one. */
1925
+ .comment-respond label {
1926
+ margin-bottom: var(--spacing);
1927
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1928
+ font-size: var(--text-sm);
1929
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1930
+ display: block;
1931
+ }
956
1932
 
957
- .archive h2 {
958
- margin-bottom: var(--spacing-2);
959
- }
1933
+ .comment-optional, .contact-optional, .comment-hint, .contact-hint {
1934
+ color: var(--color-muted);
1935
+ }
960
1936
 
961
- /* Body copy: whatever a document's words render into, which is the entry's
962
- `section.e-content` and the `div.page-body.e-content` a posts page prints
963
- its own words in. */
1937
+ .comment-hint, .contact-hint, .comment-field-error, .contact-field-error {
1938
+ margin-top: var(--spacing);
1939
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1940
+ font-size: var(--text-sm);
1941
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1942
+ display: block;
1943
+ }
964
1944
 
965
- .e-content {
966
- overflow-wrap: break-word;
967
- }
1945
+ .comment-field-error, .contact-field-error {
1946
+ color: var(--color-error);
1947
+ }
968
1948
 
969
- .e-content > :first-child {
970
- margin-top: 0;
971
- }
1949
+ :is(.comment-respond, .search-form) :is(input:not([type="checkbox"], [type="hidden"]), textarea) {
1950
+ border-radius: var(--radius-md);
1951
+ border-style: var(--tw-border-style);
1952
+ border-width: 1px;
1953
+ border-color: var(--color-edge);
1954
+ background-color: var(--color-base);
1955
+ width: 100%;
1956
+ padding-inline: calc(var(--spacing) * 3);
1957
+ padding-block: calc(var(--spacing) * 2);
1958
+ font-family: Iowan Old Style, Palatino Linotype, Palatino, Book Antiqua, Georgia, serif;
1959
+ font-size: var(--text-base);
1960
+ line-height: var(--tw-leading, var(--text-base--line-height));
1961
+ color: var(--color-text);
1962
+ display: block;
1963
+ }
972
1964
 
973
- .e-content table {
974
- display: block;
975
- overflow-x: auto;
976
- }
1965
+ :is(.comment-respond, .search-form) :is(input, textarea):is(:user-invalid, [aria-invalid="true"]) {
1966
+ border-style: var(--tw-border-style);
1967
+ border-width: 2px;
1968
+ border-color: var(--color-error);
1969
+ padding-block: calc(.5rem - 1px);
1970
+ padding-inline: calc(.75rem - 1px);
1971
+ }
977
1972
 
978
- .e-content th,
979
- .e-content td {
980
- padding: var(--spacing-1) var(--spacing-3);
981
- text-align: start;
982
- }
1973
+ .comment-check {
1974
+ align-items: center;
1975
+ gap: calc(var(--spacing) * 2);
1976
+ display: flex;
1977
+ }
983
1978
 
984
- .footnotes {
985
- margin-top: var(--spacing-10);
986
- padding-top: var(--spacing-4);
987
- border-top: 1px solid var(--color-base);
988
- font-size: var(--fontSize-0);
989
- }
1979
+ .comment-check label {
1980
+ margin-bottom: 0;
1981
+ }
990
1982
 
991
- .footnote-item p {
992
- display: inline;
993
- }
1983
+ .comment-respond input[type="checkbox"] {
1984
+ block-size: 24px;
1985
+ inline-size: 24px;
1986
+ accent-color: var(--color-primary);
1987
+ margin: 0;
1988
+ }
994
1989
 
995
- /* Reactions: the likes, the boosts and the pages that mentioned a post,
996
- grouped by kind as facepiles of small round avatars (TASK-84). */
1990
+ .search-form button, .comment-respond .form-submit button, .comment-respond .form-submit input[type="submit"] {
1991
+ cursor: pointer;
1992
+ border-radius: var(--radius-md);
1993
+ background-color: var(--color-primary);
1994
+ padding-inline: calc(var(--spacing) * 5);
1995
+ padding-block: calc(var(--spacing) * 2.5);
1996
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
1997
+ font-size: var(--text-sm);
1998
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1999
+ --tw-font-weight: var(--font-weight-semibold);
2000
+ font-weight: var(--font-weight-semibold);
2001
+ color: var(--color-body);
2002
+ }
997
2003
 
998
- .reactions-section {
999
- margin-top: var(--spacing-12);
1000
- }
2004
+ @media (hover: hover) {
2005
+ :is(.search-form button, .comment-respond .form-submit button, .comment-respond .form-submit input[type="submit"]):hover {
2006
+ background-color: var(--color-text);
2007
+ }
2008
+ }
1001
2009
 
1002
- .reaction-group {
1003
- display: flex;
1004
- align-items: center;
1005
- gap: var(--spacing-3);
1006
- margin-bottom: var(--spacing-3);
1007
- }
2010
+ .search-form button, .comment-respond .form-submit button, .comment-respond .form-submit input[type="submit"] {
2011
+ min-block-size: 24px;
2012
+ min-inline-size: 24px;
2013
+ }
1008
2014
 
1009
- .reaction-title {
1010
- margin: 0;
1011
- font-family: var(--font-heading);
1012
- font-size: var(--fontSize-1);
1013
- white-space: nowrap;
1014
- }
2015
+ .comment-signed-in, .comment-replying-to {
2016
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
2017
+ font-size: var(--text-sm);
2018
+ line-height: var(--tw-leading, var(--text-sm--line-height));
2019
+ color: var(--color-muted);
2020
+ }
1015
2021
 
1016
- .facepile {
1017
- display: flex;
1018
- flex-wrap: wrap;
1019
- gap: var(--spacing-1);
1020
- }
2022
+ .comment-signed-in a, .comment-replying-to a {
2023
+ color: var(--color-primary);
2024
+ }
1021
2025
 
1022
- .facepile a,
1023
- .facepile span {
1024
- display: inline-block;
1025
- line-height: 0;
1026
- text-decoration: none;
1027
- }
2026
+ .comment-notice, .contact-notice {
2027
+ border-radius: var(--radius-md);
2028
+ border-style: var(--tw-border-style);
2029
+ border-width: 1px;
2030
+ border-color: var(--color-edge);
2031
+ background-color: var(--color-base);
2032
+ padding: calc(var(--spacing) * 4);
2033
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
2034
+ font-size: var(--text-sm);
2035
+ line-height: var(--tw-leading, var(--text-sm--line-height));
2036
+ color: var(--color-text);
2037
+ }
1028
2038
 
1029
- /* A face is a picture of somebody: the block of colour a link takes on hover
1030
- everywhere else would sit behind it as a frame, so it is taken back off. */
2039
+ .comment-error, .contact-error {
2040
+ margin-block: calc(var(--spacing) * 6);
2041
+ border-inline-start-style: var(--tw-border-style);
2042
+ border-inline-start-width: 2px;
2043
+ border-color: var(--color-error);
2044
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
2045
+ font-size: var(--text-sm);
2046
+ line-height: var(--tw-leading, var(--text-sm--line-height));
2047
+ padding-inline-start: calc(var(--spacing) * 4);
2048
+ }
1031
2049
 
1032
- .facepile a:hover,
1033
- .facepile a:focus {
1034
- background-color: transparent;
1035
- color: var(--color-primary);
1036
- text-decoration: underline;
1037
- }
2050
+ .comment-error h3, .contact-error h3 {
2051
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
2052
+ font-size: var(--text-base);
2053
+ line-height: var(--tw-leading, var(--text-base--line-height));
2054
+ --tw-font-weight: var(--font-weight-semibold);
2055
+ font-weight: var(--font-weight-semibold);
2056
+ color: var(--color-error);
2057
+ }
1038
2058
 
1039
- .facepile img {
1040
- display: block;
1041
- border-radius: 50%;
1042
- }
2059
+ .comment-error ul, .contact-error ul {
2060
+ margin-top: calc(var(--spacing) * 2);
2061
+ padding-inline-start: calc(var(--spacing) * 5);
2062
+ list-style-type: disc;
2063
+ }
1043
2064
 
1044
- /* A reaction with no avatar has nothing to recognise anybody by, so the emoji
1045
- badge of its kind stands in and the name is printed beside it — which needs
1046
- the line box the faces above do without. */
1047
-
1048
- .facepile a:has(.reaction-name),
1049
- .facepile span:has(.reaction-name) {
1050
- display: inline-flex;
1051
- align-items: center;
1052
- gap: var(--spacing-1);
1053
- font-family: var(--font-heading);
1054
- font-size: var(--fontSize-0);
1055
- line-height: normal;
1056
- }
2065
+ .comment-error a, .contact-error a {
2066
+ align-items: center;
2067
+ min-block-size: 24px;
2068
+ min-inline-size: 24px;
2069
+ display: inline-flex;
2070
+ }
1057
2071
 
1058
- .reaction-icon {
1059
- display: inline-block;
1060
- width: 2rem;
1061
- height: 2rem;
1062
- border-radius: 50%;
1063
- background-color: var(--color-base);
1064
- line-height: 2rem;
1065
- text-align: center;
2072
+ .comment-trap, .contact-trap {
2073
+ width: 1px;
2074
+ height: 1px;
2075
+ position: absolute;
2076
+ inset-inline-start: -10000px;
2077
+ overflow: hidden;
2078
+ }
1066
2079
  }
1067
2080
 
1068
- /* The thread under a post: the replies from every door, each one an h-entry
1069
- with its author, its time and its words, and answers nested inside it. */
2081
+ @layer utilities {
2082
+ .visible {
2083
+ visibility: visible;
2084
+ }
1070
2085
 
1071
- .comments-area {
1072
- margin-top: var(--spacing-12);
1073
- }
2086
+ .fixed {
2087
+ position: fixed;
2088
+ }
1074
2089
 
1075
- .comments-title {
1076
- margin: 0 0 var(--spacing-8);
1077
- font-size: var(--fontSize-4);
1078
- }
2090
+ .static {
2091
+ position: static;
2092
+ }
1079
2093
 
1080
- .comment-list,
1081
- .comment-list .children {
1082
- margin: 0;
1083
- padding: 0;
1084
- list-style: none;
1085
- }
2094
+ .target {
2095
+ align-items: center;
2096
+ min-block-size: 24px;
2097
+ min-inline-size: 24px;
2098
+ display: inline-flex;
2099
+ }
1086
2100
 
1087
- .comment-list .children {
1088
- margin-inline-start: var(--spacing-8);
1089
- }
2101
+ .block {
2102
+ display: block;
2103
+ }
1090
2104
 
1091
- .comment-body {
1092
- padding: var(--spacing-4) 0;
1093
- border-bottom: 1px solid var(--color-base);
1094
- }
2105
+ .contents {
2106
+ display: contents;
2107
+ }
1095
2108
 
1096
- .comment-author {
1097
- display: flex;
1098
- align-items: center;
1099
- gap: var(--spacing-2);
1100
- font-family: var(--font-heading);
1101
- }
2109
+ .hidden {
2110
+ display: none;
2111
+ }
1102
2112
 
1103
- .comment-author .avatar {
1104
- border-radius: 50%;
1105
- }
2113
+ .list-none {
2114
+ list-style-type: none;
2115
+ }
1106
2116
 
1107
- .comment-metadata {
1108
- margin-bottom: var(--spacing-2);
1109
- font-family: var(--font-heading);
1110
- font-size: var(--fontSize-0);
1111
- }
2117
+ .truncate {
2118
+ text-overflow: ellipsis;
2119
+ white-space: nowrap;
2120
+ overflow: hidden;
2121
+ }
1112
2122
 
1113
- /* The permalink is the whole date line, so it is the ink of the page rather
1114
- than a link's colour until somebody points at it. */
2123
+ .italic {
2124
+ font-style: italic;
2125
+ }
1115
2126
 
1116
- .comment-metadata a {
1117
- color: var(--color-text);
1118
- text-decoration: none;
2127
+ .outline {
2128
+ outline-style: var(--tw-outline-style);
2129
+ outline-width: 1px;
2130
+ }
1119
2131
  }
1120
2132
 
1121
- .comment-metadata a:hover,
1122
- .comment-metadata a:focus {
1123
- background-color: transparent;
1124
- color: var(--color-primary);
2133
+ :root {
2134
+ color-scheme: light dark;
2135
+ --color-body: #faf7f2;
2136
+ --color-text: #1c1917;
2137
+ --color-muted: #534c46;
2138
+ --color-primary: #8c2f1f;
2139
+ --color-secondary: #2b5580;
2140
+ --color-rule: #e4dccf;
2141
+ --color-edge: #8a867e;
2142
+ --color-base: #f3eee5;
2143
+ --color-base-2: #f5f6f7;
2144
+ --color-base-3: #fff;
2145
+ --color-code-background: #f3eee5;
2146
+ --color-code-text: #1c1917;
2147
+ --color-error: #9c1f18;
2148
+ --color-code-comment: #4e4f4d;
2149
+ --color-code-tag: #4e4f4e;
2150
+ --color-code-name: #991f1f;
2151
+ --color-code-literal: #77420f;
2152
+ --color-code-class: #624c00;
2153
+ --color-code-string: #455500;
2154
+ --color-code-support: #23565a;
2155
+ --color-code-function: #2f507c;
2156
+ --color-code-keyword: #63417a;
2157
+ --color-code-meta: #6d453c;
2158
+ --color-code-added-background: #dcedd3;
2159
+ --color-code-removed-background: #f5d8d6;
1125
2160
  }
1126
2161
 
1127
- .comment-content {
1128
- margin-top: var(--spacing-2);
2162
+ @media (prefers-color-scheme: dark) {
2163
+ :root {
2164
+ --color-body: #171412;
2165
+ --color-text: #ece6de;
2166
+ --color-muted: #b2aaa0;
2167
+ --color-primary: #ee9370;
2168
+ --color-secondary: #86b8e2;
2169
+ --color-rule: #3a332e;
2170
+ --color-edge: #706a67;
2171
+ --color-base: #221d1a;
2172
+ --color-base-2: #222124;
2173
+ --color-base-3: #2d2421;
2174
+ --color-code-background: #221d1a;
2175
+ --color-code-text: #ece6de;
2176
+ --color-error: #ff8f9f;
2177
+ --color-code-comment: #a9a9a9;
2178
+ --color-code-tag: #b4b7b4;
2179
+ --color-code-name: #f48b8d;
2180
+ --color-code-literal: #f99157;
2181
+ --color-code-class: #fc6;
2182
+ --color-code-string: #9c9;
2183
+ --color-code-support: #6cc;
2184
+ --color-code-function: #83add6;
2185
+ --color-code-keyword: #c9c;
2186
+ --color-code-meta: #c6a198;
2187
+ --color-code-added-background: #203622;
2188
+ --color-code-removed-background: #401e1e;
2189
+ }
1129
2190
  }
1130
2191
 
1131
- .comment-content > :last-child {
1132
- margin-bottom: 0;
1133
- }
2192
+ @media (forced-colors: active) {
2193
+ .search-form button, .comment-respond .form-submit button, .comment-respond .form-submit input[type="submit"] {
2194
+ border: 1px solid buttontext;
2195
+ }
1134
2196
 
1135
- .reply {
1136
- margin-top: var(--spacing-2);
1137
- font-family: var(--font-heading);
1138
- font-size: var(--fontSize-0);
1139
- }
2197
+ hr {
2198
+ border-block-start: 1px solid canvastext;
2199
+ }
1140
2200
 
1141
- .no-comments {
1142
- font-family: var(--font-heading);
1143
- font-style: italic;
1144
- }
2201
+ pre, code, .search-snippet mark, .comment-avatar-empty {
2202
+ border: 1px solid canvastext;
2203
+ }
1145
2204
 
1146
- /* The comment form under an open post, and the contact form on a page that
1147
- asked for one. One set of rules rather than two: they are the same kind of
1148
- form, the contact form wears `comment-respond` to say so, and a site
1149
- restyling one cannot leave the other behind. */
2205
+ pre code {
2206
+ border: 0;
2207
+ }
1150
2208
 
1151
- .comment-respond {
1152
- margin-top: var(--spacing-8);
2209
+ .facepile > a, .facepile > span {
2210
+ outline: 1px solid canvastext;
2211
+ }
1153
2212
  }
1154
2213
 
1155
- .comment-respond .comment-reply-title,
1156
- .comment-respond .contact-form-title {
1157
- margin: 0 0 var(--spacing-4);
1158
- font-size: var(--fontSize-4);
2214
+ @property --tw-outline-style {
2215
+ syntax: "*";
2216
+ inherits: false;
2217
+ initial-value: solid;
1159
2218
  }
1160
2219
 
1161
- .comment-respond label {
1162
- display: block;
1163
- margin-bottom: var(--spacing-1);
1164
- font-family: var(--font-heading);
1165
- font-size: var(--fontSize-0);
2220
+ @property --tw-leading {
2221
+ syntax: "*";
2222
+ inherits: false
1166
2223
  }
1167
2224
 
1168
- .comment-field,
1169
- .contact-field,
1170
- .comment-check {
1171
- margin: 0 0 var(--spacing-4);
2225
+ @property --tw-font-weight {
2226
+ syntax: "*";
2227
+ inherits: false
1172
2228
  }
1173
2229
 
1174
- /* The one label that belongs beside its field rather than over it. */
1175
-
1176
- .comment-check label {
1177
- display: inline;
2230
+ @property --tw-tracking {
2231
+ syntax: "*";
2232
+ inherits: false
1178
2233
  }
1179
2234
 
1180
- .comment-respond input[type='text'],
1181
- .comment-respond input[type='email'],
1182
- .comment-respond input[type='url'],
1183
- .comment-respond textarea {
1184
- width: 100%;
1185
- padding: var(--spacing-2);
1186
- border: 1px solid var(--color-base);
1187
- background-color: var(--color-base-3);
1188
- color: var(--color-text);
1189
- font-family: var(--font-body);
1190
- font-size: var(--fontSize-1);
2235
+ @property --tw-border-style {
2236
+ syntax: "*";
2237
+ inherits: false;
2238
+ initial-value: solid;
1191
2239
  }
1192
2240
 
1193
- .comment-respond input[type='text']:focus-visible,
1194
- .comment-respond input[type='email']:focus-visible,
1195
- .comment-respond input[type='url']:focus-visible,
1196
- .comment-respond textarea:focus-visible {
1197
- outline: 2px solid var(--color-primary);
1198
- outline-offset: -1px;
1199
- border-color: var(--color-primary);
2241
+ @property --tw-space-y-reverse {
2242
+ syntax: "*";
2243
+ inherits: false;
2244
+ initial-value: 0;
1200
2245
  }
1201
2246
 
1202
- .comment-respond textarea {
1203
- min-height: 8rem;
1204
- resize: vertical;
2247
+ @property --tw-shadow {
2248
+ syntax: "*";
2249
+ inherits: false;
2250
+ initial-value: 0 0 #0000;
1205
2251
  }
1206
2252
 
1207
- .comment-respond .form-submit button,
1208
- .comment-respond .form-submit input[type='submit'] {
1209
- padding: var(--spacing-2) var(--spacing-6);
1210
- border: none;
1211
- background-color: var(--color-primary);
1212
- color: var(--color-body);
1213
- font-family: var(--font-heading);
1214
- font-size: var(--fontSize-1);
1215
- cursor: pointer;
2253
+ @property --tw-shadow-color {
2254
+ syntax: "*";
2255
+ inherits: false
1216
2256
  }
1217
2257
 
1218
- .comment-respond .form-submit button:hover,
1219
- .comment-respond .form-submit button:focus-visible,
1220
- .comment-respond .form-submit input[type='submit']:hover,
1221
- .comment-respond .form-submit input[type='submit']:focus-visible {
1222
- opacity: 0.85;
2258
+ @property --tw-shadow-alpha {
2259
+ syntax: "<percentage>";
2260
+ inherits: false;
2261
+ initial-value: 100%;
1223
2262
  }
1224
2263
 
1225
- /* What a form says back: the thank-you after a submission, the message about
1226
- one that was refused, and what a reader is answering. */
1227
-
1228
- .comment-notice,
1229
- .comment-error,
1230
- .contact-notice,
1231
- .contact-error {
1232
- margin: 0 0 var(--spacing-4);
1233
- padding: var(--spacing-2) var(--spacing-3);
1234
- border-inline-start: var(--spacing-1) solid var(--color-secondary);
2264
+ @property --tw-inset-shadow {
2265
+ syntax: "*";
2266
+ inherits: false;
2267
+ initial-value: 0 0 #0000;
1235
2268
  }
1236
2269
 
1237
- .comment-error,
1238
- .contact-error {
1239
- border-inline-start-color: var(--color-error);
2270
+ @property --tw-inset-shadow-color {
2271
+ syntax: "*";
2272
+ inherits: false
1240
2273
  }
1241
2274
 
1242
- /* A refused form's summary: what went wrong as its heading, then a link to
1243
- each field to put right. */
1244
- .comment-error h3,
1245
- .contact-error h3 {
1246
- margin: 0;
1247
- font-size: var(--fontSize-1);
2275
+ @property --tw-inset-shadow-alpha {
2276
+ syntax: "<percentage>";
2277
+ inherits: false;
2278
+ initial-value: 100%;
1248
2279
  }
1249
2280
 
1250
- .comment-error ul,
1251
- .contact-error ul {
1252
- margin: var(--spacing-1) 0 0;
2281
+ @property --tw-ring-color {
2282
+ syntax: "*";
2283
+ inherits: false
1253
2284
  }
1254
2285
 
1255
- .comment-replying-to,
1256
- .comment-signed-in {
1257
- margin: 0 0 var(--spacing-4);
1258
- font-family: var(--font-heading);
1259
- font-size: var(--fontSize-0);
2286
+ @property --tw-ring-shadow {
2287
+ syntax: "*";
2288
+ inherits: false;
2289
+ initial-value: 0 0 #0000;
1260
2290
  }
1261
2291
 
1262
- .comment-optional,
1263
- .contact-optional {
1264
- font-size: var(--fontSize-0);
2292
+ @property --tw-inset-ring-color {
2293
+ syntax: "*";
2294
+ inherits: false
1265
2295
  }
1266
2296
 
1267
- .comment-hint,
1268
- .contact-hint,
1269
- .comment-field-error,
1270
- .contact-field-error {
1271
- display: block;
1272
- margin-top: var(--spacing-1);
1273
- font-size: var(--fontSize-0);
2297
+ @property --tw-inset-ring-shadow {
2298
+ syntax: "*";
2299
+ inherits: false;
2300
+ initial-value: 0 0 #0000;
1274
2301
  }
1275
2302
 
1276
- .comment-field-error,
1277
- .contact-field-error {
1278
- color: var(--color-error);
2303
+ @property --tw-ring-inset {
2304
+ syntax: "*";
2305
+ inherits: false
1279
2306
  }
1280
2307
 
1281
- /* Target size. A link that stands on its own rather than inside a sentence,
1282
- and every button, is at least 24 by 24 CSS pixels, the WCAG 2.2 AA minimum
1283
- for something a finger or an unsteady pointer has to hit. A link inside a
1284
- sentence is exempt and keeps the line it sits on. `inline-flex` grows the
1285
- box without moving the text off the baseline it shares with its line. */
1286
-
1287
- .site-nav a,
1288
- .post-categories a,
1289
- .blog-post-nav a,
1290
- .pagination a,
1291
- .comment-metadata a,
1292
- .reply a,
1293
- .comment-error a,
1294
- .contact-error a {
1295
- display: inline-flex;
1296
- align-items: center;
1297
- min-block-size: 24px;
1298
- min-inline-size: 24px;
2308
+ @property --tw-ring-offset-width {
2309
+ syntax: "<length>";
2310
+ inherits: false;
2311
+ initial-value: 0;
1299
2312
  }
1300
2313
 
1301
- .search-form button,
1302
- .comment-respond .form-submit button,
1303
- .comment-respond .form-submit input[type='submit'] {
1304
- min-block-size: 24px;
1305
- min-inline-size: 24px;
2314
+ @property --tw-ring-offset-color {
2315
+ syntax: "*";
2316
+ inherits: false;
2317
+ initial-value: #fff;
1306
2318
  }
1307
2319
 
1308
- .comment-respond input[type='checkbox'] {
1309
- inline-size: 24px;
1310
- block-size: 24px;
1311
- margin: 0;
1312
- vertical-align: middle;
2320
+ @property --tw-ring-offset-shadow {
2321
+ syntax: "*";
2322
+ inherits: false;
2323
+ initial-value: 0 0 #0000;
1313
2324
  }
1314
2325
 
1315
- /*
1316
- The honeypot. Taken out of the flow rather than `display: none`, because some
1317
- form fillers skip fields a browser would not paint at all and this one is
1318
- meant to be filled in.
1319
- */
1320
- .comment-trap,
1321
- .contact-trap {
1322
- position: absolute;
1323
- inset-inline-start: -10000px;
1324
- width: 1px;
1325
- height: 1px;
1326
- overflow: hidden;
2326
+ @property --tw-scale-x {
2327
+ syntax: "*";
2328
+ inherits: false;
2329
+ initial-value: 1;
1327
2330
  }
1328
2331
 
1329
- /* Media queries */
1330
-
1331
- @media (max-width: 42rem) {
1332
- .bio {
1333
- flex-direction: column;
1334
- }
1335
-
1336
- .bio-avatar {
1337
- margin-inline-end: var(--spacing-0);
1338
- margin-bottom: var(--spacing-4);
1339
- }
1340
-
1341
- blockquote {
1342
- margin-inline-start: var(--spacing-0);
1343
- padding-inline-start: var(--spacing-4);
1344
- }
1345
-
1346
- ul,
1347
- ol {
1348
- list-style-position: inside;
1349
- }
1350
-
1351
- .comment-list .children {
1352
- margin-inline-start: var(--spacing-4);
1353
- }
2332
+ @property --tw-scale-y {
2333
+ syntax: "*";
2334
+ inherits: false;
2335
+ initial-value: 1;
1354
2336
  }
1355
2337
 
1356
- /* Forced colours: Windows High Contrast and the like, where the reader's own
1357
- palette replaces every colour here. Borders and outlines survive that and
1358
- backgrounds do not, so anything drawn by a background alone takes a border
1359
- in a system colour: the buttons, which are otherwise a block of the primary
1360
- colour, the rule, which is a 1px background, and a block of code. Focus
1361
- needs nothing: every ring here is an outline, which the forced palette
1362
- redraws in its own colour. */
1363
-
1364
- @media (forced-colors: active) {
1365
- .search-form button,
1366
- .comment-respond .form-submit button,
1367
- .comment-respond .form-submit input[type='submit'] {
1368
- border: 1px solid ButtonText;
1369
- }
1370
-
1371
- hr {
1372
- border-block-start: 1px solid CanvasText;
1373
- }
1374
-
1375
- pre {
1376
- border: 1px solid CanvasText;
1377
- }
2338
+ @property --tw-scale-z {
2339
+ syntax: "*";
2340
+ inherits: false;
2341
+ initial-value: 1;
1378
2342
  }