@geekity/cms 0.39.0 → 0.41.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 (297) hide show
  1. package/admin/pages/appearance/look.njk +135 -0
  2. package/admin/pages/dashboard/home.njk +9 -3
  3. package/admin/pages/documents/conflict.njk +35 -10
  4. package/admin/pages/documents/editor.njk +28 -0
  5. package/admin/pages/documents/list.njk +44 -1
  6. package/admin/pages/settings/general.njk +4 -0
  7. package/admin/pages/users/edit.njk +1 -1
  8. package/admin/src/admin.css +32 -0
  9. package/admin/static/admin.css +197 -3
  10. package/admin/static/dashboard.js +51 -23
  11. package/admin/static/editor.js +19 -19
  12. package/dist/admin/autosave-client.d.ts +85 -0
  13. package/dist/admin/autosave-client.d.ts.map +1 -0
  14. package/dist/admin/autosave-client.js +218 -0
  15. package/dist/admin/autosave-client.js.map +1 -0
  16. package/dist/admin/autosave.d.ts +11 -0
  17. package/dist/admin/autosave.d.ts.map +1 -0
  18. package/dist/admin/autosave.js +76 -0
  19. package/dist/admin/autosave.js.map +1 -0
  20. package/dist/admin/dashboard.d.ts +2 -2
  21. package/dist/admin/dashboard.d.ts.map +1 -1
  22. package/dist/admin/dashboard.js +23 -15
  23. package/dist/admin/dashboard.js.map +1 -1
  24. package/dist/admin/documents.d.ts.map +1 -1
  25. package/dist/admin/documents.js +205 -16
  26. package/dist/admin/documents.js.map +1 -1
  27. package/dist/admin/flash.d.ts +2 -0
  28. package/dist/admin/flash.d.ts.map +1 -1
  29. package/dist/admin/flash.js +12 -0
  30. package/dist/admin/flash.js.map +1 -1
  31. package/dist/admin/focus-mode.d.ts +39 -0
  32. package/dist/admin/focus-mode.d.ts.map +1 -0
  33. package/dist/admin/focus-mode.js +81 -0
  34. package/dist/admin/focus-mode.js.map +1 -0
  35. package/dist/admin/formatting.d.ts +0 -2
  36. package/dist/admin/formatting.d.ts.map +1 -1
  37. package/dist/admin/formatting.js +0 -8
  38. package/dist/admin/formatting.js.map +1 -1
  39. package/dist/admin/look.d.ts +12 -0
  40. package/dist/admin/look.d.ts.map +1 -0
  41. package/dist/admin/look.js +179 -0
  42. package/dist/admin/look.js.map +1 -0
  43. package/dist/admin/menu.d.ts.map +1 -1
  44. package/dist/admin/menu.js +5 -3
  45. package/dist/admin/menu.js.map +1 -1
  46. package/dist/admin/preview.d.ts.map +1 -1
  47. package/dist/admin/preview.js +1 -0
  48. package/dist/admin/preview.js.map +1 -1
  49. package/dist/admin/routes.d.ts.map +1 -1
  50. package/dist/admin/routes.js +6 -4
  51. package/dist/admin/routes.js.map +1 -1
  52. package/dist/admin/settings-fields.d.ts +1 -1
  53. package/dist/admin/settings-fields.d.ts.map +1 -1
  54. package/dist/admin/settings-fields.js +1 -0
  55. package/dist/admin/settings-fields.js.map +1 -1
  56. package/dist/admin/settings-general.d.ts.map +1 -1
  57. package/dist/admin/settings-general.js +1 -0
  58. package/dist/admin/settings-general.js.map +1 -1
  59. package/dist/admin/templates.d.ts +1 -0
  60. package/dist/admin/templates.d.ts.map +1 -1
  61. package/dist/admin/templates.js +2 -1
  62. package/dist/admin/templates.js.map +1 -1
  63. package/dist/admin/users.d.ts.map +1 -1
  64. package/dist/admin/users.js +2 -0
  65. package/dist/admin/users.js.map +1 -1
  66. package/dist/admin/widget-fediverse.js +1 -1
  67. package/dist/admin/widget-posting.d.ts.map +1 -1
  68. package/dist/admin/widget-posting.js +4 -75
  69. package/dist/admin/widget-posting.js.map +1 -1
  70. package/dist/admin/widget-scheduled.js +1 -1
  71. package/dist/admin/widget-top-posts.js +1 -1
  72. package/dist/autosave/index.d.ts +5 -0
  73. package/dist/autosave/index.d.ts.map +1 -0
  74. package/dist/autosave/index.js +3 -0
  75. package/dist/autosave/index.js.map +1 -0
  76. package/dist/autosave/key.d.ts +13 -0
  77. package/dist/autosave/key.d.ts.map +1 -0
  78. package/dist/autosave/key.js +29 -0
  79. package/dist/autosave/key.js.map +1 -0
  80. package/dist/autosave/store.d.ts +23 -0
  81. package/dist/autosave/store.d.ts.map +1 -0
  82. package/dist/autosave/store.js +114 -0
  83. package/dist/autosave/store.js.map +1 -0
  84. package/dist/cli.js +1 -1
  85. package/dist/cli.js.map +1 -1
  86. package/dist/cms/app.d.ts.map +1 -1
  87. package/dist/cms/app.js +1 -0
  88. package/dist/cms/app.js.map +1 -1
  89. package/dist/cms/boot.d.ts.map +1 -1
  90. package/dist/cms/boot.js +2 -0
  91. package/dist/cms/boot.js.map +1 -1
  92. package/dist/cms/create.d.ts +6 -0
  93. package/dist/cms/create.d.ts.map +1 -1
  94. package/dist/cms/create.js +1 -0
  95. package/dist/cms/create.js.map +1 -1
  96. package/dist/cms/server-error.d.ts.map +1 -1
  97. package/dist/cms/server-error.js +6 -6
  98. package/dist/cms/server-error.js.map +1 -1
  99. package/dist/cms/services.d.ts +2 -0
  100. package/dist/cms/services.d.ts.map +1 -1
  101. package/dist/cms/services.js +9 -0
  102. package/dist/cms/services.js.map +1 -1
  103. package/dist/{micropub/content.d.ts → content/html-to-markdown.d.ts} +1 -1
  104. package/dist/content/html-to-markdown.d.ts.map +1 -0
  105. package/dist/{micropub/content.js → content/html-to-markdown.js} +11 -9
  106. package/dist/content/html-to-markdown.js.map +1 -0
  107. package/dist/content/post-type.d.ts +1 -0
  108. package/dist/content/post-type.d.ts.map +1 -1
  109. package/dist/content/post-type.js +1 -1
  110. package/dist/content/post-type.js.map +1 -1
  111. package/dist/content/review.d.ts +14 -0
  112. package/dist/content/review.d.ts.map +1 -1
  113. package/dist/content/review.js +31 -8
  114. package/dist/content/review.js.map +1 -1
  115. package/dist/content/write.d.ts +8 -0
  116. package/dist/content/write.d.ts.map +1 -1
  117. package/dist/content/write.js +1 -1
  118. package/dist/content/write.js.map +1 -1
  119. package/dist/files/data-files.d.ts +2 -0
  120. package/dist/files/data-files.d.ts.map +1 -1
  121. package/dist/files/data-files.js +12 -0
  122. package/dist/files/data-files.js.map +1 -1
  123. package/dist/fonts/css.d.ts +25 -0
  124. package/dist/fonts/css.d.ts.map +1 -0
  125. package/dist/fonts/css.js +88 -0
  126. package/dist/fonts/css.js.map +1 -0
  127. package/dist/fonts/family.d.ts +23 -0
  128. package/dist/fonts/family.d.ts.map +1 -0
  129. package/dist/fonts/family.js +41 -0
  130. package/dist/fonts/family.js.map +1 -0
  131. package/dist/fonts/index.d.ts +10 -0
  132. package/dist/fonts/index.d.ts.map +1 -0
  133. package/dist/fonts/index.js +6 -0
  134. package/dist/fonts/index.js.map +1 -0
  135. package/dist/fonts/job.d.ts +20 -0
  136. package/dist/fonts/job.d.ts.map +1 -0
  137. package/dist/fonts/job.js +49 -0
  138. package/dist/fonts/job.js.map +1 -0
  139. package/dist/fonts/roles.d.ts +53 -0
  140. package/dist/fonts/roles.d.ts.map +1 -0
  141. package/dist/fonts/roles.js +64 -0
  142. package/dist/fonts/roles.js.map +1 -0
  143. package/dist/fonts/store.d.ts +69 -0
  144. package/dist/fonts/store.d.ts.map +1 -0
  145. package/dist/fonts/store.js +237 -0
  146. package/dist/fonts/store.js.map +1 -0
  147. package/dist/maintenance.d.ts +1 -0
  148. package/dist/maintenance.d.ts.map +1 -1
  149. package/dist/maintenance.js +1 -1
  150. package/dist/maintenance.js.map +1 -1
  151. package/dist/micropub/create.js +1 -1
  152. package/dist/micropub/create.js.map +1 -1
  153. package/dist/plugin.d.ts +1 -1
  154. package/dist/plugin.d.ts.map +1 -1
  155. package/dist/settings/registry.d.ts.map +1 -1
  156. package/dist/settings/registry.js +5 -1
  157. package/dist/settings/registry.js.map +1 -1
  158. package/dist/settings/types.d.ts +1 -1
  159. package/dist/settings/types.d.ts.map +1 -1
  160. package/dist/site/dashboard-layout.d.ts +33 -26
  161. package/dist/site/dashboard-layout.d.ts.map +1 -1
  162. package/dist/site/dashboard-layout.js +94 -39
  163. package/dist/site/dashboard-layout.js.map +1 -1
  164. package/dist/site/namespace.d.ts +5 -0
  165. package/dist/site/namespace.d.ts.map +1 -1
  166. package/dist/site/namespace.js +40 -1
  167. package/dist/site/namespace.js.map +1 -1
  168. package/dist/store/schema.d.ts.map +1 -1
  169. package/dist/store/schema.js +4 -0
  170. package/dist/store/schema.js.map +1 -1
  171. package/dist/store/sessions.d.ts +2 -1
  172. package/dist/store/sessions.d.ts.map +1 -1
  173. package/dist/store/sessions.js +30 -12
  174. package/dist/store/sessions.js.map +1 -1
  175. package/dist/theme/font-family.d.ts +13 -0
  176. package/dist/theme/font-family.d.ts.map +1 -0
  177. package/dist/theme/font-family.js +21 -0
  178. package/dist/theme/font-family.js.map +1 -0
  179. package/dist/theme/scheme-tokens.d.ts +50 -0
  180. package/dist/theme/scheme-tokens.d.ts.map +1 -0
  181. package/dist/theme/scheme-tokens.js +240 -0
  182. package/dist/theme/scheme-tokens.js.map +1 -0
  183. package/dist/theme/site-data.d.ts +12 -0
  184. package/dist/theme/site-data.d.ts.map +1 -1
  185. package/dist/theme/site-data.js +15 -0
  186. package/dist/theme/site-data.js.map +1 -1
  187. package/dist/theme/themes.d.ts +74 -0
  188. package/dist/theme/themes.d.ts.map +1 -1
  189. package/dist/theme/themes.js +100 -9
  190. package/dist/theme/themes.js.map +1 -1
  191. package/dist/util/file-size.d.ts +3 -0
  192. package/dist/util/file-size.d.ts.map +1 -0
  193. package/dist/util/file-size.js +9 -0
  194. package/dist/util/file-size.js.map +1 -0
  195. package/dist/web/asset-routes.d.ts.map +1 -1
  196. package/dist/web/asset-routes.js +2 -1
  197. package/dist/web/asset-routes.js.map +1 -1
  198. package/dist/web/conversation.d.ts +15 -0
  199. package/dist/web/conversation.d.ts.map +1 -1
  200. package/dist/web/conversation.js +10 -3
  201. package/dist/web/conversation.js.map +1 -1
  202. package/dist/web/document-page.d.ts.map +1 -1
  203. package/dist/web/document-page.js +11 -13
  204. package/dist/web/document-page.js.map +1 -1
  205. package/dist/web/embed.d.ts.map +1 -1
  206. package/dist/web/embed.js +4 -2
  207. package/dist/web/embed.js.map +1 -1
  208. package/dist/web/env.d.ts +2 -0
  209. package/dist/web/env.d.ts.map +1 -1
  210. package/dist/web/federation-routes.d.ts.map +1 -1
  211. package/dist/web/federation-routes.js +2 -1
  212. package/dist/web/federation-routes.js.map +1 -1
  213. package/dist/web/feed-routes.d.ts +4 -2
  214. package/dist/web/feed-routes.d.ts.map +1 -1
  215. package/dist/web/feed-routes.js +22 -4
  216. package/dist/web/feed-routes.js.map +1 -1
  217. package/dist/web/feed-source.d.ts +1 -1
  218. package/dist/web/feed-source.d.ts.map +1 -1
  219. package/dist/web/feed-source.js +1 -1
  220. package/dist/web/feed-source.js.map +1 -1
  221. package/dist/web/font-routes.d.ts +13 -0
  222. package/dist/web/font-routes.d.ts.map +1 -0
  223. package/dist/web/font-routes.js +27 -0
  224. package/dist/web/font-routes.js.map +1 -0
  225. package/dist/web/listing-pages.d.ts.map +1 -1
  226. package/dist/web/listing-pages.js +12 -14
  227. package/dist/web/listing-pages.js.map +1 -1
  228. package/dist/web/maintenance.d.ts.map +1 -1
  229. package/dist/web/maintenance.js +12 -8
  230. package/dist/web/maintenance.js.map +1 -1
  231. package/dist/web/manifest.d.ts +8 -5
  232. package/dist/web/manifest.d.ts.map +1 -1
  233. package/dist/web/manifest.js +10 -7
  234. package/dist/web/manifest.js.map +1 -1
  235. package/dist/web/markdown-conversation.d.ts +72 -0
  236. package/dist/web/markdown-conversation.d.ts.map +1 -0
  237. package/dist/web/markdown-conversation.js +63 -0
  238. package/dist/web/markdown-conversation.js.map +1 -0
  239. package/dist/web/markdown-page.d.ts +39 -0
  240. package/dist/web/markdown-page.d.ts.map +1 -1
  241. package/dist/web/markdown-page.js +5 -2
  242. package/dist/web/markdown-page.js.map +1 -1
  243. package/dist/web/markdown-representation.d.ts +31 -1
  244. package/dist/web/markdown-representation.d.ts.map +1 -1
  245. package/dist/web/markdown-representation.js +161 -8
  246. package/dist/web/markdown-representation.js.map +1 -1
  247. package/dist/web/negotiate.d.ts +3 -2
  248. package/dist/web/negotiate.d.ts.map +1 -1
  249. package/dist/web/negotiate.js +7 -3
  250. package/dist/web/negotiate.js.map +1 -1
  251. package/dist/web/oembed.d.ts +17 -3
  252. package/dist/web/oembed.d.ts.map +1 -1
  253. package/dist/web/oembed.js +68 -26
  254. package/dist/web/oembed.js.map +1 -1
  255. package/dist/web/render.d.ts +64 -5
  256. package/dist/web/render.d.ts.map +1 -1
  257. package/dist/web/render.js +185 -10
  258. package/dist/web/render.js.map +1 -1
  259. package/dist/web/request.d.ts +0 -3
  260. package/dist/web/request.d.ts.map +1 -1
  261. package/dist/web/request.js +0 -7
  262. package/dist/web/request.js.map +1 -1
  263. package/dist/web/routes.d.ts.map +1 -1
  264. package/dist/web/routes.js +13 -7
  265. package/dist/web/routes.js.map +1 -1
  266. package/dist/web/search.d.ts +6 -3
  267. package/dist/web/search.d.ts.map +1 -1
  268. package/dist/web/search.js +20 -5
  269. package/dist/web/search.js.map +1 -1
  270. package/dist/web/site-index.d.ts.map +1 -1
  271. package/dist/web/site-index.js +2 -1
  272. package/dist/web/site-index.js.map +1 -1
  273. package/dist/web/status-pages.d.ts +19 -0
  274. package/dist/web/status-pages.d.ts.map +1 -0
  275. package/dist/web/status-pages.js +44 -0
  276. package/dist/web/status-pages.js.map +1 -0
  277. package/dist/webmention/fetch-public.d.ts +6 -0
  278. package/dist/webmention/fetch-public.d.ts.map +1 -1
  279. package/dist/webmention/fetch-public.js +6 -1
  280. package/dist/webmention/fetch-public.js.map +1 -1
  281. package/package.json +1 -1
  282. package/themes/default/layouts/404.md.njk +8 -0
  283. package/themes/default/layouts/410.md.njk +7 -0
  284. package/themes/default/layouts/500.md.njk +8 -0
  285. package/themes/default/layouts/503.md.njk +9 -0
  286. package/themes/default/layouts/base.njk +28 -16
  287. package/themes/default/layouts/page.njk +4 -8
  288. package/themes/default/partials/bio.njk +1 -1
  289. package/themes/default/partials/contact-form.njk +1 -1
  290. package/themes/default/partials/markdown-footer.md.njk +121 -3
  291. package/themes/default/partials/markdown-header.md.njk +102 -0
  292. package/themes/default/partials/markdown-reply.md.njk +31 -0
  293. package/themes/default/src/style.css +326 -15
  294. package/themes/default/static/style.css +489 -3
  295. package/themes/default/theme.json +23 -1
  296. package/dist/micropub/content.d.ts.map +0 -1
  297. package/dist/micropub/content.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { randomBytes } from 'node:crypto';
2
+ const FLASH_KINDS = new Set(['notice', 'warning', 'error']);
2
3
  /** How long a session id is, in bytes. 32 is the 256 bits doc-5 asks for. */
3
4
  export const SESSION_ID_BYTES = 32;
4
5
  export function openSessionStore(db, isReadOnly, clock) {
@@ -13,6 +14,8 @@ export function openSessionStore(db, isReadOnly, clock) {
13
14
  pruneSessions: db.prepare('DELETE FROM sessions WHERE expires_at <= ?'),
14
15
  readFlash: db.prepare('SELECT flash FROM sessions WHERE id = ?'),
15
16
  writeFlash: db.prepare('UPDATE sessions SET flash = ? WHERE id = ?'),
17
+ readCleared: db.prepare('SELECT cleared_autosaves FROM sessions WHERE id = ?'),
18
+ writeCleared: db.prepare('UPDATE sessions SET cleared_autosaves = ? WHERE id = ?'),
16
19
  };
17
20
  /**
18
21
  * The messages queued on a session. A column that will not parse is treated
@@ -21,16 +24,11 @@ export function openSessionStore(db, isReadOnly, clock) {
21
24
  */
22
25
  function readFlash(sessionId) {
23
26
  const row = statements.readFlash.get(sessionId);
24
- const raw = row?.['flash'];
25
- if (typeof raw !== 'string' || raw === '')
26
- return [];
27
- try {
28
- const parsed = JSON.parse(raw);
29
- return Array.isArray(parsed) ? parsed.filter(isFlashMessage) : [];
30
- }
31
- catch {
32
- return [];
33
- }
27
+ return parseList(row?.['flash']).filter(isFlashMessage);
28
+ }
29
+ function readCleared(sessionId) {
30
+ const row = statements.readCleared.get(sessionId);
31
+ return parseList(row?.['cleared_autosaves']).filter((key) => typeof key === 'string');
34
32
  }
35
33
  return {
36
34
  createSession(input) {
@@ -78,14 +76,34 @@ export function openSessionStore(db, isReadOnly, clock) {
78
76
  statements.writeFlash.run(null, sessionId);
79
77
  return queued;
80
78
  },
79
+ pushClearedAutosave(sessionId, key) {
80
+ const queued = [...readCleared(sessionId), key];
81
+ statements.writeCleared.run(JSON.stringify(queued), sessionId);
82
+ },
83
+ takeClearedAutosaves(sessionId) {
84
+ const queued = readCleared(sessionId);
85
+ if (!isReadOnly())
86
+ statements.writeCleared.run(null, sessionId);
87
+ return queued;
88
+ },
81
89
  };
82
90
  }
91
+ function parseList(raw) {
92
+ if (typeof raw !== 'string' || raw === '')
93
+ return [];
94
+ try {
95
+ const parsed = JSON.parse(raw);
96
+ return Array.isArray(parsed) ? parsed : [];
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
83
102
  function isFlashMessage(value) {
84
103
  if (typeof value !== 'object' || value === null)
85
104
  return false;
86
105
  const entry = value;
87
- return ((entry['kind'] === 'notice' || entry['kind'] === 'warning' || entry['kind'] === 'error') &&
88
- typeof entry['message'] === 'string');
106
+ return FLASH_KINDS.has(entry['kind']) && typeof entry['message'] === 'string';
89
107
  }
90
108
  function toSession(row) {
91
109
  const userId = row['user_id'];
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Whether `name` can be a Google Fonts family name: letters and digits in
3
+ * words split by single spaces, as every family Google lists is.
4
+ */
5
+ export declare function isFontFamilyName(name: string): boolean;
6
+ export type CssFontStack = string & {
7
+ readonly __brand: 'CssFontStack';
8
+ };
9
+ /** `list` trimmed, when it is a comma-separated list of family names, plain or quoted. */
10
+ export declare function cssFontStack(list: string): CssFontStack | undefined;
11
+ /** `stack` with `family` quoted in front of it, when `family` is a font family name. */
12
+ export declare function cssFontStackWith(family: string, stack: CssFontStack): CssFontStack | undefined;
13
+ //# sourceMappingURL=font-family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-family.d.ts","sourceRoot":"","sources":["../../src/theme/font-family.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AAIzE,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAKnE;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAE9F"}
@@ -0,0 +1,21 @@
1
+ const MAX_FAMILY_LENGTH = 64;
2
+ /**
3
+ * Whether `name` can be a Google Fonts family name: letters and digits in
4
+ * words split by single spaces, as every family Google lists is.
5
+ */
6
+ export function isFontFamilyName(name) {
7
+ return name.length <= MAX_FAMILY_LENGTH && /^[A-Za-z0-9]+(?: [A-Za-z0-9]+)*$/.test(name);
8
+ }
9
+ const STACK_FAMILY = /^(?:'[^'"\\<>;{}]*'|"[^'"\\<>;{}]*"|[\w-]+(?: +[\w-]+)*)$/;
10
+ /** `list` trimmed, when it is a comma-separated list of family names, plain or quoted. */
11
+ export function cssFontStack(list) {
12
+ const stack = list.trim();
13
+ return stack.split(',').every((family) => STACK_FAMILY.test(family.trim()))
14
+ ? stack
15
+ : undefined;
16
+ }
17
+ /** `stack` with `family` quoted in front of it, when `family` is a font family name. */
18
+ export function cssFontStackWith(family, stack) {
19
+ return isFontFamilyName(family) ? `"${family}", ${stack}` : undefined;
20
+ }
21
+ //# sourceMappingURL=font-family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-family.js","sourceRoot":"","sources":["../../src/theme/font-family.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,MAAM,IAAI,iBAAiB,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3F,CAAC;AAID,MAAM,YAAY,GAAG,2DAA2D,CAAC;AAEjF,0FAA0F;AAC1F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC,CAAE,KAAsB;QACzB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAmB;IAClE,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,MAAM,MAAM,KAAK,EAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,50 @@
1
+ export interface StyleRule {
2
+ readonly selectors: readonly string[];
3
+ /** The conditions of every `@media` around it, innermost last. */
4
+ readonly media: readonly string[];
5
+ readonly layered: boolean;
6
+ readonly declarations: ReadonlyMap<string, string>;
7
+ /** Whether it held a rule of its own, which this reader does not flatten. */
8
+ readonly nested: boolean;
9
+ }
10
+ export interface TokenPage {
11
+ readonly scheme?: string | undefined;
12
+ readonly mode?: 'light' | 'dark' | undefined;
13
+ readonly system: 'light' | 'dark';
14
+ }
15
+ /**
16
+ * The style rules that set a colour token or `color-scheme`, in source order.
17
+ *
18
+ * `@layer`, `@supports` and `@media` are looked through, recording the media
19
+ * conditions and whether a layer was crossed; any other at-rule (`@property`,
20
+ * `@keyframes`) holds nothing read here.
21
+ */
22
+ export declare function stylesheetRules(css: string): StyleRule[];
23
+ export declare function selectorMatches(selector: string, page: TokenPage): boolean;
24
+ /** Whether a media condition holds for this reader; only the colour scheme is asked. */
25
+ export declare function mediaHolds(condition: string, page: TokenPage): boolean;
26
+ /**
27
+ * What this reader cannot read in the rules it found: a selector or a media
28
+ * condition it would misjudge, or a rule with another nested inside. A rule
29
+ * like that is passed over, so a stylesheet with any of these may be drawn
30
+ * differently from what {@link computedTokens} says.
31
+ */
32
+ export declare function stylesheetProblems(rules: readonly StyleRule[]): string[];
33
+ export declare function computedTokens(rules: readonly StyleRule[], page: TokenPage): Map<string, string>;
34
+ /**
35
+ * Only the colour tokens, keyed without the `--color-` prefix: `body`,
36
+ * `text`, `primary` and the rest.
37
+ */
38
+ export declare function colorTokens(properties: ReadonlyMap<string, string>): Map<string, string>;
39
+ /** One scheme's colour tokens in each mode, keyed as {@link colorTokens} keys them. */
40
+ export interface SchemeTokens {
41
+ readonly light: ReadonlyMap<string, string>;
42
+ readonly dark: ReadonlyMap<string, string>;
43
+ }
44
+ /**
45
+ * The colour tokens of `scheme` in the stylesheet at `file`, light and dark.
46
+ * The file is parsed once and again only when it changes. A file that cannot
47
+ * be read has no tokens.
48
+ */
49
+ export declare function schemeTokens(file: string, scheme: string): SchemeTokens;
50
+ //# sourceMappingURL=scheme-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme-tokens.d.ts","sourceRoot":"","sources":["../../src/theme/scheme-tokens.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAgDxD;AAwFD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAG1E;AAID,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,EAAE,CAcxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA0BhG;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxF;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAKvE"}
@@ -0,0 +1,240 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ const READ = (property) => property.startsWith('--color-') || property === 'color-scheme';
3
+ /**
4
+ * The style rules that set a colour token or `color-scheme`, in source order.
5
+ *
6
+ * `@layer`, `@supports` and `@media` are looked through, recording the media
7
+ * conditions and whether a layer was crossed; any other at-rule (`@property`,
8
+ * `@keyframes`) holds nothing read here.
9
+ */
10
+ export function stylesheetRules(css) {
11
+ const rules = [];
12
+ const source = css.replaceAll(/\/\*[\s\S]*?\*\//g, '');
13
+ function walk(from, to, media, layered) {
14
+ let at = from;
15
+ while (at < to) {
16
+ const open = source.indexOf('{', at);
17
+ const semicolon = source.indexOf(';', at);
18
+ if (open === -1 || open >= to)
19
+ return;
20
+ if (semicolon !== -1 && semicolon < open) {
21
+ at = semicolon + 1;
22
+ continue;
23
+ }
24
+ const prelude = source.slice(at, open).trim();
25
+ const close = closingBrace(source, open);
26
+ if (close === -1)
27
+ return;
28
+ if (prelude.startsWith('@media')) {
29
+ walk(open + 1, close, [...media, prelude.slice('@media'.length).trim()], layered);
30
+ }
31
+ else if (prelude.startsWith('@layer')) {
32
+ walk(open + 1, close, media, true);
33
+ }
34
+ else if (prelude.startsWith('@supports')) {
35
+ walk(open + 1, close, media, layered);
36
+ }
37
+ else if (!prelude.startsWith('@')) {
38
+ const body = source.slice(open + 1, close);
39
+ const declarations = new Map();
40
+ for (const [, name = '', value = ''] of body.matchAll(/([\w-]+)\s*:\s*([^;]+)/g)) {
41
+ if (READ(name))
42
+ declarations.set(name, value.trim());
43
+ }
44
+ if (declarations.size > 0) {
45
+ rules.push({
46
+ selectors: splitTopLevel(prelude),
47
+ media,
48
+ layered,
49
+ declarations,
50
+ nested: body.includes('{'),
51
+ });
52
+ }
53
+ }
54
+ at = close + 1;
55
+ }
56
+ }
57
+ walk(0, source.length, [], false);
58
+ return rules;
59
+ }
60
+ function closingBrace(css, open) {
61
+ let depth = 0;
62
+ for (let index = open; index < css.length; index += 1) {
63
+ if (css[index] === '{')
64
+ depth += 1;
65
+ if (css[index] === '}') {
66
+ depth -= 1;
67
+ if (depth === 0)
68
+ return index;
69
+ }
70
+ }
71
+ return -1;
72
+ }
73
+ function splitTopLevel(list) {
74
+ const parts = [];
75
+ let depth = 0;
76
+ let start = 0;
77
+ for (let index = 0; index < list.length; index += 1) {
78
+ if (list[index] === '(')
79
+ depth += 1;
80
+ if (list[index] === ')')
81
+ depth -= 1;
82
+ if (list[index] === ',' && depth === 0) {
83
+ parts.push(list.slice(start, index).trim());
84
+ start = index + 1;
85
+ }
86
+ }
87
+ parts.push(list.slice(start).trim());
88
+ return parts;
89
+ }
90
+ function matchSelector(selector, page) {
91
+ const attributes = {
92
+ 'data-scheme': page.scheme,
93
+ 'data-mode': page.mode,
94
+ };
95
+ let rest = selector.trim();
96
+ let matches = true;
97
+ let specificity = 0;
98
+ while (rest !== '') {
99
+ if (rest.startsWith(':root')) {
100
+ specificity += 1;
101
+ rest = rest.slice(':root'.length);
102
+ continue;
103
+ }
104
+ if (rest.startsWith(':host'))
105
+ return { matches: false, specificity: 0 };
106
+ const attribute = /^\[([\w-]+)(?:=(["']?)([^"'\]]*)\2)?\]/.exec(rest);
107
+ if (attribute) {
108
+ const [whole, name = '', , value] = attribute;
109
+ const actual = attributes[name];
110
+ matches &&= value === undefined ? actual !== undefined : actual === value;
111
+ specificity += 1;
112
+ rest = rest.slice(whole.length);
113
+ continue;
114
+ }
115
+ const pseudo = /^:(not|is|where)\(/.exec(rest);
116
+ if (!pseudo)
117
+ return { unreadable: selector };
118
+ const open = pseudo[0].length - 1;
119
+ let depth = 0;
120
+ let close = open;
121
+ for (; close < rest.length; close += 1) {
122
+ if (rest[close] === '(')
123
+ depth += 1;
124
+ if (rest[close] === ')')
125
+ depth -= 1;
126
+ if (depth === 0)
127
+ break;
128
+ }
129
+ const inner = splitTopLevel(rest.slice(open + 1, close)).map((part) => matchSelector(part, page));
130
+ const unreadable = inner.find((result) => 'unreadable' in result);
131
+ if (unreadable !== undefined)
132
+ return unreadable;
133
+ const known = inner.flatMap((result) => ('matches' in result ? [result] : []));
134
+ const any = known.some((result) => result.matches);
135
+ const most = Math.max(0, ...known.map((result) => result.specificity));
136
+ if (pseudo[1] === 'not')
137
+ matches &&= !any;
138
+ else
139
+ matches &&= any;
140
+ if (pseudo[1] !== 'where')
141
+ specificity += most;
142
+ rest = rest.slice(close + 1);
143
+ }
144
+ return { matches, specificity };
145
+ }
146
+ export function selectorMatches(selector, page) {
147
+ const result = matchSelector(selector, page);
148
+ return 'matches' in result && result.matches;
149
+ }
150
+ const COLOR_SCHEME_QUERY = /^\(prefers-color-scheme:\s*(light|dark)\)$/;
151
+ /** Whether a media condition holds for this reader; only the colour scheme is asked. */
152
+ export function mediaHolds(condition, page) {
153
+ return COLOR_SCHEME_QUERY.exec(condition)?.[1] === page.system;
154
+ }
155
+ /**
156
+ * What this reader cannot read in the rules it found: a selector or a media
157
+ * condition it would misjudge, or a rule with another nested inside. A rule
158
+ * like that is passed over, so a stylesheet with any of these may be drawn
159
+ * differently from what {@link computedTokens} says.
160
+ */
161
+ export function stylesheetProblems(rules) {
162
+ const problems = new Set();
163
+ const page = { system: 'light' };
164
+ for (const rule of rules) {
165
+ if (rule.nested)
166
+ problems.add(`a nested rule under ${rule.selectors.join(', ')}`);
167
+ for (const condition of rule.media) {
168
+ if (!COLOR_SCHEME_QUERY.test(condition))
169
+ problems.add(`@media ${condition}`);
170
+ }
171
+ for (const selector of rule.selectors) {
172
+ const result = matchSelector(selector, page);
173
+ if ('unreadable' in result)
174
+ problems.add(`the selector ${result.unreadable}`);
175
+ }
176
+ }
177
+ return [...problems];
178
+ }
179
+ export function computedTokens(rules, page) {
180
+ const applying = [];
181
+ rules.forEach((rule, order) => {
182
+ if (rule.nested)
183
+ return;
184
+ if (!rule.media.every((condition) => mediaHolds(condition, page)))
185
+ return;
186
+ const matching = rule.selectors
187
+ .map((selector) => matchSelector(selector, page))
188
+ .flatMap((result) => ('matches' in result && result.matches ? [result] : []));
189
+ if (matching.length === 0)
190
+ return;
191
+ const specificity = Math.max(...matching.map((result) => result.specificity));
192
+ applying.push({ rule, specificity, order });
193
+ });
194
+ applying.sort((a, b) => Number(!a.rule.layered) - Number(!b.rule.layered) ||
195
+ a.specificity - b.specificity ||
196
+ a.order - b.order);
197
+ const properties = new Map();
198
+ for (const { rule } of applying) {
199
+ for (const [name, value] of rule.declarations)
200
+ properties.set(name, value);
201
+ }
202
+ return properties;
203
+ }
204
+ /**
205
+ * Only the colour tokens, keyed without the `--color-` prefix: `body`,
206
+ * `text`, `primary` and the rest.
207
+ */
208
+ export function colorTokens(properties) {
209
+ return new Map([...properties]
210
+ .filter(([name]) => name.startsWith('--color-'))
211
+ .map(([name, value]) => [name.slice('--color-'.length), value]));
212
+ }
213
+ const parsed = new Map();
214
+ /**
215
+ * The colour tokens of `scheme` in the stylesheet at `file`, light and dark.
216
+ * The file is parsed once and again only when it changes. A file that cannot
217
+ * be read has no tokens.
218
+ */
219
+ export function schemeTokens(file, scheme) {
220
+ const rules = rulesOfFile(file);
221
+ const drawn = (system) => colorTokens(computedTokens(rules, { scheme, system }));
222
+ return { light: drawn('light'), dark: drawn('dark') };
223
+ }
224
+ function rulesOfFile(file) {
225
+ let key;
226
+ try {
227
+ const stats = statSync(file);
228
+ key = `${String(stats.mtimeMs)}:${String(stats.size)}:${String(stats.ino)}`;
229
+ }
230
+ catch {
231
+ return [];
232
+ }
233
+ const cached = parsed.get(file);
234
+ if (cached?.key === key)
235
+ return cached.rules;
236
+ const rules = stylesheetRules(readFileSync(file, 'utf8'));
237
+ parsed.set(file, { key, rules });
238
+ return rules;
239
+ }
240
+ //# sourceMappingURL=scheme-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme-tokens.js","sourceRoot":"","sources":["../../src/theme/scheme-tokens.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ResolvedConfig } from '../config.ts';
2
2
  import type { TaxonomyBases, TaxonomyRedirect } from '../content/taxonomy.ts';
3
+ import type { ColorMode, ThemeScheme } from './themes.ts';
3
4
  /** Where the site-wide data file lives, relative to the content directory. */
4
5
  export declare const SITE_DATA_FILE = "_data/site.json";
5
6
  /** How many posts a listing page holds when the site does not say. */
@@ -184,4 +185,15 @@ export interface FrontPageSlugs {
184
185
  /** The page whose permalink carries the listing, or empty for none. */
185
186
  postsPage: string;
186
187
  }
188
+ export interface SiteColors {
189
+ readonly scheme: ThemeScheme;
190
+ readonly mode: ColorMode;
191
+ }
192
+ /**
193
+ * The scheme a page of this site is drawn in, out of the theme's `schemes`,
194
+ * and its mode: `colorScheme` when the theme declares it, else the theme's
195
+ * first, and `colorMode` when it is one of {@link COLOR_MODES}, else `system`.
196
+ * `undefined` for a theme with no schemes, whose page names neither.
197
+ */
198
+ export declare function siteColors(site: SiteData, schemes: readonly ThemeScheme[]): SiteColors | undefined;
187
199
  //# sourceMappingURL=site-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"site-data.d.ts","sourceRoot":"","sources":["../../src/theme/site-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"site-data.d.ts","sourceRoot":"","sources":["../../src/theme/site-data.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { canonicalLocale, DEFAULT_LOCALE } from '../content/locale.js';
4
4
  import { DEFAULT_TAXONOMY_BASES, taxonomyBasesOrDefault, taxonomyRedirectsOf, } from '../content/taxonomy.js';
5
5
  import { DEFAULT_TIMEZONE } from '../content/time.js';
6
6
  import { isRecord } from '../util/guards.js';
7
+ import { COLOR_MODES, themeScheme } from './themes.js';
7
8
  /** Where the site-wide data file lives, relative to the content directory. */
8
9
  export const SITE_DATA_FILE = '_data/site.json';
9
10
  /** How many posts a listing page holds when the site does not say. */
@@ -157,4 +158,18 @@ export function taxonomyBases(site) {
157
158
  export function termRedirects(site) {
158
159
  return taxonomyRedirectsOf(site['taxonomyRedirects']);
159
160
  }
161
+ /**
162
+ * The scheme a page of this site is drawn in, out of the theme's `schemes`,
163
+ * and its mode: `colorScheme` when the theme declares it, else the theme's
164
+ * first, and `colorMode` when it is one of {@link COLOR_MODES}, else `system`.
165
+ * `undefined` for a theme with no schemes, whose page names neither.
166
+ */
167
+ export function siteColors(site, schemes) {
168
+ const named = site['colorScheme'];
169
+ const scheme = themeScheme(schemes, typeof named === 'string' ? named.trim() : '');
170
+ if (scheme === undefined)
171
+ return undefined;
172
+ const mode = COLOR_MODES.find((each) => each === site['colorMode']) ?? 'system';
173
+ return { scheme, mode };
174
+ }
160
175
  //# sourceMappingURL=site-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"site-data.js","sourceRoot":"","sources":["../../src/theme/site-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"site-data.js","sourceRoot":"","sources":["../../src/theme/site-data.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { CssFontStack } from './font-family.ts';
1
2
  /**
2
3
  * Where a theme is, and what makes a directory one.
3
4
  *
@@ -77,6 +78,62 @@ export interface ThemeColors {
77
78
  readonly dark?: string | undefined;
78
79
  };
79
80
  }
81
+ /**
82
+ * One colour scheme a theme draws, as its `theme.json` lists it under
83
+ * `schemes` (decision-61):
84
+ *
85
+ * "schemes": [
86
+ * { "name": "paper", "label": "Paper", "themeColor": { "light": "#faf7f2", "dark": "#171412" } },
87
+ * { "name": "slate", "label": "Slate" }
88
+ * ]
89
+ *
90
+ * The first is the theme's default. The `name` is what the page prints as
91
+ * `data-scheme` on `<html>` and what the stylesheet selects on, so it is
92
+ * lower-case letters, digits and hyphens. The `themeColor` is the browser
93
+ * chrome for that scheme; whatever a scheme leaves out is the manifest's
94
+ * top-level `themeColor`.
95
+ */
96
+ export interface ThemeScheme {
97
+ readonly name: string;
98
+ readonly label: string;
99
+ readonly themeColor: ThemeColors['themeColor'];
100
+ }
101
+ /**
102
+ * One font role a theme declares, as its `theme.json` writes it under `fonts`
103
+ * (decision-61):
104
+ *
105
+ * "fonts": {
106
+ * "heading": { "label": "Headings", "fallback": "Georgia, serif" },
107
+ * "body": { "label": "Body text", "fallback": "Georgia, serif" }
108
+ * }
109
+ *
110
+ * A role is a place the theme's stylesheet reads a font from: it sets
111
+ * `font-family` from the `--font-<role>` custom property and gives that
112
+ * property the `fallback` stack on `:root`. A page that sets a font for the
113
+ * role sets the property to the family followed by the fallback. Both are
114
+ * printed into a style rule, so the role is lower-case letters, digits and
115
+ * hyphens, and the fallback is a comma-separated list of family names, plain
116
+ * or quoted.
117
+ */
118
+ export interface ThemeFont {
119
+ readonly role: string;
120
+ readonly label: string;
121
+ /** The custom property the stylesheet reads the role from: `--font-<role>`. */
122
+ readonly property: `--font-${string}`;
123
+ /** The `font-family` list the role uses when the site sets no font. */
124
+ readonly fallback: CssFontStack;
125
+ }
126
+ /**
127
+ * Whether a page follows the reader's system setting or is always light or
128
+ * always dark (decision-61): the `colorMode` setting.
129
+ */
130
+ export declare const COLOR_MODES: readonly ['system', 'light', 'dark'];
131
+ export type ColorMode = (typeof COLOR_MODES)[number];
132
+ /**
133
+ * Why `name` cannot be the `colorScheme` of a site whose theme draws
134
+ * `schemes`, or `undefined` when it can. Empty always can: it is the first.
135
+ */
136
+ export declare function colorSchemeProblem(schemes: readonly ThemeScheme[], name: string): string | undefined;
80
137
  /** One theme directory, read and validated. */
81
138
  export interface Theme {
82
139
  /** The directory name, which is the theme's id and what a site.json names. */
@@ -97,6 +154,10 @@ export interface Theme {
97
154
  readonly areas: readonly ThemeArea[];
98
155
  /** The colours the manifest declares, each one absent when it declares none. */
99
156
  readonly colors: ThemeColors;
157
+ /** The colour schemes it draws, default first. Empty for a theme that declares none. */
158
+ readonly schemes: readonly ThemeScheme[];
159
+ /** The font roles it declares, in manifest order. Empty for a theme that declares none. */
160
+ readonly fonts: readonly ThemeFont[];
100
161
  }
101
162
  /** A theme, or the reason the directory is not one. */
102
163
  export type ThemeRead = {
@@ -118,6 +179,12 @@ export type ThemeRead = {
118
179
  * in it soon enough.
119
180
  */
120
181
  export declare function readTheme(dir: string): ThemeRead;
182
+ /**
183
+ * The scheme a page is drawn in: the one named, or the theme's first when the
184
+ * name is empty or names a scheme the theme does not declare, so a site that
185
+ * switches themes keeps rendering. `undefined` only for a theme with no schemes.
186
+ */
187
+ export declare function themeScheme(schemes: readonly ThemeScheme[], name: string): ThemeScheme | undefined;
121
188
  /** A directory under the themes directory that turned out not to be a theme. */
122
189
  export interface UnreadableTheme {
123
190
  /** The directory name, as it sits on disk. */
@@ -191,6 +258,13 @@ export interface ChosenTheme {
191
258
  readonly problem: string | undefined;
192
259
  /** The colours the page declares: {@link ThemeColors}, the packaged theme's where this one is silent. */
193
260
  readonly colors: ThemeColors;
261
+ /**
262
+ * The colour schemes the site may choose from, default first. Pick the one a
263
+ * page uses with {@link themeScheme}.
264
+ */
265
+ readonly schemes: readonly ThemeScheme[];
266
+ /** The font roles the site may set a font for, in manifest order. */
267
+ readonly fonts: readonly ThemeFont[];
194
268
  }
195
269
  /**
196
270
  * The theme one site has chosen, resolved against its themes directory.