@bendyline/squisq 2.1.0 → 2.2.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/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-BubIpWsp.d.ts} +1 -1
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/chunk-2L55443L.js +0 -0
- package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
- package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
- package/dist/chunk-3IGPAPQ7.js +645 -0
- package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
- package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
- package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
- package/dist/{chunk-JI77MGAK.js → chunk-7ARJZYQY.js} +159 -120
- package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
- package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
- package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
- package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
- package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
- package/dist/chunk-BCCXTMN5.js +699 -0
- package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
- package/dist/{chunk-QUUPYOSP.js → chunk-CB45YGAM.js} +2 -3
- package/dist/{chunk-XNLB57UD.js → chunk-DYPMOPIW.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
- package/dist/{chunk-OTKVFVL6.js → chunk-I2O6W7DX.js} +116 -44
- package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
- package/dist/chunk-OPO5K4DZ.js +241 -0
- package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
- package/dist/chunk-QKPXHDLR.js +0 -0
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/chunk-WV5ARNDA.js +0 -0
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/chunk-XWNNA3KE.js +0 -0
- package/dist/chunk-YZNGMV3G.js +0 -0
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +27 -12
- package/dist/doc/index.js +16 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +2 -3
- package/dist/icons/index.js +3 -4
- package/dist/icons/inlineIconMarker.js +1 -2
- package/dist/imageEdit/index.d.ts +48 -17
- package/dist/imageEdit/index.js +3 -4
- package/dist/index.d.ts +11 -11
- package/dist/index.js +60 -33
- package/dist/jsonForm/index.d.ts +10 -3
- package/dist/jsonForm/index.js +8 -7
- package/dist/markdown/index.d.ts +75 -11
- package/dist/markdown/index.js +32 -7
- package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-wSLA2A1g.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +13 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +2 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +3 -4
- package/dist/schemas/index.d.ts +5 -5
- package/dist/schemas/index.js +5 -6
- package/dist/spatial/index.d.ts +2 -1
- package/dist/spatial/index.js +1 -2
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/index.js +1 -2
- package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -4
- package/dist/transform/index.d.ts +3 -3
- package/dist/transform/index.js +6 -7
- package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
- package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
- package/dist/versions/index.d.ts +14 -11
- package/dist/versions/index.js +2 -3
- package/package.json +4 -2
- package/dist/chunk-2UQOHYE2.js.map +0 -1
- package/dist/chunk-3E5F2XMR.js.map +0 -1
- package/dist/chunk-4X3JQXNM.js.map +0 -1
- package/dist/chunk-5DKBFXPY.js.map +0 -1
- package/dist/chunk-5J4HKRJF.js.map +0 -1
- package/dist/chunk-5UYI3RJB.js.map +0 -1
- package/dist/chunk-66QO7XFB.js.map +0 -1
- package/dist/chunk-AMIR72JP.js +0 -380
- package/dist/chunk-AMIR72JP.js.map +0 -1
- package/dist/chunk-DBS6RIFL.js.map +0 -1
- package/dist/chunk-DNJKBAI7.js +0 -1
- package/dist/chunk-DNJKBAI7.js.map +0 -1
- package/dist/chunk-ET53IIEP.js +0 -1
- package/dist/chunk-ET53IIEP.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-ILWDXLUK.js.map +0 -1
- package/dist/chunk-JHZWYRSW.js.map +0 -1
- package/dist/chunk-JI77MGAK.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-OTKVFVL6.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.js.map +0 -1
- package/dist/chunk-QUUPYOSP.js.map +0 -1
- package/dist/chunk-R2GC6RLD.js +0 -344
- package/dist/chunk-R2GC6RLD.js.map +0 -1
- package/dist/chunk-R2YZTCLO.js.map +0 -1
- package/dist/chunk-S7A5D7ZJ.js +0 -174
- package/dist/chunk-S7A5D7ZJ.js.map +0 -1
- package/dist/chunk-TUWMK62B.js.map +0 -1
- package/dist/chunk-V543AI2F.js +0 -1
- package/dist/chunk-V543AI2F.js.map +0 -1
- package/dist/chunk-VR7UPJ7C.js.map +0 -1
- package/dist/chunk-VWCJ2WXC.js.map +0 -1
- package/dist/chunk-VYFRI7R6.js.map +0 -1
- package/dist/chunk-XNLB57UD.js.map +0 -1
- package/dist/chunk-ZLQKNOZQ.js +0 -1
- package/dist/chunk-ZLQKNOZQ.js.map +0 -1
- package/dist/doc/index.js.map +0 -1
- package/dist/generate/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/icons/inlineIconMarker.js.map +0 -1
- package/dist/imageEdit/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsonForm/index.js.map +0 -1
- package/dist/markdown/index.js.map +0 -1
- package/dist/narration/index.js.map +0 -1
- package/dist/random/index.js.map +0 -1
- package/dist/recommend/index.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/spatial/index.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/timing/index.js.map +0 -1
- package/dist/transform/index.js.map +0 -1
- package/dist/versions/index.js.map +0 -1
- package/src/__tests__/animationUtils.test.ts +0 -117
- package/src/__tests__/annotationCoercion.test.ts +0 -243
- package/src/__tests__/applyNarrationTiming.test.ts +0 -190
- package/src/__tests__/applyRenderStyle.test.ts +0 -146
- package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
- package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
- package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
- package/src/__tests__/asciiDiagramParse.test.ts +0 -233
- package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
- package/src/__tests__/asciiDiagramRender.test.ts +0 -162
- package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
- package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
- package/src/__tests__/asciiTimelineParse.test.ts +0 -205
- package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
- package/src/__tests__/asciiTimelineRender.test.ts +0 -376
- package/src/__tests__/atmosphereLayers.test.ts +0 -108
- package/src/__tests__/attrTokens.test.ts +0 -167
- package/src/__tests__/colorUtils.test.ts +0 -112
- package/src/__tests__/contentContainer.test.ts +0 -325
- package/src/__tests__/contentExtractor.test.ts +0 -243
- package/src/__tests__/coverBlock.test.ts +0 -310
- package/src/__tests__/customTemplateSample.test.ts +0 -144
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
- package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
- package/src/__tests__/dataTable.test.ts +0 -145
- package/src/__tests__/diagramBlock.test.ts +0 -122
- package/src/__tests__/diagramLayout.test.ts +0 -134
- package/src/__tests__/diagramText.test.ts +0 -26
- package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
- package/src/__tests__/drawing.test.ts +0 -109
- package/src/__tests__/drawingBlock.test.ts +0 -124
- package/src/__tests__/drawingLayout.test.ts +0 -171
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
- package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
- package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
- package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
- package/src/__tests__/geohash.test.ts +0 -110
- package/src/__tests__/getLayers.test.ts +0 -243
- package/src/__tests__/getLayersFallback.test.ts +0 -103
- package/src/__tests__/haversine.test.ts +0 -63
- package/src/__tests__/iconResolve.test.ts +0 -122
- package/src/__tests__/imageEditExportSvg.test.ts +0 -70
- package/src/__tests__/imageEditState.test.ts +0 -74
- package/src/__tests__/imageEditVersions.test.ts +0 -243
- package/src/__tests__/inferDocumentTitle.test.ts +0 -50
- package/src/__tests__/inlineIconMarker.test.ts +0 -36
- package/src/__tests__/inputDescriptors.test.ts +0 -162
- package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
- package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
- package/src/__tests__/jsonForm.pointer.test.ts +0 -149
- package/src/__tests__/jsonForm.tokens.test.ts +0 -84
- package/src/__tests__/layoutBlock.test.ts +0 -83
- package/src/__tests__/layoutLayout.test.ts +0 -169
- package/src/__tests__/localForageAdapter.test.ts +0 -155
- package/src/__tests__/majorApiTypes.test.ts +0 -18
- package/src/__tests__/markdown.test.ts +0 -1009
- package/src/__tests__/markdownIcons.test.ts +0 -104
- package/src/__tests__/markdownSanitize.test.ts +0 -81
- package/src/__tests__/markdownToDoc.test.ts +0 -957
- package/src/__tests__/matchFontFamily.test.ts +0 -114
- package/src/__tests__/materializeBlockLayers.test.ts +0 -167
- package/src/__tests__/materializePageSections.test.ts +0 -404
- package/src/__tests__/materializeTestUtils.ts +0 -17
- package/src/__tests__/mediaAnnotations.test.ts +0 -91
- package/src/__tests__/mediaSchedule.test.ts +0 -118
- package/src/__tests__/narrationAlign.test.ts +0 -150
- package/src/__tests__/narrationFeatures.test.ts +0 -71
- package/src/__tests__/narrationNuclei.test.ts +0 -45
- package/src/__tests__/narrationPacing.test.ts +0 -189
- package/src/__tests__/narrationScript.test.ts +0 -149
- package/src/__tests__/narrationSessionRepro.test.ts +0 -62
- package/src/__tests__/narrationSidecar.test.ts +0 -88
- package/src/__tests__/narrationSyllables.test.ts +0 -65
- package/src/__tests__/narrationTestSignals.ts +0 -167
- package/src/__tests__/narrationVad.test.ts +0 -66
- package/src/__tests__/pageStyle.test.ts +0 -258
- package/src/__tests__/pandocAttrParse.test.ts +0 -187
- package/src/__tests__/recommendTemplates.test.ts +0 -183
- package/src/__tests__/resolveDocTheme.test.ts +0 -69
- package/src/__tests__/rootExports.test.ts +0 -61
- package/src/__tests__/scopedContentContainer.test.ts +0 -109
- package/src/__tests__/seededRandom.test.ts +0 -142
- package/src/__tests__/shapeGeometry.test.ts +0 -138
- package/src/__tests__/shapeVocabulary.test.ts +0 -133
- package/src/__tests__/storage.test.ts +0 -60
- package/src/__tests__/structuredData.test.ts +0 -249
- package/src/__tests__/surface.test.ts +0 -68
- package/src/__tests__/templateAnnotationParse.test.ts +0 -173
- package/src/__tests__/templateInputs.test.ts +0 -69
- package/src/__tests__/templateMetadata.test.ts +0 -32
- package/src/__tests__/templates.test.ts +0 -710
- package/src/__tests__/themeCompile.test.ts +0 -225
- package/src/__tests__/themeValidator.test.ts +0 -131
- package/src/__tests__/timing.test.ts +0 -167
- package/src/__tests__/transformProvenance.test.ts +0 -160
- package/src/__tests__/transformV2.test.ts +0 -163
- package/src/__tests__/transitionNormalize.test.ts +0 -61
- package/src/__tests__/treeviewBattle.test.ts +0 -76
- package/src/__tests__/treeviewDetect.test.ts +0 -168
- package/src/__tests__/treeviewParse.test.ts +0 -118
- package/src/__tests__/treeviewPipeline.test.ts +0 -183
- package/src/__tests__/treeviewRender.test.ts +0 -91
- package/src/__tests__/validateDoc.test.ts +0 -260
- package/src/__tests__/versions.test.ts +0 -459
- package/src/doc/annotationBlocks.ts +0 -117
- package/src/doc/applyNarrationTiming.ts +0 -244
- package/src/doc/asciiDiagram/chars.ts +0 -210
- package/src/doc/asciiDiagram/detect.ts +0 -175
- package/src/doc/asciiDiagram/index.ts +0 -38
- package/src/doc/asciiDiagram/mapping.ts +0 -225
- package/src/doc/asciiDiagram/parse.ts +0 -1095
- package/src/doc/asciiDiagram/render.ts +0 -963
- package/src/doc/asciiDiagram/repair.ts +0 -400
- package/src/doc/asciiDiagram/types.ts +0 -65
- package/src/doc/asciiTimeline/detect.ts +0 -138
- package/src/doc/asciiTimeline/index.ts +0 -26
- package/src/doc/asciiTimeline/mapping.ts +0 -43
- package/src/doc/asciiTimeline/parse.ts +0 -870
- package/src/doc/asciiTimeline/render.ts +0 -427
- package/src/doc/asciiTimeline/types.ts +0 -73
- package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
- package/src/doc/audioMapping.ts +0 -442
- package/src/doc/customTemplatesFrontmatter.ts +0 -273
- package/src/doc/customThemesFrontmatter.ts +0 -95
- package/src/doc/docToMarkdown.ts +0 -284
- package/src/doc/index.ts +0 -161
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -465
- package/src/doc/mediaAnnotations.ts +0 -120
- package/src/doc/page/PageSection.ts +0 -174
- package/src/doc/page/materializePageSection.ts +0 -616
- package/src/doc/page/resolvePageBlock.ts +0 -108
- package/src/doc/page/sectionExtractors.ts +0 -466
- package/src/doc/pageCss.ts +0 -628
- package/src/doc/resolveDocTheme.ts +0 -56
- package/src/doc/standaloneAnnotation.ts +0 -58
- package/src/doc/structuredData.ts +0 -301
- package/src/doc/templateInputs.ts +0 -424
- package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
- package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
- package/src/doc/templates/accentImage.ts +0 -362
- package/src/doc/templates/captionUtils.ts +0 -56
- package/src/doc/templates/comparisonBar.ts +0 -173
- package/src/doc/templates/coverBlock.ts +0 -255
- package/src/doc/templates/customTemplate.ts +0 -51
- package/src/doc/templates/dataTable.ts +0 -102
- package/src/doc/templates/dateEvent.ts +0 -147
- package/src/doc/templates/definitionCard.ts +0 -140
- package/src/doc/templates/diagramBlock.ts +0 -403
- package/src/doc/templates/diagramLayout.ts +0 -159
- package/src/doc/templates/drawingBlock.ts +0 -325
- package/src/doc/templates/drawingLayout.ts +0 -539
- package/src/doc/templates/factCard.ts +0 -146
- package/src/doc/templates/fallbackBlock.ts +0 -123
- package/src/doc/templates/featureBlock.ts +0 -209
- package/src/doc/templates/fullBleedQuote.ts +0 -83
- package/src/doc/templates/imageWithCaption.ts +0 -186
- package/src/doc/templates/index.ts +0 -642
- package/src/doc/templates/inputDescriptors.ts +0 -451
- package/src/doc/templates/layoutBlock.ts +0 -43
- package/src/doc/templates/layoutLayout.ts +0 -243
- package/src/doc/templates/listBlock.ts +0 -207
- package/src/doc/templates/mapBlock.ts +0 -138
- package/src/doc/templates/metadata.ts +0 -130
- package/src/doc/templates/persistentLayers.ts +0 -526
- package/src/doc/templates/photoGrid.ts +0 -190
- package/src/doc/templates/pullQuote.ts +0 -141
- package/src/doc/templates/quoteBlock.ts +0 -141
- package/src/doc/templates/registry.ts +0 -88
- package/src/doc/templates/sectionHeader.ts +0 -120
- package/src/doc/templates/statHighlight.ts +0 -146
- package/src/doc/templates/templateNames.ts +0 -22
- package/src/doc/templates/timelineBlock.ts +0 -613
- package/src/doc/templates/titleBlock.ts +0 -150
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
- package/src/doc/templates/tokens/resolveTokens.ts +0 -453
- package/src/doc/templates/treeBlock.ts +0 -131
- package/src/doc/templates/twoColumn.ts +0 -263
- package/src/doc/templates/videoPullQuote.ts +0 -142
- package/src/doc/templates/videoWithCaption.ts +0 -135
- package/src/doc/treeview/chars.ts +0 -72
- package/src/doc/treeview/detect.ts +0 -145
- package/src/doc/treeview/index.ts +0 -30
- package/src/doc/treeview/mapping.ts +0 -95
- package/src/doc/treeview/parse.ts +0 -201
- package/src/doc/treeview/render.ts +0 -41
- package/src/doc/treeview/types.ts +0 -43
- package/src/doc/utils/animationUtils.ts +0 -399
- package/src/doc/utils/applyRenderStyle.ts +0 -106
- package/src/doc/utils/diagramText.ts +0 -78
- package/src/doc/utils/imageTreatment.ts +0 -70
- package/src/doc/utils/nearest.ts +0 -59
- package/src/doc/utils/shapeGeometry.ts +0 -614
- package/src/doc/utils/themeUtils.ts +0 -243
- package/src/doc/validate.ts +0 -575
- package/src/generate/contentExtractor.ts +0 -921
- package/src/generate/index.ts +0 -18
- package/src/generate/templateMapper.ts +0 -177
- package/src/icons/iconData.ts +0 -31
- package/src/icons/index.ts +0 -26
- package/src/icons/inlineIconMarker.ts +0 -73
- package/src/icons/resolve.ts +0 -139
- package/src/imageEdit/ImageEditVersionManager.ts +0 -73
- package/src/imageEdit/export.ts +0 -410
- package/src/imageEdit/index.ts +0 -72
- package/src/imageEdit/persistence.ts +0 -113
- package/src/imageEdit/state.ts +0 -112
- package/src/imageEdit/versionPaths.ts +0 -44
- package/src/imageEdit/versions.ts +0 -152
- package/src/index.ts +0 -15
- package/src/internal/immutable.ts +0 -58
- package/src/jsonForm/chooseControl.ts +0 -88
- package/src/jsonForm/evaluateWhen.ts +0 -59
- package/src/jsonForm/index.ts +0 -32
- package/src/jsonForm/inferSchema.ts +0 -25
- package/src/jsonForm/pointer.ts +0 -154
- package/src/jsonForm/tokens.ts +0 -78
- package/src/jsonForm/types.ts +0 -167
- package/src/markdown/annotationCoercion.ts +0 -295
- package/src/markdown/attrTokens.ts +0 -243
- package/src/markdown/convert.ts +0 -1353
- package/src/markdown/htmlParse.ts +0 -212
- package/src/markdown/index.ts +0 -152
- package/src/markdown/parse.ts +0 -103
- package/src/markdown/sanitize.ts +0 -318
- package/src/markdown/stringify.ts +0 -207
- package/src/markdown/types.ts +0 -710
- package/src/markdown/utils.ts +0 -459
- package/src/narration/align.ts +0 -514
- package/src/narration/features.ts +0 -231
- package/src/narration/index.ts +0 -86
- package/src/narration/nuclei.ts +0 -118
- package/src/narration/pacing.ts +0 -211
- package/src/narration/script.ts +0 -239
- package/src/narration/session.ts +0 -100
- package/src/narration/sidecar.ts +0 -187
- package/src/narration/syllables.ts +0 -85
- package/src/narration/trace.ts +0 -50
- package/src/narration/types.ts +0 -299
- package/src/narration/vad.ts +0 -131
- package/src/ngeohash.d.ts +0 -11
- package/src/random/SeededRandom.ts +0 -127
- package/src/random/index.ts +0 -1
- package/src/recommend/index.ts +0 -16
- package/src/recommend/numberHighlight.ts +0 -25
- package/src/recommend/templates.ts +0 -393
- package/src/schemas/BlockTemplates.ts +0 -1046
- package/src/schemas/CustomTemplates.ts +0 -126
- package/src/schemas/Doc.ts +0 -1073
- package/src/schemas/ImageEditDoc.ts +0 -102
- package/src/schemas/LayoutStrategy.ts +0 -178
- package/src/schemas/Media.ts +0 -179
- package/src/schemas/MediaProvider.ts +0 -70
- package/src/schemas/PageStyle.ts +0 -213
- package/src/schemas/Theme.ts +0 -413
- package/src/schemas/Transitions.ts +0 -224
- package/src/schemas/Types.ts +0 -15
- package/src/schemas/Viewport.ts +0 -91
- package/src/schemas/colorUtils.ts +0 -219
- package/src/schemas/fontStacks.ts +0 -339
- package/src/schemas/index.ts +0 -31
- package/src/schemas/pageStyleDefaults.ts +0 -204
- package/src/schemas/themeCompile.ts +0 -244
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -609
- package/src/schemas/themes/bold.json +0 -77
- package/src/schemas/themes/cinematic.json +0 -143
- package/src/schemas/themes/documentary.json +0 -125
- package/src/schemas/themes/gezellig.json +0 -123
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -126
- package/src/schemas/themes/minimalist.json +0 -74
- package/src/schemas/themes/morning-light.json +0 -117
- package/src/schemas/themes/standard-dark.json +0 -109
- package/src/schemas/themes/standard.json +0 -98
- package/src/schemas/themes/tech-dark.json +0 -143
- package/src/schemas/themes/warm-earth.json +0 -74
- package/src/spatial/Geohash.ts +0 -196
- package/src/spatial/Haversine.ts +0 -59
- package/src/spatial/index.ts +0 -2
- package/src/storage/ContentContainer.ts +0 -220
- package/src/storage/LocalForageAdapter.ts +0 -103
- package/src/storage/LocalStorageAdapter.ts +0 -57
- package/src/storage/MediaProviderFromContainer.ts +0 -92
- package/src/storage/MemoryStorageAdapter.ts +0 -37
- package/src/storage/ScopedContentContainer.ts +0 -143
- package/src/storage/Storage.ts +0 -28
- package/src/storage/index.ts +0 -9
- package/src/timing/index.ts +0 -17
- package/src/timing/narrationTiming.ts +0 -220
- package/src/timing/readingTime.ts +0 -94
- package/src/transform/applyTransform.ts +0 -122
- package/src/transform/blockAnalyzer.ts +0 -181
- package/src/transform/index.ts +0 -23
- package/src/transform/registry.ts +0 -217
- package/src/transform/styles/dataDriven.ts +0 -18
- package/src/transform/styles/documentary.ts +0 -18
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -19
- package/src/transform/styles/minimal.ts +0 -18
- package/src/transform/styles/narrative.ts +0 -19
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -158
- package/src/versions/DocumentVersionManager.ts +0 -70
- package/src/versions/gitignore.ts +0 -34
- package/src/versions/index.ts +0 -56
- package/src/versions/operations.ts +0 -144
- package/src/versions/paths.ts +0 -51
- package/src/versions/snapshotStore.ts +0 -202
- package/src/versions/timestamp.ts +0 -48
- package/src/versions/types.ts +0 -93
package/src/schemas/PageStyle.ts
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Page Style — the theme's art-direction layer for Page (linear) mode.
|
|
3
|
-
*
|
|
4
|
-
* Slides render through fixed-viewport SVG templates; pages render through
|
|
5
|
-
* a small closed vocabulary of variable-height HTML section layouts
|
|
6
|
-
* (`PageSectionKind`). A `ThemePageStyle` is how a theme art-directs that
|
|
7
|
-
* page rendition: it picks a design family, sets page-wide tokens
|
|
8
|
-
* (column widths, spacing, dividers, hero treatment, image framing …),
|
|
9
|
-
* and can override how individual section kinds or block templates map
|
|
10
|
-
* onto the section vocabulary.
|
|
11
|
-
*
|
|
12
|
-
* Design principles (mirrors the rest of the Theme schema):
|
|
13
|
-
* - Fully JSON-serializable — rides the `squisq-custom-themes` frontmatter
|
|
14
|
-
* codec unchanged.
|
|
15
|
-
* - Closed enums everywhere so renderers can switch exhaustively and the
|
|
16
|
-
* validator can reject typos.
|
|
17
|
-
* - Optional on `Theme`; `resolvePageStyle`/`defaultPageStyle` derive a
|
|
18
|
-
* complete style from existing theme fields when absent, so legacy and
|
|
19
|
-
* customizer themes keep working without edits.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
// ============================================
|
|
23
|
-
// Section vocabulary
|
|
24
|
-
// ============================================
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* The closed set of page section layouts. Every block template maps onto
|
|
28
|
-
* one of these kinds (see `doc/page/sectionExtractors.ts`); themes may
|
|
29
|
-
* remap via `ThemePageStyle.sections` / `.templates`.
|
|
30
|
-
*/
|
|
31
|
-
export const PAGE_SECTION_KINDS = [
|
|
32
|
-
'hero',
|
|
33
|
-
'banner',
|
|
34
|
-
'stat-band',
|
|
35
|
-
'quote-band',
|
|
36
|
-
'feature-split',
|
|
37
|
-
'media-figure',
|
|
38
|
-
'gallery',
|
|
39
|
-
'callout',
|
|
40
|
-
'card-grid',
|
|
41
|
-
'item-list',
|
|
42
|
-
'timeline-rail',
|
|
43
|
-
'table-section',
|
|
44
|
-
'canvas-embed',
|
|
45
|
-
'prose',
|
|
46
|
-
'footer',
|
|
47
|
-
] as const;
|
|
48
|
-
|
|
49
|
-
export type PageSectionKind = (typeof PAGE_SECTION_KINDS)[number];
|
|
50
|
-
|
|
51
|
-
/** Relative visual weight of a section within the page. */
|
|
52
|
-
export type PageEmphasis = 'lead' | 'strong' | 'standard' | 'quiet';
|
|
53
|
-
|
|
54
|
-
/** Which background treatment a section sits on. */
|
|
55
|
-
export type PageBackground = 'base' | 'alternate' | 'accent' | 'media';
|
|
56
|
-
|
|
57
|
-
// ============================================
|
|
58
|
-
// Design families + tokens
|
|
59
|
-
// ============================================
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Broad page design personalities. A family selects the structural
|
|
63
|
-
* skeleton (how sections compose); tokens parameterize it per theme.
|
|
64
|
-
*/
|
|
65
|
-
export const PAGE_DESIGN_FAMILIES = [
|
|
66
|
-
'clean',
|
|
67
|
-
'editorial',
|
|
68
|
-
'brutalist',
|
|
69
|
-
'terminal',
|
|
70
|
-
'cinematic',
|
|
71
|
-
'documentary',
|
|
72
|
-
'organic',
|
|
73
|
-
'soft',
|
|
74
|
-
] as const;
|
|
75
|
-
|
|
76
|
-
export type PageDesignFamily = (typeof PAGE_DESIGN_FAMILIES)[number];
|
|
77
|
-
|
|
78
|
-
/** How headings announce themselves across the page. */
|
|
79
|
-
export interface PageHeadingTreatment {
|
|
80
|
-
/** Small label above headings: none, plain kicker, "01 —" numbering, or a mono tag. */
|
|
81
|
-
eyebrow: 'none' | 'kicker' | 'numbered' | 'mono-tag';
|
|
82
|
-
/** Overall heading size register. */
|
|
83
|
-
scale: 'regular' | 'display' | 'oversized';
|
|
84
|
-
/** Optional case transform for headings/eyebrows. */
|
|
85
|
-
case?: 'none' | 'uppercase';
|
|
86
|
-
/** Optional decoration under headings. */
|
|
87
|
-
underline?: 'none' | 'accent-bar' | 'full-rule';
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Page-wide design tokens. Structural CSS reads these via
|
|
92
|
-
* `--squisq-page-*` custom properties (see `doc/pageCss.ts`).
|
|
93
|
-
*/
|
|
94
|
-
export interface PageTokens {
|
|
95
|
-
/** Reading-column max width in px (prose, callouts, quotes). */
|
|
96
|
-
contentMaxWidth: number;
|
|
97
|
-
/** Wide-band inner max width in px (figures, tables, feature splits). */
|
|
98
|
-
wideMaxWidth: number;
|
|
99
|
-
/** Vertical rhythm between sections. */
|
|
100
|
-
sectionSpacing: 'compact' | 'comfortable' | 'generous';
|
|
101
|
-
/** Corner radius for cards, media frames, panels (px). */
|
|
102
|
-
cornerRadius: number;
|
|
103
|
-
/** Divider treatment between sections. */
|
|
104
|
-
divider: 'none' | 'gap-only' | 'hairline' | 'thick-rule' | 'double-rule' | 'dotted';
|
|
105
|
-
/** How section backgrounds vary down the page. */
|
|
106
|
-
backgroundRhythm: 'flat' | 'alternate' | 'accent-bands' | 'tinted-panels';
|
|
107
|
-
/** Hero (cover/title) composition. */
|
|
108
|
-
heroStyle: 'stacked' | 'split' | 'full-bleed' | 'letterbox' | 'oversized-type';
|
|
109
|
-
/** Heading voice across the page. */
|
|
110
|
-
headingTreatment: PageHeadingTreatment;
|
|
111
|
-
/** Frame treatment for photographic media. */
|
|
112
|
-
imageFraming: 'flush' | 'rounded' | 'bordered' | 'polaroid' | 'letterboxed' | 'circle-accent';
|
|
113
|
-
/** Shadow language for elevated elements. */
|
|
114
|
-
shadow: 'none' | 'soft' | 'crisp' | 'heavy';
|
|
115
|
-
/** Decoration on quote sections. */
|
|
116
|
-
quoteMark: 'none' | 'oversized-glyph' | 'accent-bar';
|
|
117
|
-
/** Treatment of large stat numerals. */
|
|
118
|
-
numeralStyle: 'plain' | 'oversized' | 'boxed' | 'mono';
|
|
119
|
-
/** Optional page background pattern. */
|
|
120
|
-
pattern?: 'none' | 'dots' | 'grid' | 'diagonal' | 'noise';
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ============================================
|
|
124
|
-
// Overrides + accent rotation
|
|
125
|
-
// ============================================
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* A theme's override for one section kind or one block template —
|
|
129
|
-
* remap the kind, force a variant, adjust emphasis/background, or pass
|
|
130
|
-
* freeform scalar hints the section renderer understands.
|
|
131
|
-
*/
|
|
132
|
-
export interface PageSectionOverride {
|
|
133
|
-
kind?: PageSectionKind;
|
|
134
|
-
variant?: string;
|
|
135
|
-
emphasis?: PageEmphasis;
|
|
136
|
-
background?: PageBackground;
|
|
137
|
-
/** Freeform scalar hints (e.g. `dropCap: true`, `frame: "terminal"`). */
|
|
138
|
-
hints?: Record<string, string | number | boolean>;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** How named color schemes rotate across accent-bearing sections. */
|
|
142
|
-
export interface PageAccentRotation {
|
|
143
|
-
strategy: 'primary-only' | 'cycle' | 'alternate-two' | 'none';
|
|
144
|
-
/**
|
|
145
|
-
* ColorScheme names (keys of `theme.colorSchemes`) to rotate through.
|
|
146
|
-
* Defaults to all schemes in insertion order.
|
|
147
|
-
*/
|
|
148
|
-
schemes?: string[];
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// ============================================
|
|
152
|
-
// ThemePageStyle
|
|
153
|
-
// ============================================
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* The complete page art direction for a theme. Optional on `Theme`;
|
|
157
|
-
* `defaultPageStyle(theme)` derives one from existing theme fields.
|
|
158
|
-
*/
|
|
159
|
-
export interface ThemePageStyle {
|
|
160
|
-
family: PageDesignFamily;
|
|
161
|
-
tokens: PageTokens;
|
|
162
|
-
/** Per-section-kind overrides. */
|
|
163
|
-
sections?: Partial<Record<PageSectionKind, PageSectionOverride>>;
|
|
164
|
-
/** Per-template overrides (canonical template ids); win over `sections`. */
|
|
165
|
-
templates?: Record<string, PageSectionOverride>;
|
|
166
|
-
accentRotation: PageAccentRotation;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ============================================
|
|
170
|
-
// Enum sets (shared by the validator + defaults)
|
|
171
|
-
// ============================================
|
|
172
|
-
|
|
173
|
-
export const PAGE_SECTION_SPACINGS = ['compact', 'comfortable', 'generous'] as const;
|
|
174
|
-
export const PAGE_DIVIDERS = [
|
|
175
|
-
'none',
|
|
176
|
-
'gap-only',
|
|
177
|
-
'hairline',
|
|
178
|
-
'thick-rule',
|
|
179
|
-
'double-rule',
|
|
180
|
-
'dotted',
|
|
181
|
-
] as const;
|
|
182
|
-
export const PAGE_BACKGROUND_RHYTHMS = [
|
|
183
|
-
'flat',
|
|
184
|
-
'alternate',
|
|
185
|
-
'accent-bands',
|
|
186
|
-
'tinted-panels',
|
|
187
|
-
] as const;
|
|
188
|
-
export const PAGE_HERO_STYLES = [
|
|
189
|
-
'stacked',
|
|
190
|
-
'split',
|
|
191
|
-
'full-bleed',
|
|
192
|
-
'letterbox',
|
|
193
|
-
'oversized-type',
|
|
194
|
-
] as const;
|
|
195
|
-
export const PAGE_EYEBROWS = ['none', 'kicker', 'numbered', 'mono-tag'] as const;
|
|
196
|
-
export const PAGE_HEADING_SCALES = ['regular', 'display', 'oversized'] as const;
|
|
197
|
-
export const PAGE_HEADING_CASES = ['none', 'uppercase'] as const;
|
|
198
|
-
export const PAGE_HEADING_UNDERLINES = ['none', 'accent-bar', 'full-rule'] as const;
|
|
199
|
-
export const PAGE_IMAGE_FRAMINGS = [
|
|
200
|
-
'flush',
|
|
201
|
-
'rounded',
|
|
202
|
-
'bordered',
|
|
203
|
-
'polaroid',
|
|
204
|
-
'letterboxed',
|
|
205
|
-
'circle-accent',
|
|
206
|
-
] as const;
|
|
207
|
-
export const PAGE_SHADOWS = ['none', 'soft', 'crisp', 'heavy'] as const;
|
|
208
|
-
export const PAGE_QUOTE_MARKS = ['none', 'oversized-glyph', 'accent-bar'] as const;
|
|
209
|
-
export const PAGE_NUMERAL_STYLES = ['plain', 'oversized', 'boxed', 'mono'] as const;
|
|
210
|
-
export const PAGE_PATTERNS = ['none', 'dots', 'grid', 'diagonal', 'noise'] as const;
|
|
211
|
-
export const PAGE_EMPHASES = ['lead', 'strong', 'standard', 'quiet'] as const;
|
|
212
|
-
export const PAGE_BACKGROUNDS = ['base', 'alternate', 'accent', 'media'] as const;
|
|
213
|
-
export const PAGE_ACCENT_STRATEGIES = ['primary-only', 'cycle', 'alternate-two', 'none'] as const;
|
package/src/schemas/Theme.ts
DELETED
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Theme System
|
|
3
|
-
*
|
|
4
|
-
* A Theme bundles color palette, typography, visual style, render-style
|
|
5
|
-
* algorithm, and per-block color schemes into one JSON-serializable object.
|
|
6
|
-
*
|
|
7
|
-
* Built-in themes and customizer-authored themes share this exact schema.
|
|
8
|
-
* Customizer-authored themes additionally specify `seedColors` so the few
|
|
9
|
-
* fields the user picked can be re-edited later; built-ins typically omit
|
|
10
|
-
* `seedColors` and ship with explicit `colors` already filled in.
|
|
11
|
-
*
|
|
12
|
-
* Design principles:
|
|
13
|
-
* - Fully JSON-serializable. No functions; no raw CSS font strings.
|
|
14
|
-
* - Font families are structured `FontFamily` references resolved by
|
|
15
|
-
* `resolveFontFamily()` at render time.
|
|
16
|
-
* - Doc carries an optional `themeId`; resolution happens at render time
|
|
17
|
-
* via `resolveTheme(id)`.
|
|
18
|
-
* - `createTheme` deep-merges a base theme with partial overrides;
|
|
19
|
-
* `compileTheme` fills in defaults and derives missing color slots from
|
|
20
|
-
* `seedColors`; both produce a complete `Theme`.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import type { LayoutHints } from './LayoutStrategy.js';
|
|
24
|
-
import type { AnimationType, ImageTreatment, TransitionType } from './Doc.js';
|
|
25
|
-
import type { PersistentLayerConfig } from './BlockTemplates.js';
|
|
26
|
-
import type { ThemePageStyle } from './PageStyle.js';
|
|
27
|
-
import { THEME_SCHEMA_VERSION } from './themeConstants.js';
|
|
28
|
-
import { validateTheme } from './themeValidator.js';
|
|
29
|
-
import { cloneAndFreezeData } from '../internal/immutable.js';
|
|
30
|
-
|
|
31
|
-
// ============================================
|
|
32
|
-
// Schema version
|
|
33
|
-
// ============================================
|
|
34
|
-
|
|
35
|
-
export { THEME_SCHEMA_VERSION } from './themeConstants.js';
|
|
36
|
-
export type ThemeSchemaVersion = typeof THEME_SCHEMA_VERSION;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Frontmatter key under which a document inlines its custom Theme
|
|
40
|
-
* definitions. The theme analog of `FRONTMATTER_CUSTOM_TEMPLATES_KEY`
|
|
41
|
-
* (custom block templates). See `doc/customThemesFrontmatter.ts` for the
|
|
42
|
-
* codec and `doc/resolveDocTheme.ts` for doc-scoped resolution.
|
|
43
|
-
*/
|
|
44
|
-
export const FRONTMATTER_CUSTOM_THEMES_KEY = 'squisq-custom-themes';
|
|
45
|
-
|
|
46
|
-
// ============================================
|
|
47
|
-
// Color Palette
|
|
48
|
-
// ============================================
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Core color palette for a theme. Every color is a `#rrggbb` hex string.
|
|
52
|
-
*/
|
|
53
|
-
export interface ThemeColorPalette {
|
|
54
|
-
/** Primary accent color */
|
|
55
|
-
primary: string;
|
|
56
|
-
/** Secondary accent color */
|
|
57
|
-
secondary: string;
|
|
58
|
-
/** Background color (typically dark) */
|
|
59
|
-
background: string;
|
|
60
|
-
/** Lighter background for contrast panels */
|
|
61
|
-
backgroundLight: string;
|
|
62
|
-
/** Main text color */
|
|
63
|
-
text: string;
|
|
64
|
-
/** Muted/secondary text color */
|
|
65
|
-
textMuted: string;
|
|
66
|
-
/** Highlight/emphasis color */
|
|
67
|
-
highlight: string;
|
|
68
|
-
/** Warning/alert color */
|
|
69
|
-
warning: string;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* A named color scheme used by templates for per-block color variation
|
|
74
|
-
* (e.g., statHighlight or sectionHeader).
|
|
75
|
-
*/
|
|
76
|
-
export interface ThemeColorScheme {
|
|
77
|
-
/** Background fill */
|
|
78
|
-
bg: string;
|
|
79
|
-
/** Primary text tint */
|
|
80
|
-
text: string;
|
|
81
|
-
/** Accent / secondary tint */
|
|
82
|
-
accent: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Optional authoring metadata. When present and `colors` is partial,
|
|
87
|
-
* `compileTheme` derives missing color slots from these seeds via OKLCh
|
|
88
|
-
* lightening / darkening. Round-trips a customizer-authored theme back
|
|
89
|
-
* into editable form.
|
|
90
|
-
*/
|
|
91
|
-
export interface ThemeSeedColors {
|
|
92
|
-
primary: string;
|
|
93
|
-
secondary?: string;
|
|
94
|
-
accent?: string;
|
|
95
|
-
background?: string;
|
|
96
|
-
text?: string;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ============================================
|
|
100
|
-
// Typography
|
|
101
|
-
// ============================================
|
|
102
|
-
|
|
103
|
-
/** Categorical bucket for a font family — drives default fallback. */
|
|
104
|
-
export type FontFamilyKind = 'sans' | 'serif' | 'mono' | 'display';
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Structured reference to a font family. Either a curated stack id (looked
|
|
108
|
-
* up in `AVAILABLE_FONT_STACKS`) or a custom user-supplied name with a
|
|
109
|
-
* structured fallback bucket. Themes never carry raw CSS family strings.
|
|
110
|
-
*/
|
|
111
|
-
export type FontFamily =
|
|
112
|
-
| { stackId: string }
|
|
113
|
-
| {
|
|
114
|
-
custom: {
|
|
115
|
-
name: string;
|
|
116
|
-
fallback: 'serif' | 'sans-serif' | 'monospace' | 'system-ui';
|
|
117
|
-
};
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Typography settings for a theme.
|
|
122
|
-
*/
|
|
123
|
-
export interface ThemeTypography {
|
|
124
|
-
/** Font family for body / description text */
|
|
125
|
-
bodyFont: FontFamily;
|
|
126
|
-
/** Font family for titles and headings */
|
|
127
|
-
titleFont: FontFamily;
|
|
128
|
-
/** Font family for code / monospaced text (optional) */
|
|
129
|
-
monoFont?: FontFamily;
|
|
130
|
-
/** Multiplier applied to LayoutHints.titleScale (default 1.0) */
|
|
131
|
-
titleScale?: number;
|
|
132
|
-
/** Multiplier applied to LayoutHints.bodyScale (default 1.0) */
|
|
133
|
-
bodyScale?: number;
|
|
134
|
-
/** Default body line height (default 1.4) */
|
|
135
|
-
lineHeight?: number;
|
|
136
|
-
/** Default title line height */
|
|
137
|
-
titleLineHeight?: number;
|
|
138
|
-
/** Default title font weight */
|
|
139
|
-
titleWeight?: 'normal' | 'bold';
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ============================================
|
|
143
|
-
// Visual Style
|
|
144
|
-
// ============================================
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Global visual-style knobs that templates consult.
|
|
148
|
-
*/
|
|
149
|
-
export interface ThemeStyle {
|
|
150
|
-
/** Default border radius for cards / shapes (px) */
|
|
151
|
-
borderRadius?: number;
|
|
152
|
-
/** Whether templates should default to text shadows */
|
|
153
|
-
textShadow?: boolean;
|
|
154
|
-
/** Darkness of overlay on image-backed blocks (0–1) */
|
|
155
|
-
overlayOpacity?: number;
|
|
156
|
-
/** Multiplier on all animation durations (1.0 = normal, <1 faster, >1 slower) */
|
|
157
|
-
animationSpeed?: number;
|
|
158
|
-
/** Default horizontal padding for text (percentage string, e.g. "5%") */
|
|
159
|
-
blockPadding?: string;
|
|
160
|
-
/**
|
|
161
|
-
* Photographic grade applied to template imagery (full-bleed photos,
|
|
162
|
-
* feature halves, accent strips) so photos look native to the theme.
|
|
163
|
-
* Duotone tints default to the theme primary. Blocks opt out per
|
|
164
|
-
* template via `imageTreatment: 'none'`.
|
|
165
|
-
*/
|
|
166
|
-
imageTreatment?: ImageTreatment;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ============================================
|
|
170
|
-
// Render Style
|
|
171
|
-
// ============================================
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Render-style algorithm preset. Controls layout tweaks, default animations,
|
|
175
|
-
* transitions, and per-template behavioral hints.
|
|
176
|
-
*/
|
|
177
|
-
export interface RenderStyle {
|
|
178
|
-
/** Identifier for this algorithmic approach (e.g. "documentary", "magazine") */
|
|
179
|
-
name: string;
|
|
180
|
-
/** Partial overrides merged onto the orientation-based LayoutHints */
|
|
181
|
-
layoutOverrides?: Partial<LayoutHints>;
|
|
182
|
-
/** Default entrance animation for text layers */
|
|
183
|
-
defaultTextAnimation?: AnimationType;
|
|
184
|
-
/** Default animation for background / image layers */
|
|
185
|
-
defaultImageAnimation?: AnimationType;
|
|
186
|
-
/** Whether to apply Ken Burns ambient motion to images by default */
|
|
187
|
-
ambientMotion?: boolean;
|
|
188
|
-
/** Default block-to-block transition */
|
|
189
|
-
defaultTransition?: { type: TransitionType; duration?: number };
|
|
190
|
-
/**
|
|
191
|
-
* Per-template behavioral hints. Keys are template names, values are
|
|
192
|
-
* string/number/boolean maps that templates can read to vary their output.
|
|
193
|
-
* Templates that consume hints publish a `hintSchema` export documenting
|
|
194
|
-
* the keys they recognise.
|
|
195
|
-
*/
|
|
196
|
-
templateHints?: Record<string, Record<string, string | number | boolean>>;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// ============================================
|
|
200
|
-
// Theme
|
|
201
|
-
// ============================================
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* A complete, JSON-serializable theme definition. Built-in and customizer-
|
|
205
|
-
* authored themes share this exact shape.
|
|
206
|
-
*/
|
|
207
|
-
export interface Theme {
|
|
208
|
-
/** Schema version. Always '1' for now. */
|
|
209
|
-
schemaVersion: ThemeSchemaVersion;
|
|
210
|
-
/** Unique identifier (e.g. "documentary") */
|
|
211
|
-
id: string;
|
|
212
|
-
/** Human-readable display name */
|
|
213
|
-
name: string;
|
|
214
|
-
/** Short description for theme pickers */
|
|
215
|
-
description?: string;
|
|
216
|
-
/**
|
|
217
|
-
* Id of the theme this custom theme was derived from, if any. Recorded
|
|
218
|
-
* by `compileTheme({ base })` so a customizer can re-open the theme and
|
|
219
|
-
* re-inherit the base's render style / color schemes / typography.
|
|
220
|
-
* Absent on built-ins.
|
|
221
|
-
*/
|
|
222
|
-
basedOn?: string;
|
|
223
|
-
/** Optional authoring seeds (customizer fills these; built-ins typically omit) */
|
|
224
|
-
seedColors?: ThemeSeedColors;
|
|
225
|
-
/** Color palette */
|
|
226
|
-
colors: ThemeColorPalette;
|
|
227
|
-
/** Typography settings */
|
|
228
|
-
typography: ThemeTypography;
|
|
229
|
-
/** Global visual-style knobs */
|
|
230
|
-
style: ThemeStyle;
|
|
231
|
-
/** Algorithmic render-style preset */
|
|
232
|
-
renderStyle: RenderStyle;
|
|
233
|
-
/**
|
|
234
|
-
* Named color schemes for per-block color variation.
|
|
235
|
-
* Templates reference these by name (e.g. "blue", "warm").
|
|
236
|
-
*/
|
|
237
|
-
colorSchemes: Record<string, ThemeColorScheme>;
|
|
238
|
-
/** Optional persistent layers baked into the theme */
|
|
239
|
-
persistentLayers?: PersistentLayerConfig;
|
|
240
|
-
/**
|
|
241
|
-
* Optional page art direction for Page (linear) mode. When absent,
|
|
242
|
-
* `resolvePageStyle`/`defaultPageStyle` derive one from the fields above,
|
|
243
|
-
* so legacy themes render pages without declaring this.
|
|
244
|
-
*/
|
|
245
|
-
pageStyle?: ThemePageStyle;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
// ============================================
|
|
249
|
-
// Deep-Partial helper type
|
|
250
|
-
// ============================================
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Recursively makes every property optional.
|
|
254
|
-
*/
|
|
255
|
-
export type DeepPartial<T> = {
|
|
256
|
-
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
// ============================================
|
|
260
|
-
// Helpers
|
|
261
|
-
// ============================================
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Deep-merge `source` into `target`, returning a new object.
|
|
265
|
-
* Arrays are replaced wholesale (not concatenated).
|
|
266
|
-
*/
|
|
267
|
-
function deepMerge<T extends Record<string, unknown>>(target: T, source: DeepPartial<T>): T {
|
|
268
|
-
const result = { ...target } as Record<string, unknown>;
|
|
269
|
-
for (const key of Object.keys(source)) {
|
|
270
|
-
const srcVal = (source as Record<string, unknown>)[key];
|
|
271
|
-
const tgtVal = (target as Record<string, unknown>)[key];
|
|
272
|
-
if (
|
|
273
|
-
srcVal !== null &&
|
|
274
|
-
srcVal !== undefined &&
|
|
275
|
-
typeof srcVal === 'object' &&
|
|
276
|
-
!Array.isArray(srcVal) &&
|
|
277
|
-
tgtVal !== null &&
|
|
278
|
-
tgtVal !== undefined &&
|
|
279
|
-
typeof tgtVal === 'object' &&
|
|
280
|
-
!Array.isArray(tgtVal)
|
|
281
|
-
) {
|
|
282
|
-
result[key] = deepMerge(
|
|
283
|
-
tgtVal as Record<string, unknown>,
|
|
284
|
-
srcVal as DeepPartial<Record<string, unknown>>,
|
|
285
|
-
);
|
|
286
|
-
} else if (srcVal !== undefined) {
|
|
287
|
-
result[key] = srcVal;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return result as T;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Create a new theme by deep-merging overrides onto a base theme.
|
|
295
|
-
* The returned theme gets its own `id` if one is provided in overrides,
|
|
296
|
-
* otherwise keeps the base theme's `id` suffixed with "-custom".
|
|
297
|
-
*/
|
|
298
|
-
export function createTheme(base: Theme, overrides: DeepPartial<Theme>): Theme {
|
|
299
|
-
const merged = deepMerge(
|
|
300
|
-
base as unknown as Record<string, unknown>,
|
|
301
|
-
overrides as DeepPartial<Record<string, unknown>>,
|
|
302
|
-
) as unknown as Theme;
|
|
303
|
-
if (!overrides.id && merged.id === base.id) {
|
|
304
|
-
merged.id = `${base.id}-custom`;
|
|
305
|
-
}
|
|
306
|
-
if (!merged.schemaVersion) merged.schemaVersion = THEME_SCHEMA_VERSION;
|
|
307
|
-
return merged;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// ============================================
|
|
311
|
-
// Surface Schemes — orthogonal to Theme
|
|
312
|
-
// ============================================
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* A Surface Scheme is the light/dark axis, orthogonal to the editorial
|
|
316
|
-
* identity of a Theme. A Theme chooses voice (serif vs sans, muted vs
|
|
317
|
-
* bold, documentary vs magazine); a SurfaceScheme chooses what the paper
|
|
318
|
-
* looks like. Any theme can render on either surface.
|
|
319
|
-
*/
|
|
320
|
-
export interface SurfaceScheme {
|
|
321
|
-
/** Identifier — 'light', 'dark', or a custom id. */
|
|
322
|
-
id: string;
|
|
323
|
-
background: string;
|
|
324
|
-
backgroundLight: string;
|
|
325
|
-
text: string;
|
|
326
|
-
textMuted: string;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/** Near-white paper with dark text — standard light mode. */
|
|
330
|
-
export const LIGHT_SURFACE: SurfaceScheme = {
|
|
331
|
-
id: 'light',
|
|
332
|
-
background: '#ffffff',
|
|
333
|
-
backgroundLight: '#f5f5f5',
|
|
334
|
-
text: '#1a1a1a',
|
|
335
|
-
textMuted: '#666666',
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
/** Dark charcoal paper with light text — standard dark mode. */
|
|
339
|
-
export const DARK_SURFACE: SurfaceScheme = {
|
|
340
|
-
id: 'dark',
|
|
341
|
-
background: '#1a202c',
|
|
342
|
-
backgroundLight: '#2d3748',
|
|
343
|
-
text: '#f0f0f0',
|
|
344
|
-
textMuted: '#a0aec0',
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Overlay a SurfaceScheme's surface colors onto a Theme's palette,
|
|
349
|
-
* leaving everything else (primary, highlight, warning, typography,
|
|
350
|
-
* style, renderStyle, colorSchemes) untouched.
|
|
351
|
-
*/
|
|
352
|
-
export function applySurface(theme: Theme, surface: SurfaceScheme): Theme {
|
|
353
|
-
return {
|
|
354
|
-
...theme,
|
|
355
|
-
colors: {
|
|
356
|
-
...theme.colors,
|
|
357
|
-
background: surface.background,
|
|
358
|
-
backgroundLight: surface.backgroundLight,
|
|
359
|
-
text: surface.text,
|
|
360
|
-
textMuted: surface.textMuted,
|
|
361
|
-
},
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// ============================================
|
|
366
|
-
// Caller-owned registry — for custom themes
|
|
367
|
-
// ============================================
|
|
368
|
-
|
|
369
|
-
/** A caller-owned custom-theme registry for SSR tenants, tests, and embedders. */
|
|
370
|
-
export interface ThemeRegistry {
|
|
371
|
-
register(theme: Theme): void;
|
|
372
|
-
unregister(id: string): boolean;
|
|
373
|
-
get(id: string): Theme | undefined;
|
|
374
|
-
list(): Theme[];
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
function validatedThemeSnapshot(theme: Theme): Theme {
|
|
378
|
-
const result = validateTheme(theme);
|
|
379
|
-
if (!result.valid || !result.theme) {
|
|
380
|
-
const details = result.errors
|
|
381
|
-
.slice(0, 5)
|
|
382
|
-
.map((error) => `${error.path || '<root>'}: ${error.message}`)
|
|
383
|
-
.join('; ');
|
|
384
|
-
throw new TypeError(`Cannot register invalid theme: ${details}`);
|
|
385
|
-
}
|
|
386
|
-
return cloneAndFreezeData(result.theme);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Create a registry whose state is owned by the caller rather than the
|
|
391
|
-
* process. Registered values are validated and stored as deeply frozen
|
|
392
|
-
* snapshots, so later caller mutation cannot alter resolution behavior.
|
|
393
|
-
*/
|
|
394
|
-
export function createThemeRegistry(initialThemes: readonly Theme[] = []): ThemeRegistry {
|
|
395
|
-
const themes = new Map<string, Theme>();
|
|
396
|
-
const registry: ThemeRegistry = {
|
|
397
|
-
register(theme): void {
|
|
398
|
-
const snapshot = validatedThemeSnapshot(theme);
|
|
399
|
-
themes.set(snapshot.id, snapshot);
|
|
400
|
-
},
|
|
401
|
-
unregister(id): boolean {
|
|
402
|
-
return themes.delete(id);
|
|
403
|
-
},
|
|
404
|
-
get(id): Theme | undefined {
|
|
405
|
-
return themes.get(id);
|
|
406
|
-
},
|
|
407
|
-
list(): Theme[] {
|
|
408
|
-
return Array.from(themes.values());
|
|
409
|
-
},
|
|
410
|
-
};
|
|
411
|
-
for (const theme of initialThemes) registry.register(theme);
|
|
412
|
-
return Object.freeze(registry);
|
|
413
|
-
}
|