@bendyline/squisq 2.0.1 → 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-ylqWKDc_.d.ts → Doc-BubIpWsp.d.ts} +160 -3
- package/dist/{ImageEditDoc-D828IXJ1.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-2ZWIXGAC.js +214 -0
- package/dist/{chunk-2PWOO4ZE.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-X6DUONGT.js → chunk-7ARJZYQY.js} +280 -128
- 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-W4O2TX5I.js → chunk-C33GTPUZ.js} +579 -4
- package/dist/{chunk-MMPBOUK7.js → chunk-CB45YGAM.js} +7 -2
- package/dist/{chunk-CY2R2VPR.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-TFJVXUHH.js → chunk-I2O6W7DX.js} +1513 -79
- 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-PXLVXTLW.js → chunk-RS5AP3J4.js} +72 -15
- 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 +166 -12
- package/dist/doc/index.js +36 -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 +13 -12
- package/dist/index.js +118 -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-wSLA2A1g.d.ts +223 -0
- 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 +31 -6
- package/dist/schemas/index.js +43 -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-RjVgLpUi.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -4
- package/dist/transform/index.d.ts +9 -10
- 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-2PWOO4ZE.js.map +0 -1
- 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-CY2R2VPR.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-FVJUUTEM.js +0 -74
- package/dist/chunk-FVJUUTEM.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-MMPBOUK7.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-PXLVXTLW.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.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-TFJVXUHH.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-W4O2TX5I.js.map +0 -1
- package/dist/chunk-X6DUONGT.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 -135
- 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__/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 -160
- 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 -127
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -304
- package/src/doc/mediaAnnotations.ts +0 -120
- 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 -423
- 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 -1052
- 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/Theme.ts +0 -406
- 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 -29
- package/src/schemas/themeCompile.ts +0 -237
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -426
- package/src/schemas/themes/bold.json +0 -48
- package/src/schemas/themes/cinematic.json +0 -111
- package/src/schemas/themes/documentary.json +0 -96
- package/src/schemas/themes/gezellig.json +0 -93
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -89
- package/src/schemas/themes/minimalist.json +0 -45
- package/src/schemas/themes/morning-light.json +0 -85
- package/src/schemas/themes/standard-dark.json +0 -85
- package/src/schemas/themes/standard.json +0 -74
- package/src/schemas/themes/tech-dark.json +0 -101
- package/src/schemas/themes/warm-earth.json +0 -50
- 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 -198
- package/src/transform/styles/dataDriven.ts +0 -17
- package/src/transform/styles/documentary.ts +0 -17
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -18
- package/src/transform/styles/minimal.ts +0 -17
- package/src/transform/styles/narrative.ts +0 -18
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -151
- 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/Viewport.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Viewport Configuration
|
|
3
|
-
*
|
|
4
|
-
* Defines viewport dimensions for doc rendering across different aspect ratios.
|
|
5
|
-
* Templates use this configuration to adapt their layouts appropriately.
|
|
6
|
-
*
|
|
7
|
-
* Supported aspect ratios:
|
|
8
|
-
* - landscape (16:9) - Default, standard video/presentation format
|
|
9
|
-
* - portrait (9:16) - Vertical video, mobile stories
|
|
10
|
-
* - square (1:1) - Social media posts
|
|
11
|
-
* - standard (4:3) - Classic presentation format
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Viewport configuration for doc rendering.
|
|
16
|
-
*/
|
|
17
|
-
export interface ViewportConfig {
|
|
18
|
-
/** Canonical width in virtual pixels */
|
|
19
|
-
width: number;
|
|
20
|
-
/** Canonical height in virtual pixels */
|
|
21
|
-
height: number;
|
|
22
|
-
/** Human-readable name for debugging/display */
|
|
23
|
-
name: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Standard viewport presets for common aspect ratios.
|
|
28
|
-
*/
|
|
29
|
-
export const VIEWPORT_PRESETS = {
|
|
30
|
-
/** 16:9 landscape (default, 1080p) */
|
|
31
|
-
landscape: { width: 1920, height: 1080, name: '16:9 Landscape' },
|
|
32
|
-
/** 9:16 portrait (vertical video, stories) */
|
|
33
|
-
portrait: { width: 1080, height: 1920, name: '9:16 Portrait' },
|
|
34
|
-
/** 1:1 square (social media) */
|
|
35
|
-
square: { width: 1080, height: 1080, name: '1:1 Square' },
|
|
36
|
-
/** 4:3 standard */
|
|
37
|
-
standard: { width: 1440, height: 1080, name: '4:3 Standard' },
|
|
38
|
-
} as const;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Viewport preset name.
|
|
42
|
-
*/
|
|
43
|
-
export type ViewportPreset = keyof typeof VIEWPORT_PRESETS;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Viewport orientation derived from aspect ratio.
|
|
47
|
-
*/
|
|
48
|
-
export type ViewportOrientation = 'landscape' | 'portrait' | 'square';
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Get a viewport configuration from a preset name or return the config if already a ViewportConfig.
|
|
52
|
-
*/
|
|
53
|
-
export function getViewport(viewport: ViewportPreset | ViewportConfig): ViewportConfig {
|
|
54
|
-
if (typeof viewport === 'string') {
|
|
55
|
-
return VIEWPORT_PRESETS[viewport];
|
|
56
|
-
}
|
|
57
|
-
return viewport;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Calculate font scale factor for a viewport.
|
|
62
|
-
* Based on diagonal pixels relative to 1080p landscape reference.
|
|
63
|
-
* This ensures text remains readable across different viewport sizes.
|
|
64
|
-
*/
|
|
65
|
-
const REFERENCE_DIAGONAL = Math.sqrt(1920 * 1920 + 1080 * 1080); // ~2203
|
|
66
|
-
|
|
67
|
-
export function calculateFontScale(viewport: ViewportConfig): number {
|
|
68
|
-
const currentDiagonal = Math.sqrt(
|
|
69
|
-
viewport.width * viewport.width + viewport.height * viewport.height,
|
|
70
|
-
);
|
|
71
|
-
return currentDiagonal / REFERENCE_DIAGONAL;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Determine if viewport is landscape, portrait, or square.
|
|
76
|
-
*/
|
|
77
|
-
export function getViewportOrientation(viewport: ViewportConfig): ViewportOrientation {
|
|
78
|
-
const ratio = viewport.width / viewport.height;
|
|
79
|
-
// Allow small tolerance for "square" classification
|
|
80
|
-
if (Math.abs(ratio - 1) < 0.05) return 'square';
|
|
81
|
-
return ratio > 1 ? 'landscape' : 'portrait';
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Get aspect ratio as a string (e.g., "16:9", "9:16", "1:1").
|
|
86
|
-
*/
|
|
87
|
-
export function getAspectRatioString(viewport: ViewportConfig): string {
|
|
88
|
-
const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));
|
|
89
|
-
const divisor = gcd(viewport.width, viewport.height);
|
|
90
|
-
return `${viewport.width / divisor}:${viewport.height / divisor}`;
|
|
91
|
-
}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Color Utilities
|
|
3
|
-
*
|
|
4
|
-
* Pure-JS color math used by theme compilation and contrast checks.
|
|
5
|
-
* No dependencies. Operates on `#rrggbb` hex strings.
|
|
6
|
-
*
|
|
7
|
-
* Internally uses OKLCh — perceptually uniform, so lightening by 0.1
|
|
8
|
-
* looks like the same change at any starting point. Out-of-gamut
|
|
9
|
-
* results are clamped to sRGB.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
13
|
-
|
|
14
|
-
/** Test whether a string is a valid `#rgb` or `#rrggbb` hex color. */
|
|
15
|
-
export function isHex(value: string): boolean {
|
|
16
|
-
return HEX_RE.test(value);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** Parse `#rgb` or `#rrggbb` into 0..1 sRGB triplet. Returns null on failure. */
|
|
20
|
-
function parseHex(hex: string): [number, number, number] | null {
|
|
21
|
-
if (!HEX_RE.test(hex)) return null;
|
|
22
|
-
let body = hex.slice(1);
|
|
23
|
-
if (body.length === 3)
|
|
24
|
-
body = body
|
|
25
|
-
.split('')
|
|
26
|
-
.map((c) => c + c)
|
|
27
|
-
.join('');
|
|
28
|
-
return [
|
|
29
|
-
parseInt(body.slice(0, 2), 16) / 255,
|
|
30
|
-
parseInt(body.slice(2, 4), 16) / 255,
|
|
31
|
-
parseInt(body.slice(4, 6), 16) / 255,
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function toHex(rgb: [number, number, number]): string {
|
|
36
|
-
const ch = (v: number) => {
|
|
37
|
-
const c = Math.max(0, Math.min(255, Math.round(v * 255)));
|
|
38
|
-
return c.toString(16).padStart(2, '0');
|
|
39
|
-
};
|
|
40
|
-
return '#' + ch(rgb[0]) + ch(rgb[1]) + ch(rgb[2]);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function srgbToLinear(c: number): number {
|
|
44
|
-
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function linearToSrgb(c: number): number {
|
|
48
|
-
return c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
interface OKLCh {
|
|
52
|
-
L: number;
|
|
53
|
-
C: number;
|
|
54
|
-
h: number;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function rgbToOklch(rgb: [number, number, number]): OKLCh {
|
|
58
|
-
const [sr, sg, sb] = rgb;
|
|
59
|
-
const r = srgbToLinear(sr);
|
|
60
|
-
const g = srgbToLinear(sg);
|
|
61
|
-
const b = srgbToLinear(sb);
|
|
62
|
-
|
|
63
|
-
const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
|
|
64
|
-
const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
|
|
65
|
-
const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
|
|
66
|
-
|
|
67
|
-
const l_ = Math.cbrt(l);
|
|
68
|
-
const m_ = Math.cbrt(m);
|
|
69
|
-
const s_ = Math.cbrt(s);
|
|
70
|
-
|
|
71
|
-
const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
|
|
72
|
-
const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
|
|
73
|
-
const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
|
|
74
|
-
|
|
75
|
-
const C = Math.sqrt(a * a + bb * bb);
|
|
76
|
-
let h = (Math.atan2(bb, a) * 180) / Math.PI;
|
|
77
|
-
if (h < 0) h += 360;
|
|
78
|
-
return { L, C, h };
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function oklchToRgb({ L, C, h }: OKLCh): [number, number, number] {
|
|
82
|
-
const hr = (h * Math.PI) / 180;
|
|
83
|
-
const a = C * Math.cos(hr);
|
|
84
|
-
const bb = C * Math.sin(hr);
|
|
85
|
-
|
|
86
|
-
const l_ = L + 0.3963377774 * a + 0.2158037573 * bb;
|
|
87
|
-
const m_ = L - 0.1055613458 * a - 0.0638541728 * bb;
|
|
88
|
-
const s_ = L - 0.0894841775 * a - 1.291485548 * bb;
|
|
89
|
-
|
|
90
|
-
const l = l_ * l_ * l_;
|
|
91
|
-
const m = m_ * m_ * m_;
|
|
92
|
-
const s = s_ * s_ * s_;
|
|
93
|
-
|
|
94
|
-
const r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;
|
|
95
|
-
const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;
|
|
96
|
-
const b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;
|
|
97
|
-
|
|
98
|
-
return [
|
|
99
|
-
Math.max(0, Math.min(1, linearToSrgb(r))),
|
|
100
|
-
Math.max(0, Math.min(1, linearToSrgb(g))),
|
|
101
|
-
Math.max(0, Math.min(1, linearToSrgb(b))),
|
|
102
|
-
];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Lighten a color by `amount` (0..1) in OKLCh L space.
|
|
107
|
-
* Falls back to the input on parse failure.
|
|
108
|
-
*/
|
|
109
|
-
export function oklchLighten(hex: string, amount: number): string {
|
|
110
|
-
const rgb = parseHex(hex);
|
|
111
|
-
if (!rgb) return hex;
|
|
112
|
-
const lch = rgbToOklch(rgb);
|
|
113
|
-
lch.L = Math.max(0, Math.min(1, lch.L + amount));
|
|
114
|
-
return toHex(oklchToRgb(lch));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Darken a color by `amount` (0..1) in OKLCh L space.
|
|
119
|
-
* Falls back to the input on parse failure.
|
|
120
|
-
*/
|
|
121
|
-
export function oklchDarken(hex: string, amount: number): string {
|
|
122
|
-
return oklchLighten(hex, -amount);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Adjust the OKLCh chroma of a color by a multiplier (e.g. 0.7 to mute).
|
|
127
|
-
*/
|
|
128
|
-
export function oklchSetChroma(hex: string, multiplier: number): string {
|
|
129
|
-
const rgb = parseHex(hex);
|
|
130
|
-
if (!rgb) return hex;
|
|
131
|
-
const lch = rgbToOklch(rgb);
|
|
132
|
-
lch.C = Math.max(0, lch.C * multiplier);
|
|
133
|
-
return toHex(oklchToRgb(lch));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* WCAG relative luminance of a hex color, returned as 0..1.
|
|
138
|
-
*/
|
|
139
|
-
export function relativeLuminance(hex: string): number {
|
|
140
|
-
const rgb = parseHex(hex);
|
|
141
|
-
if (!rgb) return 0;
|
|
142
|
-
const [r, g, b] = rgb.map(srgbToLinear) as [number, number, number];
|
|
143
|
-
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Hue of a hex color in HSL degrees (0..360). Returns 0 for pure grays
|
|
148
|
-
* and on parse failure. Used by the duotone image treatment to aim its
|
|
149
|
-
* `hue-rotate()` at the theme's tint color.
|
|
150
|
-
*/
|
|
151
|
-
export function hexHueDegrees(hex: string): number {
|
|
152
|
-
const rgb = parseHex(hex);
|
|
153
|
-
if (!rgb) return 0;
|
|
154
|
-
const [r, g, b] = rgb;
|
|
155
|
-
const max = Math.max(r, g, b);
|
|
156
|
-
const min = Math.min(r, g, b);
|
|
157
|
-
if (max === min) return 0;
|
|
158
|
-
const d = max - min;
|
|
159
|
-
let h: number;
|
|
160
|
-
if (max === r) h = ((g - b) / d) % 6;
|
|
161
|
-
else if (max === g) h = (b - r) / d + 2;
|
|
162
|
-
else h = (r - g) / d + 4;
|
|
163
|
-
return Math.round((h * 60 + 360) % 360);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Convert a hex color + alpha (0..1) to an `rgba()` string.
|
|
168
|
-
* Falls back to the input on parse failure (e.g. a value that is
|
|
169
|
-
* already an rgba()/gradient string).
|
|
170
|
-
*/
|
|
171
|
-
export function withAlpha(hex: string, alpha: number): string {
|
|
172
|
-
const rgb = parseHex(hex);
|
|
173
|
-
if (!rgb) return hex;
|
|
174
|
-
const a = Math.max(0, Math.min(1, alpha));
|
|
175
|
-
const ch = (v: number) => Math.round(v * 255);
|
|
176
|
-
return `rgba(${ch(rgb[0])}, ${ch(rgb[1])}, ${ch(rgb[2])}, ${a})`;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* WCAG contrast ratio between two hex colors. Returns 1..21.
|
|
181
|
-
*/
|
|
182
|
-
export function contrastRatio(a: string, b: string): number {
|
|
183
|
-
const la = relativeLuminance(a);
|
|
184
|
-
const lb = relativeLuminance(b);
|
|
185
|
-
const lighter = Math.max(la, lb);
|
|
186
|
-
const darker = Math.min(la, lb);
|
|
187
|
-
return (lighter + 0.05) / (darker + 0.05);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Pick a near-white or near-black text color that contrasts well against `bg`.
|
|
192
|
-
*/
|
|
193
|
-
export function pickContrastingText(bg: string, light = '#f7fafc', dark = '#1a202c'): string {
|
|
194
|
-
return contrastRatio(bg, dark) >= contrastRatio(bg, light) ? dark : light;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Derive a 5-step lighter→darker scale from a seed color.
|
|
199
|
-
* Stops are evenly spaced in OKLCh L space around the seed.
|
|
200
|
-
* `spread` controls amplitude (0.05 = subtle, 0.15 = balanced, 0.22 = high).
|
|
201
|
-
*/
|
|
202
|
-
export function deriveScale(
|
|
203
|
-
seedHex: string,
|
|
204
|
-
spread = 0.15,
|
|
205
|
-
): {
|
|
206
|
-
lighter2: string;
|
|
207
|
-
lighter1: string;
|
|
208
|
-
base: string;
|
|
209
|
-
darker1: string;
|
|
210
|
-
darker2: string;
|
|
211
|
-
} {
|
|
212
|
-
return {
|
|
213
|
-
lighter2: oklchLighten(seedHex, spread),
|
|
214
|
-
lighter1: oklchLighten(seedHex, spread / 2),
|
|
215
|
-
base: seedHex,
|
|
216
|
-
darker1: oklchDarken(seedHex, spread / 2),
|
|
217
|
-
darker2: oklchDarken(seedHex, spread),
|
|
218
|
-
};
|
|
219
|
-
}
|
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Font Stacks
|
|
3
|
-
*
|
|
4
|
-
* Curated registry of font families used by built-in themes and offered in
|
|
5
|
-
* the theme customizer. Each stack has a stable `id` (referenced by JSON
|
|
6
|
-
* theme files via `{ stackId }`) and a CSS `family` string that resolves
|
|
7
|
-
* to the actual font when rendered.
|
|
8
|
-
*
|
|
9
|
-
* Themes never carry raw CSS font strings — they reference a `stackId` or
|
|
10
|
-
* specify a `{ custom: { name, fallback } }` form, both of which resolve
|
|
11
|
-
* here at render time.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { FontFamily, FontFamilyKind } from './Theme.js';
|
|
15
|
-
|
|
16
|
-
export interface FontStack {
|
|
17
|
-
/** Stable identifier referenced by Theme JSON. */
|
|
18
|
-
id: string;
|
|
19
|
-
/** Display label for pickers. */
|
|
20
|
-
label: string;
|
|
21
|
-
/** Full CSS font-family string with safe fallbacks. */
|
|
22
|
-
family: string;
|
|
23
|
-
/** Categorical bucket for the picker UI. */
|
|
24
|
-
kind: FontFamilyKind;
|
|
25
|
-
/**
|
|
26
|
-
* Google Fonts family name, when this stack is served by Google Fonts.
|
|
27
|
-
* Used by exports that bundle a `<link>` to fonts.googleapis.com so the
|
|
28
|
-
* face renders correctly even when the host page doesn't preload it.
|
|
29
|
-
* Omit (or set to undefined) for purely system stacks.
|
|
30
|
-
*/
|
|
31
|
-
googleFontFamily?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** All curated stacks, in the order they should appear in pickers. */
|
|
35
|
-
export const AVAILABLE_FONT_STACKS: FontStack[] = [
|
|
36
|
-
// System defaults
|
|
37
|
-
{
|
|
38
|
-
id: 'system-sans',
|
|
39
|
-
label: 'System Sans',
|
|
40
|
-
family: 'system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
|
|
41
|
-
kind: 'sans',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: 'system-serif',
|
|
45
|
-
label: 'System Serif',
|
|
46
|
-
family: 'Georgia, "Times New Roman", serif',
|
|
47
|
-
kind: 'serif',
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: 'system-mono',
|
|
51
|
-
label: 'System Mono',
|
|
52
|
-
family: 'Consolas, "Courier New", monospace',
|
|
53
|
-
kind: 'mono',
|
|
54
|
-
},
|
|
55
|
-
// Curated Google Fonts. `googleFontFamily` is the canonical family
|
|
56
|
-
// name Google serves the face under (used by exports that emit a
|
|
57
|
-
// `<link rel="stylesheet" href="https://fonts.googleapis.com/...">`
|
|
58
|
-
// so the face renders even when the host doesn't preload it).
|
|
59
|
-
{
|
|
60
|
-
id: 'inter',
|
|
61
|
-
label: 'Inter',
|
|
62
|
-
family: '"Inter", "Segoe UI", Roboto, sans-serif',
|
|
63
|
-
kind: 'sans',
|
|
64
|
-
googleFontFamily: 'Inter',
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
id: 'ibm-plex-sans',
|
|
68
|
-
label: 'IBM Plex Sans',
|
|
69
|
-
family: '"IBM Plex Sans", "Segoe UI", Roboto, sans-serif',
|
|
70
|
-
kind: 'sans',
|
|
71
|
-
googleFontFamily: 'IBM Plex Sans',
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
id: 'roboto',
|
|
75
|
-
label: 'Roboto',
|
|
76
|
-
family: '"Roboto", "Segoe UI", Arial, sans-serif',
|
|
77
|
-
kind: 'sans',
|
|
78
|
-
googleFontFamily: 'Roboto',
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
id: 'dm-sans',
|
|
82
|
-
label: 'DM Sans',
|
|
83
|
-
family: '"DM Sans", "Segoe UI", Roboto, sans-serif',
|
|
84
|
-
kind: 'sans',
|
|
85
|
-
googleFontFamily: 'DM Sans',
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
id: 'oswald',
|
|
89
|
-
label: 'Oswald',
|
|
90
|
-
// Condensed grotesques make a far better stand-in for Oswald than
|
|
91
|
-
// Impact/Arial Black, whose extreme weight distorts every layout
|
|
92
|
-
// tuned for the real face.
|
|
93
|
-
family: '"Oswald", "Arial Narrow", "Helvetica Neue Condensed", "Roboto Condensed", sans-serif',
|
|
94
|
-
kind: 'display',
|
|
95
|
-
googleFontFamily: 'Oswald',
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
id: 'playfair',
|
|
99
|
-
label: 'Playfair Display',
|
|
100
|
-
family: '"Playfair Display", Georgia, serif',
|
|
101
|
-
kind: 'serif',
|
|
102
|
-
googleFontFamily: 'Playfair Display',
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
id: 'source-serif',
|
|
106
|
-
label: 'Source Serif',
|
|
107
|
-
family: '"Source Serif 4", "PT Serif", Georgia, serif',
|
|
108
|
-
kind: 'serif',
|
|
109
|
-
googleFontFamily: 'Source Serif 4',
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
id: 'merriweather',
|
|
113
|
-
label: 'Merriweather',
|
|
114
|
-
family: '"Merriweather", Georgia, serif',
|
|
115
|
-
kind: 'serif',
|
|
116
|
-
googleFontFamily: 'Merriweather',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: 'lora',
|
|
120
|
-
label: 'Lora',
|
|
121
|
-
family: '"Lora", "Merriweather", Georgia, serif',
|
|
122
|
-
kind: 'serif',
|
|
123
|
-
googleFontFamily: 'Lora',
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
id: 'pt-serif',
|
|
127
|
-
label: 'PT Serif',
|
|
128
|
-
family: '"PT Serif", Georgia, serif',
|
|
129
|
-
kind: 'serif',
|
|
130
|
-
googleFontFamily: 'PT Serif',
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
id: 'crimson',
|
|
134
|
-
label: 'Crimson Text',
|
|
135
|
-
family: '"Crimson Text", Georgia, serif',
|
|
136
|
-
kind: 'serif',
|
|
137
|
-
googleFontFamily: 'Crimson Text',
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
id: 'cormorant',
|
|
141
|
-
label: 'Cormorant Garamond',
|
|
142
|
-
family: '"Cormorant Garamond", Garamond, Georgia, serif',
|
|
143
|
-
kind: 'serif',
|
|
144
|
-
googleFontFamily: 'Cormorant Garamond',
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
id: 'dm-serif',
|
|
148
|
-
label: 'DM Serif Display',
|
|
149
|
-
family: '"DM Serif Display", Georgia, serif',
|
|
150
|
-
kind: 'display',
|
|
151
|
-
googleFontFamily: 'DM Serif Display',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
id: 'jetbrains-mono',
|
|
155
|
-
label: 'JetBrains Mono',
|
|
156
|
-
family: '"JetBrains Mono", "Fira Code", Consolas, monospace',
|
|
157
|
-
kind: 'mono',
|
|
158
|
-
googleFontFamily: 'JetBrains Mono',
|
|
159
|
-
},
|
|
160
|
-
// Themed system stacks with emoji fallbacks (used by gezellig)
|
|
161
|
-
{
|
|
162
|
-
id: 'system-sans-emoji',
|
|
163
|
-
label: 'System Sans + Emoji',
|
|
164
|
-
family:
|
|
165
|
-
'system-ui, -apple-system, "Segoe UI", Roboto, "OpenMoji Color", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif',
|
|
166
|
-
kind: 'sans',
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
id: 'system-serif-emoji',
|
|
170
|
-
label: 'System Serif + Emoji',
|
|
171
|
-
family:
|
|
172
|
-
'Georgia, "Times New Roman", "OpenMoji Color", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", serif',
|
|
173
|
-
kind: 'serif',
|
|
174
|
-
},
|
|
175
|
-
];
|
|
176
|
-
|
|
177
|
-
const STACKS_BY_ID: Record<string, FontStack> = Object.fromEntries(
|
|
178
|
-
AVAILABLE_FONT_STACKS.map((s) => [s.id, s]),
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
/** Look up a stack by id. Returns undefined if not registered. */
|
|
182
|
-
export function getFontStack(id: string): FontStack | undefined {
|
|
183
|
-
return STACKS_BY_ID[id];
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** Default fallback CSS family per kind, used when a custom font has no fallback specified. */
|
|
187
|
-
const FALLBACK_BY_KIND: Record<FontFamilyKind, string> = {
|
|
188
|
-
sans: 'system-ui, sans-serif',
|
|
189
|
-
serif: 'Georgia, serif',
|
|
190
|
-
mono: 'Consolas, monospace',
|
|
191
|
-
display: '"Arial Narrow", "Helvetica Neue", Arial, sans-serif',
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Resolve a `FontFamily` reference (or legacy raw string) to a CSS family string.
|
|
196
|
-
* Used by `getThemeFont` at render time. Never returns an empty string —
|
|
197
|
-
* unrecognized stackIds fall back to the requested role's default.
|
|
198
|
-
*/
|
|
199
|
-
export function resolveFontFamily(
|
|
200
|
-
family: FontFamily | string | undefined,
|
|
201
|
-
roleFallback: string,
|
|
202
|
-
): string {
|
|
203
|
-
if (!family) return roleFallback;
|
|
204
|
-
if (typeof family === 'string') return family;
|
|
205
|
-
if ('stackId' in family) {
|
|
206
|
-
const stack = STACKS_BY_ID[family.stackId];
|
|
207
|
-
return stack ? stack.family : roleFallback;
|
|
208
|
-
}
|
|
209
|
-
if ('custom' in family) {
|
|
210
|
-
const { name, fallback } = family.custom;
|
|
211
|
-
const fb =
|
|
212
|
-
fallback === 'system-ui'
|
|
213
|
-
? 'system-ui, sans-serif'
|
|
214
|
-
: fallback === 'serif'
|
|
215
|
-
? 'Georgia, serif'
|
|
216
|
-
: fallback === 'monospace'
|
|
217
|
-
? 'Consolas, monospace'
|
|
218
|
-
: 'system-ui, sans-serif';
|
|
219
|
-
const safeName = name.includes(' ') || name.includes(',') ? `"${name}"` : name;
|
|
220
|
-
return `${safeName}, ${fb}`;
|
|
221
|
-
}
|
|
222
|
-
return roleFallback;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** Convenience: quick `{ stackId }` factory for code that constructs themes. */
|
|
226
|
-
export function fontStack(id: string): FontFamily {
|
|
227
|
-
return { stackId: id };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Build a `https://fonts.googleapis.com/css2?...` URL that loads the
|
|
232
|
-
* subset of supplied `FontFamily` references that are served by Google
|
|
233
|
-
* Fonts. Returns `null` when nothing in the list needs Google hosting
|
|
234
|
-
* (system stacks, custom fonts, or unknown stack ids) — callers can use
|
|
235
|
-
* that to skip emitting a `<link>` entirely.
|
|
236
|
-
*
|
|
237
|
-
* The URL requests regular + bold (400/700) for each family, which is
|
|
238
|
-
* what the templates use. `display=swap` keeps the fallback visible
|
|
239
|
-
* while the web font streams in.
|
|
240
|
-
*/
|
|
241
|
-
export function buildGoogleFontsUrl(families: Array<FontFamily | undefined>): string | null {
|
|
242
|
-
const names = new Set<string>();
|
|
243
|
-
for (const f of families) {
|
|
244
|
-
if (!f || typeof f === 'string') continue;
|
|
245
|
-
if ('stackId' in f) {
|
|
246
|
-
const stack = STACKS_BY_ID[f.stackId];
|
|
247
|
-
if (stack?.googleFontFamily) names.add(stack.googleFontFamily);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (names.size === 0) return null;
|
|
251
|
-
// css2 syntax: ?family=Name+With+Spaces:wght@400;700&family=Other:wght@400;700&display=swap
|
|
252
|
-
const params = Array.from(names)
|
|
253
|
-
.sort()
|
|
254
|
-
.map((name) => `family=${encodeURIComponent(name).replace(/%20/g, '+')}:wght@400;700`)
|
|
255
|
-
.join('&');
|
|
256
|
-
return `https://fonts.googleapis.com/css2?${params}&display=swap`;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/** Default fallback families exposed for tools that need them. */
|
|
260
|
-
export const FONT_FALLBACKS = FALLBACK_BY_KIND;
|
|
261
|
-
|
|
262
|
-
// ── Arbitrary font-name matching ─────────────────────────────────────
|
|
263
|
-
//
|
|
264
|
-
// Used by file-import theme inference (OOXML fontScheme → FontFamily):
|
|
265
|
-
// a typeface name from an office document either matches a curated stack
|
|
266
|
-
// or becomes a `{ custom }` reference that preserves the original face.
|
|
267
|
-
|
|
268
|
-
/** Normalize a raw typeface name for lookup: trim, unquote, lowercase, collapse whitespace. */
|
|
269
|
-
function normalizeFontName(name: string): string {
|
|
270
|
-
return name
|
|
271
|
-
.trim()
|
|
272
|
-
.replace(/^["']+|["']+$/g, '')
|
|
273
|
-
.replace(/\s+/g, ' ')
|
|
274
|
-
.toLowerCase();
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Normalized name → stackId. Seeded from every stack's label and Google
|
|
279
|
-
* Fonts family name, plus explicit aliases for common variants and the
|
|
280
|
-
* web-safe faces that already anchor the system stacks' CSS families.
|
|
281
|
-
*/
|
|
282
|
-
const STACK_NAME_ALIASES: Record<string, string> = (() => {
|
|
283
|
-
const aliases: Record<string, string> = {};
|
|
284
|
-
for (const stack of AVAILABLE_FONT_STACKS) {
|
|
285
|
-
aliases[normalizeFontName(stack.label)] = stack.id;
|
|
286
|
-
if (stack.googleFontFamily) aliases[normalizeFontName(stack.googleFontFamily)] = stack.id;
|
|
287
|
-
}
|
|
288
|
-
Object.assign(aliases, {
|
|
289
|
-
playfair: 'playfair',
|
|
290
|
-
'source serif': 'source-serif',
|
|
291
|
-
'source serif pro': 'source-serif',
|
|
292
|
-
'crimson pro': 'crimson',
|
|
293
|
-
cormorant: 'cormorant',
|
|
294
|
-
georgia: 'system-serif',
|
|
295
|
-
'times new roman': 'system-serif',
|
|
296
|
-
times: 'system-serif',
|
|
297
|
-
consolas: 'system-mono',
|
|
298
|
-
'courier new': 'system-mono',
|
|
299
|
-
courier: 'system-mono',
|
|
300
|
-
'segoe ui': 'system-sans',
|
|
301
|
-
'system-ui': 'system-sans',
|
|
302
|
-
});
|
|
303
|
-
return aliases;
|
|
304
|
-
})();
|
|
305
|
-
|
|
306
|
-
const MONO_NAME_RE =
|
|
307
|
-
/\b(mono|monospace|consolas|courier|menlo|inconsolata|cascadia|fira code|source code|code)\b/;
|
|
308
|
-
const SERIF_NAME_RE =
|
|
309
|
-
/\b(georgia|times|garamond|cambria|caslon|baskerville|bodoni|didot|palatino|book antiqua|goudy|minion|charter|constantia|century schoolbook|antiqua|roman)\b/;
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Guess the structured fallback bucket for an arbitrary typeface name.
|
|
313
|
-
* Deliberately never guesses `system-ui` — a wrong serif/sans guess is
|
|
314
|
-
* recoverable in the customizer; `system-ui` erases the signal entirely.
|
|
315
|
-
*/
|
|
316
|
-
export function guessFontFallback(
|
|
317
|
-
name: string,
|
|
318
|
-
): 'serif' | 'sans-serif' | 'monospace' | 'system-ui' {
|
|
319
|
-
const n = normalizeFontName(name);
|
|
320
|
-
if (MONO_NAME_RE.test(n)) return 'monospace';
|
|
321
|
-
if ((n.includes('serif') && !n.includes('sans')) || SERIF_NAME_RE.test(n)) return 'serif';
|
|
322
|
-
return 'sans-serif';
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Map an arbitrary typeface name (e.g. from an imported office document's
|
|
327
|
-
* fontScheme) to a `FontFamily`: a curated `{ stackId }` when the name
|
|
328
|
-
* matches a known stack, else `{ custom }` preserving the original name
|
|
329
|
-
* (original casing, quotes stripped) with a heuristic fallback bucket.
|
|
330
|
-
* Empty/blank names resolve to the system sans stack.
|
|
331
|
-
*/
|
|
332
|
-
export function matchFontFamily(name: string): FontFamily {
|
|
333
|
-
const normalized = normalizeFontName(name);
|
|
334
|
-
if (!normalized) return { stackId: 'system-sans' };
|
|
335
|
-
const stackId = STACK_NAME_ALIASES[normalized];
|
|
336
|
-
if (stackId) return { stackId };
|
|
337
|
-
const displayName = name.trim().replace(/^["']+|["']+$/g, '');
|
|
338
|
-
return { custom: { name: displayName, fallback: guessFontFallback(name) } };
|
|
339
|
-
}
|
package/src/schemas/index.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export * from './Types.js';
|
|
2
|
-
export * from './Doc.js';
|
|
3
|
-
export * from './Transitions.js';
|
|
4
|
-
export * from './Media.js';
|
|
5
|
-
export * from './BlockTemplates.js';
|
|
6
|
-
export * from './CustomTemplates.js';
|
|
7
|
-
export * from './Theme.js';
|
|
8
|
-
export * from './themeLibrary.js';
|
|
9
|
-
export * from './themeValidator.js';
|
|
10
|
-
export * from './themeCompile.js';
|
|
11
|
-
export * from './fontStacks.js';
|
|
12
|
-
export * from './colorUtils.js';
|
|
13
|
-
export * from './Viewport.js';
|
|
14
|
-
export {
|
|
15
|
-
getLayoutHints,
|
|
16
|
-
getTwoColumnPositions,
|
|
17
|
-
getSafeTextBounds,
|
|
18
|
-
scaledFontSize as layoutScaledFontSize,
|
|
19
|
-
} from './LayoutStrategy.js';
|
|
20
|
-
export type { LayoutHints } from './LayoutStrategy.js';
|
|
21
|
-
export type { MediaProvider, MediaEntry } from './MediaProvider.js';
|
|
22
|
-
export type {
|
|
23
|
-
ImageEditDoc,
|
|
24
|
-
ImageEditLayer,
|
|
25
|
-
ImageEditLayerKind,
|
|
26
|
-
ImageEditCanvas,
|
|
27
|
-
ImageEditMeta,
|
|
28
|
-
EditorLayerMeta,
|
|
29
|
-
} from './ImageEditDoc.js';
|