@bendyline/squisq 2.1.0 → 2.3.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/README.md +8 -8
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-COe-rPQB.d.ts} +7 -5
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- 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-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-XNLB57UD.js → chunk-EK446BUE.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-JI77MGAK.js → chunk-GIIOY6XR.js} +2178 -1291
- 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-OTKVFVL6.js → chunk-QNTQIEIV.js} +130 -47
- package/dist/{chunk-5UYI3RJB.js → chunk-QWCFK5FN.js} +55 -40
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/{chunk-QUUPYOSP.js → chunk-SPTY4C6F.js} +136 -5
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +311 -13
- package/dist/doc/index.js +25 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +1 -3
- package/dist/icons/index.js +2 -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 -13
- package/dist/index.js +67 -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-BSMOocve.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +12 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +1 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +2 -4
- package/dist/schemas/index.d.ts +18 -6
- package/dist/schemas/index.js +7 -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-BUTWjufL.d.ts} +1 -1
- package/dist/timing/index.js +2 -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 +8 -3
- 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
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared transition vocabulary for block-to-block slide changes.
|
|
3
|
-
*
|
|
4
|
-
* The canonical names are based on PowerPoint / PresentationML transition
|
|
5
|
-
* names where possible, with a few legacy renderer aliases kept so older
|
|
6
|
-
* Squisq documents continue to work.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export const DEFAULT_TRANSITION_DURATION_SECONDS = 0.7;
|
|
10
|
-
|
|
11
|
-
export const TRANSITION_TYPES = [
|
|
12
|
-
// Existing / common transitions
|
|
13
|
-
'cut',
|
|
14
|
-
'fade',
|
|
15
|
-
'dissolve',
|
|
16
|
-
'push',
|
|
17
|
-
'wipe',
|
|
18
|
-
'split',
|
|
19
|
-
'reveal',
|
|
20
|
-
'randomBars',
|
|
21
|
-
'shape',
|
|
22
|
-
'uncover',
|
|
23
|
-
'cover',
|
|
24
|
-
'zoom',
|
|
25
|
-
'pan',
|
|
26
|
-
|
|
27
|
-
// PowerPoint subtle / exciting transitions
|
|
28
|
-
'flash',
|
|
29
|
-
'fallOver',
|
|
30
|
-
'drape',
|
|
31
|
-
'curtains',
|
|
32
|
-
'wind',
|
|
33
|
-
'prestige',
|
|
34
|
-
'fracture',
|
|
35
|
-
'crush',
|
|
36
|
-
'peelOff',
|
|
37
|
-
'pageCurl',
|
|
38
|
-
'airplane',
|
|
39
|
-
'origami',
|
|
40
|
-
'checkerboard',
|
|
41
|
-
'blinds',
|
|
42
|
-
'clock',
|
|
43
|
-
'ripple',
|
|
44
|
-
'honeycomb',
|
|
45
|
-
'glitter',
|
|
46
|
-
'vortex',
|
|
47
|
-
'shred',
|
|
48
|
-
'switch',
|
|
49
|
-
'flip',
|
|
50
|
-
'gallery',
|
|
51
|
-
'cube',
|
|
52
|
-
'doors',
|
|
53
|
-
'box',
|
|
54
|
-
'ferrisWheel',
|
|
55
|
-
'conveyor',
|
|
56
|
-
'rotate',
|
|
57
|
-
'window',
|
|
58
|
-
'orbit',
|
|
59
|
-
'flyThrough',
|
|
60
|
-
'morph',
|
|
61
|
-
|
|
62
|
-
// PresentationML/Open XML precise names and legacy aliases
|
|
63
|
-
'checker',
|
|
64
|
-
'circle',
|
|
65
|
-
'comb',
|
|
66
|
-
'diamond',
|
|
67
|
-
'newsflash',
|
|
68
|
-
'plus',
|
|
69
|
-
'pull',
|
|
70
|
-
'random',
|
|
71
|
-
'randomBar',
|
|
72
|
-
'strips',
|
|
73
|
-
'wedge',
|
|
74
|
-
'wheel',
|
|
75
|
-
'prism',
|
|
76
|
-
'warp',
|
|
77
|
-
'ferris',
|
|
78
|
-
'flythrough',
|
|
79
|
-
'wheelReverse',
|
|
80
|
-
'pageCurlDouble',
|
|
81
|
-
'pageCurlSingle',
|
|
82
|
-
'slideLeft',
|
|
83
|
-
'slideRight',
|
|
84
|
-
'slideUp',
|
|
85
|
-
'slideDown',
|
|
86
|
-
] as const;
|
|
87
|
-
|
|
88
|
-
export type TransitionType = (typeof TRANSITION_TYPES)[number];
|
|
89
|
-
|
|
90
|
-
export const TRANSITION_DIRECTIONS = [
|
|
91
|
-
'left',
|
|
92
|
-
'right',
|
|
93
|
-
'up',
|
|
94
|
-
'down',
|
|
95
|
-
'in',
|
|
96
|
-
'out',
|
|
97
|
-
'horizontal',
|
|
98
|
-
'vertical',
|
|
99
|
-
] as const;
|
|
100
|
-
|
|
101
|
-
export type TransitionDirection = (typeof TRANSITION_DIRECTIONS)[number];
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Transition between blocks.
|
|
105
|
-
*
|
|
106
|
-
* A block's transition is the lead-in from the previous block. The same
|
|
107
|
-
* transition drives the entering block and the previous block's exit.
|
|
108
|
-
*/
|
|
109
|
-
export interface Transition {
|
|
110
|
-
/** Transition type */
|
|
111
|
-
type: TransitionType;
|
|
112
|
-
/** Duration in seconds. Defaults to DEFAULT_TRANSITION_DURATION_SECONDS. */
|
|
113
|
-
duration?: number;
|
|
114
|
-
/** Optional direction/variant for directional transitions. */
|
|
115
|
-
direction?: TransitionDirection;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const TRANSITION_TYPE_SET = new Set<string>(TRANSITION_TYPES);
|
|
119
|
-
|
|
120
|
-
const TRANSITION_TYPE_ALIASES: Record<string, TransitionType> = {
|
|
121
|
-
none: 'cut',
|
|
122
|
-
randombars: 'randomBars',
|
|
123
|
-
randombar: 'randomBar',
|
|
124
|
-
// Self-referential spellings (`checkerboard`, `shape`, `uncover`) are
|
|
125
|
-
// intentionally absent: an exact valid type returns early from
|
|
126
|
-
// `normalizeTransitionType`, and any case variant resolves through
|
|
127
|
-
// `NORMALIZED_TRANSITION_TYPES`. Only the *plural* aliases need an entry.
|
|
128
|
-
checkerboards: 'checkerboard',
|
|
129
|
-
shapes: 'shape',
|
|
130
|
-
ferris: 'ferrisWheel',
|
|
131
|
-
ferriswheel: 'ferrisWheel',
|
|
132
|
-
flythrough: 'flyThrough',
|
|
133
|
-
flythru: 'flyThrough',
|
|
134
|
-
pagecurl: 'pageCurl',
|
|
135
|
-
pagecurldouble: 'pageCurlDouble',
|
|
136
|
-
pagecurlsingle: 'pageCurlSingle',
|
|
137
|
-
wheelreverse: 'wheelReverse',
|
|
138
|
-
slideleft: 'slideLeft',
|
|
139
|
-
slideright: 'slideRight',
|
|
140
|
-
slideup: 'slideUp',
|
|
141
|
-
slidedown: 'slideDown',
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
const NORMALIZED_TRANSITION_TYPES = new Map<string, TransitionType>(
|
|
145
|
-
TRANSITION_TYPES.map((type) => [normalizeToken(type), type]),
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
export function isTransitionType(value: string): value is TransitionType {
|
|
149
|
-
return TRANSITION_TYPE_SET.has(value);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export function normalizeTransitionType(value: string): TransitionType | null {
|
|
153
|
-
const trimmed = value.trim();
|
|
154
|
-
if (!trimmed) return null;
|
|
155
|
-
if (isTransitionType(trimmed)) return trimmed;
|
|
156
|
-
const normalized = normalizeToken(trimmed);
|
|
157
|
-
return TRANSITION_TYPE_ALIASES[normalized] ?? NORMALIZED_TRANSITION_TYPES.get(normalized) ?? null;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function normalizeTransitionDirection(value: string): TransitionDirection | null {
|
|
161
|
-
const normalized = normalizeToken(value);
|
|
162
|
-
switch (normalized) {
|
|
163
|
-
case 'left':
|
|
164
|
-
case 'l':
|
|
165
|
-
return 'left';
|
|
166
|
-
case 'right':
|
|
167
|
-
case 'r':
|
|
168
|
-
return 'right';
|
|
169
|
-
case 'up':
|
|
170
|
-
case 'u':
|
|
171
|
-
return 'up';
|
|
172
|
-
case 'down':
|
|
173
|
-
case 'd':
|
|
174
|
-
return 'down';
|
|
175
|
-
case 'in':
|
|
176
|
-
return 'in';
|
|
177
|
-
case 'out':
|
|
178
|
-
return 'out';
|
|
179
|
-
case 'horizontal':
|
|
180
|
-
case 'horz':
|
|
181
|
-
case 'h':
|
|
182
|
-
return 'horizontal';
|
|
183
|
-
case 'vertical':
|
|
184
|
-
case 'vert':
|
|
185
|
-
case 'v':
|
|
186
|
-
return 'vertical';
|
|
187
|
-
default:
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export function resolveTransitionDuration(
|
|
193
|
-
transition: Transition | undefined,
|
|
194
|
-
fallback: number = DEFAULT_TRANSITION_DURATION_SECONDS,
|
|
195
|
-
): number {
|
|
196
|
-
const duration = transition?.duration;
|
|
197
|
-
return duration != null && Number.isFinite(duration) && duration > 0 ? duration : fallback;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Resolve the effective transition for a block: the authored value wins
|
|
202
|
-
* (markdown frontmatter and transform styles both write `block.transition`
|
|
203
|
-
* upstream), then the theme's `renderStyle.defaultTransition`, then
|
|
204
|
-
* `undefined` (the player's built-in default).
|
|
205
|
-
*
|
|
206
|
-
* Block 0 never gets a theme default — an entrance transition on the first
|
|
207
|
-
* block would dim the opening frames of every exported video.
|
|
208
|
-
*
|
|
209
|
-
* The theme parameter is structural (not `Theme`) to avoid a schema import
|
|
210
|
-
* cycle; pass any resolved theme.
|
|
211
|
-
*/
|
|
212
|
-
export function resolveBlockTransition(
|
|
213
|
-
block: { transition?: Transition },
|
|
214
|
-
theme: { renderStyle: { defaultTransition?: Transition } },
|
|
215
|
-
blockIndex: number,
|
|
216
|
-
): Transition | undefined {
|
|
217
|
-
if (block.transition) return block.transition;
|
|
218
|
-
if (blockIndex === 0) return undefined;
|
|
219
|
-
return theme.renderStyle.defaultTransition;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function normalizeToken(value: string): string {
|
|
223
|
-
return value.toLowerCase().replace(/[\s_-]+/g, '');
|
|
224
|
-
}
|
package/src/schemas/Types.ts
DELETED
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
|
-
}
|