@psrt/sdk 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -9
- package/dist/browser/index.d.ts +260 -0
- package/dist/browser/index.js +3447 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/index.cjs +2422 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -4
- package/dist/index.d.ts +85 -4
- package/dist/index.js +2414 -34
- package/dist/index.js.map +1 -1
- package/package.json +17 -6
- package/wasm/psrt.wasm +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wasm.ts","../src/parse.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT WASM not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown WASM handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'WASM call failed')\n }\n if (!result.data) {\n throw new Error('WASM call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found on globalThis')\n }\n wasmExports = exp\n}\n\nexport async function initPsrt(wasmUrl?: string): Promise<void> {\n if (wasmExports) {\n return\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n await loadWasmExec()\n const go = new Go()\n const url = wasmUrl ?? new URL('../wasm/psrt.wasm', import.meta.url).href\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`failed to fetch WASM: ${response.status}`)\n }\n const bytes = await response.arrayBuffer()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('psrtWasm exports not found after WASM init')\n }\n wasmExports = exp\n}\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout waiting for psrtWasm exports'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function loadWasmExec(): Promise<void> {\n if (typeof (globalThis as { Go?: unknown }).Go !== 'undefined') {\n return\n }\n const scriptUrl = new URL('../wasm/wasm_exec.js', import.meta.url).href\n await import(/* @vite-ignore */ scriptUrl)\n}\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport type { CompileOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string. */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/wasm.ts","../src/runtime/boot.node.ts","../src/runtime/boot.node-entry.ts","../src/init.ts","../src/parse.ts","../src/html/text/expandConsts.ts","../src/html/assets/dimensions.ts","../src/html/assets/refs.ts","../src/html/text/inlineMarkup.ts","../src/html/resolve/resolveDocumentPure.ts","../src/html/document/pageBlocks.ts","../src/html/style/keys.ts","../src/html/style/values.ts","../src/html/style/names.ts","../src/html/style/percent.ts","../src/html/geometry/layoutHelpers.ts","../src/html/geometry/textBlockGeometry.ts","../src/html/style/fragment.ts","../src/html/style/effects.ts","../src/html/style/blur.ts","../src/html/style/stroke.ts","../src/html/style/context.ts","../src/html/style/adapter.ts","../src/html/style/maskAdapter.ts","../src/html/style/render.ts","../src/html/steps.ts","../src/html/variants.ts","../src/html/render/script.ts","../src/html/render/html.ts","../src/html/compilePure.ts","../src/compile.ts","../src/editor/consts.ts","../src/editor/fonts.ts","../src/editor/pages.ts","../src/editor/text.ts","../src/editor/mask.ts","../src/transformer.ts","../src/gui.ts","../src/editor/style.ts","../src/editor/lookup.ts","../src/resolve.ts"],"sourcesContent":["import type { CompileOptions, PsrtDocument, PsrtStyle, WasmResult } from './types.js'\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\nlet wasmExports: Record<string, (...args: unknown[]) => WasmResult> | null = null\n\nfunction decodeData(data: Uint8Array): string {\n return decoder.decode(data)\n}\n\nfunction encodeDoc(doc: PsrtDocument): Uint8Array {\n return encoder.encode(JSON.stringify(doc))\n}\n\nfunction encodeInput(input: PsrtDocument | string): Uint8Array | string {\n return typeof input === 'string' ? input : encodeDoc(input)\n}\n\nfunction encodeArg(arg: unknown): unknown {\n if (arg === undefined) {\n return undefined\n }\n if (arg instanceof Uint8Array) {\n return arg\n }\n if (typeof arg === 'object' && arg !== null) {\n return encoder.encode(JSON.stringify(arg))\n }\n return arg\n}\n\nfunction call(name: string, ...args: unknown[]): WasmResult {\n if (!wasmExports) {\n throw new Error('PSRT is not initialized; call initPsrt() first')\n }\n const fn = wasmExports[name]\n if (!fn) {\n throw new Error(`unknown PSRT handler: ${name}`)\n }\n const encoded = args.map(encodeArg)\n return fn(...encoded) as WasmResult\n}\n\nfunction requireBytes(result: WasmResult): Uint8Array {\n if (!result.ok) {\n throw new Error(result.err ?? 'PSRT call failed')\n }\n if (!result.data) {\n throw new Error('PSRT call returned no data')\n }\n return result.data\n}\n\nfunction parseDocResult(result: WasmResult): PsrtDocument {\n return JSON.parse(decodeData(requireBytes(result))) as PsrtDocument\n}\n\nfunction parseTextResult(result: WasmResult): string {\n return decodeData(requireBytes(result))\n}\n\nfunction parseJSONResult<T>(result: WasmResult): T {\n return JSON.parse(decodeData(requireBytes(result))) as T\n}\n\nexport function invokeDocMutation(\n handler: string,\n doc: PsrtDocument,\n ...extra: unknown[]\n): PsrtDocument {\n return parseDocResult(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeDocQuery<T>(handler: string, doc: PsrtDocument, ...extra: unknown[]): T {\n return parseJSONResult<T>(call(handler, encodeDoc(doc), ...extra))\n}\n\nexport function invokeRaw<T>(handler: string, ...args: unknown[]): T {\n return parseJSONResult<T>(call(handler, ...args))\n}\n\nexport function invokeText(handler: string, ...args: unknown[]): string {\n return parseTextResult(call(handler, ...args))\n}\n\nexport function invokeStyleMutation(handler: string, style: PsrtStyle, ...extra: unknown[]): PsrtStyle {\n return parseJSONResult<PsrtStyle>(call(handler, style, ...extra))\n}\n\nexport function invokeParse(psrtString: string): PsrtDocument {\n return parseDocResult(call('parse', psrtString))\n}\n\nexport function invokeStringify(doc: PsrtDocument): string {\n return parseTextResult(call('stringify', encodeDoc(doc)))\n}\n\nexport function invokeFormatDocument(doc: PsrtDocument): string {\n return parseTextResult(call('formatDocument', encodeDoc(doc)))\n}\n\nexport function invokeCompileToHtml(\n input: PsrtDocument | string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToHtml', encodeInput(input), options ?? {}))\n}\n\nexport function invokeCompileToSvg(\n input: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return parseTextResult(call('compileToSvg', encodeInput(input), pageName, options ?? {}))\n}\n\nexport function wireWasmFromGlobal(): void {\n const exp = (globalThis as { psrtWasm?: Record<string, (...args: unknown[]) => WasmResult> })\n .psrtWasm\n if (!exp) {\n throw new Error('PSRT core exports not found')\n }\n wasmExports = exp\n}\n\n/** @internal */\nexport function setWasmExports(\n exports: Record<string, (...args: unknown[]) => WasmResult>,\n): void {\n wasmExports = exports\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nfunction wasmDir(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (;;) {\n const candidate = join(dir, 'wasm', 'psrt.wasm')\n if (existsSync(candidate)) {\n return join(dir, 'wasm')\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n throw new Error('PSRT core binary not found')\n}\n\nexport async function loadGoRuntimeNode(): Promise<void> {\n if (typeof globalThis.Go !== 'undefined') {\n return\n }\n const scriptPath = join(wasmDir(), 'wasm_exec.js')\n await import(pathToFileURL(scriptPath).href)\n}\n\nexport async function loadCoreBytesNode(): Promise<ArrayBuffer> {\n const bytes = readFileSync(join(wasmDir(), 'psrt.wasm'))\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n}\n","import { setWasmExports, wireWasmFromGlobal } from '../wasm.js'\nimport { loadCoreBytesNode, loadGoRuntimeNode } from './boot.node.js'\n\ndeclare class Go {\n importObject: WebAssembly.Imports\n run(instance: WebAssembly.Instance): Promise<void>\n}\n\nlet bootPromise: Promise<void> | null = null\n\nfunction waitForExports(): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0\n const tick = (): void => {\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n resolve()\n return\n }\n attempts++\n if (attempts > 200) {\n reject(new Error('timeout loading PSRT core'))\n return\n }\n setTimeout(tick, 10)\n }\n tick()\n })\n}\n\nasync function startCore(bytes: ArrayBuffer): Promise<void> {\n await loadGoRuntimeNode()\n const go = new Go()\n const { instance } = await WebAssembly.instantiate(bytes, go.importObject)\n void go.run(instance)\n await waitForExports()\n wireWasmFromGlobal()\n}\n\n/** Loads the PSRT core once (Node). */\nexport async function bootCore(): Promise<void> {\n if (bootPromise) {\n return bootPromise\n }\n if ((globalThis as { psrtWasm?: unknown }).psrtWasm) {\n wireWasmFromGlobal()\n return\n }\n bootPromise = (async () => {\n const bytes = await loadCoreBytesNode()\n await startCore(bytes)\n })()\n return bootPromise\n}\n\n/** @internal Test hook — inject pre-started core exports. */\nexport function attachCoreExports(\n exports: Record<string, (...args: unknown[]) => unknown>,\n): void {\n setWasmExports(exports as Record<string, (...args: unknown[]) => import('../types.js').WasmResult>)\n}\n","import { bootCore } from './runtime/boot.node-entry.js'\n\n/** Initializes PSRT. Call once at app startup before any other SDK API. */\nexport async function initPsrt(): Promise<void> {\n await bootCore()\n}\n","import { invokeFormatDocument, invokeParse, invokeStringify } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Converts a .psrt string into a typed PsrtDocument. */\nexport function parse(psrtString: string): PsrtDocument {\n return invokeParse(psrtString)\n}\n\n/** Converts a PsrtDocument back to normative .psrt text. */\nexport function stringify(doc: PsrtDocument): string {\n return invokeStringify(doc)\n}\n\n/** Formats a document with editor cleanup rules. */\nexport function formatDocument(doc: PsrtDocument): string {\n return invokeFormatDocument(doc)\n}\n","/** Mirrors psrt.ExpandConsts — longer keys first to avoid prefix clashes. */\nexport function expandConsts(\n content: string,\n consts: Record<string, string> | undefined,\n): string {\n if (!consts || !content) return content\n const keys = Object.keys(consts).sort((a, b) => {\n if (b.length !== a.length) return b.length - a.length\n return a.localeCompare(b)\n })\n let out = content\n for (const k of keys) {\n out = out.split(`@${k}@`).join(consts[k])\n }\n return out\n}\n\nexport function compactJsonString(s: string): string {\n const trimmed = s.trim()\n if (!trimmed) return trimmed\n try {\n return JSON.stringify(JSON.parse(trimmed))\n } catch {\n return trimmed.replace(/\\n/g, '').replace(/\\r/g, '')\n }\n}\n\nexport function expandConstsInStyle(\n style: Record<string, unknown> | string,\n consts: Record<string, string> | undefined,\n): Record<string, unknown> | string {\n const raw = typeof style === 'string' ? style.trim() : JSON.stringify(style ?? {})\n if (!raw || raw === '{}') return style\n const compact = compactJsonString(raw)\n const expanded = expandConsts(compact, consts)\n try {\n JSON.parse(expanded)\n return expanded\n } catch {\n return style\n }\n}\n","export interface Asset {\n bytes: Uint8Array\n mime: string\n}\n\nexport type AssetMap = Map<string, Asset>\n\nexport const DEFAULT_WIDTH = 1080\nexport const DEFAULT_HEIGHT = 1920\n\nfunction dimensionsFromStandard(body: Uint8Array): { w: number; h: number } | null {\n if (body.length < 24) return null\n // PNG\n if (\n body[0] === 0x89 &&\n body[1] === 0x50 &&\n body[2] === 0x4e &&\n body[3] === 0x47\n ) {\n const w = (body[16] << 24) | (body[17] << 16) | (body[18] << 8) | body[19]\n const h = (body[20] << 24) | (body[21] << 16) | (body[22] << 8) | body[23]\n if (w > 0 && h > 0) return { w, h }\n }\n // JPEG SOF markers\n if (body[0] === 0xff && body[1] === 0xd8) {\n let i = 2\n while (i + 9 < body.length) {\n if (body[i] !== 0xff) {\n i++\n continue\n }\n const marker = body[i + 1]\n const len = (body[i + 2] << 8) | body[i + 3]\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n const h = (body[i + 5] << 8) | body[i + 6]\n const w = (body[i + 7] << 8) | body[i + 8]\n if (w > 0 && h > 0) return { w, h }\n return null\n }\n i += 2 + len\n }\n }\n // GIF\n if (body[0] === 0x47 && body[1] === 0x49 && body[2] === 0x46) {\n const w = body[6] | (body[7] << 8)\n const h = body[8] | (body[9] << 8)\n if (w > 0 && h > 0) return { w, h }\n }\n return null\n}\n\nfunction isWebP(body: Uint8Array): boolean {\n return (\n body.length >= 12 &&\n body[0] === 0x52 &&\n body[1] === 0x49 &&\n body[2] === 0x46 &&\n body[3] === 0x46 &&\n body[8] === 0x57 &&\n body[9] === 0x45 &&\n body[10] === 0x42 &&\n body[11] === 0x50\n )\n}\n\nfunction webpDimensions(body: Uint8Array): { w: number; h: number } | null {\n if (!isWebP(body)) return null\n let off = 12\n while (off + 8 <= body.length) {\n const chunk = String.fromCharCode(body[off], body[off + 1], body[off + 2], body[off + 3])\n const size = body[off + 4] | (body[off + 5] << 8) | (body[off + 6] << 16) | (body[off + 7] << 24)\n const dataStart = off + 8\n const dataEnd = dataStart + size\n if (size < 0 || dataEnd > body.length) break\n if (chunk === 'VP8X' && size >= 10) {\n const w = body[dataStart + 4] | (body[dataStart + 5] << 8) | (body[dataStart + 6] << 16)\n const h = body[dataStart + 7] | (body[dataStart + 8] << 8) | (body[dataStart + 9] << 16)\n if (w > 0 && h > 0) return { w: w + 1, h: h + 1 }\n }\n if (chunk === 'VP8L' && size >= 5) {\n const b0 = body[dataStart]\n const b1 = body[dataStart + 1]\n const b2 = body[dataStart + 2]\n const b3 = body[dataStart + 3]\n const w = 1 + b0 + (b1 & 0x3f) * 256\n const h = 1 + (b1 >> 6) + (b2 & 0x0f) * 4 + (b3 & 0xfc) * 2\n if (w > 0 && h > 0) return { w, h }\n }\n off = dataEnd + (size & 1)\n }\n return null\n}\n\nfunction isAVIF(body: Uint8Array): boolean {\n if (body.length < 12) return false\n if (String.fromCharCode(body[4], body[5], body[6], body[7]) !== 'ftyp') return false\n const brand = String.fromCharCode(body[8], body[9], body[10], body[11])\n return brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'MA1A'\n}\n\nfunction avifDimensions(body: Uint8Array): { w: number; h: number } | null {\n let found: { w: number; h: number } | null = null\n const walk = (buf: Uint8Array): boolean => {\n for (let off = 0; off + 8 <= buf.length; ) {\n let size = (buf[off] << 24) | (buf[off + 1] << 16) | (buf[off + 2] << 8) | buf[off + 3]\n const boxType = String.fromCharCode(buf[off + 4], buf[off + 5], buf[off + 6], buf[off + 7])\n let header = 8\n if (size === 1 && off + 16 <= buf.length) {\n size = Number(\n (BigInt(buf[off + 8]) << 56n) |\n (BigInt(buf[off + 9]) << 48n) |\n (BigInt(buf[off + 10]) << 40n) |\n (BigInt(buf[off + 11]) << 32n) |\n (BigInt(buf[off + 12]) << 24n) |\n (BigInt(buf[off + 13]) << 16n) |\n (BigInt(buf[off + 14]) << 8n) |\n BigInt(buf[off + 15]),\n )\n header = 16\n }\n if (size < header || off + size > buf.length) break\n const payloadStart = off + header\n const payloadEnd = off + size\n const payload = buf.slice(payloadStart, payloadEnd)\n if (boxType === 'ispe' && payload.length >= 12) {\n const w = (payload[4] << 24) | (payload[5] << 16) | (payload[6] << 8) | payload[7]\n const h = (payload[8] << 24) | (payload[9] << 16) | (payload[10] << 8) | payload[11]\n if (w > 0 && h > 0) {\n found = { w, h }\n return false\n }\n }\n const containers = ['meta', 'iprp', 'moov', 'trak', 'mdia', 'minf', 'stbl', 'stsd', 'ipco']\n if (containers.includes(boxType)) {\n let child = payload\n if (payload.length >= 4) child = payload.slice(4)\n if (!walk(child)) return false\n }\n off += size\n }\n return true\n }\n walk(body)\n return found\n}\n\n/** Returns width and height from image bytes, or defaults on failure. */\nexport function imageDimensions(body: Uint8Array | null, mime: string): { w: number; h: number } {\n if (!body || body.length === 0) return { w: DEFAULT_WIDTH, h: DEFAULT_HEIGHT }\n const std = dimensionsFromStandard(body)\n if (std) return std\n const m = mime.trim().toLowerCase()\n if (m === 'image/webp' || isWebP(body)) {\n const d = webpDimensions(body)\n if (d) return d\n }\n if (m === 'image/avif' || isAVIF(body)) {\n const d = avifDimensions(body)\n if (d) return d\n }\n return { w: DEFAULT_WIDTH, h: DEFAULT_HEIGHT }\n}\n\nexport function decodeDataUri(uri: string): Asset | null {\n const match = /^data:([^;,]+)?(?:;base64)?,(.*)$/s.exec(uri)\n if (!match) return null\n const mime = match[1] || 'application/octet-stream'\n const data = match[2]\n if (/;base64/i.test(uri.slice(0, uri.indexOf(',') + 1))) {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return { mime, bytes }\n }\n const decoded = decodeURIComponent(data)\n const bytes = new TextEncoder().encode(decoded)\n return { mime, bytes }\n}\n\nexport function encodeDataUri(mime: string, bytes: Uint8Array): string {\n let binary = ''\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i])\n return `data:${mime};base64,${btoa(binary)}`\n}\n","import { expandConsts } from '../text/expandConsts.js'\nimport type { PsrtDocument } from '../../types.js'\nimport { decodeDataUri, encodeDataUri, type Asset, type AssetMap } from './dimensions.js'\n\nexport function looksLikeHttpUrl(raw: string): boolean {\n const u = raw.trim().toLowerCase()\n return u.startsWith('http://') || u.startsWith('https://')\n}\n\nexport function isDataUri(raw: string): boolean {\n return raw.startsWith('data:')\n}\n\nfunction hasWindowsDrive(s: string): boolean {\n if (s.length < 2 || s[1] !== ':') return false\n const c = s[0]\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')\n}\n\nexport function isLocalAssetRef(raw: string): boolean {\n const trimmed = raw.trim()\n if (!trimmed) return false\n if (looksLikeHttpUrl(trimmed)) return false\n const lower = trimmed.toLowerCase()\n if (lower.startsWith('file:')) return true\n return trimmed.includes('\\\\') || trimmed.includes('/') || hasWindowsDrive(trimmed)\n}\n\nexport function isAssetReference(raw: string): boolean {\n return looksLikeHttpUrl(raw) || isLocalAssetRef(raw) || isDataUri(raw)\n}\n\nexport function resolveAssetReference(raw: string, consts: Record<string, string>): string {\n return expandConsts(raw.trim(), consts)\n}\n\nexport function collectAssetUrls(doc: PsrtDocument): string[] {\n const consts = doc.consts ?? {}\n const seen = new Set<string>()\n const out: string[] = []\n const add = (raw: string | undefined) => {\n const u = resolveAssetReference(raw ?? '', consts)\n if (!u || !isAssetReference(u) || seen.has(u)) return\n seen.add(u)\n out.push(u)\n }\n for (const page of doc.pages ?? []) {\n add(page.imageUrl)\n for (const t of page.texts ?? []) add(t.imageRef)\n for (const m of page.masks ?? []) add(m.imageRef)\n }\n for (const f of doc.fonts ?? []) add(f)\n return out\n}\n\nexport function assetRef(resolvedUrl: string, asset: Asset | undefined, linksOnly: boolean): string {\n if (linksOnly) return resolvedUrl\n if (!asset) return resolvedUrl\n return encodeDataUri(asset.mime, asset.bytes)\n}\n\nexport function fontSrcUrl(fontUrl: string, asset: Asset | undefined, linksOnly: boolean): string {\n if (linksOnly) return `url(${fontUrl})`\n if (!asset) return `url(${fontUrl})`\n return `url(${encodeDataUri(asset.mime, asset.bytes)})`\n}\n\nexport function buildAssetMap(docs: PsrtDocument | PsrtDocument[], linksOnly: boolean): AssetMap {\n const list = Array.isArray(docs) ? docs : [docs]\n const map: AssetMap = new Map()\n if (linksOnly) return map\n for (const doc of list) {\n for (const url of collectAssetUrls(doc)) {\n if (isDataUri(url)) {\n const asset = decodeDataUri(url)\n if (asset) map.set(url, asset)\n }\n }\n for (const font of doc.fonts ?? []) {\n const u = resolveAssetReference(font, doc.consts ?? {})\n if (isDataUri(u)) {\n const asset = decodeDataUri(u)\n if (asset) map.set(u, asset)\n }\n }\n }\n return map\n}\n\nexport function faceFormat(mime: string): string {\n switch (mime.trim().toLowerCase()) {\n case 'font/woff2':\n return \" format('woff2')\"\n case 'font/woff':\n return \" format('woff')\"\n case 'font/ttf':\n return \" format('truetype')\"\n case 'font/otf':\n return \" format('opentype')\"\n default:\n return ''\n }\n}\n\nexport function fontFamilyNameForURL(fontURL: string, index: number): string {\n try {\n const u = new URL(fontURL)\n const family = u.searchParams.get('family')\n if (family) {\n const name = family.split(':')[0]?.replace(/\\+/g, ' ')\n if (name) return name\n }\n } catch {\n /* not a URL */\n }\n return `CompiledFont_${index}`\n}\n","/** Mirrors psrt.RenderInlineHTML */\n\ntype InlineDelim = { open: string; close: string; tagOpen: string; tagClose: string }\n\nconst DELIMS: InlineDelim[] = [\n { open: '***', close: '***', tagOpen: '<strong><em>', tagClose: '</em></strong>' },\n { open: '**', close: '**', tagOpen: '<strong>', tagClose: '</strong>' },\n { open: '*', close: '*', tagOpen: '<em>', tagClose: '</em>' },\n { open: '_', close: '_', tagOpen: '<u>', tagClose: '</u>' },\n { open: '~', close: '~', tagOpen: '<s>', tagClose: '</s>' },\n]\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n\nfunction renderSegment(s: string): string {\n let out = ''\n let i = 0\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n out += escapeHtml(s[i + 1])\n i += 2\n continue\n }\n let matched = false\n for (const d of DELIMS) {\n if (!s.startsWith(d.open, i)) continue\n const innerStart = i + d.open.length\n const closeAt = s.indexOf(d.close, innerStart)\n if (closeAt <= innerStart) continue\n out += d.tagOpen + renderSegment(s.slice(innerStart, closeAt)) + d.tagClose\n i = closeAt + d.close.length\n matched = true\n break\n }\n if (matched) continue\n out += escapeHtml(s[i])\n i += 1\n }\n return out\n}\n\nfunction plainSegment(s: string): string {\n let out = ''\n let i = 0\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n out += s[i + 1]\n i += 2\n continue\n }\n let matched = false\n for (const d of DELIMS) {\n if (!s.startsWith(d.open, i)) continue\n const innerStart = i + d.open.length\n const closeAt = s.indexOf(d.close, innerStart)\n if (closeAt <= innerStart) continue\n out += plainSegment(s.slice(innerStart, closeAt))\n i = closeAt + d.close.length\n matched = true\n break\n }\n if (matched) continue\n out += s[i]\n i += 1\n }\n return out\n}\n\nexport function renderInlineHTML(content: string): string {\n if (!content) return ''\n return content.split('\\n').map((line) => renderSegment(line)).join('<br/>')\n}\n\nexport function plainTextForLayout(content: string): string {\n if (!content) return ''\n return content.split('\\n').map((line) => plainSegment(line)).join('\\n')\n}\n\nexport function normalizeTextContent(content: string): string {\n return content.replace(/^[\\t ]+/, '').replace(/[\\t \\r\\n]+$/, '')\n}\n","import type { PsrtDocument } from '../../types.js'\nimport { expandConsts, expandConstsInStyle } from '../text/expandConsts.js'\nimport { normalizeTextContent } from '../text/inlineMarkup.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocumentPure(doc: PsrtDocument): PsrtDocument {\n const consts = doc.consts\n if (!consts || Object.keys(consts).length === 0) return doc\n\n return {\n ...doc,\n pages: doc.pages.map((p) => ({\n ...p,\n style: expandConstsInStyle(p.style, consts),\n imageUrl: expandConsts(p.imageUrl.trim(), consts),\n texts: (p.texts ?? []).map((t) => ({\n ...t,\n style: expandConstsInStyle(t.style, consts),\n content: normalizeTextContent(expandConsts(t.content, consts)),\n imageRef: expandConsts((t.imageRef ?? '').trim(), consts),\n })),\n masks: (p.masks ?? []).map((m) => ({\n ...m,\n style: expandConstsInStyle(m.style, consts),\n imageRef: expandConsts((m.imageRef ?? '').trim(), consts),\n })),\n })),\n }\n}\n","import type { PsrtMask, PsrtPage, PsrtText } from '../../types.js'\n\nexport const BlockText = 'text' as const\nexport const BlockMask = 'mask' as const\n\nexport type BlockKind = typeof BlockText | typeof BlockMask\n\nexport interface PageBlockEntry {\n kind: BlockKind\n text?: PsrtText\n mask?: PsrtMask\n}\n\nexport function pageBlocksByIndex(page: PsrtPage): PageBlockEntry[] {\n const out: PageBlockEntry[] = []\n for (const t of page.texts ?? []) {\n out.push({ kind: BlockText, text: t })\n }\n for (const m of page.masks ?? []) {\n out.push({ kind: BlockMask, mask: m })\n }\n out.sort((a, b) => blockIndex(a) - blockIndex(b))\n return out\n}\n\nfunction blockIndex(e: PageBlockEntry): number {\n if (e.kind === BlockText && e.text) return e.text.index\n if (e.kind === BlockMask && e.mask) return e.mask.index\n return 0\n}\n","// Canonical property name constants (camelCase).\nexport const KeyPosition = 'position'\nexport const KeyLeft = 'left'\nexport const KeyTop = 'top'\nexport const KeyWidth = 'width'\nexport const KeyHeight = 'height'\nexport const KeyBoxSizing = 'boxSizing'\nexport const KeyPadding = 'padding'\nexport const KeyPaddingTop = 'paddingTop'\nexport const KeyPaddingRight = 'paddingRight'\nexport const KeyPaddingBottom = 'paddingBottom'\nexport const KeyPaddingLeft = 'paddingLeft'\n\nexport const KeyBorder = 'border'\nexport const KeyBorderTop = 'borderTop'\nexport const KeyBorderRight = 'borderRight'\nexport const KeyBorderBottom = 'borderBottom'\nexport const KeyBorderLeft = 'borderLeft'\nexport const KeyBorderWidth = 'borderWidth'\nexport const KeyBorderStyle = 'borderStyle'\nexport const KeyBorderColor = 'borderColor'\n\nexport const KeyBorderRadius = 'borderRadius'\nexport const KeyBorderTopLeftRadius = 'borderTopLeftRadius'\nexport const KeyBorderTopRightRadius = 'borderTopRightRadius'\nexport const KeyBorderBottomRightRadius = 'borderBottomRightRadius'\nexport const KeyBorderBottomLeftRadius = 'borderBottomLeftRadius'\n\nexport const KeyBoxShadow = 'boxShadow'\nexport const KeyTextShadow = 'textShadow'\nexport const KeyGlow = 'glow'\nexport const KeyBevel = 'bevel'\nexport const KeyBlur = 'blur'\nexport const KeyBlurLeft = 'blurLeft'\nexport const KeyBlurRight = 'blurRight'\nexport const KeyBlurTop = 'blurTop'\nexport const KeyBlurBottom = 'blurBottom'\n\nexport const KeyBackground = 'background'\nexport const KeyColor = 'color'\n\nexport const KeyTextAlign = 'textAlign'\nexport const KeyAlignItems = 'alignItems'\nexport const KeyTextDecoration = 'textDecoration'\nexport const KeyTextDecorationLine = 'textDecorationLine'\nexport const KeyLetterSpacing = 'letterSpacing'\nexport const KeyLineHeight = 'lineHeight'\nexport const KeyWordSpacing = 'wordSpacing'\nexport const KeyWhiteSpace = 'whiteSpace'\nexport const KeyTextTransform = 'textTransform'\nexport const KeyTextIndent = 'textIndent'\nexport const KeyTextOverflow = 'textOverflow'\nexport const KeyOpacity = 'opacity'\n\nexport const KeyStroke = 'stroke'\nexport const KeyStrokeWidth = 'strokeWidth'\nexport const KeyStrokeColor = 'strokeColor'\n\nexport const KeyTransform = 'transform'\nexport const KeyTransformOrigin = 'transformOrigin'\nexport const KeyTranslate = 'translate'\nexport const KeyRotate = 'rotate'\nexport const KeyScale = 'scale'\nexport const KeySkew = 'skew'\nexport const KeyMatrix = 'matrix'\n\nexport const KeyFontFamily = 'fontFamily'\nexport const KeyFontSize = 'fontSize'\nexport const KeyFontWeight = 'fontWeight'\nexport const KeyFontStyle = 'fontStyle'\nexport const KeyFontVariant = 'fontVariant'\nexport const KeyFontStretch = 'fontStretch'\n\nconst boxKeys = new Set<string>([\n KeyHeight,\n KeyBackground,\n KeyPadding,\n KeyPaddingTop,\n KeyPaddingRight,\n KeyPaddingBottom,\n KeyPaddingLeft,\n KeyBorder,\n KeyBorderTop,\n KeyBorderRight,\n KeyBorderBottom,\n KeyBorderLeft,\n KeyBorderWidth,\n KeyBorderStyle,\n KeyBorderColor,\n KeyBorderRadius,\n KeyBorderTopLeftRadius,\n KeyBorderTopRightRadius,\n KeyBorderBottomRightRadius,\n KeyBorderBottomLeftRadius,\n KeyBoxShadow,\n KeyGlow,\n KeyBevel,\n KeyBlur,\n KeyBlurLeft,\n KeyBlurRight,\n KeyBlurTop,\n KeyBlurBottom,\n])\n\nconst textKeys = new Set<string>([\n KeyColor,\n KeyTextAlign,\n KeyAlignItems,\n KeyTextDecoration,\n KeyTextDecorationLine,\n KeyLetterSpacing,\n KeyLineHeight,\n KeyWordSpacing,\n KeyWhiteSpace,\n KeyTextTransform,\n KeyTextIndent,\n KeyTextOverflow,\n KeyOpacity,\n KeyTextShadow,\n KeyStroke,\n KeyStrokeWidth,\n KeyStrokeColor,\n KeyFontFamily,\n KeyFontSize,\n KeyFontWeight,\n KeyFontStyle,\n KeyFontVariant,\n KeyFontStretch,\n])\n\nconst transformKeys = new Set<string>([\n KeyTransform,\n KeyTransformOrigin,\n KeyTranslate,\n KeyRotate,\n KeyScale,\n KeySkew,\n KeyMatrix,\n])\n\nexport function isBoxKey(key: string): boolean {\n return boxKeys.has(key)\n}\n\nexport function isTextKey(key: string): boolean {\n return textKeys.has(key)\n}\n\nexport function isTransformKey(key: string): boolean {\n return transformKeys.has(key)\n}\n","import {\n KeyBlur,\n KeyBlurBottom,\n KeyBlurLeft,\n KeyBlurRight,\n KeyBlurTop,\n KeyBorderBottomLeftRadius,\n KeyBorderBottomRightRadius,\n KeyBorderRadius,\n KeyBorderTopLeftRadius,\n KeyBorderTopRightRadius,\n KeyBorderWidth,\n KeyHeight,\n KeyLetterSpacing,\n KeyLineHeight,\n KeyPadding,\n KeyPaddingBottom,\n KeyPaddingLeft,\n KeyPaddingRight,\n KeyPaddingTop,\n KeyStrokeWidth,\n KeyTextIndent,\n KeyWidth,\n KeyWordSpacing,\n} from './keys.js'\n\nexport function stringifyCSSValue(raw: unknown): string {\n if (raw === null || raw === undefined) return ''\n if (typeof raw === 'string') return raw.trim()\n if (typeof raw === 'number') return formatJSONNumber(raw)\n if (typeof raw === 'boolean') return raw ? '1' : '0'\n return JSON.stringify(raw).trim()\n}\n\nfunction formatJSONNumber(value: number): string {\n if (Math.abs(value - Math.trunc(value)) < 1e-9 && Math.abs(value) < 1e12) {\n return String(Math.trunc(value))\n }\n return value.toString()\n}\n\nexport function sanitizeCSSValue(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n return trimmed.replaceAll(';', '')\n}\n\nexport function hasStyleValue(key: string, raw: unknown): boolean {\n if (raw === null || raw === undefined) return false\n if (typeof raw === 'boolean') return raw\n\n const value = sanitizeCSSValue(stringifyCSSValue(raw))\n if (!value) return false\n if (omitZeroForKey(key) && isZeroLikeCSSValue(value)) return false\n return true\n}\n\nfunction omitZeroForKey(key: string): boolean {\n switch (key) {\n case KeyHeight:\n case KeyWidth:\n case KeyPadding:\n case KeyPaddingTop:\n case KeyPaddingRight:\n case KeyPaddingBottom:\n case KeyPaddingLeft:\n case KeyBorderWidth:\n case KeyStrokeWidth:\n case KeyBorderRadius:\n case KeyBorderTopLeftRadius:\n case KeyBorderTopRightRadius:\n case KeyBorderBottomRightRadius:\n case KeyBorderBottomLeftRadius:\n case KeyLetterSpacing:\n case KeyWordSpacing:\n case KeyLineHeight:\n case KeyTextIndent:\n case KeyBlur:\n case KeyBlurLeft:\n case KeyBlurRight:\n case KeyBlurTop:\n case KeyBlurBottom:\n return true\n default:\n return false\n }\n}\n\nfunction isZeroLikeCSSValue(value: string): boolean {\n const v = value.trim().toLowerCase()\n switch (v) {\n case '0':\n case '0%':\n case '0px':\n case '0em':\n case '0rem':\n case '0pt':\n case '0cqh':\n case '0ch':\n case '0vw':\n case '0vh':\n case '0vmin':\n case '0vmax':\n return true\n }\n\n const units = ['px', '%', 'em', 'rem', 'pt', 'cqh', 'ch']\n for (const unit of units) {\n if (!v.endsWith(unit)) continue\n const n = Number.parseFloat(v.slice(0, -unit.length))\n if (Number.isFinite(n) && n === 0) return true\n }\n\n const n = Number.parseFloat(v)\n return Number.isFinite(n) && n === 0\n}\n\nexport function filterStyleMap(style: Record<string, unknown>): Record<string, unknown> {\n if (Object.keys(style).length === 0) return style\n const out: Record<string, unknown> = {}\n for (const [key, raw] of Object.entries(style)) {\n if (hasStyleValue(key, raw)) {\n out[key] = raw\n }\n }\n return out\n}\n\nexport function pctString(value: number): string {\n return `${value}%`\n}\n\nexport function pxString(value: number): string {\n return `${value}px`\n}\n","import type { PsrtStyle } from '../../types.js'\nimport {\n KeyAlignItems,\n KeyBackground,\n KeyBevel,\n KeyBlur,\n KeyBlurBottom,\n KeyBlurLeft,\n KeyBlurRight,\n KeyBlurTop,\n KeyBorderColor,\n KeyBorderRadius,\n KeyBorderStyle,\n KeyBorderWidth,\n KeyBoxShadow,\n KeyColor,\n KeyFontFamily,\n KeyFontStyle,\n KeyFontWeight,\n KeyGlow,\n KeyHeight,\n KeyLeft,\n KeyLetterSpacing,\n KeyLineHeight,\n KeyMatrix,\n KeyPadding,\n KeyRotate,\n KeyScale,\n KeySkew,\n KeyStroke,\n KeyStrokeColor,\n KeyStrokeWidth,\n KeyTextAlign,\n KeyTextDecoration,\n KeyTextShadow,\n KeyTop,\n KeyTransform,\n KeyTransformOrigin,\n KeyTranslate,\n KeyWidth,\n isBoxKey,\n isTextKey,\n isTransformKey,\n} from './keys.js'\nimport { filterStyleMap } from './values.js'\n\nconst aliasToCanonical: Record<string, string> = {\n 'border-radius': KeyBorderRadius,\n 'border-width': KeyBorderWidth,\n 'border-style': KeyBorderStyle,\n 'border-color': KeyBorderColor,\n 'box-shadow': KeyBoxShadow,\n 'text-shadow': KeyTextShadow,\n 'text-align': KeyTextAlign,\n 'align-items': KeyAlignItems,\n 'vertical-align': KeyAlignItems,\n 'font-family': KeyFontFamily,\n 'font-weight': KeyFontWeight,\n 'font-style': KeyFontStyle,\n 'line-height': KeyLineHeight,\n 'letter-spacing': KeyLetterSpacing,\n 'text-decoration': KeyTextDecoration,\n 'background-color': KeyBackground,\n 'stroke-width': KeyStrokeWidth,\n 'stroke-color': KeyStrokeColor,\n 'text-stroke': KeyStroke,\n backGround: KeyBackground,\n backgroundColor: KeyBackground,\n br: KeyBorderRadius,\n bw: KeyBorderWidth,\n bc: KeyBorderColor,\n bs: KeyBorderStyle,\n bg: KeyBackground,\n ta: KeyTextAlign,\n ts: KeyTextShadow,\n bsh: KeyBoxShadow,\n blur: KeyBlur,\n 'blur-left': KeyBlurLeft,\n 'blur-right': KeyBlurRight,\n 'blur-top': KeyBlurTop,\n 'blur-bottom': KeyBlurBottom,\n ff: KeyFontFamily,\n fw: KeyFontWeight,\n fs: KeyFontStyle,\n pd: KeyPadding,\n sw: KeyStrokeWidth,\n sc: KeyStrokeColor,\n textStroke: KeyStroke,\n textStrokeWidth: KeyStrokeWidth,\n textStrokeColor: KeyStrokeColor,\n}\n\nexport function registerAlias(alias: string, canonical: string): void {\n aliasToCanonical[alias.trim()] = canonical\n}\n\nexport function resolveName(raw: string): { canonical: string; ok: boolean } {\n const key = raw.trim()\n if (!key) return { canonical: '', ok: false }\n\n const mapped = aliasToCanonical[key]\n if (mapped) return { canonical: mapped, ok: true }\n\n if (key.includes('-')) {\n const camel = kebabToCamel(key)\n const mappedCamel = aliasToCanonical[camel]\n if (mappedCamel) return { canonical: mappedCamel, ok: true }\n const mappedRaw = aliasToCanonical[key]\n if (mappedRaw) return { canonical: mappedRaw, ok: true }\n return { canonical: camel, ok: isKnownCanonical(camel) }\n }\n\n const mappedAgain = aliasToCanonical[key]\n if (mappedAgain) return { canonical: mappedAgain, ok: true }\n return { canonical: key, ok: isKnownCanonical(key) }\n}\n\nfunction isKnownCanonical(name: string): boolean {\n return (\n isBoxKey(name) ||\n isTextKey(name) ||\n isTransformKey(name) ||\n name === KeyLeft ||\n name === KeyTop ||\n name === KeyWidth ||\n name === KeyHeight ||\n name === KeyGlow ||\n name === KeyBevel ||\n name === KeyBlur ||\n name === KeyBlurLeft ||\n name === KeyBlurRight ||\n name === KeyBlurTop ||\n name === KeyBlurBottom\n )\n}\n\nfunction kebabToCamel(value: string): string {\n const parts = value.split('-')\n if (parts.length === 0) return value\n let out = ''\n for (let i = 0; i < parts.length; i += 1) {\n const part = parts[i]?.trim()\n if (!part) continue\n if (i === 0) {\n out += part.toLowerCase()\n continue\n }\n out += part[0].toUpperCase() + part.slice(1).toLowerCase()\n }\n return out\n}\n\nexport function normalizeStyle(style: PsrtStyle): Record<string, unknown> {\n const rawObject = parseStyleObject(style)\n if (!rawObject) return {}\n\n const out: Record<string, unknown> = {}\n const applyKeys = (vendorOnly: boolean): void => {\n for (const [rawKey, value] of Object.entries(rawObject)) {\n const vendor = isVendorRawKey(rawKey)\n if (vendorOnly !== vendor) continue\n\n const canonical = canonicalKeyForRaw(rawKey)\n if (!canonical || isVendorKey(canonical)) continue\n if (vendorOnly && Object.prototype.hasOwnProperty.call(out, canonical)) continue\n\n out[canonical] = value\n }\n }\n\n applyKeys(false)\n applyKeys(true)\n mergeBackgroundKeys(out)\n return filterStyleMap(out)\n}\n\nfunction parseStyleObject(style: PsrtStyle): Record<string, unknown> | null {\n if (typeof style === 'string') {\n const trimmed = style.trim()\n if (!trimmed || trimmed === '{}') return null\n try {\n const parsed: unknown = JSON.parse(trimmed)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null\n return parsed as Record<string, unknown>\n } catch {\n return null\n }\n }\n\n if (!style || typeof style !== 'object' || Array.isArray(style)) return null\n if (Object.keys(style).length === 0) return null\n return style\n}\n\nfunction canonicalKeyForRaw(rawKey: string): string {\n for (const candidate of expandRawKey(rawKey)) {\n const resolved = resolveName(candidate)\n if (resolved.ok) return resolved.canonical\n if (!isVendorKey(candidate)) return candidate\n }\n return ''\n}\n\nfunction isVendorRawKey(key: string): boolean {\n if (isVendorKey(key)) return true\n return stripVendorPrefix(key).ok\n}\n\nfunction expandRawKey(rawKey: string): string[] {\n const key = rawKey.trim()\n const stripped = stripVendorPrefix(key)\n if (stripped.ok) return [stripped.value, key]\n return [key]\n}\n\nfunction stripVendorPrefix(key: string): { value: string; ok: boolean } {\n const trimmed = key.trim()\n const lower = trimmed.toLowerCase()\n for (const prefix of ['-webkit-', 'webkit-', 'webkit']) {\n if (!lower.startsWith(prefix)) continue\n const rest = trimmed.slice(prefix.length)\n if (!rest) return { value: '', ok: false }\n return { value: decapitalize(rest), ok: true }\n }\n if (trimmed.startsWith('Webkit')) {\n return { value: decapitalize(trimmed.slice(6)), ok: true }\n }\n if (trimmed.startsWith('webkit')) {\n return { value: decapitalize(trimmed.slice(6)), ok: true }\n }\n return { value: '', ok: false }\n}\n\nfunction decapitalize(value: string): string {\n if (!value) return value\n return value[0].toLowerCase() + value.slice(1)\n}\n\nfunction isVendorKey(key: string): boolean {\n return key.startsWith('Webkit') || key.startsWith('webkit') || key.toLowerCase().startsWith('-webkit-')\n}\n\nfunction mergeBackgroundKeys(style: Record<string, unknown>): void {\n if (Object.prototype.hasOwnProperty.call(style, KeyBackground)) {\n style[KeyBackground] = style[KeyBackground]\n delete style.backgroundColor\n }\n}\n\nexport { isKnownCanonical }\n","interface PercentHandler {\n keys(): string[]\n resolve(key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean }\n}\n\nexport type ImageDims = {\n w?: number\n h?: number\n W?: number\n H?: number\n fontSizePx?: number\n FontSizePx?: number\n zoom?: number\n Zoom?: number\n preservePercent?: boolean\n PreservePercent?: boolean\n}\n\ntype ResolvedImageDims = {\n w: number\n h: number\n fontSizePx: number\n zoom: number\n preservePercent: boolean\n}\n\nlet defaultHandlers: PercentHandler[] = []\n\nexport function registerPercentHandler(handler: PercentHandler): void {\n defaultHandlers.push(handler)\n}\n\nexport function applyPercentHandlers(style: Record<string, unknown>, dims: ImageDims): Record<string, unknown> {\n if (Object.keys(style).length === 0) return style\n\n const resolvedDims = resolveImageDims(dims)\n const keyHandler = new Map<string, PercentHandler>()\n for (const handler of defaultHandlers) {\n for (const key of handler.keys()) {\n keyHandler.set(key, handler)\n }\n }\n\n const out: Record<string, unknown> = {}\n for (const [key, raw] of Object.entries(style)) {\n const value = stringifyRaw(raw)\n if (resolvedDims.preservePercent && value.includes('%')) {\n out[key] = raw\n continue\n }\n\n const handler = keyHandler.get(key)\n if (handler && value) {\n const resolved = handler.resolve(key, value, resolvedDims)\n if (resolved.ok) {\n out[key] = resolved.resolved\n continue\n }\n }\n\n out[key] = raw\n }\n\n return out\n}\n\nfunction resolveImageDims(dims: ImageDims): ResolvedImageDims {\n const w = dims.W ?? dims.w ?? 0\n const h = dims.H ?? dims.h ?? 0\n const fontSizePx = dims.FontSizePx ?? dims.fontSizePx ?? 0\n const zoom = dims.Zoom ?? dims.zoom ?? 1\n const preservePercent = dims.PreservePercent ?? dims.preservePercent ?? false\n return { w, h, fontSizePx, zoom: zoom > 0 ? zoom : 1, preservePercent }\n}\n\nfunction stringifyRaw(raw: unknown): string {\n if (raw === null || raw === undefined) return ''\n if (typeof raw === 'string') return raw\n return String(raw)\n}\n\nclass DimensionHandler implements PercentHandler {\n keys(): string[] {\n return ['height', 'width']\n }\n\n resolve(key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n const base = key === 'width' ? dims.w : dims.h\n return singlePercentToken(value, base, dims)\n }\n}\n\nclass PaddingHandler implements PercentHandler {\n keys(): string[] {\n return ['padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft']\n }\n\n resolve(key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n const tokens = value.trim().split(/\\s+/).filter(Boolean)\n if (tokens.length === 0) return { resolved: value, ok: true }\n\n if (tokens.length === 1 || key !== 'padding') {\n const base = paddingAxisBase(key, tokens.length, 0, dims)\n if (tokens.length === 1) {\n return singlePercentToken(tokens[0], base, dims)\n }\n }\n\n const bases = shorthandBases(tokens.length)\n const out: string[] = []\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i] ?? ''\n const axis = bases[i] ?? 0\n const base = paddingAxisBase(key, tokens.length, axis, dims)\n const resolved = singlePercentToken(token, base, dims)\n out.push(resolved.resolved)\n }\n return { resolved: out.join(' '), ok: true }\n }\n}\n\nfunction shorthandBases(count: number): number[] {\n switch (count) {\n case 1:\n return [0, 0, 0, 0]\n case 2:\n return [0, 1, 0, 1]\n case 3:\n return [0, 1, 2, 1]\n default:\n return [0, 1, 2, 3]\n }\n}\n\nfunction paddingAxisBase(key: string, count: number, axis: number, dims: ResolvedImageDims): number {\n switch (key) {\n case 'paddingTop':\n case 'paddingBottom':\n return dims.h\n case 'paddingLeft':\n case 'paddingRight':\n return dims.w\n }\n if (count === 1) return max(dims.w, dims.h)\n switch (axis) {\n case 0:\n case 2:\n return dims.h\n case 1:\n case 3:\n return dims.w\n default:\n return dims.w\n }\n}\n\nclass BorderWidthHandler implements PercentHandler {\n keys(): string[] {\n return ['borderWidth', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n return singlePercentToken(value, dims.w, dims)\n }\n}\n\nclass LineHeightHandler implements PercentHandler {\n keys(): string[] {\n return ['lineHeight']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.trim().endsWith('%')) return { resolved: value, ok: true }\n return singlePercentToken(value, dims.h, dims)\n }\n}\n\nclass StrokeWidthHandler implements PercentHandler {\n keys(): string[] {\n return ['strokeWidth']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n const base = dims.fontSizePx > 0 ? dims.fontSizePx : 1\n return singlePercentToken(value, base, dims)\n }\n}\n\nclass BlurHandler implements PercentHandler {\n keys(): string[] {\n return ['blur', 'blurLeft', 'blurRight', 'blurTop', 'blurBottom']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n let base = dims.w\n if (dims.h > 0 && dims.h < dims.w) base = dims.h\n return singlePercentToken(value, base, dims)\n }\n}\n\nclass TextShadowHandler implements PercentHandler {\n keys(): string[] {\n return ['textShadow']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n return { resolved: resolveShadowList(value, dims), ok: true }\n }\n}\n\nclass BoxShadowHandler implements PercentHandler {\n keys(): string[] {\n return ['boxShadow']\n }\n\n resolve(_key: string, value: string, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n if (!value.includes('%')) return { resolved: value, ok: true }\n return { resolved: resolveShadowList(value, dims), ok: true }\n }\n}\n\nfunction resolveShadowList(value: string, dims: ResolvedImageDims): string {\n const parts = value.split(',')\n for (let i = 0; i < parts.length; i += 1) {\n const shadow = parts[i]?.trim() ?? ''\n parts[i] = resolveShadowOne(shadow, dims)\n }\n return parts.join(', ')\n}\n\nfunction resolveShadowOne(shadow: string, dims: ResolvedImageDims): string {\n if (!shadow) return shadow\n const tokens = shadow.split(/\\s+/).filter(Boolean)\n if (tokens.length === 0) return shadow\n\n const colorIndex = findColorTokenIndex(tokens)\n const numericEnd = colorIndex < 0 ? tokens.length : colorIndex\n for (let i = 0; i < numericEnd && i < 3; i += 1) {\n const token = tokens[i]\n if (token) tokens[i] = resolveShadowToken(token, i, dims)\n }\n return tokens.join(' ')\n}\n\nfunction findColorTokenIndex(tokens: string[]): number {\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i] ?? ''\n if (token.startsWith('#') || token.toLowerCase().startsWith('rgb')) return i\n }\n return -1\n}\n\nfunction resolveShadowToken(token: string, index: number, dims: ResolvedImageDims): string {\n if (!token.endsWith('%')) return token\n const pct = Number.parseFloat(token.slice(0, -1))\n if (!Number.isFinite(pct)) return token\n\n const z = dims.zoom > 0 ? dims.zoom : 1\n let base = 0\n switch (index) {\n case 0:\n base = dims.w * z\n break\n case 1:\n base = dims.h * z\n break\n case 2:\n base = max(dims.w, dims.h) * z\n break\n default:\n return token\n }\n return `${((pct / 100) * base).toFixed(3)}px`\n}\n\nfunction percentToPx(percentString: string, base: number, zoom: number): string {\n const pct = Number.parseFloat(percentString.trim().replace(/%$/, ''))\n if (!Number.isFinite(pct)) return percentString\n const z = zoom > 0 ? zoom : 1\n return `${((pct / 100) * base * z).toFixed(3)}px`\n}\n\nfunction singlePercentToken(value: string, base: number, dims: ResolvedImageDims): { resolved: string; ok: boolean } {\n const v = value.trim()\n if (!v.endsWith('%')) return { resolved: v, ok: true }\n return { resolved: percentToPx(v, base, dims.zoom), ok: true }\n}\n\nfunction max(a: number, b: number): number {\n return a > b ? a : b\n}\n\ndefaultHandlers = [\n new TextShadowHandler(),\n new BoxShadowHandler(),\n new BlurHandler(),\n new BorderWidthHandler(),\n new StrokeWidthHandler(),\n new LineHeightHandler(),\n new PaddingHandler(),\n new DimensionHandler(),\n]\n","import type { PsrtStyle } from '../../types.js'\nimport { normalizeStyle } from '../style/names.js'\nimport { applyPercentHandlers } from '../style/percent.js'\n\nexport function textSizeBasisPx(canvasW: number, canvasH: number): number {\n const w = canvasW\n const h = canvasH\n if (w <= 0 && h <= 0) return 1\n if (w <= 0) return h\n if (h <= 0) return w\n return w < h ? w : h\n}\n\nexport function textFontSizePx(textSizePct: number, canvasW: number, canvasH: number): number {\n const px = (textSizePct / 100) * textSizeBasisPx(canvasW, canvasH)\n return px < 1 ? 1 : px\n}\n\nexport function pctString(v: number): string {\n return `${v}%`\n}\n\nexport interface PaddingInsets {\n top: number\n right: number\n bottom: number\n left: number\n}\n\nexport function paddingHorizontal(p: PaddingInsets): number {\n return p.left + p.right\n}\n\nexport function paddingVertical(p: PaddingInsets): number {\n return p.top + p.bottom\n}\n\nfunction cssLengthToPx(s: string, refFontPx: number): number {\n s = s.trim().toLowerCase()\n if (!s) return 0\n if (s.endsWith('px')) {\n const v = parseFloat(s.slice(0, -2))\n return Number.isFinite(v) ? Math.max(0, v) : 0\n }\n if (s.endsWith('em')) {\n const v = parseFloat(s.slice(0, -2))\n return Number.isFinite(v) ? Math.max(0, v * refFontPx) : 0\n }\n if (s.endsWith('%')) return 0\n const v = parseFloat(s)\n return Number.isFinite(v) ? Math.max(0, v) : 0\n}\n\nfunction rawStringProp(m: Record<string, unknown>, ...keys: string[]): string {\n for (const k of keys) {\n const v = m[k]\n if (typeof v === 'string' && v.trim()) return v.trim()\n if (typeof v === 'number') return String(v)\n }\n return ''\n}\n\nfunction cssColorFromRaw(v: unknown): string {\n if (typeof v === 'string' && v.trim()) return v.trim().replace(/;/g, '')\n return ''\n}\n\nexport function backgroundColorFromStyle(style: PsrtStyle): string {\n const m = normalizeStyle(style)\n if (!m) return ''\n for (const key of ['backGround', 'background', 'backgroundColor']) {\n const c = cssColorFromRaw(m[key])\n if (c) return c\n }\n return ''\n}\n\nfunction parsePaddingCSS(css: string, refFontPx: number): PaddingInsets {\n css = css.trim()\n if (!css) return { top: 0, right: 0, bottom: 0, left: 0 }\n const parts = css.split(/\\s+/)\n const vals = parts.map((p) => cssLengthToPx(p, refFontPx))\n switch (vals.length) {\n case 1:\n return { top: vals[0], right: vals[0], bottom: vals[0], left: vals[0] }\n case 2:\n return { top: vals[0], right: vals[1], bottom: vals[0], left: vals[1] }\n case 3:\n return { top: vals[0], right: vals[1], bottom: vals[2], left: vals[1] }\n default:\n return { top: vals[0], right: vals[1], bottom: vals[2], left: vals[3] }\n }\n}\n\nexport function styleResolvedForCanvas(\n style: PsrtStyle,\n canvasW: number,\n canvasH: number,\n fontPx: number,\n): Record<string, unknown> {\n const m = normalizeStyle(style)\n if (!m) return {}\n return applyPercentHandlers(m, { w: canvasW, h: canvasH, fontSizePx: fontPx, zoom: 1 })\n}\n\nexport function textBoxInsetsForCanvas(\n style: PsrtStyle,\n refFontPx: number,\n canvasW: number,\n canvasH: number,\n): PaddingInsets {\n const m = styleResolvedForCanvas(style, canvasW, canvasH, refFontPx)\n const padding = parsePaddingCSS(rawStringProp(m, 'padding'), refFontPx)\n let borderW = rawStringProp(m, 'borderWidth')\n if (!borderW && typeof m.border === 'string') {\n borderW = m.border.split(/\\s+/)[0] ?? ''\n }\n const px = cssLengthToPx(borderW, refFontPx)\n const border =\n px > 0 ? { top: px, right: px, bottom: px, left: px } : { top: 0, right: 0, bottom: 0, left: 0 }\n return {\n top: padding.top + border.top,\n right: padding.right + border.right,\n bottom: padding.bottom + border.bottom,\n left: padding.left + border.left,\n }\n}\n\nexport function explicitHeightPx(\n style: PsrtStyle,\n canvasW: number,\n canvasH: number,\n fontPx: number,\n): { px: number; ok: boolean } {\n if (canvasH < 1) return { px: 0, ok: false }\n const m = styleResolvedForCanvas(style, canvasW, canvasH, fontPx)\n const val = rawStringProp(m, 'height')\n if (!val) return { px: 0, ok: false }\n if (val.endsWith('%')) {\n const pct = parseFloat(val.slice(0, -1))\n if (!Number.isFinite(pct) || pct <= 0) return { px: 0, ok: false }\n return { px: Math.round((canvasH * pct) / 100), ok: true }\n }\n if (val.endsWith('px')) {\n const px = parseFloat(val.slice(0, -2))\n if (!Number.isFinite(px) || px < 1) return { px: 0, ok: false }\n return { px: Math.round(px), ok: true }\n }\n if (val.endsWith('em') || val.endsWith('rem')) {\n const suffix = val.endsWith('rem') ? 'rem' : 'em'\n const n = parseFloat(val.slice(0, -suffix.length))\n if (!Number.isFinite(n) || n <= 0 || fontPx <= 0) return { px: 0, ok: false }\n return { px: Math.round(n * fontPx), ok: true }\n }\n const n = parseFloat(val)\n if (Number.isFinite(n) && n > 0) return { px: Math.round(n), ok: true }\n return { px: 0, ok: false }\n}\n\nexport function textLayerNeedsComputedHeight(\n style: PsrtStyle,\n canvasW: number,\n canvasH: number,\n textSize: number,\n): boolean {\n const fontPx = textFontSizePx(textSize, canvasW, canvasH)\n if (explicitHeightPx(style, canvasW, canvasH, fontPx).ok) return true\n return paddingVertical(textBoxInsetsForCanvas(style, fontPx, canvasW, canvasH)) > 0\n}\n\nexport function fontWeightIsBold(style: PsrtStyle): boolean {\n const m = normalizeStyle(style)\n if (!m) return false\n const w = rawStringProp(m, 'fontWeight', 'font-weight').toLowerCase()\n if (['bold', 'bolder', '600', '700', '800', '900'].includes(w)) return true\n const n = parseInt(w, 10)\n return Number.isFinite(n) && n >= 600\n}\n\nexport function lineHeightMultiplier(style: PsrtStyle, fontSizePx: number): number {\n const def = 1.2\n const m = normalizeStyle(style)\n if (!m) return def\n const raw = m.lineHeight\n if (typeof raw === 'number' && raw > 0) return raw\n const val = typeof raw === 'string' ? raw.trim() : ''\n if (!val) return def\n if (val.endsWith('%')) {\n const pct = parseFloat(val.slice(0, -1))\n if (Number.isFinite(pct) && pct > 0) return pct / 100\n return def\n }\n if (val.endsWith('px')) {\n const px = parseFloat(val.slice(0, -2))\n if (Number.isFinite(px) && px > 0 && fontSizePx > 0) return px / fontSizePx\n return def\n }\n const v = parseFloat(val)\n return Number.isFinite(v) && v > 0 ? v : def\n}\n","import type { PsrtText } from '../../types.js'\nimport { plainTextForLayout } from '../text/inlineMarkup.js'\nimport {\n explicitHeightPx,\n fontWeightIsBold,\n lineHeightMultiplier,\n paddingHorizontal,\n paddingVertical,\n textBoxInsetsForCanvas,\n textFontSizePx,\n textLayerNeedsComputedHeight,\n} from './layoutHelpers.js'\n\nfunction textBlockWidthPx(widthPct: number, canvasW: number): number {\n const w = Math.round((canvasW * widthPct) / 100)\n return w < 1 ? 1 : w\n}\n\nfunction charsPerLineForWidth(widthPx: number, fontSizePx: number, bold: boolean): number {\n const em = bold ? 0.58 : 0.48\n const cpl = Math.floor(widthPx / (fontSizePx * em))\n return cpl < 1 ? 1 : cpl\n}\n\nfunction estimateTextLines(content: string, widthPx: number, fontSizePx: number, bold: boolean): number {\n if (widthPx < 1) widthPx = 1\n const charsPerLine = charsPerLineForWidth(widthPx, fontSizePx, bold)\n const parts = content.split('\\n')\n let total = 0\n for (const part of parts) {\n const n = [...part.trim()].length\n if (n === 0) continue\n total += Math.ceil(n / charsPerLine)\n }\n return total < 1 ? 1 : total\n}\n\nexport function textBlockGeometry(\n t: PsrtText,\n content: string,\n canvasW: number,\n canvasH: number,\n): { x: number; y: number; width: number; height: number } {\n const x = Math.round((canvasW * t.x) / 100)\n const y = Math.round((canvasH * t.y) / 100)\n const outerW = textBlockWidthPx(t.width, canvasW)\n const fontPx = textFontSizePx(t.textSize, canvasW, canvasH)\n const insets = textBoxInsetsForCanvas(t.style, fontPx, canvasW, canvasH)\n const padW = Math.round(paddingHorizontal(insets))\n const padH = Math.round(paddingVertical(insets))\n let contentW = outerW - padW\n if (contentW < 1) contentW = 1\n const plain = plainTextForLayout(content)\n const lines = estimateTextLines(plain, contentW, fontPx, fontWeightIsBold(t.style))\n const lh = lineHeightMultiplier(t.style, fontPx)\n const linePx = fontPx * lh\n let contentH = Math.round(linePx * lines)\n if (contentH < Math.round(linePx)) contentH = Math.round(linePx)\n let width = outerW\n let height = contentH + padH\n const explicit = explicitHeightPx(t.style, canvasW, canvasH, fontPx)\n if (explicit.ok) {\n if (content.trim() === '') height = explicit.px\n else if (explicit.px > height) height = explicit.px\n }\n if (width < 1) width = 1\n if (height < 1) height = 1\n return { x, y, width, height }\n}\n\nexport function appendTextLayerGeometryCSS(\n boxCSS: string,\n t: PsrtText,\n content: string,\n canvasW: number,\n canvasH: number,\n): string {\n if (canvasH < 1 || boxCSS.includes('height:')) return boxCSS\n if (!textLayerNeedsComputedHeight(t.style, canvasW, canvasH, t.textSize)) return boxCSS\n const { height: geomH } = textBlockGeometry(t, content, canvasW, canvasH)\n if (geomH < 1) return boxCSS\n const heightPct = (geomH / canvasH) * 100\n return `${boxCSS}height:${heightPct}%;`\n}\n","export const TypeKey = '__type__'\n\nexport const TypeMotionDiv = 'div'\nexport const TypeSpan = 'span'\nexport const TypeRect = 'rect'\nexport const TypeForeignObject = 'foreignObject'\nexport const TypeDiv = 'div'\nexport const TypeFilter = 'filter'\nexport const TypeMask = 'mask'\nexport const TypeG = 'g'\n\nexport type StyleFragment = Record<string, unknown> & { __type__: string }\n\nexport function newFragment(type: string): StyleFragment {\n return { [TypeKey]: type } as StyleFragment\n}\n\nexport function mergeFragments(fragments: StyleFragment[]): StyleFragment[] {\n const byType = new Map<string, StyleFragment>()\n const order: string[] = []\n\n for (const fragment of fragments) {\n if (!fragment) continue\n const type = getFragmentString(fragment, TypeKey)\n if (!type) continue\n\n const existing = byType.get(type)\n if (existing) {\n for (const [key, value] of Object.entries(fragment)) {\n if (key !== TypeKey) {\n existing[key] = value\n }\n }\n continue\n }\n\n const copy: StyleFragment = { [TypeKey]: type } as StyleFragment\n for (const [key, value] of Object.entries(fragment)) {\n copy[key] = value\n }\n byType.set(type, copy)\n order.push(type)\n }\n\n return order.map((type) => byType.get(type)).filter((v): v is StyleFragment => Boolean(v))\n}\n\nexport function setFragmentValue(fragment: StyleFragment | null | undefined, prop: string, value: unknown): void {\n if (!fragment) return\n fragment[prop] = value\n}\n\nexport function getFragmentString(fragment: StyleFragment | null | undefined, prop: string): string {\n if (!fragment) return ''\n const value = fragment[prop]\n return typeof value === 'string' ? value : ''\n}\n","import { applyPercentHandlers, type ImageDims } from './percent.js'\nimport {\n KeyBevel,\n KeyBoxShadow,\n KeyGlow,\n KeyTextShadow,\n} from './keys.js'\nimport { TypeFilter, type StyleFragment, newFragment, setFragmentValue } from './fragment.js'\nimport { hasStyleValue, stringifyCSSValue } from './values.js'\n\nexport function expandEffects(\n style: Record<string, unknown>,\n dims: ImageDims,\n targetSVG: boolean,\n filterID: string,\n): { style: Record<string, unknown>; fragments: StyleFragment[] } {\n if (Object.keys(style).length === 0) return { style, fragments: [] }\n\n const out = { ...style }\n const extra: StyleFragment[] = []\n\n if (Object.prototype.hasOwnProperty.call(out, KeyGlow)) {\n const raw = out[KeyGlow]\n const value = stringifyCSSValue(raw)\n delete out[KeyGlow]\n if (hasStyleValue(KeyGlow, raw)) {\n if (targetSVG) {\n extra.push(glowFilterFragment(filterID, value, dims))\n } else {\n mergeShadowKey(out, KeyTextShadow, value)\n }\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(out, KeyBevel)) {\n const raw = out[KeyBevel]\n const value = stringifyCSSValue(raw)\n delete out[KeyBevel]\n if (hasStyleValue(KeyBevel, raw)) {\n if (targetSVG) {\n extra.push(bevelFilterFragment(`${filterID}-bevel`, value))\n } else {\n mergeBoxShadowKey(out, bevelBoxShadows(value))\n }\n }\n }\n\n return { style: out, fragments: extra }\n}\n\nfunction mergeShadowKey(style: Record<string, unknown>, key: string, add: string): void {\n const existing = stringifyCSSValue(style[key])\n if (!existing) {\n style[key] = add\n return\n }\n style[key] = `${existing}, ${add}`\n}\n\nfunction mergeBoxShadowKey(style: Record<string, unknown>, add: string): void {\n const existing = stringifyCSSValue(style[KeyBoxShadow])\n if (!existing) {\n style[KeyBoxShadow] = add\n return\n }\n style[KeyBoxShadow] = `${existing}, ${add}`\n}\n\nfunction bevelBoxShadows(value: string): string {\n const light = 'inset 1px 1px 0 rgba(255,255,255,0.35)'\n let dark = 'inset -1px -1px 0 rgba(0,0,0,0.35)'\n if (value.trim()) {\n dark = `inset -1px -1px 2px ${value.trim()}`\n }\n return `${light}, ${dark}`\n}\n\nfunction glowFilterFragment(id: string, value: string, dims: ImageDims): StyleFragment {\n const parsed = parseSimpleShadow(value, dims)\n const fragment = newFragment(TypeFilter)\n setFragmentValue(fragment, 'id', id)\n setFragmentValue(fragment, 'feDropShadowDx', parsed.dx.toFixed(3))\n setFragmentValue(fragment, 'feDropShadowDy', parsed.dy.toFixed(3))\n setFragmentValue(fragment, 'feGaussianBlurStd', (parsed.blur / 2).toFixed(3))\n setFragmentValue(fragment, 'floodColor', parsed.color)\n return fragment\n}\n\nfunction bevelFilterFragment(id: string, value: string): StyleFragment {\n const fragment = newFragment(TypeFilter)\n setFragmentValue(fragment, 'id', id)\n setFragmentValue(fragment, 'feDropShadowDx', '-1')\n setFragmentValue(fragment, 'feDropShadowDy', '-1')\n setFragmentValue(fragment, 'feGaussianBlurStd', '0.5')\n const color = value.trim() || 'rgba(0,0,0,0.4)'\n setFragmentValue(fragment, 'floodColor', color)\n setFragmentValue(fragment, 'feDropShadowDx2', '1')\n setFragmentValue(fragment, 'floodColor2', 'rgba(255,255,255,0.35)')\n return fragment\n}\n\nfunction parseSimpleShadow(value: string, dims: ImageDims): { dx: number; dy: number; blur: number; color: string } {\n const trimmed = value.trim()\n if (!trimmed) {\n return { dx: 0, dy: 0, blur: 4, color: 'rgba(0,0,0,0.5)' }\n }\n\n const resolved = applyPercentHandlers({ textShadow: trimmed }, dims)\n const parts = stringifyCSSValue(resolved.textShadow).split(/\\s+/).filter(Boolean)\n let dx = 0\n let dy = 0\n let blur = 0\n let color = ''\n if (parts.length >= 3) {\n dx = parsePxNum(parts[0] ?? '')\n dy = parsePxNum(parts[1] ?? '')\n blur = parsePxNum(parts[2] ?? '')\n }\n if (parts.length >= 4) {\n color = parts[3] ?? ''\n }\n if (!color) color = 'rgba(0,0,0,0.5)'\n return { dx, dy, blur, color }\n}\n\nfunction parsePxNum(value: string): number {\n const parsed = Number.parseFloat(value.trim().replace(/px$/, ''))\n return Number.isFinite(parsed) ? parsed : 0\n}\n","import { applyPercentHandlers, type ImageDims } from './percent.js'\nimport {\n KeyBlur,\n KeyBlurBottom,\n KeyBlurLeft,\n KeyBlurRight,\n KeyBlurTop,\n} from './keys.js'\nimport {\n TypeFilter,\n TypeMask,\n TypeMotionDiv,\n type StyleFragment,\n newFragment,\n setFragmentValue,\n} from './fragment.js'\nimport { hasStyleValue, stringifyCSSValue } from './values.js'\n\nexport const blurFilterKind = 'blur'\n\nexport type BlurAdapt = {\n filterID: string\n maskID: string\n}\n\ntype BlurSpec = {\n amountPx: number\n side: '' | 'left' | 'right' | 'top' | 'bottom'\n}\n\nconst blurSideKeys: Array<{ key: string; side: BlurSpec['side'] }> = [\n { key: KeyBlurLeft, side: 'left' },\n { key: KeyBlurRight, side: 'right' },\n { key: KeyBlurTop, side: 'top' },\n { key: KeyBlurBottom, side: 'bottom' },\n]\n\nexport function expandBlur(\n style: Record<string, unknown>,\n dims: ImageDims,\n html: boolean,\n filterID: string,\n): { style: Record<string, unknown>; meta: BlurAdapt; fragments: StyleFragment[] } {\n if (Object.keys(style).length === 0) {\n return { style, meta: { filterID: '', maskID: '' }, fragments: [] }\n }\n\n const parsed = parseBlurFromStyle(style, dims)\n if (!parsed.ok) {\n return { style, meta: { filterID: '', maskID: '' }, fragments: [] }\n }\n\n const spec = parsed.spec\n const out = { ...style }\n for (const sideKey of blurSideKeys) {\n delete out[sideKey.key]\n }\n delete out[KeyBlur]\n\n const meta: BlurAdapt = { filterID: `${filterID}-blur`, maskID: '' }\n if (html) {\n const patch = newFragment(TypeMotionDiv)\n applyBlurHTML(patch, spec)\n return { style: out, meta, fragments: [patch] }\n }\n\n const fragments: StyleFragment[] = [blurFilterFragment(meta.filterID, spec)]\n if (spec.side) {\n meta.maskID = `${meta.filterID}-mask`\n fragments.push(blurMaskFragment(meta.maskID, spec.side))\n }\n return { style: out, meta, fragments }\n}\n\nfunction parseBlurFromStyle(style: Record<string, unknown>, dims: ImageDims): { spec: BlurSpec; ok: boolean } {\n for (const side of blurSideKeys) {\n const raw = style[side.key]\n if (!hasStyleValue(side.key, raw)) continue\n const amount = parseBlurAmount(stringifyCSSValue(raw), dims)\n if (!amount.ok || amount.amount <= 0) return { spec: { amountPx: 0, side: '' }, ok: false }\n return { spec: { amountPx: amount.amount, side: side.side }, ok: true }\n }\n\n const raw = style[KeyBlur]\n if (!hasStyleValue(KeyBlur, raw)) return { spec: { amountPx: 0, side: '' }, ok: false }\n return parseBlurCSSValue(stringifyCSSValue(raw), dims)\n}\n\nfunction parseBlurCSSValue(value: string, dims: ImageDims): { spec: BlurSpec; ok: boolean } {\n const trimmed = value.trim()\n if (!trimmed) return { spec: { amountPx: 0, side: '' }, ok: false }\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return { spec: { amountPx: 0, side: '' }, ok: false }\n\n let side: BlurSpec['side'] = ''\n const amountParts: string[] = []\n for (const part of parts) {\n const lower = part.toLowerCase()\n if ((lower === 'left' || lower === 'right' || lower === 'top' || lower === 'bottom') && !side) {\n side = lower\n continue\n }\n amountParts.push(part)\n }\n\n let amountString = amountParts.join(' ')\n if (!amountString && side && parts.length >= 2) {\n for (let i = 0; i < parts.length; i += 1) {\n const current = parts[i]?.toLowerCase()\n if (current !== side) continue\n amountString = parts.slice(i + 1).join(' ')\n break\n }\n }\n if (!amountString) {\n amountString = trimmed\n side = ''\n }\n\n const amount = parseBlurAmount(amountString, dims)\n if (!amount.ok || amount.amount <= 0) return { spec: { amountPx: 0, side: '' }, ok: false }\n return { spec: { amountPx: amount.amount, side }, ok: true }\n}\n\nfunction parseBlurAmount(value: string, dims: ImageDims): { amount: number; ok: boolean } {\n let trimmed = value.trim()\n if (!trimmed) return { amount: 0, ok: false }\n if (trimmed.includes('%')) {\n const resolved = applyPercentHandlers({ [KeyBlur]: trimmed }, dims)\n trimmed = stringifyCSSValue(resolved[KeyBlur])\n }\n const px = parsePxNum(trimmed)\n return { amount: px, ok: px > 0 }\n}\n\nfunction applyBlurHTML(box: StyleFragment, spec: BlurSpec): void {\n if (spec.amountPx <= 0) return\n\n const px = `${spec.amountPx.toFixed(3)}px`\n const blurValue = `blur(${px})`\n setFragmentValue(box, 'backdropFilter', blurValue)\n setFragmentValue(box, 'WebkitBackdropFilter', blurValue)\n if (!spec.side) return\n\n const mask = blurMaskCSS(spec.side)\n setFragmentValue(box, 'maskImage', mask)\n setFragmentValue(box, 'WebkitMaskImage', mask)\n setFragmentValue(box, 'maskSize', '100% 100%')\n setFragmentValue(box, 'WebkitMaskSize', '100% 100%')\n}\n\nfunction blurMaskCSS(side: BlurSpec['side']): string {\n switch (side) {\n case 'left':\n return 'linear-gradient(to right, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%)'\n case 'right':\n return 'linear-gradient(to left, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%)'\n case 'top':\n return 'linear-gradient(to bottom, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%)'\n case 'bottom':\n return 'linear-gradient(to top, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%)'\n default:\n return ''\n }\n}\n\nfunction blurFilterFragment(id: string, spec: BlurSpec): StyleFragment {\n const fragment = newFragment(TypeFilter)\n setFragmentValue(fragment, 'id', id)\n setFragmentValue(fragment, 'filterKind', blurFilterKind)\n let std = spec.amountPx / 2\n if (std < 0.5) std = 0.5\n setFragmentValue(fragment, 'feGaussianBlurStd', std.toFixed(3))\n setFragmentValue(fragment, 'feGaussianBlurIn', 'SourceGraphic')\n return fragment\n}\n\nfunction blurMaskFragment(id: string, side: BlurSpec['side']): StyleFragment {\n const fragment = newFragment(TypeMask)\n setFragmentValue(fragment, 'id', id)\n setFragmentValue(fragment, 'maskSide', side)\n return fragment\n}\n\nexport function applyBlurSVGRect(rect: StyleFragment, meta: BlurAdapt): void {\n if (!meta.filterID) return\n setFragmentValue(rect, 'filter', `url(#${meta.filterID})`)\n if (meta.maskID) {\n setFragmentValue(rect, 'mask', `url(#${meta.maskID})`)\n }\n}\n\nfunction parsePxNum(value: string): number {\n const trimmed = value.trim().replace(/px$/, '')\n const parsed = Number.parseFloat(trimmed)\n return Number.isFinite(parsed) ? parsed : 0\n}\n","import { KeyStroke, KeyStrokeColor, KeyStrokeWidth } from './keys.js'\nimport type { StyleFragment } from './fragment.js'\nimport { setFragmentValue } from './fragment.js'\nimport { stringifyCSSValue } from './values.js'\n\nexport function applyStrokeHTML(span: StyleFragment | null | undefined, style: Record<string, unknown>): void {\n if (!span) return\n\n const stroke = stringifyCSSValue(style[KeyStroke])\n if (stroke) {\n setFragmentValue(span, 'WebkitTextStroke', stroke)\n }\n const strokeWidth = stringifyCSSValue(style[KeyStrokeWidth])\n if (strokeWidth) {\n setFragmentValue(span, 'WebkitTextStrokeWidth', strokeWidth)\n }\n const strokeColor = stringifyCSSValue(style[KeyStrokeColor])\n if (strokeColor) {\n setFragmentValue(span, 'WebkitTextStrokeColor', strokeColor)\n }\n}\n\nexport function applyStrokeSVG(host: StyleFragment | null | undefined, style: Record<string, unknown>): void {\n if (!host) return\n\n const stroke = stringifyCSSValue(style[KeyStroke])\n if (stroke) {\n setFragmentValue(host, '-webkit-text-stroke', stroke)\n }\n const strokeWidth = stringifyCSSValue(style[KeyStrokeWidth])\n if (strokeWidth) {\n setFragmentValue(host, '-webkit-text-stroke-width', strokeWidth)\n }\n const strokeColor = stringifyCSSValue(style[KeyStrokeColor])\n if (strokeColor) {\n setFragmentValue(host, '-webkit-text-stroke-color', strokeColor)\n }\n}\n","import type { PsrtMask, PsrtText } from '../../types.js'\nimport type { ImageDims } from './percent.js'\n\nexport type AdaptContext = {\n style?: Record<string, unknown>\n text: PsrtText\n mask?: PsrtMask\n canvasW: number\n canvasH: number\n fontSizePx?: number\n zoom?: number\n htmlCompile?: boolean\n pageSlug?: string\n textIndex?: number\n}\n\nexport function contextImageDims(ctx: AdaptContext): ImageDims {\n const zoom = ctx.zoom && ctx.zoom > 0 ? ctx.zoom : 1\n return {\n w: ctx.canvasW,\n h: ctx.canvasH,\n fontSizePx: ctx.fontSizePx ?? 0,\n zoom,\n }\n}\n\nexport function fontSizePxOrCompute(ctx: AdaptContext): number {\n const fontPx = ctx.fontSizePx ?? 0\n if (fontPx > 0) return fontPx\n return textFontSizePx(ctx.text.textSize, ctx.canvasW, ctx.canvasH)\n}\n\nfunction textSizeBasisPx(canvasW: number, canvasH: number): number {\n if (canvasW <= 0 && canvasH <= 0) return 1\n if (canvasW <= 0) return canvasH\n if (canvasH <= 0) return canvasW\n return canvasW < canvasH ? canvasW : canvasH\n}\n\nfunction textFontSizePx(textSizePct: number, canvasW: number, canvasH: number): number {\n const px = (textSizePct / 100) * textSizeBasisPx(canvasW, canvasH)\n return px < 1 ? 1 : px\n}\n","import { applyPercentHandlers } from './percent.js'\nimport {\n KeyAlignItems,\n KeyBackground,\n KeyBorder,\n KeyBorderBottom,\n KeyBorderBottomLeftRadius,\n KeyBorderBottomRightRadius,\n KeyBorderColor,\n KeyBorderLeft,\n KeyBorderRadius,\n KeyBorderRight,\n KeyBorderStyle,\n KeyBorderTop,\n KeyBorderTopLeftRadius,\n KeyBorderTopRightRadius,\n KeyBorderWidth,\n KeyBoxShadow,\n KeyBoxSizing,\n KeyColor,\n KeyFontSize,\n KeyHeight,\n KeyLeft,\n KeyMatrix,\n KeyPadding,\n KeyPaddingBottom,\n KeyPaddingLeft,\n KeyPaddingRight,\n KeyPaddingTop,\n KeyPosition,\n KeyRotate,\n KeyScale,\n KeySkew,\n KeyStroke,\n KeyStrokeColor,\n KeyStrokeWidth,\n KeyTextAlign,\n KeyTop,\n KeyTransform,\n KeyTransformOrigin,\n KeyTranslate,\n KeyWidth,\n isBoxKey,\n isTextKey,\n isTransformKey,\n} from './keys.js'\nimport { normalizeStyle } from './names.js'\nimport {\n TypeMotionDiv,\n TypeSpan,\n mergeFragments,\n newFragment,\n setFragmentValue,\n getFragmentString,\n type StyleFragment,\n} from './fragment.js'\nimport { expandEffects } from './effects.js'\nimport { expandBlur } from './blur.js'\nimport { applyStrokeHTML } from './stroke.js'\nimport { contextImageDims, fontSizePxOrCompute, type AdaptContext } from './context.js'\nimport { filterStyleMap, hasStyleValue, pctString, pxString, sanitizeCSSValue, stringifyCSSValue } from './values.js'\n\nexport function adaptHTML(ctx: AdaptContext): StyleFragment[] {\n return adapt(ctx, true)\n}\n\nfunction adapt(ctx: AdaptContext, html: boolean): StyleFragment[] {\n let style = normalizeStyle(ctx.text.style)\n if (Object.keys(style).length === 0) {\n style = {}\n }\n\n const dims = contextImageDims(ctx)\n dims.fontSizePx = fontSizePxOrCompute(ctx)\n if (html && ctx.htmlCompile) {\n dims.preservePercent = true\n }\n\n style = applyPercentHandlers(style, dims)\n style = filterStyleMap(style)\n\n const filterID = `psrt-filter-${ctx.pageSlug ?? ''}-${ctx.textIndex ?? 0}`\n const effects = expandEffects(style, dims, !html, filterID)\n const blur = expandBlur(effects.style, dims, html, filterID)\n\n const fragments = html ? buildHTMLFragments(ctx, blur.style) : []\n return mergeFragments([...fragments, ...effects.fragments, ...blur.fragments])\n}\n\nexport function buildHTMLFragments(ctx: AdaptContext, style: Record<string, unknown>): StyleFragment[] {\n const box = newFragment(TypeMotionDiv)\n const text = newFragment(TypeSpan)\n\n applyLayout(box, ctx)\n applyTransform(box, style)\n\n for (const [key, raw] of Object.entries(style)) {\n if (!hasStyleValue(key, raw)) continue\n const value = sanitizeCSSValue(stringifyCSSValue(raw))\n if (isBoxKey(key)) {\n applyBoxCSS(box, key, value)\n continue\n }\n if (isTextKey(key) && key !== KeyStroke && key !== KeyStrokeWidth && key !== KeyStrokeColor) {\n applyTextCSS(text, key, value)\n continue\n }\n if (isTransformKey(key)) {\n continue\n }\n }\n\n applyStrokeHTML(text, style)\n applyFontSize(box, ctx, Boolean(ctx.htmlCompile))\n applyTextAlignHTML(box, text, style)\n if (!getFragmentString(text, KeyColor)) {\n const color = textColor(style)\n if (color) {\n setFragmentValue(text, KeyColor, color)\n }\n }\n\n return [box, text]\n}\n\nfunction applyLayout(box: StyleFragment, ctx: AdaptContext): void {\n setFragmentValue(box, KeyPosition, 'absolute')\n setFragmentValue(box, KeyBoxSizing, 'border-box')\n setFragmentValue(box, KeyLeft, pctString(ctx.text.x))\n setFragmentValue(box, KeyTop, pctString(ctx.text.y))\n setFragmentValue(box, KeyWidth, pctString(ctx.text.width))\n}\n\nfunction applyTransform(target: StyleFragment, style: Record<string, unknown>): void {\n const parts: string[] = []\n const transform = stringifyCSSValue(style[KeyTransform])\n if (transform) parts.push(transform)\n\n for (const key of [KeyTranslate, KeyRotate, KeyScale, KeySkew, KeyMatrix]) {\n const value = stringifyCSSValue(style[key])\n if (!value) continue\n parts.push(`${key}(${value})`)\n }\n\n if (parts.length === 0) return\n\n setFragmentValue(target, 'transform', parts.join(' '))\n const origin = stringifyCSSValue(style[KeyTransformOrigin])\n if (origin) {\n setFragmentValue(target, KeyTransformOrigin, origin)\n }\n}\n\nexport function applyBoxCSS(fragment: StyleFragment, key: string, value: string): void {\n switch (key) {\n case KeyBackground:\n setFragmentValue(fragment, 'backgroundColor', value)\n return\n case KeyPadding:\n case KeyPaddingTop:\n case KeyPaddingRight:\n case KeyPaddingBottom:\n case KeyPaddingLeft:\n case KeyBorder:\n case KeyBorderWidth:\n case KeyBorderStyle:\n case KeyBorderColor:\n case KeyBorderTop:\n case KeyBorderRight:\n case KeyBorderBottom:\n case KeyBorderLeft:\n case KeyBorderRadius:\n case KeyBorderTopLeftRadius:\n case KeyBorderTopRightRadius:\n case KeyBorderBottomRightRadius:\n case KeyBorderBottomLeftRadius:\n case KeyBoxShadow:\n case KeyHeight:\n setFragmentValue(fragment, key, value)\n return\n default:\n return\n }\n}\n\nfunction applyTextCSS(fragment: StyleFragment, key: string, value: string): void {\n const cssKey = key === KeyTextAlign ? 'textAlign' : key\n setFragmentValue(fragment, cssKey, value)\n}\n\nfunction applyFontSize(fragment: StyleFragment, ctx: AdaptContext, htmlCompile: boolean): void {\n if (htmlCompile) {\n setFragmentValue(fragment, KeyFontSize, `${ctx.text.textSize}cqmin`)\n return\n }\n setFragmentValue(fragment, KeyFontSize, pxString(fontSizePxOrCompute(ctx)))\n}\n\nfunction applyTextAlignHTML(box: StyleFragment, text: StyleFragment, style: Record<string, unknown>): void {\n let ta = getFragmentString(text, KeyTextAlign).toLowerCase().trim()\n if (!ta) {\n ta = readTextAlignFromStyle(style)\n }\n const va = verticalAlignFromStyle(style)\n if (!ta && !va) return\n if (!ta) ta = 'left'\n\n setFragmentValue(text, 'display', 'block')\n setFragmentValue(text, KeyWidth, '100%')\n setFragmentValue(text, KeyTextAlign, ta)\n\n switch (ta) {\n case 'justify':\n setFragmentValue(box, 'display', 'block')\n return\n case 'center':\n case 'right':\n case 'left':\n case 'start': {\n setFragmentValue(box, 'display', 'flex')\n setFragmentValue(box, 'flexDirection', 'column')\n const justify = va || 'center'\n setFragmentValue(box, 'justifyContent', justify)\n let align = 'stretch'\n if (ta === 'center') align = 'center'\n if (ta === 'right') align = 'flex-end'\n if (ta === 'left' || ta === 'start') align = 'flex-start'\n setFragmentValue(box, 'alignItems', align)\n return\n }\n default:\n setFragmentValue(box, 'display', 'block')\n }\n}\n\nfunction readTextAlignFromStyle(style: Record<string, unknown>): string {\n const direct = style[KeyTextAlign]\n if (direct !== undefined) {\n return sanitizeCSSValue(stringifyCSSValue(direct)).toLowerCase()\n }\n for (const key of ['text-align', 'ta']) {\n const value = style[key]\n if (value === undefined) continue\n return sanitizeCSSValue(stringifyCSSValue(value)).toLowerCase()\n }\n return ''\n}\n\nfunction verticalAlignFromStyle(style: Record<string, unknown>): string {\n const direct = style[KeyAlignItems]\n let value = direct !== undefined ? sanitizeCSSValue(stringifyCSSValue(direct)).toLowerCase() : ''\n if (!value) {\n for (const key of ['align-items', 'verticalAlign', 'vertical-align']) {\n const raw = style[key]\n if (raw === undefined) continue\n value = sanitizeCSSValue(stringifyCSSValue(raw)).toLowerCase()\n break\n }\n }\n\n switch (value) {\n case 'flex-start':\n case 'start':\n case 'top':\n return 'flex-start'\n case 'flex-end':\n case 'end':\n case 'bottom':\n return 'flex-end'\n case 'center':\n case 'middle':\n return 'center'\n default:\n return ''\n }\n}\n\nfunction textColor(style: Record<string, unknown>): string {\n const color = style[KeyColor]\n if (color === undefined) return ''\n return sanitizeCSSValue(stringifyCSSValue(color))\n}\n\nexport type { StyleFragment, AdaptContext }\n","import { applyPercentHandlers } from './percent.js'\nimport { normalizeStyle } from './names.js'\nimport {\n TypeMotionDiv,\n mergeFragments,\n newFragment,\n setFragmentValue,\n type StyleFragment,\n} from './fragment.js'\nimport { applyBoxCSS } from './adapter.js'\nimport { expandEffects } from './effects.js'\nimport { expandBlur } from './blur.js'\nimport { contextImageDims, type AdaptContext } from './context.js'\nimport {\n KeyBoxSizing,\n KeyHeight,\n KeyLeft,\n KeyMatrix,\n KeyPosition,\n KeyRotate,\n KeyScale,\n KeySkew,\n KeyTop,\n KeyTransform,\n KeyTransformOrigin,\n KeyTranslate,\n KeyWidth,\n isBoxKey,\n} from './keys.js'\nimport { filterStyleMap, hasStyleValue, pctString, sanitizeCSSValue, stringifyCSSValue } from './values.js'\n\nexport function adaptMaskHTML(ctx: AdaptContext): StyleFragment[] {\n const mask = ctx.mask\n if (!mask) return []\n\n let style = normalizeStyle(mask.style)\n if (Object.keys(style).length === 0) {\n style = {}\n }\n\n const dims = contextImageDims(ctx)\n if (ctx.htmlCompile) {\n dims.preservePercent = true\n }\n style = applyPercentHandlers(style, dims)\n style = filterStyleMap(style)\n\n const filterID = maskFilterID(ctx)\n const effects = expandEffects(style, dims, false, filterID)\n const blur = expandBlur(effects.style, dims, true, filterID)\n\n const fragments = buildMaskHTMLFragments(ctx, blur.style)\n return mergeFragments([...fragments, ...effects.fragments, ...blur.fragments])\n}\n\nfunction maskFilterID(ctx: AdaptContext): string {\n const index = ctx.mask?.index ?? ctx.textIndex ?? 0\n return `psrt-filter-${ctx.pageSlug ?? ''}-${index}`\n}\n\nfunction buildMaskHTMLFragments(ctx: AdaptContext, style: Record<string, unknown>): StyleFragment[] {\n const box = newFragment(TypeMotionDiv)\n applyMaskLayout(box, ctx)\n applyTransform(box, style)\n\n for (const [key, raw] of Object.entries(style)) {\n if (!hasStyleValue(key, raw)) continue\n const value = sanitizeCSSValue(stringifyCSSValue(raw))\n if (isBoxKey(key)) {\n applyBoxCSS(box, key, value)\n }\n }\n\n if (!box['background-size']) {\n setFragmentValue(box, 'background-size', 'cover')\n }\n return [box]\n}\n\nfunction applyMaskLayout(box: StyleFragment, ctx: AdaptContext): void {\n const mask = ctx.mask\n if (!mask) return\n setFragmentValue(box, KeyPosition, 'absolute')\n setFragmentValue(box, KeyBoxSizing, 'border-box')\n setFragmentValue(box, KeyLeft, pctString(mask.x))\n setFragmentValue(box, KeyTop, pctString(mask.y))\n setFragmentValue(box, KeyWidth, pctString(mask.width))\n setFragmentValue(box, KeyHeight, pctString(mask.height))\n}\n\nfunction applyTransform(target: StyleFragment, style: Record<string, unknown>): void {\n const parts: string[] = []\n const transform = stringifyCSSValue(style[KeyTransform])\n if (transform) parts.push(transform)\n for (const key of [KeyTranslate, KeyRotate, KeyScale, KeySkew, KeyMatrix]) {\n const value = stringifyCSSValue(style[key])\n if (!value) continue\n parts.push(`${key}(${value})`)\n }\n if (parts.length > 0) {\n setFragmentValue(target, KeyTransform, parts.join(' '))\n }\n const origin = stringifyCSSValue(style[KeyTransformOrigin])\n if (origin) {\n setFragmentValue(target, KeyTransformOrigin, origin)\n }\n}\n","import {\n TypeFilter,\n TypeKey,\n TypeMask,\n TypeMotionDiv,\n TypeRect,\n TypeSpan,\n getFragmentString,\n mergeFragments,\n type StyleFragment,\n} from './fragment.js'\nimport { blurFilterKind } from './blur.js'\n\nexport function htmlLayerCSS(fragments: StyleFragment[]): { boxCSS: string; textCSS: string } {\n const merged = mergeFragments(fragments)\n let box: StyleFragment | null = null\n let text: StyleFragment | null = null\n\n for (const fragment of merged) {\n const type = getFragmentString(fragment, TypeKey)\n if (type === TypeMotionDiv) box = fragment\n if (type === TypeSpan) text = fragment\n }\n\n return { boxCSS: fragmentCSS(box), textCSS: fragmentCSS(text) }\n}\n\nexport function fragmentsToInlineCSS(fragments: StyleFragment[]): string {\n const merged = mergeFragments(fragments)\n let out = ''\n for (const type of [TypeMotionDiv, TypeSpan]) {\n for (const fragment of merged) {\n if (getFragmentString(fragment, TypeKey) !== type) continue\n out += fragmentCSS(fragment)\n }\n }\n return out\n}\n\nexport function fragmentCSS(fragment: StyleFragment | null | undefined): string {\n if (!fragment) return ''\n const keys = Object.keys(fragment)\n .filter((key) => key !== TypeKey)\n .sort()\n let out = ''\n for (const key of keys) {\n const raw = fragment[key]\n const value = raw === undefined || raw === null ? '' : String(raw)\n if (!value) continue\n out += `${camelToKebab(key)}:${value};`\n }\n return out\n}\n\nexport const FragmentCSS = fragmentCSS\n\nexport function camelToKebab(value: string): string {\n if (value.startsWith('-')) return value\n let out = ''\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i] ?? ''\n const upper = char >= 'A' && char <= 'Z'\n if (upper) {\n if (i > 0) out += '-'\n out += char.toLowerCase()\n continue\n }\n out += char\n }\n return out\n}\n\nexport function filterFragmentToSVG(fragment: StyleFragment | null | undefined): string {\n if (!fragment || getFragmentString(fragment, TypeKey) !== TypeFilter) return ''\n const id = getFragmentString(fragment, 'id')\n if (!id) return ''\n if (getFragmentString(fragment, 'filterKind') === blurFilterKind) {\n return blurFilterFragmentToSVG(fragment)\n }\n\n const dx = getFragmentString(fragment, 'feDropShadowDx')\n const dy = getFragmentString(fragment, 'feDropShadowDy')\n const std = getFragmentString(fragment, 'feGaussianBlurStd') || '1'\n const color = getFragmentString(fragment, 'floodColor')\n\n let out = `<filter id=\"${id}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">`\n out += `<feDropShadow dx=\"${dx}\" dy=\"${dy}\" stdDeviation=\"${std}\" flood-color=\"${svgEscape(color)}\"/>`\n if (fragment.feDropShadowDx2 !== undefined) {\n const dx2 = String(fragment.feDropShadowDx2)\n const color2 = getFragmentString(fragment, 'floodColor2')\n out += `<feDropShadow dx=\"${dx2}\" dy=\"${dy}\" stdDeviation=\"0.5\" flood-color=\"${svgEscape(color2)}\"/>`\n }\n out += '</filter>'\n return out\n}\n\nfunction blurFilterFragmentToSVG(fragment: StyleFragment): string {\n const id = getFragmentString(fragment, 'id')\n const std = getFragmentString(fragment, 'feGaussianBlurStd') || '1'\n const input = getFragmentString(fragment, 'feGaussianBlurIn') || 'SourceGraphic'\n return `<filter id=\"${id}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur in=\"${svgEscape(input)}\" stdDeviation=\"${std}\"/></filter>`\n}\n\nexport function maskFragmentToSVG(fragment: StyleFragment | null | undefined): string {\n if (!fragment || getFragmentString(fragment, TypeKey) !== TypeMask) return ''\n const id = getFragmentString(fragment, 'id')\n const side = getFragmentString(fragment, 'maskSide')\n if (!id || !side) return ''\n\n const coords = maskGradientCoords(side)\n let out = `<mask id=\"${id}\" maskUnits=\"objectBoundingBox\">`\n out += `<linearGradient id=\"${id}-grad\" x1=\"${coords.x1}\" y1=\"${coords.y1}\" x2=\"${coords.x2}\" y2=\"${coords.y2}\">`\n out += '<stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"1\"/>'\n out += '<stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"0\"/>'\n out += '</linearGradient>'\n out += `<rect width=\"100%\" height=\"100%\" fill=\"url(#${id}-grad)\"/></mask>`\n return out\n}\n\nfunction maskGradientCoords(side: string): { x1: string; y1: string; x2: string; y2: string } {\n switch (side.toLowerCase()) {\n case 'left':\n return { x1: '0%', y1: '0%', x2: '100%', y2: '0%' }\n case 'right':\n return { x1: '100%', y1: '0%', x2: '0%', y2: '0%' }\n case 'top':\n return { x1: '0%', y1: '0%', x2: '0%', y2: '100%' }\n case 'bottom':\n return { x1: '0%', y1: '100%', x2: '0%', y2: '0%' }\n default:\n return { x1: '0%', y1: '0%', x2: '100%', y2: '0%' }\n }\n}\n\nfunction svgEscape(value: string): string {\n return value.replaceAll('\"', '"')\n}\n\nexport function rectFragmentAttrs(fragment: StyleFragment | null | undefined): string {\n if (!fragment || getFragmentString(fragment, TypeKey) !== TypeRect) return ''\n return rectAttrs(fragment, true)\n}\n\nexport function rectDecorationAttrs(fragment: StyleFragment | null | undefined): string {\n if (!fragment || getFragmentString(fragment, TypeKey) !== TypeRect) return ''\n return rectAttrs(fragment, false)\n}\n\nfunction rectAttrs(fragment: StyleFragment, includeLayout: boolean): string {\n const keys = includeLayout\n ? ['x', 'y', 'width', 'height', 'fill', 'stroke', 'stroke-width', 'rx', 'filter', 'mask']\n : ['fill', 'stroke', 'stroke-width', 'rx', 'filter', 'mask']\n\n const parts: string[] = []\n for (const key of keys) {\n const raw = fragment[key]\n if (raw === null || raw === undefined) continue\n const value = String(raw)\n if (!value) continue\n parts.push(`${key}=\"${svgEscape(value)}\"`)\n }\n return parts.join(' ')\n}\n","import type { PsrtDocument } from '../types.js'\n\nexport const CompileStep = {\n RESOLVE: 'resolve',\n BUILD_ASSETS: 'buildAssets',\n ADAPT_STYLE: 'adaptStyle',\n RENDER_FONTS: 'renderFonts',\n RENDER_HEAD: 'renderHead',\n RENDER_PAGE: 'renderPage',\n RENDER_TEXT: 'renderText',\n RENDER_MASK: 'renderMask',\n RENDER_INLINE: 'renderInline',\n FINALIZE: 'finalize',\n} as const\n\nexport type CompileStep = (typeof CompileStep)[keyof typeof CompileStep]\n\nexport type CompileStepContext =\n | { step: typeof CompileStep.RESOLVE; doc: PsrtDocument }\n | {\n step: typeof CompileStep.BUILD_ASSETS\n assetCount: number\n canvasSizes: Record<string, { w: number; h: number }>\n }\n | {\n step: typeof CompileStep.ADAPT_STYLE\n pageName: string\n blockIndex: number\n kind: 'text' | 'mask'\n }\n | { step: typeof CompileStep.RENDER_FONTS; fontCount: number }\n | { step: typeof CompileStep.RENDER_HEAD; title: string }\n | {\n step: typeof CompileStep.RENDER_PAGE\n pageIndex: number\n pageName: string\n canvasW: number\n canvasH: number\n }\n | {\n step: typeof CompileStep.RENDER_TEXT\n pageName: string\n textIndex: number\n contentPreview: string\n }\n | { step: typeof CompileStep.RENDER_MASK; pageName: string; maskIndex: number }\n | {\n step: typeof CompileStep.RENDER_INLINE\n pageName: string\n textIndex: number\n htmlLength: number\n }\n | { step: typeof CompileStep.FINALIZE; htmlLength: number; pageCount: number }\n\nexport type CompileStepObserver = (ctx: CompileStepContext) => void\n\nexport type CompileStepObservers = Partial<Record<CompileStep, CompileStepObserver[]>>\n\nexport function notifyObservers(\n observers: CompileStepObservers | undefined,\n ctx: CompileStepContext,\n): void {\n if (!observers) return\n const fns = observers[ctx.step]\n if (!fns?.length) return\n for (const fn of fns) fn(ctx)\n}\n","import type { PsrtDocument, PsrtPage } from '../types.js'\n\nexport interface HtmlVariant {\n label: string\n doc: PsrtDocument\n}\n\n/** Sanitizes a page name for use in HTML id attributes. */\nexport function slugPageName(name: string): string {\n const s = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n return s || 'page'\n}\n\nexport function pageByName(doc: PsrtDocument, pageName: string): PsrtPage | undefined {\n return doc.pages.find((p) => p.name === pageName)\n}\n\nexport function variantLabels(variants: HtmlVariant[]): string[] {\n return variants.map((v, i) => {\n const l = v.label.trim()\n return l || (i === 0 ? 'PSRT' : `variant-${i}`)\n })\n}\n\n/** DOM id for a variant overlay on a page. */\nexport function overlayDomId(pageName: string, variantIndex: number): string {\n return `psrt-overlay-${slugPageName(pageName)}-v${variantIndex}`\n}\n\n/** DOM id for a text block (page + index + variant). */\nexport function textLayerDomId(pageName: string, textIndex: number, variantIndex: number): string {\n return `psrt-text-${slugPageName(pageName)}-${textIndex}-v${variantIndex}`\n}\n\n/** DOM id for a mask block (page + index + variant). */\nexport function maskLayerDomId(pageName: string, maskIndex: number, variantIndex: number): string {\n return `psrt-mask-${slugPageName(pageName)}-${maskIndex}-v${variantIndex}`\n}\n\nexport function buildHtmlVariants(\n primary: PsrtDocument,\n extra?: { label?: string; doc: PsrtDocument }[],\n): HtmlVariant[] {\n const variants: HtmlVariant[] = [{ label: 'PSRT', doc: primary }]\n for (const item of extra ?? []) {\n const label = item.label?.trim() || `variant-${variants.length}`\n variants.push({ label, doc: item.doc })\n }\n return variants\n}\n","export function variantSwitcherCSS(): string {\n return `\n.psrt-hidden{display:none!important}\n.psrt-variant-hint{position:fixed;z-index:9999;right:12px;bottom:12px;padding:6px 10px;font:12px/1.3 system-ui,sans-serif;color:#e8e8e8;background:rgba(0,0,0,.72);border-radius:6px;pointer-events:none;user-select:none}\n`\n}\n\n/**\n * Emits a readable, commented variant switcher script.\n * Only call when there are 2+ PSRT variants bundled in the HTML.\n */\nexport function writeVariantSwitcher(labels: string[]): string {\n if (labels.length < 2) return ''\n const labelsJSON = JSON.stringify(labels)\n return `<div id=\"psrt-variant-hint\" class=\"psrt-variant-hint\" aria-live=\"polite\"></div>\n<script>\n/**\n * PSRT HTML — variant switcher\n *\n * Bundled PSRT variants share the same page images; only the text/mask\n * overlays differ. Press Ctrl+L to cycle:\n * variant 0 → variant 1 → … → \"Sem PSRT\" (hide all overlays) → variant 0 …\n *\n * Each overlay has class psrt-v-N (N = variant index). Inactive overlays\n * use class psrt-hidden (display:none).\n */\n(function () {\n /** Human-readable labels shown in the bottom-right hint. */\n var VARIANT_LABELS = ${labelsJSON};\n\n /** Extra slot at the end: hide all PSRT overlays (\"Sem PSRT\"). */\n VARIANT_LABELS.push('');\n\n /** Index into VARIANT_LABELS for the currently visible variant. */\n var activeVariantIndex = 0;\n\n /** Bottom-right hint element (created above this script). */\n var hintEl = document.getElementById('psrt-variant-hint');\n\n /**\n * Show one variant index, or hide every overlay when index is the off-state.\n */\n function applyVariant(index) {\n document.querySelectorAll('.psrt-overlay').forEach(function (overlay) {\n overlay.classList.add('psrt-hidden');\n });\n\n if (index < VARIANT_LABELS.length - 1) {\n document.querySelectorAll('.psrt-overlay.psrt-v-' + index).forEach(function (overlay) {\n overlay.classList.remove('psrt-hidden');\n });\n }\n\n if (hintEl) {\n var label = VARIANT_LABELS[index];\n hintEl.textContent = label === ''\n ? 'Sem PSRT (Ctrl+L)'\n : label + ' (Ctrl+L)';\n }\n }\n\n document.addEventListener('keydown', function (event) {\n if (!event.ctrlKey || event.altKey) return;\n if (event.key.toLowerCase() !== 'l') return;\n event.preventDefault();\n activeVariantIndex = (activeVariantIndex + 1) % VARIANT_LABELS.length;\n applyVariant(activeVariantIndex);\n });\n\n applyVariant(0);\n})();\n</script>\n`\n}\n\nexport function variantClass(v: number): string {\n return `psrt-v-${v}`\n}\n\nexport function baseCSS(fontFaces: string): string {\n return `${fontFaces.trim()}\n*{box-sizing:border-box;}\n.slides-wrap{margin:0;padding:0;display:flex;width:100%;flex-direction:column;align-items:center;}\n.slide{position:relative;display:block;flex:0 0 auto;line-height:0;margin:0;padding:0;}\n.slide-img{display:block;width:100%;height:auto;margin:0;padding:0;vertical-align:bottom;}\n.slide-overlays{position:absolute;left:0;top:0;right:0;bottom:0;}\n.slide-overlay{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;container-type:size;container-name:slide;}\n.text-layer{position:absolute;box-sizing:border-box;margin:0;padding:0;line-height:1.2;overflow:hidden;overflow-wrap:anywhere;word-wrap:break-word;white-space:pre-wrap;}\n.text-ref-img{display:block;max-width:100%;height:auto;margin:0 0 .25em;padding:0;}\n`\n}\n\nexport function escapeHtmlAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n","import type { PsrtMask, PsrtPage, PsrtText } from '../../types.js'\nimport type { AssetMap } from '../assets/dimensions.js'\nimport { imageDimensions } from '../assets/dimensions.js'\nimport {\n assetRef,\n faceFormat,\n fontFamilyNameForURL,\n fontSrcUrl,\n isAssetReference,\n} from '../assets/refs.js'\nimport { BlockMask, BlockText, pageBlocksByIndex } from '../document/pageBlocks.js'\nimport { appendTextLayerGeometryCSS } from '../geometry/textBlockGeometry.js'\nimport { backgroundColorFromStyle, textFontSizePx } from '../geometry/layoutHelpers.js'\nimport { adaptHTML } from '../style/adapter.js'\nimport { adaptMaskHTML } from '../style/maskAdapter.js'\nimport { htmlLayerCSS } from '../style/render.js'\nimport { normalizeTextContent, renderInlineHTML } from '../text/inlineMarkup.js'\nimport { CompileStep, notifyObservers, type CompileStepObservers } from '../steps.js'\nimport type { CompileOptions } from '../../types.js'\nimport {\n type HtmlVariant,\n maskLayerDomId,\n overlayDomId,\n pageByName,\n textLayerDomId,\n variantLabels,\n} from '../variants.js'\nimport { baseCSS, escapeHtmlAttr, variantClass, variantSwitcherCSS, writeVariantSwitcher } from './script.js'\n\nfunction buildFontCSS(\n fontURLs: string[],\n assets: AssetMap,\n linksOnly: boolean,\n): { fontFacesCSS: string; bodyStack: string } {\n if (fontURLs.length === 0) {\n return {\n fontFacesCSS: '',\n bodyStack: '-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif',\n }\n }\n let fb = ''\n const names: string[] = []\n for (let i = 0; i < fontURLs.length; i++) {\n const u = fontURLs[i]?.trim() ?? ''\n if (!u) continue\n const a = assets.get(u)\n if (!a && !linksOnly) continue\n const name = fontFamilyNameForURL(u, i)\n const src = fontSrcUrl(u, a, linksOnly)\n const format = faceFormat(a?.mime ?? '')\n if (linksOnly || a) {\n fb += `@font-face{font-family:'${name}';src:${src}${format};font-display:swap;}\\n`\n }\n names.push(`'${name}'`)\n }\n if (names.length === 0) {\n return {\n fontFacesCSS: fb,\n bodyStack: '-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif',\n }\n }\n const stack = `${names.join(',')},-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif`\n return { fontFacesCSS: fb, bodyStack: stack }\n}\n\nfunction pageBackgroundCSS(style: PsrtPage['style']): string {\n const bg = backgroundColorFromStyle(style)\n return bg ? `background:${bg};` : ''\n}\n\nfunction writeTextLayer(\n parts: string[],\n t: PsrtText,\n assets: AssetMap,\n canvasW: number,\n canvasH: number,\n variantIndex: number,\n linksOnly: boolean,\n pageName: string,\n observers: CompileStepObservers | undefined,\n): void {\n const content = normalizeTextContent(t.content)\n const fontPx = textFontSizePx(t.textSize, canvasW, canvasH)\n const frags = adaptHTML({\n text: t,\n canvasW,\n canvasH,\n fontSizePx: fontPx,\n htmlCompile: true,\n pageSlug: pageName,\n textIndex: t.index,\n })\n notifyObservers(observers, {\n step: CompileStep.ADAPT_STYLE,\n pageName,\n blockIndex: t.index,\n kind: 'text',\n })\n\n let { boxCSS, textCSS } = htmlLayerCSS(frags)\n boxCSS = appendTextLayerGeometryCSS(boxCSS, t, content, canvasW, canvasH)\n\n const layerId = textLayerDomId(pageName, t.index, variantIndex)\n const classes = `text-layer psrt-text ${variantClass(variantIndex)}`\n\n parts.push(\n `<div id=\"${escapeHtmlAttr(layerId)}\" class=\"${classes}\" style=\"${escapeHtmlAttr(boxCSS)}\">`,\n )\n\n const imgRef = (t.imageRef ?? '').trim()\n if (imgRef && isAssetReference(imgRef)) {\n const aa = assets.get(imgRef)\n if (linksOnly || (aa && aa.mime.startsWith('image/'))) {\n const refURI = assetRef(imgRef, aa, linksOnly)\n parts.push(\n `<img class=\"text-ref-img\" src=\"${escapeHtmlAttr(refURI)}\" alt=\"\" style=\"margin:0 0 .25em 0;display:block;max-width:100%;height:auto\"/>`,\n )\n }\n }\n\n const inlineHTML = renderInlineHTML(content)\n notifyObservers(observers, {\n step: CompileStep.RENDER_INLINE,\n pageName,\n textIndex: t.index,\n htmlLength: inlineHTML.length,\n })\n\n notifyObservers(observers, {\n step: CompileStep.RENDER_TEXT,\n pageName,\n textIndex: t.index,\n contentPreview: content.slice(0, 80),\n })\n\n if (textCSS) {\n parts.push(`<span style=\"${escapeHtmlAttr(textCSS)}\">`)\n } else {\n parts.push('<span>')\n }\n parts.push(inlineHTML)\n parts.push('</span></div>')\n}\n\nfunction writeMaskLayer(\n parts: string[],\n m: PsrtMask,\n assets: AssetMap,\n canvasW: number,\n canvasH: number,\n variantIndex: number,\n linksOnly: boolean,\n pageName: string,\n observers: CompileStepObservers | undefined,\n): void {\n const frags = adaptMaskHTML({\n text: {\n x: m.x,\n y: m.y,\n width: m.width,\n textSize: 0,\n style: m.style,\n index: m.index,\n content: '',\n },\n mask: m,\n canvasW,\n canvasH,\n htmlCompile: true,\n pageSlug: pageName,\n textIndex: m.index,\n })\n notifyObservers(observers, {\n step: CompileStep.ADAPT_STYLE,\n pageName,\n blockIndex: m.index,\n kind: 'mask',\n })\n\n let { boxCSS } = htmlLayerCSS(frags)\n const imgRef = (m.imageRef ?? '').trim()\n if (imgRef && isAssetReference(imgRef)) {\n const aa = assets.get(imgRef)\n if (linksOnly || (aa && aa.mime.startsWith('image/'))) {\n const refURI = assetRef(imgRef, aa, linksOnly)\n if (boxCSS && !boxCSS.endsWith(';')) boxCSS += ';'\n boxCSS += `background-image:url(${refURI});background-size:cover;background-position:center;background-repeat:no-repeat;`\n }\n }\n\n const layerId = maskLayerDomId(pageName, m.index, variantIndex)\n const classes = `text-layer psrt-mask ${variantClass(variantIndex)}`\n\n notifyObservers(observers, {\n step: CompileStep.RENDER_MASK,\n pageName,\n maskIndex: m.index,\n })\n\n parts.push(`<div id=\"${escapeHtmlAttr(layerId)}\" class=\"${classes}\" style=\"${escapeHtmlAttr(boxCSS)}\"></div>`)\n}\n\nfunction writeVariantOverlay(\n parts: string[],\n variantPage: PsrtPage,\n variantIndex: number,\n multiVariant: boolean,\n assets: AssetMap,\n canvasW: number,\n canvasH: number,\n linksOnly: boolean,\n observers: CompileStepObservers | undefined,\n): void {\n const overlayId = overlayDomId(variantPage.name, variantIndex)\n let overlayClasses = `slide-overlay psrt-overlay ${variantClass(variantIndex)}`\n if (multiVariant && variantIndex > 0) {\n overlayClasses += ' psrt-hidden'\n }\n\n parts.push(`<div id=\"${escapeHtmlAttr(overlayId)}\" class=\"${overlayClasses}\">`)\n\n for (const entry of pageBlocksByIndex(variantPage)) {\n if (entry.kind === BlockText && entry.text) {\n writeTextLayer(\n parts,\n entry.text,\n assets,\n canvasW,\n canvasH,\n variantIndex,\n linksOnly,\n variantPage.name,\n observers,\n )\n } else if (entry.kind === BlockMask && entry.mask) {\n writeMaskLayer(\n parts,\n entry.mask,\n assets,\n canvasW,\n canvasH,\n variantIndex,\n linksOnly,\n variantPage.name,\n observers,\n )\n }\n }\n\n parts.push('</div>')\n}\n\nfunction writeSlide(\n parts: string[],\n page: PsrtPage,\n variants: HtmlVariant[],\n assets: AssetMap,\n opts: CompileOptions,\n pageIndex: number,\n multiVariant: boolean,\n observers: CompileStepObservers | undefined,\n): void {\n const bg = pageBackgroundCSS(page.style)\n const imgURL = page.imageUrl.trim()\n const a = assets.get(imgURL)\n if (!opts.linksOnly && !a) {\n throw new Error(`missing fetched asset for page image \"${imgURL}\"`)\n }\n const src = assetRef(imgURL, a, !!opts.linksOnly)\n let canvasW: number\n let canvasH: number\n if (a) {\n const dims = imageDimensions(a.bytes, a.mime)\n canvasW = dims.w\n canvasH = dims.h\n } else {\n const dims = imageDimensions(null, '')\n canvasW = dims.w\n canvasH = dims.h\n }\n\n notifyObservers(observers, {\n step: CompileStep.RENDER_PAGE,\n pageIndex,\n pageName: page.name,\n canvasW,\n canvasH,\n })\n\n let slideStyle = `width:${canvasW}px`\n if (bg) slideStyle += `;${bg}`\n\n parts.push(`<div class=\"slide\" style=\"${escapeHtmlAttr(slideStyle)}\">`)\n parts.push(`<img class=\"slide-img\" src=\"${escapeHtmlAttr(src)}\" alt=\"\"/>`)\n parts.push('<div class=\"slide-overlays\">')\n\n for (let vi = 0; vi < variants.length; vi++) {\n const variantPage = pageByName(variants[vi].doc, page.name)\n if (!variantPage) continue\n writeVariantOverlay(\n parts,\n variantPage,\n vi,\n multiVariant,\n assets,\n canvasW,\n canvasH,\n !!opts.linksOnly,\n observers,\n )\n }\n\n parts.push('</div></div>')\n}\n\nexport function renderHtmlBundle(\n variants: HtmlVariant[],\n assets: AssetMap,\n opts: CompileOptions,\n observers?: CompileStepObservers,\n): string {\n if (variants.length === 0) {\n throw new Error('no variants')\n }\n\n const primary = variants[0].doc\n const labels = variantLabels(variants)\n const multiVariant = variants.length > 1\n const includeVariantUI = multiVariant && !opts.noScript\n\n const { fontFacesCSS, bodyStack } = buildFontCSS(primary.fonts ?? [], assets, !!opts.linksOnly)\n\n notifyObservers(observers, {\n step: CompileStep.RENDER_FONTS,\n fontCount: primary.fonts?.length ?? 0,\n })\n\n let title = 'PSRT'\n if (primary.pages.length > 0 && primary.pages[0]?.name.trim()) {\n title = primary.pages[0].name.trim()\n }\n\n notifyObservers(observers, {\n step: CompileStep.RENDER_HEAD,\n title,\n })\n\n const parts: string[] = []\n parts.push(`<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>${escapeHtmlAttr(title)}</title>\n<style>`)\n parts.push(baseCSS(fontFacesCSS))\n if (multiVariant) parts.push(variantSwitcherCSS())\n parts.push(`\nbody{font-family:${bodyStack};margin:0;padding:0;background:#111;overflow-x:auto;}\n</style>\n</head>\n<body>\n<main class=\"slides-wrap\">\n`)\n\n for (let i = 0; i < primary.pages.length; i++) {\n writeSlide(parts, primary.pages[i], variants, assets, opts, i, multiVariant, observers)\n }\n\n parts.push(`\n</main>\n`)\n if (includeVariantUI) parts.push(writeVariantSwitcher(labels))\n parts.push(`\n</body>\n</html>`)\n\n const html = parts.join('')\n notifyObservers(observers, {\n step: CompileStep.FINALIZE,\n htmlLength: html.length,\n pageCount: primary.pages.length,\n })\n return html\n}\n","import type { CompileToHtmlPureOptions, PsrtDocument } from '../types.js'\nimport { buildAssetMap } from './assets/refs.js'\nimport { imageDimensions, type AssetMap } from './assets/dimensions.js'\nimport { resolveDocumentPure } from './resolve/resolveDocumentPure.js'\nimport { renderHtmlBundle } from './render/html.js'\nimport { CompileStep, notifyObservers } from './steps.js'\nimport { buildHtmlVariants, type HtmlVariant } from './variants.js'\n\nfunction buildAssetMapWithSizes(\n variants: HtmlVariant[],\n linksOnly: boolean,\n): { assets: AssetMap; canvasSizes: Record<string, { w: number; h: number }> } {\n const docs = variants.map((v) => v.doc)\n const assets = buildAssetMap(docs, linksOnly)\n const canvasSizes: Record<string, { w: number; h: number }> = {}\n for (const doc of docs) {\n for (const page of doc.pages) {\n const url = page.imageUrl.trim()\n if (canvasSizes[url]) continue\n const asset = assets.get(url)\n if (asset) {\n canvasSizes[url] = imageDimensions(asset.bytes, asset.mime)\n } else if (linksOnly) {\n canvasSizes[url] = imageDimensions(null, '')\n }\n }\n }\n return { assets, canvasSizes }\n}\n\n/** Compiles PsrtDocument to HTML using pure JavaScript (no WASM). */\nexport function compileToHtmlPure(\n doc: PsrtDocument,\n options?: CompileToHtmlPureOptions,\n): string {\n const opts = options ?? {}\n const primary = resolveDocumentPure(doc)\n notifyObservers(opts.observers, { step: CompileStep.RESOLVE, doc: primary })\n\n const extraResolved = (opts.variants ?? []).map((v) => ({\n label: v.label,\n doc: resolveDocumentPure(v.doc),\n }))\n\n const htmlVariants = buildHtmlVariants(primary, extraResolved)\n\n const { assets, canvasSizes } = buildAssetMapWithSizes(htmlVariants, !!opts.linksOnly)\n notifyObservers(opts.observers, {\n step: CompileStep.BUILD_ASSETS,\n assetCount: assets.size,\n canvasSizes,\n })\n\n return renderHtmlBundle(htmlVariants, assets, opts, opts.observers)\n}\n\nexport { resolveDocumentPure } from './resolve/resolveDocumentPure.js'\nexport {\n CompileStep,\n notifyObservers,\n type CompileStepContext,\n type CompileStepObserver,\n type CompileStepObservers,\n} from './steps.js'\n","import { invokeCompileToHtml, invokeCompileToSvg } from './wasm.js'\nimport { compileToHtmlPure as compileToHtmlPureImpl } from './html/compilePure.js'\nimport type { CompileOptions, CompileToHtmlPureOptions, PsrtDocument } from './types.js'\n\n/** Compiles the document to a self-contained HTML string (WASM). */\nexport function compileToHtml(doc: PsrtDocument | string, options?: CompileOptions): string {\n return invokeCompileToHtml(doc, options)\n}\n\n/** Compiles PsrtDocument to HTML using pure JavaScript (no WASM, no initPsrt). */\nexport function compileToHtmlPure(doc: PsrtDocument, options?: CompileToHtmlPureOptions): string {\n return compileToHtmlPureImpl(doc, options)\n}\n\nexport {\n resolveDocumentPure,\n CompileStep,\n notifyObservers,\n type CompileStepContext,\n type CompileStepObserver,\n type CompileStepObservers,\n} from './html/compilePure.js'\n\n/** Compiles one page of the document to SVG. */\nexport function compileToSvg(\n doc: PsrtDocument | string,\n pageName: string,\n options?: CompileOptions\n): string {\n return invokeCompileToSvg(doc, pageName, options)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addConst(doc: PsrtDocument, name: string, value: string): PsrtDocument {\n return invokeDocMutation('addConst', doc, name, value)\n}\n\nexport function removeConst(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removeConst', doc, name)\n}\n\nexport function substituteConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('substituteConstReferences', doc, name, value)\n}\n\nexport function revertConstReferences(\n doc: PsrtDocument,\n name: string,\n value: string\n): PsrtDocument {\n return invokeDocMutation('revertConstReferences', doc, name, value)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument } from '../types.js'\n\nexport function addFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('addFont', doc, url)\n}\n\nexport function removeFont(doc: PsrtDocument, url: string): PsrtDocument {\n return invokeDocMutation('removeFont', doc, url)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PsrtDocument, PsrtPage, PsrtStyle } from '../types.js'\n\nexport function renamePage(doc: PsrtDocument, oldName: string, newName: string): PsrtDocument {\n return invokeDocMutation('renamePage', doc, oldName, newName)\n}\n\nexport function setPagePath(doc: PsrtDocument, pageName: string, path: string): PsrtDocument {\n return invokeDocMutation('setPagePath', doc, pageName, path)\n}\n\nexport function setPageStyle(\n doc: PsrtDocument,\n pageName: string,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setPageStyle', doc, pageName, key, value, partial)\n}\n\nexport function removePageStyleKey(doc: PsrtDocument, pageName: string, key: string): PsrtDocument {\n return invokeDocMutation('removePageStyleKey', doc, pageName, key)\n}\n\nexport function movePage(\n doc: PsrtDocument,\n pageName: string,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('movePage', doc, pageName, before, after)\n}\n\nexport function addPage(\n doc: PsrtDocument,\n page: PsrtPage,\n before = '',\n after = ''\n): PsrtDocument {\n return invokeDocMutation('addPage', doc, page, before, after)\n}\n\nexport function removePage(doc: PsrtDocument, name: string): PsrtDocument {\n return invokeDocMutation('removePage', doc, name)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { PositionFields, PsrtDocument, PsrtStyle, PsrtText } from '../types.js'\n\nexport function setTextStyle(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setTextStyle', doc, pageName, textIndex, key, value, partial)\n}\n\nexport function removeTextStyleKey(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeTextStyleKey', doc, pageName, textIndex, key)\n}\n\nexport function setTextContent(\n doc: PsrtDocument,\n pageName: string,\n index: number,\n newContent: string,\n appendContent = false\n): PsrtDocument {\n return invokeDocMutation('setTextContent', doc, pageName, index, newContent, appendContent)\n}\n\nexport function addText(\n doc: PsrtDocument,\n pageName: string,\n text: PsrtText,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addText', doc, pageName, text, beforeIndex, afterIndex)\n}\n\nexport function removeText(doc: PsrtDocument, pageName: string, textIndex: number): PsrtDocument {\n return invokeDocMutation('removeText', doc, pageName, textIndex)\n}\n\nexport function reorderTextRelative(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('reorderTextRelative', doc, pageName, textIndex, beforeIndex, afterIndex)\n}\n\nexport function reorderTextTo(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n to: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextTo', doc, pageName, textIndex, to)\n}\n\nexport function reorderTextByDelta(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: number\n): PsrtDocument {\n return invokeDocMutation('reorderTextByDelta', doc, pageName, textIndex, delta)\n}\n\nexport function setTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n pos: PositionFields\n): PsrtDocument {\n return invokeDocMutation('setTextPosition', doc, pageName, textIndex, pos)\n}\n\nexport function nudgeTextPosition(\n doc: PsrtDocument,\n pageName: string,\n textIndex: number,\n delta: PositionFields\n): PsrtDocument {\n return invokeDocMutation('nudgeTextPosition', doc, pageName, textIndex, delta)\n}\n","import { invokeDocMutation } from '../wasm.js'\nimport type { MaskPositionFields, PsrtDocument, PsrtMask, PsrtStyle } from '../types.js'\n\nexport function setMaskPosition(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n pos: MaskPositionFields\n): PsrtDocument {\n const posBytes = new TextEncoder().encode(JSON.stringify(pos))\n return invokeDocMutation('setMaskPosition', doc, pageName, maskIndex, posBytes)\n}\n\nexport function addMask(\n doc: PsrtDocument,\n pageName: string,\n mask: PsrtMask,\n beforeIndex = -1,\n afterIndex = -1\n): PsrtDocument {\n return invokeDocMutation('addMask', doc, pageName, mask, beforeIndex, afterIndex)\n}\n\nexport function removeMask(doc: PsrtDocument, pageName: string, maskIndex: number): PsrtDocument {\n return invokeDocMutation('removeMask', doc, pageName, maskIndex)\n}\n\nexport function setMaskStyle(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n): PsrtDocument {\n return invokeDocMutation('setMaskStyle', doc, pageName, maskIndex, key, value, partial)\n}\n\nexport function removeMaskStyleKey(\n doc: PsrtDocument,\n pageName: string,\n maskIndex: number,\n key: string\n): PsrtDocument {\n return invokeDocMutation('removeMaskStyleKey', doc, pageName, maskIndex, key)\n}\n","import { parse, stringify } from './parse.js'\nimport type { MaskPositionFields, PositionFields, PsrtDocument, PsrtMask, PsrtPage, PsrtStyle, PsrtText } from './types.js'\nimport {\n addConst,\n removeConst,\n substituteConstReferences,\n revertConstReferences,\n} from './editor/consts.js'\nimport { addFont, removeFont } from './editor/fonts.js'\nimport {\n addPage,\n movePage,\n removePage,\n removePageStyleKey,\n renamePage,\n setPagePath,\n setPageStyle,\n} from './editor/pages.js'\nimport {\n addText,\n nudgeTextPosition,\n removeText,\n removeTextStyleKey,\n reorderTextByDelta,\n reorderTextRelative,\n reorderTextTo,\n setTextContent,\n setTextPosition,\n setTextStyle,\n} from './editor/text.js'\nimport {\n addMask,\n removeMask,\n removeMaskStyleKey,\n setMaskPosition,\n setMaskStyle,\n} from './editor/mask.js'\n\n/** Fluent builder for chained PSRT document edits. */\nexport class Transformer {\n private _doc: PsrtDocument\n\n constructor(input: PsrtDocument | string) {\n this._doc = typeof input === 'string' ? parse(input) : structuredClone(input)\n }\n\n /** Read-only view of the current document state. */\n get document(): Readonly<PsrtDocument> {\n return this._doc\n }\n\n addConst(name: string, value: string): this {\n this._doc = addConst(this._doc, name, value)\n return this\n }\n\n removeConst(name: string): this {\n this._doc = removeConst(this._doc, name)\n return this\n }\n\n substituteConstReferences(name: string, value: string): this {\n this._doc = substituteConstReferences(this._doc, name, value)\n return this\n }\n\n revertConstReferences(name: string, value: string): this {\n this._doc = revertConstReferences(this._doc, name, value)\n return this\n }\n\n addFont(url: string): this {\n this._doc = addFont(this._doc, url)\n return this\n }\n\n removeFont(url: string): this {\n this._doc = removeFont(this._doc, url)\n return this\n }\n\n renamePage(oldName: string, newName: string): this {\n this._doc = renamePage(this._doc, oldName, newName)\n return this\n }\n\n setPagePath(pageName: string, path: string): this {\n this._doc = setPagePath(this._doc, pageName, path)\n return this\n }\n\n setPageStyle(pageName: string, key: string, value: string, partial?: PsrtStyle): this {\n this._doc = setPageStyle(this._doc, pageName, key, value, partial)\n return this\n }\n\n removePageStyleKey(pageName: string, key: string): this {\n this._doc = removePageStyleKey(this._doc, pageName, key)\n return this\n }\n\n movePage(pageName: string, before = '', after = ''): this {\n this._doc = movePage(this._doc, pageName, before, after)\n return this\n }\n\n addPage(page: PsrtPage, before = '', after = ''): this {\n this._doc = addPage(this._doc, page, before, after)\n return this\n }\n\n removePage(name: string): this {\n this._doc = removePage(this._doc, name)\n return this\n }\n\n setTextStyle(\n pageName: string,\n textIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setTextStyle(this._doc, pageName, textIndex, key, value, partial)\n return this\n }\n\n removeTextStyleKey(pageName: string, textIndex: number, key: string): this {\n this._doc = removeTextStyleKey(this._doc, pageName, textIndex, key)\n return this\n }\n\n setTextContent(pageName: string, index: number, content: string, appendContent = false): this {\n this._doc = setTextContent(this._doc, pageName, index, content, appendContent)\n return this\n }\n\n addText(\n pageName: string,\n text: PsrtText,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addText(this._doc, pageName, text, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeText(pageName: string, textIndex: number): this {\n this._doc = removeText(this._doc, pageName, textIndex)\n return this\n }\n\n reorderTextRelative(\n pageName: string,\n textIndex: number,\n beforeIndex = 0,\n afterIndex = 0\n ): this {\n this._doc = reorderTextRelative(this._doc, pageName, textIndex, beforeIndex, afterIndex)\n return this\n }\n\n reorderTextTo(pageName: string, textIndex: number, to: number): this {\n this._doc = reorderTextTo(this._doc, pageName, textIndex, to)\n return this\n }\n\n reorderTextByDelta(pageName: string, textIndex: number, delta: number): this {\n this._doc = reorderTextByDelta(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setTextPosition(pageName: string, textIndex: number, pos: PositionFields): this {\n this._doc = setTextPosition(this._doc, pageName, textIndex, pos)\n return this\n }\n\n nudgeTextPosition(pageName: string, textIndex: number, delta: PositionFields): this {\n this._doc = nudgeTextPosition(this._doc, pageName, textIndex, delta)\n return this\n }\n\n setMaskPosition(pageName: string, maskIndex: number, pos: MaskPositionFields): this {\n this._doc = setMaskPosition(this._doc, pageName, maskIndex, pos)\n return this\n }\n\n addMask(\n pageName: string,\n mask: PsrtMask,\n opts?: { beforeIndex?: number; afterIndex?: number }\n ): this {\n this._doc = addMask(this._doc, pageName, mask, opts?.beforeIndex ?? -1, opts?.afterIndex ?? -1)\n return this\n }\n\n removeMask(pageName: string, maskIndex: number): this {\n this._doc = removeMask(this._doc, pageName, maskIndex)\n return this\n }\n\n setMaskStyle(\n pageName: string,\n maskIndex: number,\n key: string,\n value: string,\n partial?: PsrtStyle\n ): this {\n this._doc = setMaskStyle(this._doc, pageName, maskIndex, key, value, partial)\n return this\n }\n\n removeMaskStyleKey(pageName: string, maskIndex: number, key: string): this {\n this._doc = removeMaskStyleKey(this._doc, pageName, maskIndex, key)\n return this\n }\n\n /** Returns the accumulated document after the edit chain. */\n build(): PsrtDocument {\n return structuredClone(this._doc)\n }\n\n /** Shortcut: build() + stringify(). */\n buildPsrt(): string {\n return stringify(this.build())\n }\n}\n\nexport function transform(input: PsrtDocument | string): Transformer {\n return new Transformer(input)\n}\n","import { invokeRaw, invokeText } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\nexport interface WebPreviewStyle {\n container: Record<string, string>\n text: Record<string, string>\n hasStroke: boolean\n}\n\n/** Adapts text/mask entries for live web preview CSS (percent → px, stroke → WebKit, etc.). */\nexport function adaptEntriesForWeb(\n entriesJSON: string,\n canvasW: number,\n canvasH: number,\n zoom: number,\n): WebPreviewStyle[] {\n return invokeRaw<WebPreviewStyle[]>('adaptEntriesForWeb', entriesJSON, canvasW, canvasH, zoom)\n}\n\n/** Applies a page PSRT fragment into a full document. */\nexport function mergePageDocumentPSRT(\n fullDocJSON: string,\n pageName: string,\n psrtText: string,\n): PsrtDocument {\n const json = invokeText('mergePageDocumentPSRT', fullDocJSON, pageName, psrtText)\n return JSON.parse(json) as PsrtDocument\n}\n\n/** Formats one page plus document fonts and constants as PSRT text. */\nexport function formatPageDocumentJSON(docJSON: string, pageName: string): string {\n return invokeText('formatPageDocumentJSON', docJSON, pageName)\n}\n","import { invokeStyleMutation } from '../wasm.js'\nimport type { PsrtStyle } from '../types.js'\n\nexport function setStyleKey(style: PsrtStyle, key: string, value: string): PsrtStyle {\n return invokeStyleMutation('setStyleKey', style, key, value) as PsrtStyle\n}\n\nexport function removeStyleKey(style: PsrtStyle, key: string): PsrtStyle {\n return invokeStyleMutation('removeStyleKey', style, key) as PsrtStyle\n}\n\nexport function mergeStyle(style: PsrtStyle, partial: PsrtStyle): PsrtStyle {\n const partialBytes = new TextEncoder().encode(JSON.stringify(partial))\n return invokeStyleMutation('mergeStyle', style, partialBytes) as PsrtStyle\n}\n","import { invokeDocQuery, invokeRaw } from '../wasm.js'\nimport type { PsrtDocument, PsrtMask, PsrtPage, PsrtText } from '../types.js'\n\nexport function findPage(doc: PsrtDocument, name: string): PsrtPage {\n return invokeDocQuery<PsrtPage>('findPage', doc, name)\n}\n\nexport function findPageIndex(doc: PsrtDocument, name: string): number {\n return invokeDocQuery<{ index: number }>('findPageIndex', doc, name).index\n}\n\nexport function findTextByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtText {\n return invokeDocQuery<PsrtText>('findTextByIndex', doc, pageName, index)\n}\n\nexport function findMaskByIndex(doc: PsrtDocument, pageName: string, index: number): PsrtMask {\n return invokeDocQuery<PsrtMask>('findMaskByIndex', doc, pageName, index)\n}\n\nexport function parseTextIndex(s: string): number {\n return invokeRaw<{ index: number }>('parseTextIndex', s).index\n}\n","import { invokeDocMutation } from './wasm.js'\nimport type { PsrtDocument } from './types.js'\n\n/** Expands all @const@ placeholders in styles, content, and URLs. */\nexport function resolveDocument(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocument', doc)\n}\n\n/** Like resolveDocument but throws on invalid style JSON after expansion. */\nexport function resolveDocumentStrict(doc: PsrtDocument): PsrtDocument {\n return invokeDocMutation('resolveDocumentStrict', doc)\n}\n"],"mappings":"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","names":["bytes","n","v","n","raw","parsePxNum","parsePxNum","textFontSizePx","textSizeBasisPx","transform","applyTransform","transform","compileToHtmlPure"]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@psrt/sdk",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Stateless PSRT SDK
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Stateless PSRT SDK for parsing, editing, and compiling PSRT documents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
7
|
+
"module": "./dist/browser/index.js",
|
|
8
|
+
"types": "./dist/browser/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
+
"types": "./dist/browser/index.d.ts",
|
|
12
|
+
"node": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
},
|
|
17
|
+
"browser": "./dist/browser/index.js",
|
|
18
|
+
"import": "./dist/browser/index.js",
|
|
19
|
+
"require": "./dist/index.cjs",
|
|
20
|
+
"default": "./dist/browser/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./node": {
|
|
11
23
|
"types": "./dist/index.d.ts",
|
|
12
24
|
"import": "./dist/index.js",
|
|
13
25
|
"require": "./dist/index.cjs"
|
|
14
|
-
}
|
|
15
|
-
"./wasm/*": "./wasm/*"
|
|
26
|
+
}
|
|
16
27
|
},
|
|
17
28
|
"files": [
|
|
18
29
|
"dist",
|