@geekity/cms 0.40.0 → 0.42.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.
- package/admin/components/blocks.njk +15 -1
- package/admin/pages/appearance/look.njk +135 -0
- package/admin/pages/dashboard/home.njk +9 -3
- package/admin/pages/documents/conflict.njk +35 -10
- package/admin/pages/documents/editor.njk +29 -0
- package/admin/pages/documents/list.njk +44 -1
- package/admin/pages/settings/general.njk +4 -0
- package/admin/pages/settings/reading.njk +14 -0
- package/admin/pages/users/edit.njk +1 -1
- package/admin/pages/users/writing-goals.njk +64 -0
- package/admin/src/admin.css +32 -0
- package/admin/static/admin.css +202 -4
- package/admin/static/dashboard.js +51 -23
- package/admin/static/editor.js +22 -19
- package/dist/access-log.d.ts +3 -0
- package/dist/access-log.d.ts.map +1 -1
- package/dist/access-log.js +13 -9
- package/dist/access-log.js.map +1 -1
- package/dist/admin/autosave-client.d.ts +85 -0
- package/dist/admin/autosave-client.d.ts.map +1 -0
- package/dist/admin/autosave-client.js +218 -0
- package/dist/admin/autosave-client.js.map +1 -0
- package/dist/admin/autosave.d.ts +12 -0
- package/dist/admin/autosave.d.ts.map +1 -0
- package/dist/admin/autosave.js +92 -0
- package/dist/admin/autosave.js.map +1 -0
- package/dist/admin/blocks.d.ts +13 -1
- package/dist/admin/blocks.d.ts.map +1 -1
- package/dist/admin/blocks.js +40 -5
- package/dist/admin/blocks.js.map +1 -1
- package/dist/admin/core-widgets.d.ts.map +1 -1
- package/dist/admin/core-widgets.js +2 -0
- package/dist/admin/core-widgets.js.map +1 -1
- package/dist/admin/dashboard.d.ts +2 -2
- package/dist/admin/dashboard.d.ts.map +1 -1
- package/dist/admin/dashboard.js +23 -15
- package/dist/admin/dashboard.js.map +1 -1
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +223 -16
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-word-counter.d.ts +8 -0
- package/dist/admin/editor-word-counter.d.ts.map +1 -0
- package/dist/admin/editor-word-counter.js +27 -0
- package/dist/admin/editor-word-counter.js.map +1 -0
- package/dist/admin/editor-words.d.ts +7 -0
- package/dist/admin/editor-words.d.ts.map +1 -0
- package/dist/admin/editor-words.js +9 -0
- package/dist/admin/editor-words.js.map +1 -0
- package/dist/admin/flash.d.ts +2 -0
- package/dist/admin/flash.d.ts.map +1 -1
- package/dist/admin/flash.js +12 -0
- package/dist/admin/flash.js.map +1 -1
- package/dist/admin/focus-mode.d.ts +37 -0
- package/dist/admin/focus-mode.d.ts.map +1 -0
- package/dist/admin/focus-mode.js +71 -0
- package/dist/admin/focus-mode.js.map +1 -0
- package/dist/admin/look.d.ts +12 -0
- package/dist/admin/look.d.ts.map +1 -0
- package/dist/admin/look.js +179 -0
- package/dist/admin/look.js.map +1 -0
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +7 -3
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +1 -0
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +8 -4
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/settings-fields.d.ts +1 -1
- package/dist/admin/settings-fields.d.ts.map +1 -1
- package/dist/admin/settings-fields.js +2 -0
- package/dist/admin/settings-fields.js.map +1 -1
- package/dist/admin/settings-general.d.ts.map +1 -1
- package/dist/admin/settings-general.js +1 -0
- package/dist/admin/settings-general.js.map +1 -1
- package/dist/admin/settings-reading.d.ts.map +1 -1
- package/dist/admin/settings-reading.js +7 -1
- package/dist/admin/settings-reading.js.map +1 -1
- package/dist/admin/templates.d.ts +2 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +2 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/users.d.ts.map +1 -1
- package/dist/admin/users.js +4 -0
- package/dist/admin/users.js.map +1 -1
- package/dist/admin/widget-writing.d.ts +3 -0
- package/dist/admin/widget-writing.d.ts.map +1 -0
- package/dist/admin/widget-writing.js +102 -0
- package/dist/admin/widget-writing.js.map +1 -0
- package/dist/admin/widgets.d.ts +4 -1
- package/dist/admin/widgets.d.ts.map +1 -1
- package/dist/admin/widgets.js +19 -8
- package/dist/admin/widgets.js.map +1 -1
- package/dist/admin/writing-goals.d.ts +33 -0
- package/dist/admin/writing-goals.d.ts.map +1 -0
- package/dist/admin/writing-goals.js +149 -0
- package/dist/admin/writing-goals.js.map +1 -0
- package/dist/autosave/index.d.ts +5 -0
- package/dist/autosave/index.d.ts.map +1 -0
- package/dist/autosave/index.js +3 -0
- package/dist/autosave/index.js.map +1 -0
- package/dist/autosave/key.d.ts +13 -0
- package/dist/autosave/key.d.ts.map +1 -0
- package/dist/autosave/key.js +29 -0
- package/dist/autosave/key.js.map +1 -0
- package/dist/autosave/store.d.ts +23 -0
- package/dist/autosave/store.d.ts.map +1 -0
- package/dist/autosave/store.js +114 -0
- package/dist/autosave/store.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +65 -4
- package/dist/cli.js.map +1 -1
- package/dist/cms/app.d.ts.map +1 -1
- package/dist/cms/app.js +1 -0
- package/dist/cms/app.js.map +1 -1
- package/dist/cms/boot.d.ts.map +1 -1
- package/dist/cms/boot.js +2 -0
- package/dist/cms/boot.js.map +1 -1
- package/dist/cms/create.d.ts +11 -2
- package/dist/cms/create.d.ts.map +1 -1
- package/dist/cms/create.js +61 -2
- package/dist/cms/create.js.map +1 -1
- package/dist/cms/server-error.d.ts.map +1 -1
- package/dist/cms/server-error.js +1 -0
- package/dist/cms/server-error.js.map +1 -1
- package/dist/cms/services.d.ts +2 -0
- package/dist/cms/services.d.ts.map +1 -1
- package/dist/cms/services.js +14 -0
- package/dist/cms/services.js.map +1 -1
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/content/post-type.d.ts +1 -0
- package/dist/content/post-type.d.ts.map +1 -1
- package/dist/content/post-type.js +1 -1
- package/dist/content/post-type.js.map +1 -1
- package/dist/content/words.d.ts +3 -0
- package/dist/content/words.d.ts.map +1 -0
- package/dist/content/words.js +120 -0
- package/dist/content/words.js.map +1 -0
- package/dist/content/write.d.ts +8 -0
- package/dist/content/write.d.ts.map +1 -1
- package/dist/content/write.js +1 -1
- package/dist/content/write.js.map +1 -1
- package/dist/files/data-files.d.ts +5 -0
- package/dist/files/data-files.d.ts.map +1 -1
- package/dist/files/data-files.js +30 -0
- package/dist/files/data-files.js.map +1 -1
- package/dist/fonts/css.d.ts +25 -0
- package/dist/fonts/css.d.ts.map +1 -0
- package/dist/fonts/css.js +88 -0
- package/dist/fonts/css.js.map +1 -0
- package/dist/fonts/family.d.ts +23 -0
- package/dist/fonts/family.d.ts.map +1 -0
- package/dist/fonts/family.js +41 -0
- package/dist/fonts/family.js.map +1 -0
- package/dist/fonts/index.d.ts +10 -0
- package/dist/fonts/index.d.ts.map +1 -0
- package/dist/fonts/index.js +6 -0
- package/dist/fonts/index.js.map +1 -0
- package/dist/fonts/job.d.ts +20 -0
- package/dist/fonts/job.d.ts.map +1 -0
- package/dist/fonts/job.js +49 -0
- package/dist/fonts/job.js.map +1 -0
- package/dist/fonts/roles.d.ts +53 -0
- package/dist/fonts/roles.d.ts.map +1 -0
- package/dist/fonts/roles.js +64 -0
- package/dist/fonts/roles.js.map +1 -0
- package/dist/fonts/store.d.ts +69 -0
- package/dist/fonts/store.d.ts.map +1 -0
- package/dist/fonts/store.js +237 -0
- package/dist/fonts/store.js.map +1 -0
- package/dist/gemini/capsule.d.ts +4 -0
- package/dist/gemini/capsule.d.ts.map +1 -0
- package/dist/gemini/capsule.js +9 -0
- package/dist/gemini/capsule.js.map +1 -0
- package/dist/gemini/certificate.d.ts +34 -0
- package/dist/gemini/certificate.d.ts.map +1 -0
- package/dist/gemini/certificate.js +255 -0
- package/dist/gemini/certificate.js.map +1 -0
- package/dist/gemini/site-certificate.d.ts +8 -0
- package/dist/gemini/site-certificate.d.ts.map +1 -0
- package/dist/gemini/site-certificate.js +17 -0
- package/dist/gemini/site-certificate.js.map +1 -0
- package/dist/micropub/endpoint.d.ts.map +1 -1
- package/dist/micropub/endpoint.js +12 -0
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/plugin.d.ts +15 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/settings/registry.d.ts.map +1 -1
- package/dist/settings/registry.js +5 -1
- package/dist/settings/registry.js.map +1 -1
- package/dist/settings/types.d.ts +1 -1
- package/dist/settings/types.d.ts.map +1 -1
- package/dist/site/dashboard-layout.d.ts +33 -26
- package/dist/site/dashboard-layout.d.ts.map +1 -1
- package/dist/site/dashboard-layout.js +94 -39
- package/dist/site/dashboard-layout.js.map +1 -1
- package/dist/site/namespace.d.ts +6 -0
- package/dist/site/namespace.d.ts.map +1 -1
- package/dist/site/namespace.js +46 -1
- package/dist/site/namespace.js.map +1 -1
- package/dist/site/users.d.ts +7 -0
- package/dist/site/users.d.ts.map +1 -1
- package/dist/site/users.js +7 -0
- package/dist/site/users.js.map +1 -1
- package/dist/site/writing-goals.d.ts +22 -0
- package/dist/site/writing-goals.d.ts.map +1 -0
- package/dist/site/writing-goals.js +42 -0
- package/dist/site/writing-goals.js.map +1 -0
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +4 -0
- package/dist/store/schema.js.map +1 -1
- package/dist/store/sessions.d.ts +2 -1
- package/dist/store/sessions.d.ts.map +1 -1
- package/dist/store/sessions.js +30 -12
- package/dist/store/sessions.js.map +1 -1
- package/dist/theme/font-family.d.ts +13 -0
- package/dist/theme/font-family.d.ts.map +1 -0
- package/dist/theme/font-family.js +21 -0
- package/dist/theme/font-family.js.map +1 -0
- package/dist/theme/scheme-tokens.d.ts +50 -0
- package/dist/theme/scheme-tokens.d.ts.map +1 -0
- package/dist/theme/scheme-tokens.js +240 -0
- package/dist/theme/scheme-tokens.js.map +1 -0
- package/dist/theme/site-data.d.ts +12 -0
- package/dist/theme/site-data.d.ts.map +1 -1
- package/dist/theme/site-data.js +15 -0
- package/dist/theme/site-data.js.map +1 -1
- package/dist/theme/themes.d.ts +74 -0
- package/dist/theme/themes.d.ts.map +1 -1
- package/dist/theme/themes.js +100 -9
- package/dist/theme/themes.js.map +1 -1
- package/dist/util/public-address.d.ts +1 -0
- package/dist/util/public-address.d.ts.map +1 -1
- package/dist/util/public-address.js +38 -30
- package/dist/util/public-address.js.map +1 -1
- package/dist/web/access-line.d.ts +2 -0
- package/dist/web/access-line.d.ts.map +1 -0
- package/dist/web/access-line.js +6 -0
- package/dist/web/access-line.js.map +1 -0
- package/dist/web/document-page.d.ts.map +1 -1
- package/dist/web/document-page.js +3 -4
- package/dist/web/document-page.js.map +1 -1
- package/dist/web/embed.d.ts.map +1 -1
- package/dist/web/embed.js +2 -1
- package/dist/web/embed.js.map +1 -1
- package/dist/web/env.d.ts +2 -0
- package/dist/web/env.d.ts.map +1 -1
- package/dist/web/feed-routes.d.ts.map +1 -1
- package/dist/web/feed-routes.js +4 -4
- package/dist/web/feed-routes.js.map +1 -1
- package/dist/web/feed-source.d.ts +1 -1
- package/dist/web/feed-source.d.ts.map +1 -1
- package/dist/web/feed-source.js +1 -1
- package/dist/web/feed-source.js.map +1 -1
- package/dist/web/font-routes.d.ts +13 -0
- package/dist/web/font-routes.d.ts.map +1 -0
- package/dist/web/font-routes.js +27 -0
- package/dist/web/font-routes.js.map +1 -0
- package/dist/web/gemini-listener.d.ts +30 -0
- package/dist/web/gemini-listener.d.ts.map +1 -0
- package/dist/web/gemini-listener.js +186 -0
- package/dist/web/gemini-listener.js.map +1 -0
- package/dist/web/gemini-request.d.ts +23 -0
- package/dist/web/gemini-request.d.ts.map +1 -0
- package/dist/web/gemini-request.js +127 -0
- package/dist/web/gemini-request.js.map +1 -0
- package/dist/web/listing-pages.d.ts.map +1 -1
- package/dist/web/listing-pages.js +7 -5
- package/dist/web/listing-pages.js.map +1 -1
- package/dist/web/llms.d.ts +1 -0
- package/dist/web/llms.d.ts.map +1 -1
- package/dist/web/llms.js +3 -0
- package/dist/web/llms.js.map +1 -1
- package/dist/web/maintenance.d.ts.map +1 -1
- package/dist/web/maintenance.js +6 -2
- package/dist/web/maintenance.js.map +1 -1
- package/dist/web/manifest.d.ts +8 -5
- package/dist/web/manifest.d.ts.map +1 -1
- package/dist/web/manifest.js +10 -7
- package/dist/web/manifest.js.map +1 -1
- package/dist/web/markdown-representation.d.ts +11 -20
- package/dist/web/markdown-representation.d.ts.map +1 -1
- package/dist/web/markdown-representation.js +57 -58
- package/dist/web/markdown-representation.js.map +1 -1
- package/dist/web/negotiate.d.ts +4 -16
- package/dist/web/negotiate.d.ts.map +1 -1
- package/dist/web/negotiate.js +23 -18
- package/dist/web/negotiate.js.map +1 -1
- package/dist/web/oembed.d.ts +17 -3
- package/dist/web/oembed.d.ts.map +1 -1
- package/dist/web/oembed.js +68 -26
- package/dist/web/oembed.js.map +1 -1
- package/dist/web/proxy-protocol.d.ts +13 -0
- package/dist/web/proxy-protocol.d.ts.map +1 -0
- package/dist/web/proxy-protocol.js +79 -0
- package/dist/web/proxy-protocol.js.map +1 -0
- package/dist/web/render.d.ts +52 -22
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +94 -30
- package/dist/web/render.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +7 -8
- package/dist/web/routes.js.map +1 -1
- package/dist/web/site-index.d.ts.map +1 -1
- package/dist/web/site-index.js +6 -2
- package/dist/web/site-index.js.map +1 -1
- package/dist/web/status-pages.d.ts +2 -3
- package/dist/web/status-pages.d.ts.map +1 -1
- package/dist/web/status-pages.js +14 -11
- package/dist/web/status-pages.js.map +1 -1
- package/dist/web/throttle.d.ts +9 -0
- package/dist/web/throttle.d.ts.map +1 -1
- package/dist/web/throttle.js +17 -0
- package/dist/web/throttle.js.map +1 -1
- package/dist/webmention/fetch-public.d.ts +6 -0
- package/dist/webmention/fetch-public.d.ts.map +1 -1
- package/dist/webmention/fetch-public.js +6 -1
- package/dist/webmention/fetch-public.js.map +1 -1
- package/dist/writing/ledger.d.ts +15 -0
- package/dist/writing/ledger.d.ts.map +1 -0
- package/dist/writing/ledger.js +70 -0
- package/dist/writing/ledger.js.map +1 -0
- package/dist/writing/progress.d.ts +25 -0
- package/dist/writing/progress.d.ts.map +1 -0
- package/dist/writing/progress.js +83 -0
- package/dist/writing/progress.js.map +1 -0
- package/package.json +2 -1
- package/themes/default/layouts/404.gmi.njk +10 -0
- package/themes/default/layouts/410.gmi.njk +8 -0
- package/themes/default/layouts/500.gmi.njk +9 -0
- package/themes/default/layouts/503.gmi.njk +9 -0
- package/themes/default/layouts/base.njk +31 -16
- package/themes/default/layouts/page.njk +4 -8
- package/themes/default/partials/bio.njk +1 -1
- package/themes/default/partials/contact-form.njk +1 -1
- package/themes/default/partials/markdown-footer.md.njk +9 -1
- package/themes/default/src/style.css +326 -15
- package/themes/default/static/style.css +489 -3
- package/themes/default/theme.json +23 -1
|
@@ -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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"}
|
package/dist/theme/site-data.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"site-data.js","sourceRoot":"","sources":["../../src/theme/site-data.ts"],"names":[],"mappings":"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"}
|
package/dist/theme/themes.d.ts
CHANGED
|
@@ -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.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/theme/themes.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAEhC,CAAC;AAEF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,8DAA8D;AAC9D,MAAM,MAAM,SAAS,GAAG,OAAO,eAAe,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,YACxB,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,YAAY,CACJ,CAAC;AAEX,oCAAoC;AACpC,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CAClG;AAED,+CAA+C;AAC/C,MAAM,WAAW,KAAK;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/theme/themes.ts"],"names":[],"mappings":"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"}
|
package/dist/theme/themes.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { messageOf } from '../util/errors.js';
|
|
5
|
+
import { cssFontStack } from './font-family.js';
|
|
5
6
|
/**
|
|
6
7
|
* Where a theme is, and what makes a directory one.
|
|
7
8
|
*
|
|
@@ -48,6 +49,24 @@ export const COLOR_SCHEMES = [
|
|
|
48
49
|
'dark light',
|
|
49
50
|
'only light',
|
|
50
51
|
];
|
|
52
|
+
/**
|
|
53
|
+
* Whether a page follows the reader's system setting or is always light or
|
|
54
|
+
* always dark (decision-61): the `colorMode` setting.
|
|
55
|
+
*/
|
|
56
|
+
export const COLOR_MODES = ['system', 'light', 'dark'];
|
|
57
|
+
/**
|
|
58
|
+
* Why `name` cannot be the `colorScheme` of a site whose theme draws
|
|
59
|
+
* `schemes`, or `undefined` when it can. Empty always can: it is the first.
|
|
60
|
+
*/
|
|
61
|
+
export function colorSchemeProblem(schemes, name) {
|
|
62
|
+
if (name === '' || schemes.some((scheme) => scheme.name === name))
|
|
63
|
+
return undefined;
|
|
64
|
+
if (schemes.length === 0) {
|
|
65
|
+
return 'The theme in use declares no colour schemes, so the colour scheme stays empty.';
|
|
66
|
+
}
|
|
67
|
+
const names = schemes.map((scheme) => scheme.name).join(', ');
|
|
68
|
+
return `"${name}" is not a colour scheme of the theme in use. Choose one of ${names}, or leave it empty for the first.`;
|
|
69
|
+
}
|
|
51
70
|
/**
|
|
52
71
|
* Read one directory as a theme.
|
|
53
72
|
*
|
|
@@ -94,6 +113,7 @@ export function readTheme(dir) {
|
|
|
94
113
|
};
|
|
95
114
|
}
|
|
96
115
|
const description = manifest['description'];
|
|
116
|
+
const colors = themeColorsOf(manifest['colorScheme'], manifest['themeColor']);
|
|
97
117
|
return {
|
|
98
118
|
ok: true,
|
|
99
119
|
theme: {
|
|
@@ -105,7 +125,9 @@ export function readTheme(dir) {
|
|
|
105
125
|
? { description: description.trim() }
|
|
106
126
|
: {}),
|
|
107
127
|
areas: themeAreasOf(manifest['areas']),
|
|
108
|
-
colors
|
|
128
|
+
colors,
|
|
129
|
+
schemes: themeSchemesOf(manifest['schemes'], colors.themeColor),
|
|
130
|
+
fonts: themeFontsOf(manifest['fonts']),
|
|
109
131
|
},
|
|
110
132
|
};
|
|
111
133
|
}
|
|
@@ -117,20 +139,84 @@ const HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
|
117
139
|
* not take costs the site a tinted address bar, not its pages.
|
|
118
140
|
*/
|
|
119
141
|
function themeColorsOf(scheme, color) {
|
|
142
|
+
return {
|
|
143
|
+
...(COLOR_SCHEMES.includes(scheme)
|
|
144
|
+
? { colorScheme: scheme }
|
|
145
|
+
: {}),
|
|
146
|
+
themeColor: themeColorOf(color),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function themeColorOf(color) {
|
|
120
150
|
const declared = typeof color === 'object' && color !== null ? color : {};
|
|
121
151
|
const hex = (value) => typeof value === 'string' && HEX_COLOR.test(value) ? value : undefined;
|
|
122
152
|
const light = hex(declared['light']);
|
|
123
153
|
const dark = hex(declared['dark']);
|
|
124
154
|
return {
|
|
125
|
-
...(
|
|
126
|
-
|
|
127
|
-
: {}),
|
|
128
|
-
themeColor: {
|
|
129
|
-
...(light === undefined ? {} : { light }),
|
|
130
|
-
...(dark === undefined ? {} : { dark }),
|
|
131
|
-
},
|
|
155
|
+
...(light === undefined ? {} : { light }),
|
|
156
|
+
...(dark === undefined ? {} : { dark }),
|
|
132
157
|
};
|
|
133
158
|
}
|
|
159
|
+
const SCHEME_NAME = /^[a-z][a-z0-9-]*$/;
|
|
160
|
+
function themeSchemesOf(value, fallback) {
|
|
161
|
+
if (!Array.isArray(value))
|
|
162
|
+
return [];
|
|
163
|
+
const schemes = [];
|
|
164
|
+
const seen = new Set();
|
|
165
|
+
for (const entry of value) {
|
|
166
|
+
if (typeof entry !== 'object' || entry === null)
|
|
167
|
+
continue;
|
|
168
|
+
const { name, label, themeColor } = entry;
|
|
169
|
+
if (typeof name !== 'string' || !SCHEME_NAME.test(name) || seen.has(name))
|
|
170
|
+
continue;
|
|
171
|
+
seen.add(name);
|
|
172
|
+
const words = typeof label === 'string' ? label.trim() : '';
|
|
173
|
+
schemes.push({
|
|
174
|
+
name,
|
|
175
|
+
label: words === '' ? name : words,
|
|
176
|
+
themeColor: { ...fallback, ...themeColorOf(themeColor) },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return schemes;
|
|
180
|
+
}
|
|
181
|
+
function themeFontsOf(value) {
|
|
182
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
183
|
+
return [];
|
|
184
|
+
const fonts = [];
|
|
185
|
+
for (const [role, entry] of Object.entries(value)) {
|
|
186
|
+
if (!SCHEME_NAME.test(role) || typeof entry !== 'object' || entry === null)
|
|
187
|
+
continue;
|
|
188
|
+
const { label, fallback } = entry;
|
|
189
|
+
if (typeof fallback !== 'string')
|
|
190
|
+
continue;
|
|
191
|
+
const stack = cssFontStack(fallback);
|
|
192
|
+
if (stack === undefined)
|
|
193
|
+
continue;
|
|
194
|
+
const words = typeof label === 'string' ? label.trim() : '';
|
|
195
|
+
fonts.push({
|
|
196
|
+
role,
|
|
197
|
+
label: words === '' ? role : words,
|
|
198
|
+
property: `--font-${role}`,
|
|
199
|
+
fallback: stack,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return fonts;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The scheme a page is drawn in: the one named, or the theme's first when the
|
|
206
|
+
* name is empty or names a scheme the theme does not declare, so a site that
|
|
207
|
+
* switches themes keeps rendering. `undefined` only for a theme with no schemes.
|
|
208
|
+
*/
|
|
209
|
+
export function themeScheme(schemes, name) {
|
|
210
|
+
return schemes.find((scheme) => scheme.name === name) ?? schemes[0];
|
|
211
|
+
}
|
|
212
|
+
function inheritPackagedUnlessOwnStylesheet(theme, key) {
|
|
213
|
+
if (theme !== undefined && theme[key].length > 0)
|
|
214
|
+
return theme[key];
|
|
215
|
+
if (theme !== undefined && existsSync(path.join(theme.dir, 'static', 'style.css')))
|
|
216
|
+
return [];
|
|
217
|
+
const packaged = readTheme(PACKAGED_THEME_DIR);
|
|
218
|
+
return packaged.ok ? packaged.theme[key] : [];
|
|
219
|
+
}
|
|
134
220
|
/**
|
|
135
221
|
* A chosen theme's colours, each one it leaves out taken from the packaged
|
|
136
222
|
* theme: a site theme is laid over the packaged one a file at a time, and it
|
|
@@ -269,7 +355,12 @@ export function themeNameProblem(name) {
|
|
|
269
355
|
*/
|
|
270
356
|
export function chooseTheme(options) {
|
|
271
357
|
const chosen = chooseThemeDirs(options);
|
|
272
|
-
return {
|
|
358
|
+
return {
|
|
359
|
+
...chosen,
|
|
360
|
+
colors: resolvedColors(chosen.theme),
|
|
361
|
+
schemes: inheritPackagedUnlessOwnStylesheet(chosen.theme, 'schemes'),
|
|
362
|
+
fonts: inheritPackagedUnlessOwnStylesheet(chosen.theme, 'fonts'),
|
|
363
|
+
};
|
|
273
364
|
}
|
|
274
365
|
function chooseThemeDirs(options) {
|
|
275
366
|
const name = options.name.trim();
|