@bendyline/squisq 1.5.1 → 2.0.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/README.md +63 -10
- package/dist/{Doc-BBVGq1_9.d.ts → Doc-ylqWKDc_.d.ts} +248 -37
- package/dist/{ImageEditDoc-FuyGtt6o.d.ts → ImageEditDoc-D828IXJ1.d.ts} +1 -1
- package/dist/annotationCoercion-Dr_DY9Hx.d.ts +86 -0
- package/dist/{chunk-VWUFZ6ZG.js → chunk-3E5F2XMR.js} +2 -29
- package/dist/chunk-3E5F2XMR.js.map +1 -0
- package/dist/chunk-4X3JQXNM.js +35 -0
- package/dist/chunk-4X3JQXNM.js.map +1 -0
- package/dist/{chunk-2OIBZYKP.js → chunk-5DKBFXPY.js} +31 -121
- package/dist/chunk-5DKBFXPY.js.map +1 -0
- package/dist/{chunk-DLXZMS5K.js → chunk-5J4HKRJF.js} +51 -3
- package/dist/chunk-5J4HKRJF.js.map +1 -0
- package/dist/chunk-5UYI3RJB.js +2503 -0
- package/dist/chunk-5UYI3RJB.js.map +1 -0
- package/dist/{chunk-TEEEILMP.js → chunk-66QO7XFB.js} +19 -292
- package/dist/chunk-66QO7XFB.js.map +1 -0
- package/dist/{chunk-KKNUBQ6Y.js → chunk-6PJRB2CF.js} +156 -91
- package/dist/chunk-6PJRB2CF.js.map +1 -0
- package/dist/{chunk-HWVFJAAH.js → chunk-AMIR72JP.js} +28 -10
- package/dist/chunk-AMIR72JP.js.map +1 -0
- package/dist/chunk-FVJUUTEM.js +74 -0
- package/dist/chunk-FVJUUTEM.js.map +1 -0
- package/dist/{chunk-LH7I6SH7.js → chunk-GF3BVNLU.js} +6360 -5723
- package/dist/chunk-GF3BVNLU.js.map +1 -0
- package/dist/{chunk-Q3ROPT5H.js → chunk-GZY66SDN.js} +1 -1
- package/dist/{chunk-Q3ROPT5H.js.map → chunk-GZY66SDN.js.map} +1 -1
- package/dist/chunk-JOQYPRDZ.js +127 -0
- package/dist/chunk-JOQYPRDZ.js.map +1 -0
- package/dist/{chunk-A4O7GIWE.js → chunk-LYNJEOAC.js} +10 -73
- package/dist/chunk-LYNJEOAC.js.map +1 -0
- package/dist/{chunk-LDQ2HJIX.js → chunk-PXLVXTLW.js} +252 -54
- package/dist/chunk-PXLVXTLW.js.map +1 -0
- package/dist/{chunk-TQWLI6S2.js → chunk-Q7LROV2H.js} +4 -2
- package/dist/{chunk-TQWLI6S2.js.map → chunk-Q7LROV2H.js.map} +1 -1
- package/dist/{chunk-T5UK6YOB.js → chunk-QTSJOY54.js} +60 -17
- package/dist/chunk-QTSJOY54.js.map +1 -0
- package/dist/chunk-QVANWDPH.js +2358 -0
- package/dist/chunk-QVANWDPH.js.map +1 -0
- package/dist/{chunk-6ATE2PSM.js → chunk-R2GC6RLD.js} +7 -7
- package/dist/chunk-R2GC6RLD.js.map +1 -0
- package/dist/chunk-R2YZTCLO.js +292 -0
- package/dist/chunk-R2YZTCLO.js.map +1 -0
- package/dist/chunk-S7A5D7ZJ.js +174 -0
- package/dist/chunk-S7A5D7ZJ.js.map +1 -0
- package/dist/chunk-T3TI7GSZ.js +884 -0
- package/dist/chunk-T3TI7GSZ.js.map +1 -0
- package/dist/{chunk-RUDYOTA6.js → chunk-TUWMK62B.js} +110 -4
- package/dist/chunk-TUWMK62B.js.map +1 -0
- package/dist/{chunk-IMSCRLLV.js → chunk-VR7UPJ7C.js} +35 -25
- package/dist/chunk-VR7UPJ7C.js.map +1 -0
- package/dist/doc/index.d.ts +2334 -5
- package/dist/doc/index.js +134 -34
- package/dist/generate/index.d.ts +7 -2
- package/dist/generate/index.js +1 -1
- package/dist/imageEdit/index.d.ts +9 -6
- package/dist/imageEdit/index.js +3 -3
- package/dist/index.d.ts +12 -10
- package/dist/index.js +253 -81
- package/dist/jsonForm/index.d.ts +7 -3
- package/dist/jsonForm/index.js +9 -4
- package/dist/markdown/index.d.ts +6 -70
- package/dist/markdown/index.js +13 -9
- package/dist/narration/index.d.ts +618 -0
- package/dist/narration/index.js +82 -0
- package/dist/recommend/index.d.ts +15 -1
- package/dist/recommend/index.js +2 -2
- package/dist/schemas/index.d.ts +28 -6
- package/dist/schemas/index.js +15 -13
- package/dist/spatial/index.d.ts +0 -1
- package/dist/spatial/index.js +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/{themeLibrary-CehcJhzz.d.ts → themeLibrary-RjVgLpUi.d.ts} +10 -11
- package/dist/timing/index.js +5 -3
- package/dist/transform/index.d.ts +35 -24
- package/dist/transform/index.js +9 -10
- package/dist/{types-DlAZ7MW4.d.ts → types-BwMPl2CB.d.ts} +1 -1
- package/dist/{types-D98li1gV.d.ts → types-C4kiRn_k.d.ts} +3 -1
- package/dist/versions/index.d.ts +2 -1
- package/dist/versions/index.js +2 -2
- package/package.json +6 -6
- package/src/__tests__/applyNarrationTiming.test.ts +190 -0
- package/src/__tests__/applyRenderStyle.test.ts +3 -3
- package/src/__tests__/asciiDiagramBattle.test.ts +246 -0
- package/src/__tests__/asciiDiagramDetect.test.ts +162 -0
- package/src/__tests__/asciiDiagramMapping.test.ts +38 -0
- package/src/__tests__/asciiDiagramParse.test.ts +233 -0
- package/src/__tests__/asciiDiagramPipeline.test.ts +273 -0
- package/src/__tests__/asciiDiagramRender.test.ts +162 -0
- package/src/__tests__/asciiDiagramRepair.test.ts +84 -0
- package/src/__tests__/asciiTimelineDetect.test.ts +157 -0
- package/src/__tests__/asciiTimelineParse.test.ts +205 -0
- package/src/__tests__/asciiTimelinePipeline.test.ts +349 -0
- package/src/__tests__/asciiTimelineRender.test.ts +376 -0
- package/src/__tests__/attrTokens.test.ts +5 -0
- package/src/__tests__/contentContainer.test.ts +43 -0
- package/src/__tests__/coverBlock.test.ts +33 -2
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -15
- package/src/__tests__/dataTable.test.ts +25 -15
- package/src/__tests__/diagramBlock.test.ts +3 -3
- package/src/__tests__/diagramText.test.ts +26 -0
- package/src/__tests__/docToMarkdownMedia.test.ts +83 -0
- package/src/__tests__/drawingBlock.test.ts +3 -3
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +512 -0
- package/src/__tests__/fixtures/asciiDiagrams.ts +287 -0
- package/src/__tests__/fixtures/asciiTimelines.ts +35 -0
- package/src/__tests__/fixtures/treeviewFixtures.ts +243 -0
- package/src/__tests__/getLayers.test.ts +32 -18
- package/src/__tests__/getLayersFallback.test.ts +8 -8
- package/src/__tests__/imageEditVersions.test.ts +2 -0
- package/src/__tests__/jsonForm.pointer.test.ts +47 -1
- package/src/__tests__/layoutBlock.test.ts +3 -3
- package/src/__tests__/majorApiTypes.test.ts +18 -0
- package/src/__tests__/markdown.test.ts +41 -0
- package/src/__tests__/markdownToDoc.test.ts +5 -2
- package/src/__tests__/matchFontFamily.test.ts +114 -0
- package/src/__tests__/materializeBlockLayers.test.ts +135 -0
- package/src/__tests__/materializeTestUtils.ts +17 -0
- package/src/__tests__/narrationAlign.test.ts +150 -0
- package/src/__tests__/narrationFeatures.test.ts +71 -0
- package/src/__tests__/narrationNuclei.test.ts +45 -0
- package/src/__tests__/narrationPacing.test.ts +189 -0
- package/src/__tests__/narrationScript.test.ts +149 -0
- package/src/__tests__/narrationSessionRepro.test.ts +62 -0
- package/src/__tests__/narrationSidecar.test.ts +88 -0
- package/src/__tests__/narrationSyllables.test.ts +65 -0
- package/src/__tests__/narrationTestSignals.ts +167 -0
- package/src/__tests__/narrationVad.test.ts +66 -0
- package/src/__tests__/resolveDocTheme.test.ts +16 -2
- package/src/__tests__/rootExports.test.ts +18 -0
- package/src/__tests__/scopedContentContainer.test.ts +20 -0
- package/src/__tests__/shapeGeometry.test.ts +49 -0
- package/src/__tests__/templateAnnotationParse.test.ts +10 -0
- package/src/__tests__/templateInputs.test.ts +69 -0
- package/src/__tests__/templateMetadata.test.ts +2 -1
- package/src/__tests__/templates.test.ts +143 -17
- package/src/__tests__/themeCompile.test.ts +49 -22
- package/src/__tests__/transformProvenance.test.ts +160 -0
- package/src/__tests__/transformV2.test.ts +40 -14
- package/src/__tests__/treeviewBattle.test.ts +76 -0
- package/src/__tests__/treeviewDetect.test.ts +168 -0
- package/src/__tests__/treeviewParse.test.ts +118 -0
- package/src/__tests__/treeviewPipeline.test.ts +183 -0
- package/src/__tests__/treeviewRender.test.ts +91 -0
- package/src/__tests__/versions.test.ts +44 -0
- package/src/doc/applyNarrationTiming.ts +244 -0
- package/src/doc/asciiDiagram/chars.ts +210 -0
- package/src/doc/asciiDiagram/detect.ts +175 -0
- package/src/doc/asciiDiagram/index.ts +38 -0
- package/src/doc/asciiDiagram/mapping.ts +225 -0
- package/src/doc/asciiDiagram/parse.ts +1095 -0
- package/src/doc/asciiDiagram/render.ts +963 -0
- package/src/doc/asciiDiagram/repair.ts +400 -0
- package/src/doc/asciiDiagram/types.ts +65 -0
- package/src/doc/asciiTimeline/detect.ts +138 -0
- package/src/doc/asciiTimeline/index.ts +26 -0
- package/src/doc/asciiTimeline/mapping.ts +43 -0
- package/src/doc/asciiTimeline/parse.ts +870 -0
- package/src/doc/asciiTimeline/render.ts +427 -0
- package/src/doc/asciiTimeline/types.ts +73 -0
- package/src/doc/asciiTimeline/wrappedFlow.ts +427 -0
- package/src/doc/audioMapping.ts +60 -46
- package/src/doc/customTemplatesFrontmatter.ts +0 -41
- package/src/doc/docToMarkdown.ts +126 -39
- package/src/doc/index.ts +76 -4
- package/src/doc/markdownToDoc.ts +135 -1
- package/src/doc/materializeBlockLayers.ts +304 -0
- package/src/doc/mediaAnnotations.ts +20 -0
- package/src/doc/resolveDocTheme.ts +8 -7
- package/src/doc/templateInputs.ts +185 -2
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +22 -8
- package/src/doc/templates/coverBlock.ts +49 -13
- package/src/doc/templates/diagramBlock.ts +237 -38
- package/src/doc/templates/drawingBlock.ts +2 -2
- package/src/doc/templates/fallbackBlock.ts +1 -1
- package/src/doc/templates/index.ts +134 -279
- package/src/doc/templates/inputDescriptors.ts +20 -1
- package/src/doc/templates/metadata.ts +10 -0
- package/src/doc/templates/persistentLayers.ts +12 -126
- package/src/doc/templates/registry.ts +88 -0
- package/src/doc/templates/templateNames.ts +22 -0
- package/src/doc/templates/timelineBlock.ts +613 -0
- package/src/doc/templates/treeBlock.ts +131 -0
- package/src/doc/treeview/chars.ts +72 -0
- package/src/doc/treeview/detect.ts +145 -0
- package/src/doc/treeview/index.ts +30 -0
- package/src/doc/treeview/mapping.ts +95 -0
- package/src/doc/treeview/parse.ts +201 -0
- package/src/doc/treeview/render.ts +41 -0
- package/src/doc/treeview/types.ts +43 -0
- package/src/doc/utils/applyRenderStyle.ts +2 -9
- package/src/doc/utils/diagramText.ts +78 -0
- package/src/doc/utils/shapeGeometry.ts +157 -7
- package/src/doc/validate.ts +1 -1
- package/src/generate/templateMapper.ts +7 -0
- package/src/imageEdit/export.ts +6 -5
- package/src/imageEdit/versionPaths.ts +13 -26
- package/src/imageEdit/versions.ts +21 -100
- package/src/index.ts +1 -0
- package/src/internal/immutable.ts +58 -0
- package/src/jsonForm/index.ts +9 -1
- package/src/jsonForm/pointer.ts +68 -23
- package/src/markdown/attrTokens.ts +7 -5
- package/src/markdown/convert.ts +11 -1
- package/src/markdown/index.ts +1 -0
- package/src/markdown/stringify.ts +4 -9
- package/src/markdown/utils.ts +36 -14
- package/src/narration/align.ts +514 -0
- package/src/narration/features.ts +231 -0
- package/src/narration/index.ts +86 -0
- package/src/narration/nuclei.ts +118 -0
- package/src/narration/pacing.ts +211 -0
- package/src/narration/script.ts +239 -0
- package/src/narration/session.ts +100 -0
- package/src/narration/sidecar.ts +187 -0
- package/src/narration/syllables.ts +85 -0
- package/src/narration/trace.ts +50 -0
- package/src/narration/types.ts +299 -0
- package/src/narration/vad.ts +131 -0
- package/src/recommend/numberHighlight.ts +25 -0
- package/src/recommend/templates.ts +108 -12
- package/src/schemas/BlockTemplates.ts +156 -7
- package/src/schemas/Doc.ts +72 -9
- package/src/schemas/Media.ts +12 -2
- package/src/schemas/Theme.ts +45 -25
- package/src/schemas/Viewport.ts +2 -2
- package/src/schemas/fontStacks.ts +79 -0
- package/src/schemas/themeCompile.ts +15 -0
- package/src/schemas/themeConstants.ts +2 -0
- package/src/schemas/themeLibrary.ts +25 -19
- package/src/schemas/themeValidator.ts +1 -1
- package/src/spatial/Geohash.ts +0 -3
- package/src/storage/ContentContainer.ts +17 -9
- package/src/storage/ScopedContentContainer.ts +45 -15
- package/src/transform/applyTransform.ts +5 -5
- package/src/transform/index.ts +3 -1
- package/src/transform/registry.ts +169 -49
- package/src/transform/templateSelector.ts +21 -2
- package/src/transform/timingAllocator.ts +152 -21
- package/src/transform/types.ts +14 -1
- package/src/versions/gitignore.ts +34 -0
- package/src/versions/index.ts +2 -0
- package/src/versions/operations.ts +18 -104
- package/src/versions/paths.ts +13 -28
- package/src/versions/snapshotStore.ts +202 -0
- package/src/versions/types.ts +3 -1
- package/dist/chunk-2OIBZYKP.js.map +0 -1
- package/dist/chunk-6ATE2PSM.js.map +0 -1
- package/dist/chunk-A4O7GIWE.js.map +0 -1
- package/dist/chunk-DLXZMS5K.js.map +0 -1
- package/dist/chunk-HWVFJAAH.js.map +0 -1
- package/dist/chunk-IMSCRLLV.js.map +0 -1
- package/dist/chunk-JELIRVDP.js +0 -24
- package/dist/chunk-JELIRVDP.js.map +0 -1
- package/dist/chunk-KKNUBQ6Y.js.map +0 -1
- package/dist/chunk-LDQ2HJIX.js.map +0 -1
- package/dist/chunk-LH7I6SH7.js.map +0 -1
- package/dist/chunk-RUDYOTA6.js.map +0 -1
- package/dist/chunk-T5UK6YOB.js.map +0 -1
- package/dist/chunk-TEEEILMP.js.map +0 -1
- package/dist/chunk-UY7KGQ5R.js +0 -192
- package/dist/chunk-UY7KGQ5R.js.map +0 -1
- package/dist/chunk-VLJJHDAC.js +0 -218
- package/dist/chunk-VLJJHDAC.js.map +0 -1
- package/dist/chunk-VWUFZ6ZG.js.map +0 -1
- package/dist/story/index.d.ts +0 -1777
- package/dist/story/index.js +0 -273
- package/src/doc/getLayers.ts +0 -195
- /package/dist/{story → narration}/index.js.map +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cloneAndFreezeData
|
|
3
|
+
} from "./chunk-5J4HKRJF.js";
|
|
1
4
|
import {
|
|
2
5
|
isTransitionType
|
|
3
6
|
} from "./chunk-QE7TWGVT.js";
|
|
@@ -5,76 +8,8 @@ import {
|
|
|
5
8
|
// src/schemas/CustomTemplates.ts
|
|
6
9
|
var FRONTMATTER_CUSTOM_TEMPLATES_KEY = "squisq-custom-templates";
|
|
7
10
|
|
|
8
|
-
// src/schemas/
|
|
11
|
+
// src/schemas/themeConstants.ts
|
|
9
12
|
var THEME_SCHEMA_VERSION = "1";
|
|
10
|
-
var FRONTMATTER_CUSTOM_THEMES_KEY = "squisq-custom-themes";
|
|
11
|
-
function deepMerge(target, source) {
|
|
12
|
-
const result = { ...target };
|
|
13
|
-
for (const key of Object.keys(source)) {
|
|
14
|
-
const srcVal = source[key];
|
|
15
|
-
const tgtVal = target[key];
|
|
16
|
-
if (srcVal !== null && srcVal !== void 0 && typeof srcVal === "object" && !Array.isArray(srcVal) && tgtVal !== null && tgtVal !== void 0 && typeof tgtVal === "object" && !Array.isArray(tgtVal)) {
|
|
17
|
-
result[key] = deepMerge(
|
|
18
|
-
tgtVal,
|
|
19
|
-
srcVal
|
|
20
|
-
);
|
|
21
|
-
} else if (srcVal !== void 0) {
|
|
22
|
-
result[key] = srcVal;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
function createTheme(base, overrides) {
|
|
28
|
-
const merged = deepMerge(
|
|
29
|
-
base,
|
|
30
|
-
overrides
|
|
31
|
-
);
|
|
32
|
-
if (!overrides.id && merged.id === base.id) {
|
|
33
|
-
merged.id = `${base.id}-custom`;
|
|
34
|
-
}
|
|
35
|
-
if (!merged.schemaVersion) merged.schemaVersion = THEME_SCHEMA_VERSION;
|
|
36
|
-
return merged;
|
|
37
|
-
}
|
|
38
|
-
var LIGHT_SURFACE = {
|
|
39
|
-
id: "light",
|
|
40
|
-
background: "#ffffff",
|
|
41
|
-
backgroundLight: "#f5f5f5",
|
|
42
|
-
text: "#1a1a1a",
|
|
43
|
-
textMuted: "#666666"
|
|
44
|
-
};
|
|
45
|
-
var DARK_SURFACE = {
|
|
46
|
-
id: "dark",
|
|
47
|
-
background: "#1a202c",
|
|
48
|
-
backgroundLight: "#2d3748",
|
|
49
|
-
text: "#f0f0f0",
|
|
50
|
-
textMuted: "#a0aec0"
|
|
51
|
-
};
|
|
52
|
-
function applySurface(theme, surface) {
|
|
53
|
-
return {
|
|
54
|
-
...theme,
|
|
55
|
-
colors: {
|
|
56
|
-
...theme.colors,
|
|
57
|
-
background: surface.background,
|
|
58
|
-
backgroundLight: surface.backgroundLight,
|
|
59
|
-
text: surface.text,
|
|
60
|
-
textMuted: surface.textMuted
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
var CUSTOM_THEME_REGISTRY = /* @__PURE__ */ new Map();
|
|
65
|
-
function registerTheme(theme) {
|
|
66
|
-
CUSTOM_THEME_REGISTRY.set(theme.id, theme);
|
|
67
|
-
}
|
|
68
|
-
function unregisterTheme(id) {
|
|
69
|
-
CUSTOM_THEME_REGISTRY.delete(id);
|
|
70
|
-
}
|
|
71
|
-
function getRegisteredThemes() {
|
|
72
|
-
return Array.from(CUSTOM_THEME_REGISTRY.values());
|
|
73
|
-
}
|
|
74
|
-
function lookupRegisteredTheme(id) {
|
|
75
|
-
if (!id) return void 0;
|
|
76
|
-
return CUSTOM_THEME_REGISTRY.get(id);
|
|
77
|
-
}
|
|
78
13
|
|
|
79
14
|
// src/schemas/colorUtils.ts
|
|
80
15
|
var HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
@@ -579,6 +514,90 @@ ${summary}${more}`);
|
|
|
579
514
|
return result.theme;
|
|
580
515
|
}
|
|
581
516
|
|
|
517
|
+
// src/schemas/Theme.ts
|
|
518
|
+
var FRONTMATTER_CUSTOM_THEMES_KEY = "squisq-custom-themes";
|
|
519
|
+
function deepMerge(target, source) {
|
|
520
|
+
const result = { ...target };
|
|
521
|
+
for (const key of Object.keys(source)) {
|
|
522
|
+
const srcVal = source[key];
|
|
523
|
+
const tgtVal = target[key];
|
|
524
|
+
if (srcVal !== null && srcVal !== void 0 && typeof srcVal === "object" && !Array.isArray(srcVal) && tgtVal !== null && tgtVal !== void 0 && typeof tgtVal === "object" && !Array.isArray(tgtVal)) {
|
|
525
|
+
result[key] = deepMerge(
|
|
526
|
+
tgtVal,
|
|
527
|
+
srcVal
|
|
528
|
+
);
|
|
529
|
+
} else if (srcVal !== void 0) {
|
|
530
|
+
result[key] = srcVal;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return result;
|
|
534
|
+
}
|
|
535
|
+
function createTheme(base, overrides) {
|
|
536
|
+
const merged = deepMerge(
|
|
537
|
+
base,
|
|
538
|
+
overrides
|
|
539
|
+
);
|
|
540
|
+
if (!overrides.id && merged.id === base.id) {
|
|
541
|
+
merged.id = `${base.id}-custom`;
|
|
542
|
+
}
|
|
543
|
+
if (!merged.schemaVersion) merged.schemaVersion = THEME_SCHEMA_VERSION;
|
|
544
|
+
return merged;
|
|
545
|
+
}
|
|
546
|
+
var LIGHT_SURFACE = {
|
|
547
|
+
id: "light",
|
|
548
|
+
background: "#ffffff",
|
|
549
|
+
backgroundLight: "#f5f5f5",
|
|
550
|
+
text: "#1a1a1a",
|
|
551
|
+
textMuted: "#666666"
|
|
552
|
+
};
|
|
553
|
+
var DARK_SURFACE = {
|
|
554
|
+
id: "dark",
|
|
555
|
+
background: "#1a202c",
|
|
556
|
+
backgroundLight: "#2d3748",
|
|
557
|
+
text: "#f0f0f0",
|
|
558
|
+
textMuted: "#a0aec0"
|
|
559
|
+
};
|
|
560
|
+
function applySurface(theme, surface) {
|
|
561
|
+
return {
|
|
562
|
+
...theme,
|
|
563
|
+
colors: {
|
|
564
|
+
...theme.colors,
|
|
565
|
+
background: surface.background,
|
|
566
|
+
backgroundLight: surface.backgroundLight,
|
|
567
|
+
text: surface.text,
|
|
568
|
+
textMuted: surface.textMuted
|
|
569
|
+
}
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
function validatedThemeSnapshot(theme) {
|
|
573
|
+
const result = validateTheme(theme);
|
|
574
|
+
if (!result.valid || !result.theme) {
|
|
575
|
+
const details = result.errors.slice(0, 5).map((error) => `${error.path || "<root>"}: ${error.message}`).join("; ");
|
|
576
|
+
throw new TypeError(`Cannot register invalid theme: ${details}`);
|
|
577
|
+
}
|
|
578
|
+
return cloneAndFreezeData(result.theme);
|
|
579
|
+
}
|
|
580
|
+
function createThemeRegistry(initialThemes = []) {
|
|
581
|
+
const themes = /* @__PURE__ */ new Map();
|
|
582
|
+
const registry = {
|
|
583
|
+
register(theme) {
|
|
584
|
+
const snapshot = validatedThemeSnapshot(theme);
|
|
585
|
+
themes.set(snapshot.id, snapshot);
|
|
586
|
+
},
|
|
587
|
+
unregister(id) {
|
|
588
|
+
return themes.delete(id);
|
|
589
|
+
},
|
|
590
|
+
get(id) {
|
|
591
|
+
return themes.get(id);
|
|
592
|
+
},
|
|
593
|
+
list() {
|
|
594
|
+
return Array.from(themes.values());
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
for (const theme of initialThemes) registry.register(theme);
|
|
598
|
+
return Object.freeze(registry);
|
|
599
|
+
}
|
|
600
|
+
|
|
582
601
|
// src/schemas/themes/standard.json
|
|
583
602
|
var standard_default = {
|
|
584
603
|
schemaVersion: "1",
|
|
@@ -1505,24 +1524,29 @@ var BUILTIN_THEMES = {
|
|
|
1505
1524
|
};
|
|
1506
1525
|
|
|
1507
1526
|
// src/schemas/themeLibrary.ts
|
|
1508
|
-
var THEMES =
|
|
1527
|
+
var THEMES = Object.freeze(
|
|
1528
|
+
Object.fromEntries(
|
|
1529
|
+
Object.entries(BUILTIN_THEMES).map(([id, theme]) => [id, cloneAndFreezeData(theme)])
|
|
1530
|
+
)
|
|
1531
|
+
);
|
|
1509
1532
|
var DEFAULT_THEME_ID = "standard";
|
|
1510
1533
|
var DEFAULT_THEME = THEMES[DEFAULT_THEME_ID];
|
|
1511
|
-
function resolveTheme(id) {
|
|
1512
|
-
const registered =
|
|
1534
|
+
function resolveTheme(id, registry) {
|
|
1535
|
+
const registered = id ? registry?.get(id) : void 0;
|
|
1513
1536
|
if (registered) return registered;
|
|
1514
1537
|
if (id && id in THEMES) return THEMES[id];
|
|
1515
1538
|
return DEFAULT_THEME;
|
|
1516
1539
|
}
|
|
1517
|
-
function getAvailableThemes() {
|
|
1518
|
-
return
|
|
1540
|
+
function getAvailableThemes(registry) {
|
|
1541
|
+
return Array.from(
|
|
1542
|
+
/* @__PURE__ */ new Set([...Object.keys(THEMES), ...registry?.list().map((theme) => theme.id) ?? []])
|
|
1543
|
+
);
|
|
1519
1544
|
}
|
|
1520
|
-
function getThemeSummaries() {
|
|
1521
|
-
return
|
|
1522
|
-
|
|
1523
|
-
name:
|
|
1524
|
-
|
|
1525
|
-
}));
|
|
1545
|
+
function getThemeSummaries(registry) {
|
|
1546
|
+
return getAvailableThemes(registry).map((id) => {
|
|
1547
|
+
const theme = resolveTheme(id, registry);
|
|
1548
|
+
return { id, name: theme.name, description: theme.description };
|
|
1549
|
+
});
|
|
1526
1550
|
}
|
|
1527
1551
|
|
|
1528
1552
|
// src/schemas/fontStacks.ts
|
|
@@ -1709,19 +1733,52 @@ function buildGoogleFontsUrl(families) {
|
|
|
1709
1733
|
return `https://fonts.googleapis.com/css2?${params}&display=swap`;
|
|
1710
1734
|
}
|
|
1711
1735
|
var FONT_FALLBACKS = FALLBACK_BY_KIND;
|
|
1736
|
+
function normalizeFontName(name) {
|
|
1737
|
+
return name.trim().replace(/^["']+|["']+$/g, "").replace(/\s+/g, " ").toLowerCase();
|
|
1738
|
+
}
|
|
1739
|
+
var STACK_NAME_ALIASES = (() => {
|
|
1740
|
+
const aliases = {};
|
|
1741
|
+
for (const stack of AVAILABLE_FONT_STACKS) {
|
|
1742
|
+
aliases[normalizeFontName(stack.label)] = stack.id;
|
|
1743
|
+
if (stack.googleFontFamily) aliases[normalizeFontName(stack.googleFontFamily)] = stack.id;
|
|
1744
|
+
}
|
|
1745
|
+
Object.assign(aliases, {
|
|
1746
|
+
playfair: "playfair",
|
|
1747
|
+
"source serif": "source-serif",
|
|
1748
|
+
"source serif pro": "source-serif",
|
|
1749
|
+
"crimson pro": "crimson",
|
|
1750
|
+
cormorant: "cormorant",
|
|
1751
|
+
georgia: "system-serif",
|
|
1752
|
+
"times new roman": "system-serif",
|
|
1753
|
+
times: "system-serif",
|
|
1754
|
+
consolas: "system-mono",
|
|
1755
|
+
"courier new": "system-mono",
|
|
1756
|
+
courier: "system-mono",
|
|
1757
|
+
"segoe ui": "system-sans",
|
|
1758
|
+
"system-ui": "system-sans"
|
|
1759
|
+
});
|
|
1760
|
+
return aliases;
|
|
1761
|
+
})();
|
|
1762
|
+
var MONO_NAME_RE = /\b(mono|monospace|consolas|courier|menlo|inconsolata|cascadia|fira code|source code|code)\b/;
|
|
1763
|
+
var SERIF_NAME_RE = /\b(georgia|times|garamond|cambria|caslon|baskerville|bodoni|didot|palatino|book antiqua|goudy|minion|charter|constantia|century schoolbook|antiqua|roman)\b/;
|
|
1764
|
+
function guessFontFallback(name) {
|
|
1765
|
+
const n = normalizeFontName(name);
|
|
1766
|
+
if (MONO_NAME_RE.test(n)) return "monospace";
|
|
1767
|
+
if (n.includes("serif") && !n.includes("sans") || SERIF_NAME_RE.test(n)) return "serif";
|
|
1768
|
+
return "sans-serif";
|
|
1769
|
+
}
|
|
1770
|
+
function matchFontFamily(name) {
|
|
1771
|
+
const normalized = normalizeFontName(name);
|
|
1772
|
+
if (!normalized) return { stackId: "system-sans" };
|
|
1773
|
+
const stackId = STACK_NAME_ALIASES[normalized];
|
|
1774
|
+
if (stackId) return { stackId };
|
|
1775
|
+
const displayName = name.trim().replace(/^["']+|["']+$/g, "");
|
|
1776
|
+
return { custom: { name: displayName, fallback: guessFontFallback(name) } };
|
|
1777
|
+
}
|
|
1712
1778
|
|
|
1713
1779
|
export {
|
|
1714
1780
|
FRONTMATTER_CUSTOM_TEMPLATES_KEY,
|
|
1715
1781
|
THEME_SCHEMA_VERSION,
|
|
1716
|
-
FRONTMATTER_CUSTOM_THEMES_KEY,
|
|
1717
|
-
createTheme,
|
|
1718
|
-
LIGHT_SURFACE,
|
|
1719
|
-
DARK_SURFACE,
|
|
1720
|
-
applySurface,
|
|
1721
|
-
registerTheme,
|
|
1722
|
-
unregisterTheme,
|
|
1723
|
-
getRegisteredThemes,
|
|
1724
|
-
lookupRegisteredTheme,
|
|
1725
1782
|
isHex,
|
|
1726
1783
|
oklchLighten,
|
|
1727
1784
|
oklchDarken,
|
|
@@ -1734,6 +1791,12 @@ export {
|
|
|
1734
1791
|
deriveScale,
|
|
1735
1792
|
validateTheme,
|
|
1736
1793
|
assertTheme,
|
|
1794
|
+
FRONTMATTER_CUSTOM_THEMES_KEY,
|
|
1795
|
+
createTheme,
|
|
1796
|
+
LIGHT_SURFACE,
|
|
1797
|
+
DARK_SURFACE,
|
|
1798
|
+
applySurface,
|
|
1799
|
+
createThemeRegistry,
|
|
1737
1800
|
THEMES,
|
|
1738
1801
|
DEFAULT_THEME_ID,
|
|
1739
1802
|
DEFAULT_THEME,
|
|
@@ -1745,6 +1808,8 @@ export {
|
|
|
1745
1808
|
resolveFontFamily,
|
|
1746
1809
|
fontStack,
|
|
1747
1810
|
buildGoogleFontsUrl,
|
|
1748
|
-
FONT_FALLBACKS
|
|
1811
|
+
FONT_FALLBACKS,
|
|
1812
|
+
guessFontFallback,
|
|
1813
|
+
matchFontFamily
|
|
1749
1814
|
};
|
|
1750
|
-
//# sourceMappingURL=chunk-
|
|
1815
|
+
//# sourceMappingURL=chunk-6PJRB2CF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/CustomTemplates.ts","../src/schemas/themeConstants.ts","../src/schemas/colorUtils.ts","../src/schemas/themeValidator.ts","../src/schemas/Theme.ts","../src/schemas/themes/standard.json","../src/schemas/themes/standard-dark.json","../src/schemas/themes/documentary.json","../src/schemas/themes/minimalist.json","../src/schemas/themes/bold.json","../src/schemas/themes/morning-light.json","../src/schemas/themes/tech-dark.json","../src/schemas/themes/magazine.json","../src/schemas/themes/cinematic.json","../src/schemas/themes/warm-earth.json","../src/schemas/themes/gezellig.json","../src/schemas/themes/index.ts","../src/schemas/themeLibrary.ts","../src/schemas/fontStacks.ts"],"sourcesContent":["/**\n * Custom Templates Schema\n *\n * User-defined block layout templates. The author designs a visual\n * layout once (in the editor's TemplateDesigner) and saves it as a\n * `CustomTemplateDefinition`. The definition lives either in the\n * document's frontmatter (per-doc, portable, ships with the markdown)\n * or in the user's local library (cross-doc reuse via localStorage).\n *\n * A custom template's content is just a `Layer[]` — the same shape that\n * built-in templates emit at expansion time. The novel bit is\n * *placeholder tokens*: TextLayer / ImageLayer content fields may carry\n * strings like `{title}`, `{content}`, `{children}`, or `{image:N}`\n * that the resolver (see `doc/templates/tokens/resolveTokens.ts`)\n * substitutes against the source Block at render time.\n *\n * Responsiveness model: every numeric position field in `layers` is\n * stored as a `%`-string relative to `viewport`, so the same template\n * renders correctly at any of Squisq's viewport presets (landscape,\n * portrait, square). The `viewport` field itself is purely an\n * authoring-time reference — it tells the designer canvas which aspect\n * ratio to mount with, and the thumbnail renderer which viewBox to use.\n */\n\nimport type { Layer } from './Doc.js';\n\n/**\n * Iteration directive for a custom-template layer.\n *\n * A layer that carries a `repeat` is cloned once per item of a source\n * collection at render time (see `resolveTokens`). The clones are laid\n * out in a row or column, offset from the base position by the layer's\n * own width/height plus `gap`, and each clone resolves per-item tokens\n * (`{item}`, `{item:src}`, `{item:label}`, `{index}`) against its item.\n */\nexport interface LayerRepeat {\n /**\n * Which of the source Block's collections to iterate:\n * - `images` — every image in the block body (alt + url)\n * - `children` — child block titles\n * - `listItems` — top-level list-item text in the block body\n */\n source: 'images' | 'children' | 'listItems';\n\n /**\n * Layout axis for the clones. `column` (default) stacks them\n * vertically (offsets `position.y`); `row` lays them out horizontally\n * (offsets `position.x`).\n */\n direction?: 'row' | 'column';\n\n /**\n * Extra spacing added between consecutive clones, in the same unit as\n * the layer's `width`/`height`. Defaults to 24.\n */\n gap?: number;\n\n /** Cap on the number of clones rendered (omit for \"all items\"). */\n max?: number;\n}\n\n/**\n * A custom-template layer: a normal render `Layer` that may additionally\n * carry a `repeat` directive. This is a strict superset of the core\n * `Layer` type used only inside `CustomTemplateDefinition.layers`; the\n * resolver strips `repeat` before emitting the final `Layer[]`, so the\n * core `Layer` type is never widened.\n */\nexport type CustomTemplateLayer = Layer & { repeat?: LayerRepeat };\n\n/**\n * A single user-defined template. Stored in `Doc.customTemplates`\n * (frontmatter-backed) or in the user's local library.\n */\nexport interface CustomTemplateDefinition {\n /**\n * Stable id used in heading annotations (`### Foo {[name]}`). Must be\n * a slug — lowercase alphanumerics, hyphens. The picker enforces\n * uniqueness within a (doc + library) merged namespace.\n */\n name: string;\n\n /** Human-readable label shown in the template picker. */\n label: string;\n\n /** Optional one-sentence description for the picker card. */\n description?: string;\n\n /**\n * Authoring viewport — the canvas size the designer drew against.\n * Stored so the designer and thumbnail renderer can reproduce the\n * same canvas. Layer positions are stored as `%`-strings, so the\n * actual render-time viewport can differ from this without breaking\n * the layout. Defaults to 1920×1080 landscape.\n */\n viewport: {\n width: number;\n height: number;\n };\n\n /**\n * The visual content. Every `position.x` / `position.y` /\n * `position.width` / `position.height` should be a `%`-string at\n * save time (the designer's normalizePositions step enforces this).\n *\n * Tokens supported (grammar v2):\n * - TextLayer.content.text — `{title}`, `{content}`, `{children}`,\n * `{image:N}` (Nth image's alt text), `{attr:key}` (block\n * attribute), plus a pipe default on any token\n * (`{attr:subtitle|Untitled}`).\n * - ImageLayer.content.src — `{image:N}` (the URL) and `{attr:key}`,\n * with pipe defaults (`{image:1|fallback.jpg}`).\n * - Inside a layer with `repeat`, per-item tokens: `{item}`,\n * `{item:src}`, `{item:label}`, `{index}` (1-based).\n *\n * A layer may carry a `repeat` directive (see {@link LayerRepeat}) to\n * be cloned once per item of a source collection.\n */\n layers: CustomTemplateLayer[];\n}\n\n/**\n * Tag value for the YAML frontmatter key that carries inlined custom\n * template definitions. Exported so the markdown bridge stays in sync.\n */\nexport const FRONTMATTER_CUSTOM_TEMPLATES_KEY = 'squisq-custom-templates';\n","/** Current Theme schema version. Bump on breaking changes; loader migrates. */\nexport const THEME_SCHEMA_VERSION = '1' as const;\n","/**\n * Color Utilities\n *\n * Pure-JS color math used by theme compilation and contrast checks.\n * No dependencies. Operates on `#rrggbb` hex strings.\n *\n * Internally uses OKLCh — perceptually uniform, so lightening by 0.1\n * looks like the same change at any starting point. Out-of-gamut\n * results are clamped to sRGB.\n */\n\nconst HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n/** Test whether a string is a valid `#rgb` or `#rrggbb` hex color. */\nexport function isHex(value: string): boolean {\n return HEX_RE.test(value);\n}\n\n/** Parse `#rgb` or `#rrggbb` into 0..1 sRGB triplet. Returns null on failure. */\nfunction parseHex(hex: string): [number, number, number] | null {\n if (!HEX_RE.test(hex)) return null;\n let body = hex.slice(1);\n if (body.length === 3)\n body = body\n .split('')\n .map((c) => c + c)\n .join('');\n return [\n parseInt(body.slice(0, 2), 16) / 255,\n parseInt(body.slice(2, 4), 16) / 255,\n parseInt(body.slice(4, 6), 16) / 255,\n ];\n}\n\nfunction toHex(rgb: [number, number, number]): string {\n const ch = (v: number) => {\n const c = Math.max(0, Math.min(255, Math.round(v * 255)));\n return c.toString(16).padStart(2, '0');\n };\n return '#' + ch(rgb[0]) + ch(rgb[1]) + ch(rgb[2]);\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\ninterface OKLCh {\n L: number;\n C: number;\n h: number;\n}\n\nfunction rgbToOklch(rgb: [number, number, number]): OKLCh {\n const [sr, sg, sb] = rgb;\n const r = srgbToLinear(sr);\n const g = srgbToLinear(sg);\n const b = srgbToLinear(sb);\n\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n\n const C = Math.sqrt(a * a + bb * bb);\n let h = (Math.atan2(bb, a) * 180) / Math.PI;\n if (h < 0) h += 360;\n return { L, C, h };\n}\n\nfunction oklchToRgb({ L, C, h }: OKLCh): [number, number, number] {\n const hr = (h * Math.PI) / 180;\n const a = C * Math.cos(hr);\n const bb = C * Math.sin(hr);\n\n const l_ = L + 0.3963377774 * a + 0.2158037573 * bb;\n const m_ = L - 0.1055613458 * a - 0.0638541728 * bb;\n const s_ = L - 0.0894841775 * a - 1.291485548 * bb;\n\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n\n const r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return [\n Math.max(0, Math.min(1, linearToSrgb(r))),\n Math.max(0, Math.min(1, linearToSrgb(g))),\n Math.max(0, Math.min(1, linearToSrgb(b))),\n ];\n}\n\n/**\n * Lighten a color by `amount` (0..1) in OKLCh L space.\n * Falls back to the input on parse failure.\n */\nexport function oklchLighten(hex: string, amount: number): string {\n const rgb = parseHex(hex);\n if (!rgb) return hex;\n const lch = rgbToOklch(rgb);\n lch.L = Math.max(0, Math.min(1, lch.L + amount));\n return toHex(oklchToRgb(lch));\n}\n\n/**\n * Darken a color by `amount` (0..1) in OKLCh L space.\n * Falls back to the input on parse failure.\n */\nexport function oklchDarken(hex: string, amount: number): string {\n return oklchLighten(hex, -amount);\n}\n\n/**\n * Adjust the OKLCh chroma of a color by a multiplier (e.g. 0.7 to mute).\n */\nexport function oklchSetChroma(hex: string, multiplier: number): string {\n const rgb = parseHex(hex);\n if (!rgb) return hex;\n const lch = rgbToOklch(rgb);\n lch.C = Math.max(0, lch.C * multiplier);\n return toHex(oklchToRgb(lch));\n}\n\n/**\n * WCAG relative luminance of a hex color, returned as 0..1.\n */\nexport function relativeLuminance(hex: string): number {\n const rgb = parseHex(hex);\n if (!rgb) return 0;\n const [r, g, b] = rgb.map(srgbToLinear) as [number, number, number];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Hue of a hex color in HSL degrees (0..360). Returns 0 for pure grays\n * and on parse failure. Used by the duotone image treatment to aim its\n * `hue-rotate()` at the theme's tint color.\n */\nexport function hexHueDegrees(hex: string): number {\n const rgb = parseHex(hex);\n if (!rgb) return 0;\n const [r, g, b] = rgb;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n if (max === min) return 0;\n const d = max - min;\n let h: number;\n if (max === r) h = ((g - b) / d) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n return Math.round((h * 60 + 360) % 360);\n}\n\n/**\n * Convert a hex color + alpha (0..1) to an `rgba()` string.\n * Falls back to the input on parse failure (e.g. a value that is\n * already an rgba()/gradient string).\n */\nexport function withAlpha(hex: string, alpha: number): string {\n const rgb = parseHex(hex);\n if (!rgb) return hex;\n const a = Math.max(0, Math.min(1, alpha));\n const ch = (v: number) => Math.round(v * 255);\n return `rgba(${ch(rgb[0])}, ${ch(rgb[1])}, ${ch(rgb[2])}, ${a})`;\n}\n\n/**\n * WCAG contrast ratio between two hex colors. Returns 1..21.\n */\nexport function contrastRatio(a: string, b: string): number {\n const la = relativeLuminance(a);\n const lb = relativeLuminance(b);\n const lighter = Math.max(la, lb);\n const darker = Math.min(la, lb);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Pick a near-white or near-black text color that contrasts well against `bg`.\n */\nexport function pickContrastingText(bg: string, light = '#f7fafc', dark = '#1a202c'): string {\n return contrastRatio(bg, dark) >= contrastRatio(bg, light) ? dark : light;\n}\n\n/**\n * Derive a 5-step lighter→darker scale from a seed color.\n * Stops are evenly spaced in OKLCh L space around the seed.\n * `spread` controls amplitude (0.05 = subtle, 0.15 = balanced, 0.22 = high).\n */\nexport function deriveScale(\n seedHex: string,\n spread = 0.15,\n): {\n lighter2: string;\n lighter1: string;\n base: string;\n darker1: string;\n darker2: string;\n} {\n return {\n lighter2: oklchLighten(seedHex, spread),\n lighter1: oklchLighten(seedHex, spread / 2),\n base: seedHex,\n darker1: oklchDarken(seedHex, spread / 2),\n darker2: oklchDarken(seedHex, spread),\n };\n}\n","/**\n * Theme Validator\n *\n * Hand-rolled validator for `Theme` JSON. No dependencies. Produces a\n * flat list of typed errors with JSON paths, suitable for surfacing in\n * the customizer UI or throwing at module init for built-in themes.\n *\n * Design: walk the candidate object, push errors for each violation.\n * Coverage is exhaustive for required fields and shapes; permissive on\n * forward-compatible fields (unknown keys are ignored, not rejected).\n */\n\nimport type { Theme, ThemeColorPalette } from './Theme.js';\nimport { THEME_SCHEMA_VERSION } from './themeConstants.js';\nimport { isHex } from './colorUtils.js';\nimport { isTransitionType } from './Transitions.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n /** Present only when `valid === true`. The same input typed as `Theme`. */\n theme?: Theme;\n}\n\nconst VALID_FALLBACK = new Set(['serif', 'sans-serif', 'monospace', 'system-ui']);\nconst VALID_TITLE_WEIGHT = new Set(['normal', 'bold']);\nconst VALID_GRADIENT_PRESETS = new Set([\n 'dark-vignette',\n 'radial-dark',\n 'warm-sunset',\n 'cool-blue',\n 'earth-tones',\n]);\n\nclass V {\n errors: ValidationError[] = [];\n err(path: string, message: string): void {\n this.errors.push({ path, message });\n }\n isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n }\n isString(v: unknown): v is string {\n return typeof v === 'string';\n }\n isNumber(v: unknown): v is number {\n return typeof v === 'number' && Number.isFinite(v);\n }\n isBoolean(v: unknown): v is boolean {\n return typeof v === 'boolean';\n }\n hex(path: string, v: unknown): void {\n if (!this.isString(v)) {\n this.err(path, `expected hex color string, got ${typeof v}`);\n } else if (!isHex(v)) {\n this.err(path, `expected #rgb or #rrggbb hex color, got \"${v}\"`);\n }\n }\n\n palette(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n const required: (keyof ThemeColorPalette)[] = [\n 'primary',\n 'secondary',\n 'background',\n 'backgroundLight',\n 'text',\n 'textMuted',\n 'highlight',\n 'warning',\n ];\n for (const k of required) this.hex(`${path}.${k}`, v[k]);\n }\n\n colorScheme(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n this.hex(`${path}.bg`, v.bg);\n this.hex(`${path}.text`, v.text);\n this.hex(`${path}.accent`, v.accent);\n }\n\n colorSchemes(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object map');\n return;\n }\n for (const key of Object.keys(v)) {\n this.colorScheme(`${path}.${key}`, v[key]);\n }\n }\n\n fontFamily(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected FontFamily object ({ stackId } or { custom })');\n return;\n }\n if ('stackId' in v) {\n if (!this.isString(v.stackId) || v.stackId.length === 0) {\n this.err(`${path}.stackId`, 'expected non-empty string');\n }\n return;\n }\n if ('custom' in v) {\n const c = v.custom;\n if (!this.isObject(c)) {\n this.err(`${path}.custom`, 'expected { name, fallback } object');\n return;\n }\n if (!this.isString(c.name) || c.name.length === 0) {\n this.err(`${path}.custom.name`, 'expected non-empty string');\n }\n if (!this.isString(c.fallback) || !VALID_FALLBACK.has(c.fallback)) {\n this.err(\n `${path}.custom.fallback`,\n `expected one of: serif, sans-serif, monospace, system-ui`,\n );\n }\n return;\n }\n this.err(path, 'expected { stackId } or { custom: { name, fallback } }');\n }\n\n typography(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n this.fontFamily(`${path}.bodyFont`, v.bodyFont);\n this.fontFamily(`${path}.titleFont`, v.titleFont);\n if (v.monoFont !== undefined) this.fontFamily(`${path}.monoFont`, v.monoFont);\n for (const k of ['titleScale', 'bodyScale', 'lineHeight', 'titleLineHeight']) {\n if (v[k] !== undefined && !this.isNumber(v[k])) {\n this.err(`${path}.${k}`, `expected number, got ${typeof v[k]}`);\n }\n }\n if (v.titleWeight !== undefined) {\n if (!this.isString(v.titleWeight) || !VALID_TITLE_WEIGHT.has(v.titleWeight)) {\n this.err(`${path}.titleWeight`, 'expected \"normal\" or \"bold\"');\n }\n }\n }\n\n style(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n if (v.borderRadius !== undefined && !this.isNumber(v.borderRadius)) {\n this.err(`${path}.borderRadius`, 'expected number');\n }\n if (v.textShadow !== undefined && !this.isBoolean(v.textShadow)) {\n this.err(`${path}.textShadow`, 'expected boolean');\n }\n for (const k of ['overlayOpacity', 'animationSpeed']) {\n if (v[k] !== undefined && !this.isNumber(v[k])) {\n this.err(`${path}.${k}`, 'expected number');\n }\n }\n if (v.blockPadding !== undefined && !this.isString(v.blockPadding)) {\n this.err(`${path}.blockPadding`, 'expected string (percentage e.g. \"5%\")');\n }\n if (v.imageTreatment !== undefined) {\n this.imageTreatment(`${path}.imageTreatment`, v.imageTreatment);\n }\n }\n\n imageTreatment(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n const kinds = ['none', 'mono', 'duotone', 'warm', 'cool'];\n if (!this.isString(v.type) || !kinds.includes(v.type)) {\n this.err(`${path}.type`, `expected one of ${kinds.join('|')}`);\n }\n if (v.strength !== undefined && !this.isNumber(v.strength)) {\n this.err(`${path}.strength`, 'expected number (0..1)');\n }\n if (v.color !== undefined) this.hex(`${path}.color`, v.color);\n }\n\n renderStyle(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n if (!this.isString(v.name) || v.name.length === 0) {\n this.err(`${path}.name`, 'expected non-empty string');\n }\n if (v.ambientMotion !== undefined && !this.isBoolean(v.ambientMotion)) {\n this.err(`${path}.ambientMotion`, 'expected boolean');\n }\n for (const k of ['defaultTextAnimation', 'defaultImageAnimation']) {\n if (v[k] !== undefined && !this.isString(v[k])) {\n this.err(`${path}.${k}`, 'expected animation type string');\n }\n }\n if (v.defaultTransition !== undefined) {\n const t = v.defaultTransition;\n if (!this.isObject(t)) {\n this.err(`${path}.defaultTransition`, 'expected object');\n } else {\n if (!this.isString(t.type) || !isTransitionType(t.type)) {\n this.err(`${path}.defaultTransition.type`, 'expected valid transition type');\n }\n if (t.duration !== undefined && !this.isNumber(t.duration)) {\n this.err(`${path}.defaultTransition.duration`, 'expected number');\n }\n }\n }\n if (v.layoutOverrides !== undefined && !this.isObject(v.layoutOverrides)) {\n this.err(`${path}.layoutOverrides`, 'expected object');\n }\n if (v.templateHints !== undefined) {\n if (!this.isObject(v.templateHints)) {\n this.err(`${path}.templateHints`, 'expected object map');\n } else {\n for (const tplName of Object.keys(v.templateHints)) {\n const hints = v.templateHints[tplName];\n if (!this.isObject(hints)) {\n this.err(`${path}.templateHints.${tplName}`, 'expected object');\n continue;\n }\n for (const key of Object.keys(hints)) {\n const val = hints[key];\n const t = typeof val;\n if (t !== 'string' && t !== 'number' && t !== 'boolean') {\n this.err(\n `${path}.templateHints.${tplName}.${key}`,\n `expected string|number|boolean, got ${t}`,\n );\n }\n }\n }\n }\n }\n }\n\n seedColors(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n if (v.primary === undefined) {\n this.err(`${path}.primary`, 'required when seedColors is present');\n } else {\n this.hex(`${path}.primary`, v.primary);\n }\n for (const k of ['secondary', 'accent', 'background', 'text']) {\n if (v[k] !== undefined) this.hex(`${path}.${k}`, v[k]);\n }\n }\n\n persistentLayer(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n // Either { template, config } or a raw Layer — only validate the template form here\n if ('template' in v) {\n if (!this.isString(v.template)) {\n this.err(`${path}.template`, 'expected string');\n return;\n }\n const cfg = v.config;\n if (!this.isObject(cfg)) {\n this.err(`${path}.config`, 'expected object');\n return;\n }\n if (cfg.type !== v.template) {\n this.err(`${path}.config.type`, `expected \"${v.template}\", got \"${String(cfg.type)}\"`);\n }\n if (v.template === 'gradientBackground' && cfg.preset !== undefined) {\n if (!this.isString(cfg.preset) || !VALID_GRADIENT_PRESETS.has(cfg.preset)) {\n this.err(\n `${path}.config.preset`,\n `expected one of: ${Array.from(VALID_GRADIENT_PRESETS).join(', ')}`,\n );\n }\n }\n if (v.template === 'gradientBackground' && 'gradient' in cfg) {\n this.err(\n `${path}.config.gradient`,\n 'raw CSS gradient strings are not allowed in Theme JSON; use a `preset`',\n );\n }\n if (v.template === 'patternBackground') {\n const patterns = ['dots', 'grid', 'diagonal', 'noise'];\n if (!this.isString(cfg.pattern) || !patterns.includes(cfg.pattern)) {\n this.err(`${path}.config.pattern`, `expected one of ${patterns.join('|')}`);\n }\n for (const k of ['opacity', 'scale']) {\n if (cfg[k] !== undefined && !this.isNumber(cfg[k])) {\n this.err(`${path}.config.${k}`, 'expected number');\n }\n }\n if (cfg.color !== undefined) this.hex(`${path}.config.color`, cfg.color);\n }\n if (v.template === 'vignette') {\n if (cfg.strength !== undefined && !this.isNumber(cfg.strength)) {\n this.err(`${path}.config.strength`, 'expected number (0..1)');\n }\n if (cfg.color !== undefined) this.hex(`${path}.config.color`, cfg.color);\n }\n if (v.template === 'ambientGradient') {\n if (cfg.duration !== undefined && !this.isNumber(cfg.duration)) {\n this.err(`${path}.config.duration`, 'expected number (seconds)');\n }\n for (const k of ['from', 'to']) {\n if (cfg[k] !== undefined) this.hex(`${path}.config.${k}`, cfg[k]);\n }\n }\n }\n // Raw Layer form is permissive — no schema check here\n }\n\n persistentLayers(path: string, v: unknown): void {\n if (!this.isObject(v)) {\n this.err(path, 'expected object');\n return;\n }\n for (const side of ['bottomLayers', 'topLayers']) {\n const arr = v[side];\n if (arr === undefined) continue;\n if (!Array.isArray(arr)) {\n this.err(`${path}.${side}`, 'expected array');\n continue;\n }\n arr.forEach((entry, i) => this.persistentLayer(`${path}.${side}[${i}]`, entry));\n }\n }\n}\n\nexport function validateTheme(input: unknown): ValidationResult {\n const v = new V();\n if (!v.isObject(input)) {\n return { valid: false, errors: [{ path: '', message: 'expected object' }] };\n }\n\n if (input.schemaVersion !== THEME_SCHEMA_VERSION) {\n v.err(\n 'schemaVersion',\n `expected \"${THEME_SCHEMA_VERSION}\", got \"${String(input.schemaVersion)}\"`,\n );\n }\n if (!v.isString(input.id) || input.id.length === 0) {\n v.err('id', 'expected non-empty string');\n }\n if (!v.isString(input.name) || input.name.length === 0) {\n v.err('name', 'expected non-empty string');\n }\n if (input.description !== undefined && !v.isString(input.description)) {\n v.err('description', 'expected string');\n }\n if (input.basedOn !== undefined && !v.isString(input.basedOn)) {\n v.err('basedOn', 'expected string');\n }\n\n if (input.seedColors !== undefined) v.seedColors('seedColors', input.seedColors);\n\n if (input.colors === undefined) {\n v.err('colors', 'required');\n } else {\n v.palette('colors', input.colors);\n }\n\n if (input.typography === undefined) {\n v.err('typography', 'required');\n } else {\n v.typography('typography', input.typography);\n }\n\n if (input.style === undefined) {\n v.err('style', 'required');\n } else {\n v.style('style', input.style);\n }\n\n if (input.renderStyle === undefined) {\n v.err('renderStyle', 'required');\n } else {\n v.renderStyle('renderStyle', input.renderStyle);\n }\n\n if (input.colorSchemes === undefined) {\n v.err('colorSchemes', 'required');\n } else {\n v.colorSchemes('colorSchemes', input.colorSchemes);\n }\n\n if (input.persistentLayers !== undefined) {\n v.persistentLayers('persistentLayers', input.persistentLayers);\n }\n\n if (v.errors.length === 0) {\n return { valid: true, errors: [], theme: input as unknown as Theme };\n }\n return { valid: false, errors: v.errors };\n}\n\n/** Throws on invalid input. Useful at module init for built-in themes. */\nexport function assertTheme(input: unknown, source = 'theme'): Theme {\n const result = validateTheme(input);\n if (!result.valid || !result.theme) {\n const summary = result.errors\n .slice(0, 5)\n .map((e) => ` ${e.path || '<root>'}: ${e.message}`)\n .join('\\n');\n const more = result.errors.length > 5 ? `\\n ... and ${result.errors.length - 5} more` : '';\n throw new Error(`Invalid ${source}:\\n${summary}${more}`);\n }\n return result.theme;\n}\n\n// (Theme types are re-exported from `./Theme.js` via the schemas barrel.)\n","/**\n * Theme System\n *\n * A Theme bundles color palette, typography, visual style, render-style\n * algorithm, and per-block color schemes into one JSON-serializable object.\n *\n * Built-in themes and customizer-authored themes share this exact schema.\n * Customizer-authored themes additionally specify `seedColors` so the few\n * fields the user picked can be re-edited later; built-ins typically omit\n * `seedColors` and ship with explicit `colors` already filled in.\n *\n * Design principles:\n * - Fully JSON-serializable. No functions; no raw CSS font strings.\n * - Font families are structured `FontFamily` references resolved by\n * `resolveFontFamily()` at render time.\n * - Doc carries an optional `themeId`; resolution happens at render time\n * via `resolveTheme(id)`.\n * - `createTheme` deep-merges a base theme with partial overrides;\n * `compileTheme` fills in defaults and derives missing color slots from\n * `seedColors`; both produce a complete `Theme`.\n */\n\nimport type { LayoutHints } from './LayoutStrategy.js';\nimport type { AnimationType, ImageTreatment, TransitionType } from './Doc.js';\nimport type { PersistentLayerConfig } from './BlockTemplates.js';\nimport { THEME_SCHEMA_VERSION } from './themeConstants.js';\nimport { validateTheme } from './themeValidator.js';\nimport { cloneAndFreezeData } from '../internal/immutable.js';\n\n// ============================================\n// Schema version\n// ============================================\n\nexport { THEME_SCHEMA_VERSION } from './themeConstants.js';\nexport type ThemeSchemaVersion = typeof THEME_SCHEMA_VERSION;\n\n/**\n * Frontmatter key under which a document inlines its custom Theme\n * definitions. The theme analog of `FRONTMATTER_CUSTOM_TEMPLATES_KEY`\n * (custom block templates). See `doc/customThemesFrontmatter.ts` for the\n * codec and `doc/resolveDocTheme.ts` for doc-scoped resolution.\n */\nexport const FRONTMATTER_CUSTOM_THEMES_KEY = 'squisq-custom-themes';\n\n// ============================================\n// Color Palette\n// ============================================\n\n/**\n * Core color palette for a theme. Every color is a `#rrggbb` hex string.\n */\nexport interface ThemeColorPalette {\n /** Primary accent color */\n primary: string;\n /** Secondary accent color */\n secondary: string;\n /** Background color (typically dark) */\n background: string;\n /** Lighter background for contrast panels */\n backgroundLight: string;\n /** Main text color */\n text: string;\n /** Muted/secondary text color */\n textMuted: string;\n /** Highlight/emphasis color */\n highlight: string;\n /** Warning/alert color */\n warning: string;\n}\n\n/**\n * A named color scheme used by templates for per-block color variation\n * (e.g., statHighlight or sectionHeader).\n */\nexport interface ThemeColorScheme {\n /** Background fill */\n bg: string;\n /** Primary text tint */\n text: string;\n /** Accent / secondary tint */\n accent: string;\n}\n\n/**\n * Optional authoring metadata. When present and `colors` is partial,\n * `compileTheme` derives missing color slots from these seeds via OKLCh\n * lightening / darkening. Round-trips a customizer-authored theme back\n * into editable form.\n */\nexport interface ThemeSeedColors {\n primary: string;\n secondary?: string;\n accent?: string;\n background?: string;\n text?: string;\n}\n\n// ============================================\n// Typography\n// ============================================\n\n/** Categorical bucket for a font family — drives default fallback. */\nexport type FontFamilyKind = 'sans' | 'serif' | 'mono' | 'display';\n\n/**\n * Structured reference to a font family. Either a curated stack id (looked\n * up in `AVAILABLE_FONT_STACKS`) or a custom user-supplied name with a\n * structured fallback bucket. Themes never carry raw CSS family strings.\n */\nexport type FontFamily =\n | { stackId: string }\n | {\n custom: {\n name: string;\n fallback: 'serif' | 'sans-serif' | 'monospace' | 'system-ui';\n };\n };\n\n/**\n * Typography settings for a theme.\n */\nexport interface ThemeTypography {\n /** Font family for body / description text */\n bodyFont: FontFamily;\n /** Font family for titles and headings */\n titleFont: FontFamily;\n /** Font family for code / monospaced text (optional) */\n monoFont?: FontFamily;\n /** Multiplier applied to LayoutHints.titleScale (default 1.0) */\n titleScale?: number;\n /** Multiplier applied to LayoutHints.bodyScale (default 1.0) */\n bodyScale?: number;\n /** Default body line height (default 1.4) */\n lineHeight?: number;\n /** Default title line height */\n titleLineHeight?: number;\n /** Default title font weight */\n titleWeight?: 'normal' | 'bold';\n}\n\n// ============================================\n// Visual Style\n// ============================================\n\n/**\n * Global visual-style knobs that templates consult.\n */\nexport interface ThemeStyle {\n /** Default border radius for cards / shapes (px) */\n borderRadius?: number;\n /** Whether templates should default to text shadows */\n textShadow?: boolean;\n /** Darkness of overlay on image-backed blocks (0–1) */\n overlayOpacity?: number;\n /** Multiplier on all animation durations (1.0 = normal, <1 faster, >1 slower) */\n animationSpeed?: number;\n /** Default horizontal padding for text (percentage string, e.g. \"5%\") */\n blockPadding?: string;\n /**\n * Photographic grade applied to template imagery (full-bleed photos,\n * feature halves, accent strips) so photos look native to the theme.\n * Duotone tints default to the theme primary. Blocks opt out per\n * template via `imageTreatment: 'none'`.\n */\n imageTreatment?: ImageTreatment;\n}\n\n// ============================================\n// Render Style\n// ============================================\n\n/**\n * Render-style algorithm preset. Controls layout tweaks, default animations,\n * transitions, and per-template behavioral hints.\n */\nexport interface RenderStyle {\n /** Identifier for this algorithmic approach (e.g. \"documentary\", \"magazine\") */\n name: string;\n /** Partial overrides merged onto the orientation-based LayoutHints */\n layoutOverrides?: Partial<LayoutHints>;\n /** Default entrance animation for text layers */\n defaultTextAnimation?: AnimationType;\n /** Default animation for background / image layers */\n defaultImageAnimation?: AnimationType;\n /** Whether to apply Ken Burns ambient motion to images by default */\n ambientMotion?: boolean;\n /** Default block-to-block transition */\n defaultTransition?: { type: TransitionType; duration?: number };\n /**\n * Per-template behavioral hints. Keys are template names, values are\n * string/number/boolean maps that templates can read to vary their output.\n * Templates that consume hints publish a `hintSchema` export documenting\n * the keys they recognise.\n */\n templateHints?: Record<string, Record<string, string | number | boolean>>;\n}\n\n// ============================================\n// Theme\n// ============================================\n\n/**\n * A complete, JSON-serializable theme definition. Built-in and customizer-\n * authored themes share this exact shape.\n */\nexport interface Theme {\n /** Schema version. Always '1' for now. */\n schemaVersion: ThemeSchemaVersion;\n /** Unique identifier (e.g. \"documentary\") */\n id: string;\n /** Human-readable display name */\n name: string;\n /** Short description for theme pickers */\n description?: string;\n /**\n * Id of the theme this custom theme was derived from, if any. Recorded\n * by `compileTheme({ base })` so a customizer can re-open the theme and\n * re-inherit the base's render style / color schemes / typography.\n * Absent on built-ins.\n */\n basedOn?: string;\n /** Optional authoring seeds (customizer fills these; built-ins typically omit) */\n seedColors?: ThemeSeedColors;\n /** Color palette */\n colors: ThemeColorPalette;\n /** Typography settings */\n typography: ThemeTypography;\n /** Global visual-style knobs */\n style: ThemeStyle;\n /** Algorithmic render-style preset */\n renderStyle: RenderStyle;\n /**\n * Named color schemes for per-block color variation.\n * Templates reference these by name (e.g. \"blue\", \"warm\").\n */\n colorSchemes: Record<string, ThemeColorScheme>;\n /** Optional persistent layers baked into the theme */\n persistentLayers?: PersistentLayerConfig;\n}\n\n// ============================================\n// Deep-Partial helper type\n// ============================================\n\n/**\n * Recursively makes every property optional.\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n// ============================================\n// Helpers\n// ============================================\n\n/**\n * Deep-merge `source` into `target`, returning a new object.\n * Arrays are replaced wholesale (not concatenated).\n */\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: DeepPartial<T>): T {\n const result = { ...target } as Record<string, unknown>;\n for (const key of Object.keys(source)) {\n const srcVal = (source as Record<string, unknown>)[key];\n const tgtVal = (target as Record<string, unknown>)[key];\n if (\n srcVal !== null &&\n srcVal !== undefined &&\n typeof srcVal === 'object' &&\n !Array.isArray(srcVal) &&\n tgtVal !== null &&\n tgtVal !== undefined &&\n typeof tgtVal === 'object' &&\n !Array.isArray(tgtVal)\n ) {\n result[key] = deepMerge(\n tgtVal as Record<string, unknown>,\n srcVal as DeepPartial<Record<string, unknown>>,\n );\n } else if (srcVal !== undefined) {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\n/**\n * Create a new theme by deep-merging overrides onto a base theme.\n * The returned theme gets its own `id` if one is provided in overrides,\n * otherwise keeps the base theme's `id` suffixed with \"-custom\".\n */\nexport function createTheme(base: Theme, overrides: DeepPartial<Theme>): Theme {\n const merged = deepMerge(\n base as unknown as Record<string, unknown>,\n overrides as DeepPartial<Record<string, unknown>>,\n ) as unknown as Theme;\n if (!overrides.id && merged.id === base.id) {\n merged.id = `${base.id}-custom`;\n }\n if (!merged.schemaVersion) merged.schemaVersion = THEME_SCHEMA_VERSION;\n return merged;\n}\n\n// ============================================\n// Surface Schemes — orthogonal to Theme\n// ============================================\n\n/**\n * A Surface Scheme is the light/dark axis, orthogonal to the editorial\n * identity of a Theme. A Theme chooses voice (serif vs sans, muted vs\n * bold, documentary vs magazine); a SurfaceScheme chooses what the paper\n * looks like. Any theme can render on either surface.\n */\nexport interface SurfaceScheme {\n /** Identifier — 'light', 'dark', or a custom id. */\n id: string;\n background: string;\n backgroundLight: string;\n text: string;\n textMuted: string;\n}\n\n/** Near-white paper with dark text — standard light mode. */\nexport const LIGHT_SURFACE: SurfaceScheme = {\n id: 'light',\n background: '#ffffff',\n backgroundLight: '#f5f5f5',\n text: '#1a1a1a',\n textMuted: '#666666',\n};\n\n/** Dark charcoal paper with light text — standard dark mode. */\nexport const DARK_SURFACE: SurfaceScheme = {\n id: 'dark',\n background: '#1a202c',\n backgroundLight: '#2d3748',\n text: '#f0f0f0',\n textMuted: '#a0aec0',\n};\n\n/**\n * Overlay a SurfaceScheme's surface colors onto a Theme's palette,\n * leaving everything else (primary, highlight, warning, typography,\n * style, renderStyle, colorSchemes) untouched.\n */\nexport function applySurface(theme: Theme, surface: SurfaceScheme): Theme {\n return {\n ...theme,\n colors: {\n ...theme.colors,\n background: surface.background,\n backgroundLight: surface.backgroundLight,\n text: surface.text,\n textMuted: surface.textMuted,\n },\n };\n}\n\n// ============================================\n// Caller-owned registry — for custom themes\n// ============================================\n\n/** A caller-owned custom-theme registry for SSR tenants, tests, and embedders. */\nexport interface ThemeRegistry {\n register(theme: Theme): void;\n unregister(id: string): boolean;\n get(id: string): Theme | undefined;\n list(): Theme[];\n}\n\nfunction validatedThemeSnapshot(theme: Theme): Theme {\n const result = validateTheme(theme);\n if (!result.valid || !result.theme) {\n const details = result.errors\n .slice(0, 5)\n .map((error) => `${error.path || '<root>'}: ${error.message}`)\n .join('; ');\n throw new TypeError(`Cannot register invalid theme: ${details}`);\n }\n return cloneAndFreezeData(result.theme);\n}\n\n/**\n * Create a registry whose state is owned by the caller rather than the\n * process. Registered values are validated and stored as deeply frozen\n * snapshots, so later caller mutation cannot alter resolution behavior.\n */\nexport function createThemeRegistry(initialThemes: readonly Theme[] = []): ThemeRegistry {\n const themes = new Map<string, Theme>();\n const registry: ThemeRegistry = {\n register(theme): void {\n const snapshot = validatedThemeSnapshot(theme);\n themes.set(snapshot.id, snapshot);\n },\n unregister(id): boolean {\n return themes.delete(id);\n },\n get(id): Theme | undefined {\n return themes.get(id);\n },\n list(): Theme[] {\n return Array.from(themes.values());\n },\n };\n for (const theme of initialThemes) registry.register(theme);\n return Object.freeze(registry);\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"standard\",\n \"name\": \"Standard Light\",\n \"description\": \"Clean and safe — black-on-white, system fonts only, no external font dependencies. Default theme.\",\n \"colors\": {\n \"primary\": \"#2563eb\",\n \"secondary\": \"#475569\",\n \"background\": \"#ffffff\",\n \"backgroundLight\": \"#f1f5f9\",\n \"text\": \"#0f172a\",\n \"textMuted\": \"#475569\",\n \"highlight\": \"#1d4ed8\",\n \"warning\": \"#dc2626\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"system-sans\"\n },\n \"titleFont\": {\n \"stackId\": \"system-serif\"\n },\n \"monoFont\": {\n \"stackId\": \"system-mono\"\n },\n \"titleWeight\": \"bold\"\n },\n \"style\": {\n \"textShadow\": false,\n \"overlayOpacity\": 0.35,\n \"animationSpeed\": 1.0\n },\n \"renderStyle\": {\n \"name\": \"standard\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"ambientMotion\": false,\n \"defaultTransition\": {\n \"type\": \"fade\",\n \"duration\": 0.7\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#dbeafe\",\n \"text\": \"#1d4ed8\",\n \"accent\": \"#2563eb\"\n },\n \"green\": {\n \"bg\": \"#dcfce7\",\n \"text\": \"#166534\",\n \"accent\": \"#16a34a\"\n },\n \"purple\": {\n \"bg\": \"#ede9fe\",\n \"text\": \"#5b21b6\",\n \"accent\": \"#7c3aed\"\n },\n \"red\": {\n \"bg\": \"#fee2e2\",\n \"text\": \"#991b1b\",\n \"accent\": \"#dc2626\"\n },\n \"orange\": {\n \"bg\": \"#ffedd5\",\n \"text\": \"#9a3412\",\n \"accent\": \"#ea580c\"\n },\n \"teal\": {\n \"bg\": \"#ccfbf1\",\n \"text\": \"#115e59\",\n \"accent\": \"#0d9488\"\n }\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"standard-dark\",\n \"name\": \"Standard Dark\",\n \"description\": \"Standard, dark variant. System fonts, dark navy background, light text.\",\n \"colors\": {\n \"primary\": \"#3182ce\",\n \"secondary\": \"#4a5568\",\n \"background\": \"#1a202c\",\n \"backgroundLight\": \"#2d3748\",\n \"text\": \"#f7fafc\",\n \"textMuted\": \"#a0aec0\",\n \"highlight\": \"#4299e1\",\n \"warning\": \"#fc8181\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"system-sans\"\n },\n \"titleFont\": {\n \"stackId\": \"system-serif\"\n },\n \"monoFont\": {\n \"stackId\": \"system-mono\"\n },\n \"titleWeight\": \"bold\"\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.45,\n \"animationSpeed\": 1.0\n },\n \"renderStyle\": {\n \"name\": \"standard\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"ambientMotion\": false,\n \"defaultTransition\": {\n \"type\": \"fade\",\n \"duration\": 0.7\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#1a365d\",\n \"text\": \"#63b3ed\",\n \"accent\": \"#90cdf4\"\n },\n \"green\": {\n \"bg\": \"#22543d\",\n \"text\": \"#9ae6b4\",\n \"accent\": \"#68d391\"\n },\n \"purple\": {\n \"bg\": \"#44337a\",\n \"text\": \"#d6bcfa\",\n \"accent\": \"#b794f4\"\n },\n \"red\": {\n \"bg\": \"#742a2a\",\n \"text\": \"#fc8181\",\n \"accent\": \"#feb2b2\"\n },\n \"orange\": {\n \"bg\": \"#744210\",\n \"text\": \"#fbd38d\",\n \"accent\": \"#f6ad55\"\n },\n \"teal\": {\n \"bg\": \"#234e52\",\n \"text\": \"#81e6d9\",\n \"accent\": \"#4fd1c5\"\n }\n },\n \"persistentLayers\": {\n \"bottomLayers\": [\n {\n \"template\": \"gradientBackground\",\n \"config\": {\n \"type\": \"gradientBackground\",\n \"preset\": \"dark-vignette\"\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"documentary\",\n \"name\": \"Documentary\",\n \"description\": \"Classic dark cinematic look with elegant serif typography.\",\n \"colors\": {\n \"primary\": \"#3d5a80\",\n \"secondary\": \"#63b3ed\",\n \"background\": \"#1a202c\",\n \"backgroundLight\": \"#2d3748\",\n \"text\": \"#ffffff\",\n \"textMuted\": \"#a0aec0\",\n \"highlight\": \"#63b3ed\",\n \"warning\": \"#fc8181\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"source-serif\"\n },\n \"titleFont\": {\n \"stackId\": \"playfair\"\n },\n \"titleWeight\": \"bold\"\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.5,\n \"animationSpeed\": 1.0,\n \"imageTreatment\": {\n \"type\": \"mono\",\n \"strength\": 0.35\n }\n },\n \"renderStyle\": {\n \"name\": \"documentary\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": true,\n \"defaultTransition\": {\n \"type\": \"fade\",\n \"duration\": 0.8\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#22354d\",\n \"text\": \"#a8c3e0\",\n \"accent\": \"#7fa3c9\"\n },\n \"green\": {\n \"bg\": \"#26382e\",\n \"text\": \"#a9c6ae\",\n \"accent\": \"#82a88a\"\n },\n \"purple\": {\n \"bg\": \"#35304a\",\n \"text\": \"#beb3d6\",\n \"accent\": \"#9d8fc2\"\n },\n \"red\": {\n \"bg\": \"#45262a\",\n \"text\": \"#d9a2a2\",\n \"accent\": \"#c37f7c\"\n },\n \"orange\": {\n \"bg\": \"#453522\",\n \"text\": \"#d9bb90\",\n \"accent\": \"#c29a64\"\n },\n \"teal\": {\n \"bg\": \"#1f3a3d\",\n \"text\": \"#9cc4c4\",\n \"accent\": \"#6fa5a5\"\n }\n },\n \"persistentLayers\": {\n \"bottomLayers\": [\n {\n \"template\": \"gradientBackground\",\n \"config\": {\n \"type\": \"gradientBackground\",\n \"preset\": \"dark-vignette\"\n }\n }\n ],\n \"topLayers\": [\n {\n \"template\": \"vignette\",\n \"config\": {\n \"type\": \"vignette\",\n \"strength\": 0.25\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"minimalist\",\n \"name\": \"Minimalist\",\n \"description\": \"Clean near-white background with sans-serif type and minimal animation.\",\n \"colors\": {\n \"primary\": \"#2d3748\",\n \"secondary\": \"#4a5568\",\n \"background\": \"#f7fafc\",\n \"backgroundLight\": \"#edf2f7\",\n \"text\": \"#1a202c\",\n \"textMuted\": \"#718096\",\n \"highlight\": \"#3182ce\",\n \"warning\": \"#e53e3e\"\n },\n \"typography\": {\n \"bodyFont\": { \"stackId\": \"inter\" },\n \"titleFont\": { \"stackId\": \"inter\" },\n \"titleWeight\": \"bold\",\n \"lineHeight\": 1.6\n },\n \"style\": {\n \"textShadow\": false,\n \"overlayOpacity\": 0.3,\n \"animationSpeed\": 1.2,\n \"borderRadius\": 8\n },\n \"renderStyle\": {\n \"name\": \"minimalist\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"ambientMotion\": false,\n \"defaultTransition\": { \"type\": \"fade\", \"duration\": 0.6 },\n \"templateHints\": {\n \"title\": { \"showAccentLine\": false }\n }\n },\n \"colorSchemes\": {\n \"blue\": { \"bg\": \"#ebf8ff\", \"text\": \"#2b6cb0\", \"accent\": \"#3182ce\" },\n \"green\": { \"bg\": \"#f0fff4\", \"text\": \"#276749\", \"accent\": \"#38a169\" },\n \"purple\": { \"bg\": \"#faf5ff\", \"text\": \"#553c9a\", \"accent\": \"#805ad5\" },\n \"red\": { \"bg\": \"#fff5f5\", \"text\": \"#c53030\", \"accent\": \"#e53e3e\" },\n \"orange\": { \"bg\": \"#fffaf0\", \"text\": \"#c05621\", \"accent\": \"#dd6b20\" },\n \"teal\": { \"bg\": \"#e6fffa\", \"text\": \"#285e61\", \"accent\": \"#319795\" }\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"bold\",\n \"name\": \"Bold\",\n \"description\": \"High-contrast black with vivid accents and dramatic animations.\",\n \"colors\": {\n \"primary\": \"#e53e3e\",\n \"secondary\": \"#ed8936\",\n \"background\": \"#000000\",\n \"backgroundLight\": \"#1a1a1a\",\n \"text\": \"#ffffff\",\n \"textMuted\": \"#cbd5e0\",\n \"highlight\": \"#f6e05e\",\n \"warning\": \"#fc8181\"\n },\n \"typography\": {\n \"bodyFont\": { \"stackId\": \"roboto\" },\n \"titleFont\": { \"stackId\": \"oswald\" },\n \"titleWeight\": \"bold\",\n \"titleScale\": 1.15,\n \"bodyScale\": 1.0,\n \"titleLineHeight\": 1.1\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.6,\n \"animationSpeed\": 0.8\n },\n \"renderStyle\": {\n \"name\": \"bold\",\n \"defaultTextAnimation\": \"zoomIn\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": true,\n \"defaultTransition\": { \"type\": \"dissolve\", \"duration\": 0.5 },\n \"templateHints\": {\n \"statHighlight\": { \"entrance\": \"dramatic\" },\n \"fullBleedQuote\": { \"entrance\": \"dramatic\" }\n }\n },\n \"colorSchemes\": {\n \"blue\": { \"bg\": \"#1a202c\", \"text\": \"#63b3ed\", \"accent\": \"#90cdf4\" },\n \"green\": { \"bg\": \"#1a202c\", \"text\": \"#48bb78\", \"accent\": \"#68d391\" },\n \"purple\": { \"bg\": \"#1a202c\", \"text\": \"#b794f4\", \"accent\": \"#d6bcfa\" },\n \"red\": { \"bg\": \"#1a202c\", \"text\": \"#fc8181\", \"accent\": \"#feb2b2\" },\n \"orange\": { \"bg\": \"#1a202c\", \"text\": \"#f6ad55\", \"accent\": \"#fbd38d\" },\n \"teal\": { \"bg\": \"#1a202c\", \"text\": \"#4fd1c5\", \"accent\": \"#81e6d9\" }\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"morning-light\",\n \"name\": \"Morning Light\",\n \"description\": \"Warm light background with dark text and gentle serif typography.\",\n \"colors\": {\n \"primary\": \"#744210\",\n \"secondary\": \"#975a16\",\n \"background\": \"#faf8f5\",\n \"backgroundLight\": \"#f5f0eb\",\n \"text\": \"#2d3748\",\n \"textMuted\": \"#718096\",\n \"highlight\": \"#dd6b20\",\n \"warning\": \"#c53030\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"lora\"\n },\n \"titleFont\": {\n \"stackId\": \"merriweather\"\n },\n \"titleWeight\": \"bold\",\n \"lineHeight\": 1.7\n },\n \"style\": {\n \"textShadow\": false,\n \"overlayOpacity\": 0.35,\n \"animationSpeed\": 1.1,\n \"borderRadius\": 4\n },\n \"renderStyle\": {\n \"name\": \"morning-light\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"ambientMotion\": false,\n \"defaultTransition\": {\n \"type\": \"fade\",\n \"duration\": 1.0\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#ebf8ff\",\n \"text\": \"#2c5282\",\n \"accent\": \"#4299e1\"\n },\n \"green\": {\n \"bg\": \"#f0fff4\",\n \"text\": \"#22543d\",\n \"accent\": \"#48bb78\"\n },\n \"purple\": {\n \"bg\": \"#faf5ff\",\n \"text\": \"#44337a\",\n \"accent\": \"#9f7aea\"\n },\n \"red\": {\n \"bg\": \"#fff5f5\",\n \"text\": \"#9b2c2c\",\n \"accent\": \"#fc8181\"\n },\n \"orange\": {\n \"bg\": \"#fffaf0\",\n \"text\": \"#744210\",\n \"accent\": \"#ed8936\"\n },\n \"teal\": {\n \"bg\": \"#e6fffa\",\n \"text\": \"#234e52\",\n \"accent\": \"#38b2ac\"\n }\n },\n \"persistentLayers\": {\n \"topLayers\": [\n {\n \"template\": \"patternBackground\",\n \"config\": {\n \"type\": \"patternBackground\",\n \"pattern\": \"noise\",\n \"opacity\": 0.03\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"tech-dark\",\n \"name\": \"Tech Dark\",\n \"description\": \"True black with neon cyan/green accents and monospace titles.\",\n \"colors\": {\n \"primary\": \"#00e5ff\",\n \"secondary\": \"#00e676\",\n \"background\": \"#0a0a0a\",\n \"backgroundLight\": \"#1a1a2e\",\n \"text\": \"#e0e0e0\",\n \"textMuted\": \"#9e9e9e\",\n \"highlight\": \"#00e5ff\",\n \"warning\": \"#ff5252\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"ibm-plex-sans\"\n },\n \"titleFont\": {\n \"stackId\": \"jetbrains-mono\"\n },\n \"monoFont\": {\n \"stackId\": \"jetbrains-mono\"\n },\n \"titleWeight\": \"bold\",\n \"titleScale\": 0.9,\n \"lineHeight\": 1.5\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.55,\n \"animationSpeed\": 0.9,\n \"borderRadius\": 2,\n \"imageTreatment\": {\n \"type\": \"cool\",\n \"strength\": 0.45\n }\n },\n \"renderStyle\": {\n \"name\": \"tech-dark\",\n \"defaultTextAnimation\": \"typewriter\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": true,\n \"defaultTransition\": {\n \"type\": \"dissolve\",\n \"duration\": 0.4\n },\n \"templateHints\": {\n \"statHighlight\": {\n \"entrance\": \"dramatic\"\n }\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#0d1b2a\",\n \"text\": \"#00b0ff\",\n \"accent\": \"#40c4ff\"\n },\n \"green\": {\n \"bg\": \"#0d1b0d\",\n \"text\": \"#00e676\",\n \"accent\": \"#69f0ae\"\n },\n \"purple\": {\n \"bg\": \"#1a0d2e\",\n \"text\": \"#d500f9\",\n \"accent\": \"#ea80fc\"\n },\n \"red\": {\n \"bg\": \"#2e0d0d\",\n \"text\": \"#ff5252\",\n \"accent\": \"#ff8a80\"\n },\n \"orange\": {\n \"bg\": \"#2e1a0d\",\n \"text\": \"#ff9100\",\n \"accent\": \"#ffab40\"\n },\n \"teal\": {\n \"bg\": \"#0d2e2e\",\n \"text\": \"#1de9b6\",\n \"accent\": \"#64ffda\"\n }\n },\n \"persistentLayers\": {\n \"topLayers\": [\n {\n \"template\": \"patternBackground\",\n \"config\": {\n \"type\": \"patternBackground\",\n \"pattern\": \"grid\",\n \"color\": \"#00e5ff\",\n \"opacity\": 0.04,\n \"scale\": 1.5\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"magazine\",\n \"name\": \"Magazine\",\n \"description\": \"Rich editorial palette with mixed serif/sans typography and slide transitions.\",\n \"colors\": {\n \"primary\": \"#c53030\",\n \"secondary\": \"#2b6cb0\",\n \"background\": \"#1a202c\",\n \"backgroundLight\": \"#2d3748\",\n \"text\": \"#f7fafc\",\n \"textMuted\": \"#cbd5e0\",\n \"highlight\": \"#ed8936\",\n \"warning\": \"#fc8181\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"dm-sans\"\n },\n \"titleFont\": {\n \"stackId\": \"dm-serif\"\n },\n \"titleWeight\": \"bold\",\n \"titleScale\": 1.05,\n \"lineHeight\": 1.5\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.45,\n \"animationSpeed\": 1.0,\n \"borderRadius\": 6\n },\n \"renderStyle\": {\n \"name\": \"magazine\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": true,\n \"defaultTransition\": {\n \"type\": \"slideLeft\",\n \"duration\": 0.7\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#1d3a6e\",\n \"text\": \"#a3c9f5\",\n \"accent\": \"#4d9de0\"\n },\n \"green\": {\n \"bg\": \"#14532d\",\n \"text\": \"#86efac\",\n \"accent\": \"#22c55e\"\n },\n \"purple\": {\n \"bg\": \"#3b2a70\",\n \"text\": \"#c4b5fd\",\n \"accent\": \"#a78bfa\"\n },\n \"red\": {\n \"bg\": \"#7f1d1d\",\n \"text\": \"#fca5a5\",\n \"accent\": \"#f87171\"\n },\n \"orange\": {\n \"bg\": \"#7c2d12\",\n \"text\": \"#fdba74\",\n \"accent\": \"#f97316\"\n },\n \"teal\": {\n \"bg\": \"#134e4a\",\n \"text\": \"#5eead4\",\n \"accent\": \"#14b8a6\"\n }\n },\n \"persistentLayers\": {\n \"topLayers\": [\n {\n \"template\": \"patternBackground\",\n \"config\": {\n \"type\": \"patternBackground\",\n \"pattern\": \"diagonal\",\n \"color\": \"#f7fafc\",\n \"opacity\": 0.03,\n \"scale\": 1.2\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"cinematic\",\n \"name\": \"Cinematic\",\n \"description\": \"Ultra-dark with moody gradients, gold accents, and slow dissolve transitions.\",\n \"colors\": {\n \"primary\": \"#d69e2e\",\n \"secondary\": \"#b7791f\",\n \"background\": \"#0a0f1a\",\n \"backgroundLight\": \"#1a202c\",\n \"text\": \"#f7fafc\",\n \"textMuted\": \"#a0aec0\",\n \"highlight\": \"#ecc94b\",\n \"warning\": \"#fc8181\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"crimson\"\n },\n \"titleFont\": {\n \"stackId\": \"cormorant\"\n },\n \"titleWeight\": \"bold\",\n \"lineHeight\": 1.5,\n \"titleLineHeight\": 1.2\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.55,\n \"animationSpeed\": 1.2,\n \"imageTreatment\": {\n \"type\": \"warm\",\n \"strength\": 0.5\n }\n },\n \"renderStyle\": {\n \"name\": \"cinematic\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": true,\n \"defaultTransition\": {\n \"type\": \"dissolve\",\n \"duration\": 1.2\n },\n \"templateHints\": {\n \"title\": {\n \"showAccentLine\": true\n }\n }\n },\n \"colorSchemes\": {\n \"blue\": {\n \"bg\": \"#0f1d33\",\n \"text\": \"#9db8dc\",\n \"accent\": \"#5d84b8\"\n },\n \"green\": {\n \"bg\": \"#10251c\",\n \"text\": \"#9ecfae\",\n \"accent\": \"#55a878\"\n },\n \"purple\": {\n \"bg\": \"#1f1433\",\n \"text\": \"#c3aede\",\n \"accent\": \"#8f74c0\"\n },\n \"red\": {\n \"bg\": \"#2e1114\",\n \"text\": \"#e0959a\",\n \"accent\": \"#c05f66\"\n },\n \"orange\": {\n \"bg\": \"#2e1d0b\",\n \"text\": \"#e3b978\",\n \"accent\": \"#d69e2e\"\n },\n \"teal\": {\n \"bg\": \"#0d2626\",\n \"text\": \"#93cfc7\",\n \"accent\": \"#4d9e94\"\n }\n },\n \"persistentLayers\": {\n \"bottomLayers\": [\n {\n \"template\": \"gradientBackground\",\n \"config\": {\n \"type\": \"gradientBackground\",\n \"preset\": \"radial-dark\"\n }\n }\n ],\n \"topLayers\": [\n {\n \"template\": \"vignette\",\n \"config\": {\n \"type\": \"vignette\",\n \"strength\": 0.35\n }\n },\n {\n \"template\": \"patternBackground\",\n \"config\": {\n \"type\": \"patternBackground\",\n \"pattern\": \"noise\",\n \"opacity\": 0.05\n }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"warm-earth\",\n \"name\": \"Warm Earth\",\n \"description\": \"Natural warm tones with earthy browns and terracotta accents.\",\n \"colors\": {\n \"primary\": \"#9c4221\",\n \"secondary\": \"#c05621\",\n \"background\": \"#1c1410\",\n \"backgroundLight\": \"#2d241e\",\n \"text\": \"#faf5f0\",\n \"textMuted\": \"#c4a882\",\n \"highlight\": \"#dd6b20\",\n \"warning\": \"#e53e3e\"\n },\n \"typography\": {\n \"bodyFont\": { \"stackId\": \"pt-serif\" },\n \"titleFont\": { \"stackId\": \"pt-serif\" },\n \"titleWeight\": \"bold\",\n \"lineHeight\": 1.6\n },\n \"style\": {\n \"textShadow\": true,\n \"overlayOpacity\": 0.5,\n \"animationSpeed\": 1.1\n },\n \"renderStyle\": {\n \"name\": \"warm-earth\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"defaultImageAnimation\": \"panLeft\",\n \"ambientMotion\": true,\n \"defaultTransition\": { \"type\": \"fade\", \"duration\": 0.9 }\n },\n \"colorSchemes\": {\n \"blue\": { \"bg\": \"#2a1f14\", \"text\": \"#90cdf4\", \"accent\": \"#63b3ed\" },\n \"green\": { \"bg\": \"#1e2a14\", \"text\": \"#9ae6b4\", \"accent\": \"#68d391\" },\n \"purple\": { \"bg\": \"#2a142a\", \"text\": \"#d6bcfa\", \"accent\": \"#b794f4\" },\n \"red\": { \"bg\": \"#2a1414\", \"text\": \"#fc8181\", \"accent\": \"#feb2b2\" },\n \"orange\": { \"bg\": \"#2a1e0a\", \"text\": \"#fbd38d\", \"accent\": \"#f6ad55\" },\n \"teal\": { \"bg\": \"#142a28\", \"text\": \"#81e6d9\", \"accent\": \"#4fd1c5\" }\n },\n \"persistentLayers\": {\n \"bottomLayers\": [\n {\n \"template\": \"gradientBackground\",\n \"config\": { \"type\": \"gradientBackground\", \"preset\": \"earth-tones\" }\n }\n ]\n }\n}\n","{\n \"schemaVersion\": \"1\",\n \"id\": \"gezellig\",\n \"name\": \"Gezellig\",\n \"description\": \"Warm sage + terracotta palette inspired by the Gezel desktop app. Subtle orange-tinted dark background, cream text, sage and terracotta accents.\",\n \"colors\": {\n \"primary\": \"#b0724c\",\n \"secondary\": \"#667f62\",\n \"background\": \"#1f1a17\",\n \"backgroundLight\": \"#2b2420\",\n \"text\": \"#f3ede0\",\n \"textMuted\": \"#a89b85\",\n \"highlight\": \"#c0875d\",\n \"warning\": \"#e07a6b\"\n },\n \"typography\": {\n \"bodyFont\": {\n \"stackId\": \"system-sans-emoji\"\n },\n \"titleFont\": {\n \"stackId\": \"system-serif-emoji\"\n },\n \"monoFont\": {\n \"stackId\": \"system-mono\"\n },\n \"titleWeight\": \"bold\",\n \"lineHeight\": 1.55\n },\n \"style\": {\n \"textShadow\": false,\n \"overlayOpacity\": 0.4,\n \"animationSpeed\": 1.0,\n \"borderRadius\": 6,\n \"imageTreatment\": {\n \"type\": \"warm\",\n \"strength\": 0.3\n }\n },\n \"renderStyle\": {\n \"name\": \"gezellig\",\n \"defaultTextAnimation\": \"fadeIn\",\n \"defaultImageAnimation\": \"slowZoom\",\n \"ambientMotion\": false,\n \"defaultTransition\": {\n \"type\": \"fade\",\n \"duration\": 0.6\n }\n },\n \"colorSchemes\": {\n \"terracotta\": {\n \"bg\": \"#3d2620\",\n \"text\": \"#f3ede0\",\n \"accent\": \"#c0875d\"\n },\n \"sage\": {\n \"bg\": \"#28332a\",\n \"text\": \"#e3ead9\",\n \"accent\": \"#8aa589\"\n },\n \"amber\": {\n \"bg\": \"#3d2e17\",\n \"text\": \"#fbe3a8\",\n \"accent\": \"#d4a149\"\n },\n \"plum\": {\n \"bg\": \"#2e1f2a\",\n \"text\": \"#e8d4e0\",\n \"accent\": \"#b088a5\"\n },\n \"ink\": {\n \"bg\": \"#1a1f26\",\n \"text\": \"#d5dde8\",\n \"accent\": \"#7b8fa8\"\n },\n \"cream\": {\n \"bg\": \"#f3ede0\",\n \"text\": \"#2b2420\",\n \"accent\": \"#b0724c\"\n }\n },\n \"persistentLayers\": {\n \"topLayers\": [\n {\n \"template\": \"patternBackground\",\n \"config\": {\n \"type\": \"patternBackground\",\n \"pattern\": \"noise\",\n \"opacity\": 0.04\n }\n }\n ]\n }\n}\n","/**\n * Built-in Theme Library\n *\n * Loads each built-in theme from its JSON sidecar, validates it, and\n * exports the typed `Theme` constants. The JSON files in this directory\n * are syntactically identical to customizer-authored themes — they just\n * use more of the schema.\n *\n * Validation runs at module init: if a built-in JSON drifts from the\n * schema, the import fails loudly during build / startup.\n */\n\nimport type { Theme } from '../Theme.js';\nimport { assertTheme } from '../themeValidator.js';\n\nimport standardJson from './standard.json' with { type: 'json' };\nimport standardDarkJson from './standard-dark.json' with { type: 'json' };\nimport documentaryJson from './documentary.json' with { type: 'json' };\nimport minimalistJson from './minimalist.json' with { type: 'json' };\nimport boldJson from './bold.json' with { type: 'json' };\nimport morningLightJson from './morning-light.json' with { type: 'json' };\nimport techDarkJson from './tech-dark.json' with { type: 'json' };\nimport magazineJson from './magazine.json' with { type: 'json' };\nimport cinematicJson from './cinematic.json' with { type: 'json' };\nimport warmEarthJson from './warm-earth.json' with { type: 'json' };\nimport gezelligJson from './gezellig.json' with { type: 'json' };\n\nexport const standard: Theme = assertTheme(standardJson, 'standard.json');\nexport const standardDark: Theme = assertTheme(standardDarkJson, 'standard-dark.json');\nexport const documentary: Theme = assertTheme(documentaryJson, 'documentary.json');\nexport const minimalist: Theme = assertTheme(minimalistJson, 'minimalist.json');\nexport const bold: Theme = assertTheme(boldJson, 'bold.json');\nexport const morningLight: Theme = assertTheme(morningLightJson, 'morning-light.json');\nexport const techDark: Theme = assertTheme(techDarkJson, 'tech-dark.json');\nexport const magazine: Theme = assertTheme(magazineJson, 'magazine.json');\nexport const cinematic: Theme = assertTheme(cinematicJson, 'cinematic.json');\nexport const warmEarth: Theme = assertTheme(warmEarthJson, 'warm-earth.json');\nexport const gezellig: Theme = assertTheme(gezelligJson, 'gezellig.json');\n\n/** All built-in themes, keyed by id. */\nexport const BUILTIN_THEMES: Record<string, Theme> = {\n standard,\n 'standard-dark': standardDark,\n documentary,\n minimalist,\n bold,\n 'morning-light': morningLight,\n 'tech-dark': techDark,\n magazine,\n cinematic,\n 'warm-earth': warmEarth,\n gezellig,\n};\n","/**\n * Built-in Theme Library\n *\n * Public entry point for theme lookup. Built-in themes live as JSON\n * sidecars in [./themes/](./themes/) — they share the exact same shape\n * as customizer-authored themes (no two-tier distinction).\n *\n * Usage:\n * ```ts\n * import { THEMES, resolveTheme } from '@bendyline/squisq/schemas';\n *\n * const theme = resolveTheme('minimalist'); // built-in lookup by id\n * const theme = THEMES.documentary; // direct access to a built-in\n * ```\n */\n\nimport type { Theme, ThemeRegistry } from './Theme.js';\nimport { BUILTIN_THEMES } from './themes/index.js';\nimport { cloneAndFreezeData } from '../internal/immutable.js';\n\n/** All built-in themes, keyed by id. */\nexport const THEMES: Readonly<Record<string, Theme>> = Object.freeze(\n Object.fromEntries(\n Object.entries(BUILTIN_THEMES).map(([id, theme]) => [id, cloneAndFreezeData(theme)]),\n ),\n);\n\n/** The default theme id. */\nexport const DEFAULT_THEME_ID = 'standard';\n\n/** The default theme (standard — safe system fonts, no external dependencies). */\nexport const DEFAULT_THEME: Theme = THEMES[DEFAULT_THEME_ID];\n\n/**\n * Resolve a theme by id. When a caller-owned registry is supplied its themes\n * take precedence over built-ins; unknown ids fall back to the default.\n */\nexport function resolveTheme(id: string | undefined, registry?: ThemeRegistry): Theme {\n const registered = id ? registry?.get(id) : undefined;\n if (registered) return registered;\n if (id && id in THEMES) return THEMES[id];\n return DEFAULT_THEME;\n}\n\n/** Get built-in ids plus ids from an optional caller-owned registry. */\nexport function getAvailableThemes(registry?: ThemeRegistry): string[] {\n return Array.from(\n new Set([...Object.keys(THEMES), ...(registry?.list().map((theme) => theme.id) ?? [])]),\n );\n}\n\n/** Get summaries for built-ins plus an optional caller-owned registry. */\nexport function getThemeSummaries(\n registry?: ThemeRegistry,\n): Array<{ id: string; name: string; description?: string }> {\n return getAvailableThemes(registry).map((id) => {\n const theme = resolveTheme(id, registry);\n return { id, name: theme.name, description: theme.description };\n });\n}\n","/**\n * Font Stacks\n *\n * Curated registry of font families used by built-in themes and offered in\n * the theme customizer. Each stack has a stable `id` (referenced by JSON\n * theme files via `{ stackId }`) and a CSS `family` string that resolves\n * to the actual font when rendered.\n *\n * Themes never carry raw CSS font strings — they reference a `stackId` or\n * specify a `{ custom: { name, fallback } }` form, both of which resolve\n * here at render time.\n */\n\nimport type { FontFamily, FontFamilyKind } from './Theme.js';\n\nexport interface FontStack {\n /** Stable identifier referenced by Theme JSON. */\n id: string;\n /** Display label for pickers. */\n label: string;\n /** Full CSS font-family string with safe fallbacks. */\n family: string;\n /** Categorical bucket for the picker UI. */\n kind: FontFamilyKind;\n /**\n * Google Fonts family name, when this stack is served by Google Fonts.\n * Used by exports that bundle a `<link>` to fonts.googleapis.com so the\n * face renders correctly even when the host page doesn't preload it.\n * Omit (or set to undefined) for purely system stacks.\n */\n googleFontFamily?: string;\n}\n\n/** All curated stacks, in the order they should appear in pickers. */\nexport const AVAILABLE_FONT_STACKS: FontStack[] = [\n // System defaults\n {\n id: 'system-sans',\n label: 'System Sans',\n family: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n kind: 'sans',\n },\n {\n id: 'system-serif',\n label: 'System Serif',\n family: 'Georgia, \"Times New Roman\", serif',\n kind: 'serif',\n },\n {\n id: 'system-mono',\n label: 'System Mono',\n family: 'Consolas, \"Courier New\", monospace',\n kind: 'mono',\n },\n // Curated Google Fonts. `googleFontFamily` is the canonical family\n // name Google serves the face under (used by exports that emit a\n // `<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/...\">`\n // so the face renders even when the host doesn't preload it).\n {\n id: 'inter',\n label: 'Inter',\n family: '\"Inter\", \"Segoe UI\", Roboto, sans-serif',\n kind: 'sans',\n googleFontFamily: 'Inter',\n },\n {\n id: 'ibm-plex-sans',\n label: 'IBM Plex Sans',\n family: '\"IBM Plex Sans\", \"Segoe UI\", Roboto, sans-serif',\n kind: 'sans',\n googleFontFamily: 'IBM Plex Sans',\n },\n {\n id: 'roboto',\n label: 'Roboto',\n family: '\"Roboto\", \"Segoe UI\", Arial, sans-serif',\n kind: 'sans',\n googleFontFamily: 'Roboto',\n },\n {\n id: 'dm-sans',\n label: 'DM Sans',\n family: '\"DM Sans\", \"Segoe UI\", Roboto, sans-serif',\n kind: 'sans',\n googleFontFamily: 'DM Sans',\n },\n {\n id: 'oswald',\n label: 'Oswald',\n // Condensed grotesques make a far better stand-in for Oswald than\n // Impact/Arial Black, whose extreme weight distorts every layout\n // tuned for the real face.\n family: '\"Oswald\", \"Arial Narrow\", \"Helvetica Neue Condensed\", \"Roboto Condensed\", sans-serif',\n kind: 'display',\n googleFontFamily: 'Oswald',\n },\n {\n id: 'playfair',\n label: 'Playfair Display',\n family: '\"Playfair Display\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Playfair Display',\n },\n {\n id: 'source-serif',\n label: 'Source Serif',\n family: '\"Source Serif 4\", \"PT Serif\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Source Serif 4',\n },\n {\n id: 'merriweather',\n label: 'Merriweather',\n family: '\"Merriweather\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Merriweather',\n },\n {\n id: 'lora',\n label: 'Lora',\n family: '\"Lora\", \"Merriweather\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Lora',\n },\n {\n id: 'pt-serif',\n label: 'PT Serif',\n family: '\"PT Serif\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'PT Serif',\n },\n {\n id: 'crimson',\n label: 'Crimson Text',\n family: '\"Crimson Text\", Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Crimson Text',\n },\n {\n id: 'cormorant',\n label: 'Cormorant Garamond',\n family: '\"Cormorant Garamond\", Garamond, Georgia, serif',\n kind: 'serif',\n googleFontFamily: 'Cormorant Garamond',\n },\n {\n id: 'dm-serif',\n label: 'DM Serif Display',\n family: '\"DM Serif Display\", Georgia, serif',\n kind: 'display',\n googleFontFamily: 'DM Serif Display',\n },\n {\n id: 'jetbrains-mono',\n label: 'JetBrains Mono',\n family: '\"JetBrains Mono\", \"Fira Code\", Consolas, monospace',\n kind: 'mono',\n googleFontFamily: 'JetBrains Mono',\n },\n // Themed system stacks with emoji fallbacks (used by gezellig)\n {\n id: 'system-sans-emoji',\n label: 'System Sans + Emoji',\n family:\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, \"OpenMoji Color\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", sans-serif',\n kind: 'sans',\n },\n {\n id: 'system-serif-emoji',\n label: 'System Serif + Emoji',\n family:\n 'Georgia, \"Times New Roman\", \"OpenMoji Color\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", serif',\n kind: 'serif',\n },\n];\n\nconst STACKS_BY_ID: Record<string, FontStack> = Object.fromEntries(\n AVAILABLE_FONT_STACKS.map((s) => [s.id, s]),\n);\n\n/** Look up a stack by id. Returns undefined if not registered. */\nexport function getFontStack(id: string): FontStack | undefined {\n return STACKS_BY_ID[id];\n}\n\n/** Default fallback CSS family per kind, used when a custom font has no fallback specified. */\nconst FALLBACK_BY_KIND: Record<FontFamilyKind, string> = {\n sans: 'system-ui, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Consolas, monospace',\n display: '\"Arial Narrow\", \"Helvetica Neue\", Arial, sans-serif',\n};\n\n/**\n * Resolve a `FontFamily` reference (or legacy raw string) to a CSS family string.\n * Used by `getThemeFont` at render time. Never returns an empty string —\n * unrecognized stackIds fall back to the requested role's default.\n */\nexport function resolveFontFamily(\n family: FontFamily | string | undefined,\n roleFallback: string,\n): string {\n if (!family) return roleFallback;\n if (typeof family === 'string') return family;\n if ('stackId' in family) {\n const stack = STACKS_BY_ID[family.stackId];\n return stack ? stack.family : roleFallback;\n }\n if ('custom' in family) {\n const { name, fallback } = family.custom;\n const fb =\n fallback === 'system-ui'\n ? 'system-ui, sans-serif'\n : fallback === 'serif'\n ? 'Georgia, serif'\n : fallback === 'monospace'\n ? 'Consolas, monospace'\n : 'system-ui, sans-serif';\n const safeName = name.includes(' ') || name.includes(',') ? `\"${name}\"` : name;\n return `${safeName}, ${fb}`;\n }\n return roleFallback;\n}\n\n/** Convenience: quick `{ stackId }` factory for code that constructs themes. */\nexport function fontStack(id: string): FontFamily {\n return { stackId: id };\n}\n\n/**\n * Build a `https://fonts.googleapis.com/css2?...` URL that loads the\n * subset of supplied `FontFamily` references that are served by Google\n * Fonts. Returns `null` when nothing in the list needs Google hosting\n * (system stacks, custom fonts, or unknown stack ids) — callers can use\n * that to skip emitting a `<link>` entirely.\n *\n * The URL requests regular + bold (400/700) for each family, which is\n * what the templates use. `display=swap` keeps the fallback visible\n * while the web font streams in.\n */\nexport function buildGoogleFontsUrl(families: Array<FontFamily | undefined>): string | null {\n const names = new Set<string>();\n for (const f of families) {\n if (!f || typeof f === 'string') continue;\n if ('stackId' in f) {\n const stack = STACKS_BY_ID[f.stackId];\n if (stack?.googleFontFamily) names.add(stack.googleFontFamily);\n }\n }\n if (names.size === 0) return null;\n // css2 syntax: ?family=Name+With+Spaces:wght@400;700&family=Other:wght@400;700&display=swap\n const params = Array.from(names)\n .sort()\n .map((name) => `family=${encodeURIComponent(name).replace(/%20/g, '+')}:wght@400;700`)\n .join('&');\n return `https://fonts.googleapis.com/css2?${params}&display=swap`;\n}\n\n/** Default fallback families exposed for tools that need them. */\nexport const FONT_FALLBACKS = FALLBACK_BY_KIND;\n\n// ── Arbitrary font-name matching ─────────────────────────────────────\n//\n// Used by file-import theme inference (OOXML fontScheme → FontFamily):\n// a typeface name from an office document either matches a curated stack\n// or becomes a `{ custom }` reference that preserves the original face.\n\n/** Normalize a raw typeface name for lookup: trim, unquote, lowercase, collapse whitespace. */\nfunction normalizeFontName(name: string): string {\n return name\n .trim()\n .replace(/^[\"']+|[\"']+$/g, '')\n .replace(/\\s+/g, ' ')\n .toLowerCase();\n}\n\n/**\n * Normalized name → stackId. Seeded from every stack's label and Google\n * Fonts family name, plus explicit aliases for common variants and the\n * web-safe faces that already anchor the system stacks' CSS families.\n */\nconst STACK_NAME_ALIASES: Record<string, string> = (() => {\n const aliases: Record<string, string> = {};\n for (const stack of AVAILABLE_FONT_STACKS) {\n aliases[normalizeFontName(stack.label)] = stack.id;\n if (stack.googleFontFamily) aliases[normalizeFontName(stack.googleFontFamily)] = stack.id;\n }\n Object.assign(aliases, {\n playfair: 'playfair',\n 'source serif': 'source-serif',\n 'source serif pro': 'source-serif',\n 'crimson pro': 'crimson',\n cormorant: 'cormorant',\n georgia: 'system-serif',\n 'times new roman': 'system-serif',\n times: 'system-serif',\n consolas: 'system-mono',\n 'courier new': 'system-mono',\n courier: 'system-mono',\n 'segoe ui': 'system-sans',\n 'system-ui': 'system-sans',\n });\n return aliases;\n})();\n\nconst MONO_NAME_RE =\n /\\b(mono|monospace|consolas|courier|menlo|inconsolata|cascadia|fira code|source code|code)\\b/;\nconst SERIF_NAME_RE =\n /\\b(georgia|times|garamond|cambria|caslon|baskerville|bodoni|didot|palatino|book antiqua|goudy|minion|charter|constantia|century schoolbook|antiqua|roman)\\b/;\n\n/**\n * Guess the structured fallback bucket for an arbitrary typeface name.\n * Deliberately never guesses `system-ui` — a wrong serif/sans guess is\n * recoverable in the customizer; `system-ui` erases the signal entirely.\n */\nexport function guessFontFallback(\n name: string,\n): 'serif' | 'sans-serif' | 'monospace' | 'system-ui' {\n const n = normalizeFontName(name);\n if (MONO_NAME_RE.test(n)) return 'monospace';\n if ((n.includes('serif') && !n.includes('sans')) || SERIF_NAME_RE.test(n)) return 'serif';\n return 'sans-serif';\n}\n\n/**\n * Map an arbitrary typeface name (e.g. from an imported office document's\n * fontScheme) to a `FontFamily`: a curated `{ stackId }` when the name\n * matches a known stack, else `{ custom }` preserving the original name\n * (original casing, quotes stripped) with a heuristic fallback bucket.\n * Empty/blank names resolve to the system sans stack.\n */\nexport function matchFontFamily(name: string): FontFamily {\n const normalized = normalizeFontName(name);\n if (!normalized) return { stackId: 'system-sans' };\n const stackId = STACK_NAME_ALIASES[normalized];\n if (stackId) return { stackId };\n const displayName = name.trim().replace(/^[\"']+|[\"']+$/g, '');\n return { custom: { name: displayName, fallback: guessFontFallback(name) } };\n}\n"],"mappings":"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","names":[]}
|