rtl-text-transform 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +529 -2
- package/dist/chunk-QDWUKRPS.js +1853 -0
- package/dist/chunk-QDWUKRPS.js.map +1 -0
- package/dist/index.cjs +1867 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +261 -0
- package/dist/index.d.ts +261 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +1951 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +37 -0
- package/dist/react.d.ts +37 -0
- package/dist/react.js +84 -0
- package/dist/react.js.map +1 -0
- package/package.json +104 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/easing.ts","../src/core/math.ts","../src/core/effects/rise.ts","../src/core/filter.ts","../src/core/layers.ts","../src/core/options.ts","../src/core/presets.ts","../src/core/atoms.ts","../src/core/chunks.ts","../src/core/diff.ts","../src/core/scene.ts","../src/core/transition.ts","../src/core/controller.ts"],"names":["clamp01","normalizeThreshold","nextIndex","indices","merged","row","column","nonNegative","view","next","reduced"],"mappings":"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","file":"index.cjs","sourcesContent":["export type EasingFunction = (t: number) => number;\n\n/** Linear fallback, useful as an explicit opt-out. */\nexport function linear(t: number): number {\n return t;\n}\n\nfunction clamp01(value: number): number {\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n}\n\n/**\n * CSS-style cubic-bezier easing.\n *\n * X control points are clamped to 0..1 so the curve remains a function of time.\n * Y values are left untouched for the caller to clamp if its property needs it.\n */\nexport function cubicBezier(x1: number, y1: number, x2: number, y2: number): EasingFunction {\n const cx = 3 * clamp01(x1);\n const bx = 3 * (clamp01(x2) - clamp01(x1)) - cx;\n const ax = 1 - cx - bx;\n\n const cy = 3 * y1;\n const by = 3 * (y2 - y1) - cy;\n const ay = 1 - cy - by;\n\n const sampleX = (t: number): number => ((ax * t + bx) * t + cx) * t;\n const sampleY = (t: number): number => ((ay * t + by) * t + cy) * t;\n const sampleDerivativeX = (t: number): number => (3 * ax * t + 2 * bx) * t + cx;\n\n return (input: number): number => {\n if (input <= 0) return 0;\n if (input >= 1) return 1;\n\n let t = input;\n for (let step = 0; step < 8; step += 1) {\n const error = sampleX(t) - input;\n if (Math.abs(error) < 1e-6) return sampleY(t);\n\n const derivative = sampleDerivativeX(t);\n if (Math.abs(derivative) < 1e-6) break;\n t -= error / derivative;\n }\n\n let lower = 0;\n let upper = 1;\n t = clamp01(t);\n for (let step = 0; step < 20; step += 1) {\n const value = sampleX(t);\n if (Math.abs(value - input) < 1e-6) break;\n if (value < input) lower = t;\n else upper = t;\n t = (lower + upper) / 2;\n }\n\n return sampleY(t);\n };\n}\n\n/** Smooth symmetric curve for the overall morph. */\nexport const easeInOutCubic: EasingFunction = cubicBezier(0.65, 0, 0.35, 1);\n\n/** Decelerating curve for entering and exiting hunks. */\nexport const easeOutCubic: EasingFunction = cubicBezier(0.33, 1, 0.68, 1);\n\nexport const DEFAULT_MORPH_EASING: EasingFunction = easeInOutCubic;\nexport const DEFAULT_RISE_EASING: EasingFunction = easeOutCubic;\n","/**\n * Pure math for the goo morph effect.\n *\n * A \"light fraction\" is the amount of a text layer that is allowed through:\n * 1 = fully visible and sharp, 0 = fully transparent and maximally blurred.\n * These helpers contain no DOM access so they can be unit-tested and reused.\n */\n\nexport const MAX_BLUR_PX = 100;\nexport const OPACITY_EXPONENT = 0.4;\n\n/** Clamp a number to the inclusive 0..1 range. NaN becomes 0. */\nexport function clamp01(value: number): number {\n if (Number.isNaN(value)) return 0;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n}\n\n/**\n * Blur in pixels for a layer at `fraction`.\n *\n * `min(blurEm * fontSizePx * (1 / fraction - 1), 100)`.\n * At fraction 1 the layer is sharp; at fraction 0 it is clamped to 100px.\n */\nexport function blurForFraction(fraction: number, fontSizePx: number, blurEm: number): number {\n const f = clamp01(fraction);\n if (f >= 1) return 0;\n if (f <= 0) return MAX_BLUR_PX;\n\n const fontSize = Number.isFinite(fontSizePx) && fontSizePx > 0 ? fontSizePx : 16;\n const blurEmSafe = Number.isFinite(blurEm) && blurEm > 0 ? blurEm : 0;\n const blur = blurEmSafe * fontSize * (1 / f - 1);\n return Math.min(MAX_BLUR_PX, Math.max(0, blur));\n}\n\n/** Opacity for a layer at `fraction`: `fraction ** 0.4`. */\nexport function opacityForFraction(fraction: number): number {\n return Math.pow(clamp01(fraction), OPACITY_EXPONENT);\n}\n\nexport interface VisualState {\n blurPx: number;\n opacity: number;\n}\n\n/** Both layer visuals for a light fraction. */\nexport function visualForFraction(\n fraction: number,\n fontSizePx: number,\n blurEm: number,\n): VisualState {\n return {\n blurPx: blurForFraction(fraction, fontSizePx, blurEm),\n opacity: opacityForFraction(fraction),\n };\n}\n\n/** CSS filter value for a threshold matrix row \"0 0 0 255 -T\". */\nexport function thresholdMatrix(threshold: number): string {\n const t = Math.max(0, Math.min(255, threshold));\n return `1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 255 -${t}`;\n}\n\n/** Total length of one rest + morph cycle, in seconds. */\nexport function cycleDuration(morphTime: number, restTime: number): number {\n return Math.max(0, morphTime) + Math.max(0, restTime);\n}\n\nexport interface CyclePosition {\n /** Zero-based cycle number for looping playback. */\n cycleIndex: number;\n /** Eased-agnostic morph fraction, 0..1. */\n fraction: number;\n /** True while the cycle is in its rest window. */\n atRest: boolean;\n}\n\n/**\n * Position inside the demo's rest-then-morph cycle.\n *\n * Elapsed time is split into `restTime` followed by `morphTime`. This mirrors\n * the original demo, which shows the current word during rest and morphs to\n * the next word afterwards.\n */\nexport function cyclePosition(elapsed: number, morphTime: number, restTime: number): CyclePosition {\n const rest = Math.max(0, restTime);\n const morph = Math.max(0, morphTime);\n const duration = rest + morph;\n\n if (duration <= 0) {\n return { cycleIndex: 0, fraction: 1, atRest: true };\n }\n\n const time = Math.max(0, elapsed);\n const cycleIndex = Math.floor(time / duration);\n const local = time - cycleIndex * duration;\n\n if (local < rest) {\n return { cycleIndex, fraction: 0, atRest: true };\n }\n if (morph <= 0) {\n return { cycleIndex, fraction: 1, atRest: true };\n }\n\n const fraction = clamp01((local - rest) / morph);\n return { cycleIndex, fraction, atRest: fraction >= 1 };\n}\n\n/** Wrap or clamp an index depending on the loop setting. */\nexport function wrapIndex(index: number, length: number, loop: boolean): number {\n if (length <= 0) return 0;\n if (loop) return ((index % length) + length) % length;\n return Math.max(0, Math.min(length - 1, index));\n}\n\n/** True when another word can be shown without wrapping. */\nexport function canAdvance(index: number, length: number, loop: boolean): boolean {\n if (length <= 1) return false;\n if (loop) return true;\n return index < length - 1;\n}\n","import { clamp01 } from \"../math\";\nimport type { RiseFlow } from \"../options\";\n\nexport interface RiseTiming {\n /** Window for an entering hunk, in seconds. */\n window: number;\n /** Effective delay between neighbouring hunks, in seconds. */\n stagger: number;\n /** Fraction of the entering window used as overlap. */\n overlap: number;\n}\n\nexport interface RiseTransform {\n /** Horizontal offset in em. */\n xEm: number;\n /** Vertical offset in em. */\n yEm: number;\n scale: number;\n /** Motion-blur strength in em. */\n blurEm: number;\n}\n\nfunction withoutNegativeZero(value: number): number {\n return value === 0 ? 0 : value;\n}\n\nconst MAX_STAGGER_SHARE = 0.35;\nconst EXIT_DURATION = 0.7;\n\n/**\n * Fit the archive's staggered hunk timing inside one shared morph duration.\n * The archive could run longer than its base duration; the unified engine keeps\n * every effect on the same clock instead.\n */\nexport function riseTiming(\n durationSeconds: number,\n hunkCount: number,\n staggerMs: number,\n overlap: number,\n): RiseTiming {\n const duration = Math.max(0, durationSeconds);\n const count = Math.max(1, Math.floor(hunkCount));\n const configuredStagger = Math.max(0, staggerMs) / 1000;\n const stagger =\n count > 1 ? Math.min(configuredStagger, (duration * MAX_STAGGER_SHARE) / (count - 1)) : 0;\n const maxDelay = (count - 1) * stagger;\n const window = Math.max(0, duration - maxDelay) / (1 + overlap);\n return { window, stagger, overlap };\n}\n\n/** Local 0..1 progress for an entering hunk. */\nexport function enterProgress(elapsedSeconds: number, order: number, timing: RiseTiming): number {\n if (timing.window <= 0) return 1;\n const start = order * timing.stagger + timing.window * timing.overlap;\n return clamp01((elapsedSeconds - start) / timing.window);\n}\n\n/** Local 0..1 progress for an exiting hunk. */\nexport function exitProgress(elapsedSeconds: number, order: number, timing: RiseTiming): number {\n const duration = timing.window * EXIT_DURATION;\n if (duration <= 0) return 1;\n const start = order * timing.stagger;\n return clamp01((elapsedSeconds - start) / duration);\n}\n\nexport function enterTransform(\n progress: number,\n travelEm: number,\n scale: number,\n blurEm: number,\n flow: RiseFlow,\n): RiseTransform {\n const eased = clamp01(progress);\n const distance = travelEm * (1 - eased);\n let xEm = 0;\n let yEm = 0;\n\n if (flow === \"up\") yEm = distance;\n else if (flow === \"down\") yEm = -distance;\n else if (flow === \"left\") xEm = distance;\n else xEm = -distance;\n\n return {\n xEm: withoutNegativeZero(xEm),\n yEm: withoutNegativeZero(yEm),\n scale: 1 - (1 - scale) * (1 - eased),\n blurEm: blurEm * (1 - eased),\n };\n}\n\nexport function exitTransform(\n progress: number,\n travelEm: number,\n scale: number,\n blurEm: number,\n flow: RiseFlow,\n): RiseTransform {\n const eased = clamp01(progress);\n const distance = travelEm * 0.6 * eased;\n let xEm = 0;\n let yEm = 0;\n\n if (flow === \"up\") yEm = -distance;\n else if (flow === \"down\") yEm = distance;\n else if (flow === \"left\") xEm = -distance;\n else xEm = distance;\n\n return {\n xEm: withoutNegativeZero(xEm),\n yEm: withoutNegativeZero(yEm),\n scale: 1 - (1 - scale) * eased,\n blurEm: blurEm * eased,\n };\n}\n","import { thresholdMatrix } from \"./math\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport interface GooFilterHandle {\n readonly id: string;\n readonly threshold: number;\n /** Decrement the reference count and remove the SVG when it reaches zero. */\n release(): void;\n}\n\ninterface FilterEntry {\n id: string;\n threshold: number;\n svg: SVGSVGElement;\n refs: number;\n}\n\n/**\n * Each document gets its own registry so iframes and multiple documents do not\n * share SVG nodes. IDs are globally unique within the module.\n */\nconst registries = new WeakMap<Document, Map<number, FilterEntry>>();\nlet idCounter = 0;\n\nfunction normalizeThreshold(threshold: number): number {\n if (!Number.isFinite(threshold)) return 140;\n return Math.max(0, Math.min(255, Math.round(threshold)));\n}\n\nfunction registryFor(doc: Document): Map<number, FilterEntry> {\n let registry = registries.get(doc);\n if (!registry) {\n registry = new Map();\n registries.set(doc, registry);\n }\n return registry;\n}\n\nfunction setStyles(el: SVGElement, styles: Record<string, string>): void {\n for (const [name, value] of Object.entries(styles)) {\n el.style.setProperty(name, value);\n }\n}\n\nfunction createFilterSvg(doc: Document, threshold: number): FilterEntry {\n const id = `goo-morph-${++idCounter}`;\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"focusable\", \"false\");\n svg.setAttribute(\"width\", \"0\");\n svg.setAttribute(\"height\", \"0\");\n setStyles(svg, {\n position: \"absolute\",\n width: \"0\",\n height: \"0\",\n overflow: \"hidden\",\n \"pointer-events\": \"none\",\n });\n\n const defs = doc.createElementNS(SVG_NS, \"defs\");\n const filter = doc.createElementNS(SVG_NS, \"filter\");\n filter.setAttribute(\"id\", id);\n // Be generous with the filter region: Arabic dots, ascenders and descenders\n // sit well outside the em box at heavy weights.\n filter.setAttribute(\"x\", \"-25%\");\n filter.setAttribute(\"y\", \"-35%\");\n filter.setAttribute(\"width\", \"150%\");\n filter.setAttribute(\"height\", \"170%\");\n filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n\n const matrix = doc.createElementNS(SVG_NS, \"feColorMatrix\");\n matrix.setAttribute(\"in\", \"SourceGraphic\");\n matrix.setAttribute(\"type\", \"matrix\");\n matrix.setAttribute(\"values\", thresholdMatrix(threshold));\n\n filter.appendChild(matrix);\n defs.appendChild(filter);\n svg.appendChild(defs);\n (doc.body ?? doc.documentElement).appendChild(svg);\n\n return { id, threshold, svg, refs: 0 };\n}\n\n/**\n * Acquire a shared SVG filter for a threshold. The filter is created lazily,\n * kept while at least one morph uses it, and removed when the last handle is\n * released.\n */\nexport function acquireGooFilter(\n threshold: number,\n doc: Document | undefined = typeof document === \"undefined\" ? undefined : document,\n): GooFilterHandle | null {\n if (!doc) return null;\n\n const normalized = normalizeThreshold(threshold);\n const registry = registryFor(doc);\n let entry = registry.get(normalized);\n if (!entry || !entry.svg.isConnected) {\n if (entry) registry.delete(normalized);\n entry = createFilterSvg(doc, normalized);\n registry.set(normalized, entry);\n }\n\n entry.refs += 1;\n let released = false;\n\n return {\n id: entry.id,\n threshold: normalized,\n release() {\n if (released) return;\n released = true;\n\n const current = registry.get(normalized);\n if (!current || current !== entry) return;\n current.refs = Math.max(0, current.refs - 1);\n if (current.refs === 0) {\n current.svg.remove();\n registry.delete(normalized);\n }\n },\n };\n}\n\n/** Current reference count for a threshold. Primarily useful in tests. */\nexport function getFilterRefCount(\n threshold: number,\n doc: Document | undefined = typeof document === \"undefined\" ? undefined : document,\n): number {\n if (!doc) return 0;\n return registryFor(doc).get(normalizeThreshold(threshold))?.refs ?? 0;\n}\n\n/** Current filter element for a threshold, or null. Primarily useful in tests. */\nexport function getFilterElement(\n threshold: number,\n doc: Document | undefined = typeof document === \"undefined\" ? undefined : document,\n): SVGFilterElement | null {\n if (!doc) return null;\n return registryFor(doc).get(normalizeThreshold(threshold))?.svg.querySelector(\"filter\") ?? null;\n}\n","import { visualForFraction } from \"./math\";\n\nexport interface MorphLayer {\n /** Positioning shell. */\n el: HTMLDivElement;\n /** Text line inside the shell. */\n line: HTMLSpanElement;\n}\n\nexport interface MorphStage {\n outgoing: MorphLayer;\n incoming: MorphLayer;\n live: HTMLSpanElement;\n}\n\nconst HIDDEN_STYLE = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n \"clip-path\": \"inset(50%)\",\n \"white-space\": \"nowrap\",\n border: \"0\",\n} as const;\n\nfunction styleShell(el: HTMLDivElement): void {\n const style = el.style;\n style.position = \"absolute\";\n style.inset = \"0\";\n style.display = \"flex\";\n style.alignItems = \"center\";\n style.justifyContent = \"center\";\n style.width = \"100%\";\n style.height = \"100%\";\n style.margin = \"0\";\n style.padding = \"0\";\n style.pointerEvents = \"none\";\n style.fontFamily = \"inherit\";\n style.fontSize = \"inherit\";\n style.fontWeight = \"inherit\";\n style.fontStyle = \"inherit\";\n style.fontStretch = \"inherit\";\n style.fontVariant = \"inherit\";\n style.lineHeight = \"inherit\";\n style.color = \"inherit\";\n style.textAlign = \"center\";\n style.overflow = \"visible\";\n}\n\nfunction styleLine(line: HTMLSpanElement): void {\n const style = line.style;\n style.display = \"block\";\n style.margin = \"0\";\n style.padding = \"0\";\n style.whiteSpace = \"nowrap\";\n style.direction = \"inherit\";\n style.textAlign = \"center\";\n style.userSelect = \"none\";\n style.webkitUserSelect = \"none\";\n style.pointerEvents = \"none\";\n style.transformOrigin = \"center center\";\n style.opacity = \"1\";\n style.filter = \"none\";\n // Positive tracking breaks Arabic joins between letters, so this is forced\n // regardless of host styles.\n style.setProperty(\"letter-spacing\", \"0\", \"important\");\n}\n\nfunction createLayer(doc: Document, role: \"outgoing\" | \"incoming\"): MorphLayer {\n const el = doc.createElement(\"div\");\n const line = doc.createElement(\"span\");\n\n el.setAttribute(\"aria-hidden\", \"true\");\n el.dataset.morphLayer = role;\n styleShell(el);\n\n line.dataset.morphLine = role;\n styleLine(line);\n\n el.append(line);\n return { el, line };\n}\n\n/**\n * Replace the host's children with two animated layer shells and one live\n * region. The caller is responsible for preserving pre-existing content.\n */\nexport function createStage(host: HTMLElement): MorphStage {\n const doc = host.ownerDocument;\n const outgoing = createLayer(doc, \"outgoing\");\n const incoming = createLayer(doc, \"incoming\");\n const live = doc.createElement(\"span\");\n\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n live.dataset.morphLive = \"\";\n for (const [name, value] of Object.entries(HIDDEN_STYLE)) {\n live.style.setProperty(name, value);\n }\n\n host.replaceChildren(outgoing.el, incoming.el, live);\n return { outgoing, incoming, live };\n}\n\nfunction defaultView(host: HTMLElement): Window | null {\n return host.ownerDocument.defaultView;\n}\n\n/**\n * Give the host enough room for the filter region and vertical travel without\n * fighting a layout the author configured explicitly.\n */\nexport function sizeHost(host: HTMLElement): void {\n const view = defaultView(host);\n const computed = view?.getComputedStyle(host);\n const computedPosition = computed?.position ?? \"\";\n\n if (!host.style.position && (computedPosition === \"\" || computedPosition === \"static\")) {\n host.style.position = \"relative\";\n }\n if (computed?.display === \"inline\") {\n // Absolute layers have no in-flow content to give an inline host a width.\n host.style.display = \"block\";\n if (!host.style.width) host.style.width = \"100%\";\n }\n const computedMinHeight = computed?.minHeight ?? \"\";\n if (\n !host.style.minHeight &&\n (!computedMinHeight || computedMinHeight === \"0px\" || computedMinHeight === \"auto\")\n ) {\n host.style.minHeight = \"1.6em\";\n }\n}\n\nexport function resetLayer(layer: MorphLayer): void {\n layer.line.style.opacity = \"1\";\n layer.line.style.filter = \"none\";\n layer.line.style.transform = \"none\";\n}\n\nexport function clearLayer(layer: MorphLayer): void {\n layer.line.replaceChildren();\n resetLayer(layer);\n}\n\nexport function setLayerText(layer: MorphLayer, text: string): void {\n if (\n layer.line.childNodes.length === 1 &&\n layer.line.firstChild?.nodeType === 3 &&\n layer.line.textContent === text\n ) {\n return;\n }\n layer.line.replaceChildren(text);\n}\n\nexport function applyGooState(\n layer: MorphLayer,\n lightFraction: number,\n fontSizePx: number,\n blurEm: number,\n): void {\n const visual = visualForFraction(lightFraction, fontSizePx, blurEm);\n layer.line.style.opacity = String(visual.opacity);\n layer.line.style.filter = visual.blurPx > 0 ? `blur(${visual.blurPx}px)` : \"none\";\n}\n\nexport function applyFadeState(layer: MorphLayer, opacity: number): void {\n layer.line.style.opacity = String(Math.max(0, Math.min(1, opacity)));\n layer.line.style.filter = \"none\";\n}\n\nexport function setLiveText(el: HTMLSpanElement, text: string): void {\n if (el.textContent !== text) el.textContent = text;\n}\n\nexport function removeStage(stage: MorphStage): void {\n stage.outgoing.el.remove();\n stage.incoming.el.remove();\n stage.live.remove();\n}\n","import { DEFAULT_RISE_EASING } from \"./easing\";\nimport type { EasingFunction } from \"./easing\";\n\nexport type MorphDirection = \"rtl\" | \"ltr\" | \"auto\";\n\nexport type RiseFlow = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface RiseFlowHunk {\n /** Stable id for the changed chunk. */\n id: string;\n /** Added text enters; removed text exits. */\n kind: \"add\" | \"remove\";\n text: string;\n /** Source offset in the side's text. */\n start: number;\n end: number;\n /** Length of the side's text. */\n length: number;\n /** 0 at the start of the line, 1 at the end. */\n position: number;\n}\n\nexport interface RiseFlowContext {\n from: string;\n to: string;\n dir: MorphDirection;\n rtl: boolean;\n hunk: RiseFlowHunk;\n}\n\nexport type RiseFlowResolver = (context: RiseFlowContext) => RiseFlow;\n\nexport type RiseFlowValue = RiseFlow | RiseFlowResolver;\n\nexport type PresetName = \"numbers\" | \"wordsHorizontal\" | \"wordsUp\" | \"wordsDown\";\n\nexport type MotionName = \"default\" | \"smooth\" | \"snappy\" | \"gentle\";\n\nexport type MorphCallback = (from: string, to: string) => void;\n\nexport interface GooEffectOptions {\n /** Blur strength in em, scaled by the host's computed font size. */\n blur?: number;\n /** Alpha threshold T in \"0 0 0 255 -T\". Clamped to 0–255. */\n threshold?: number;\n /** Keep the SVG filter mounted while the text is at rest. */\n atRest?: boolean;\n}\n\nexport interface RiseEffectOptions {\n /** Motion blur strength in em. Applied on top of the goo blur. */\n blur?: number;\n /** Vertical travel in em. */\n travel?: number;\n /** Scale at the start of an entering hunk. */\n scale?: number;\n /** Delay between neighbouring hunks, in milliseconds. */\n stagger?: number;\n /** Fraction of the entering window that overlaps the outgoing hunk. */\n overlap?: number;\n /** Timing curve for each hunk's enter and exit progress. */\n easing?: EasingFunction;\n /**\n * Direction of travel. `up`: outgoing hunks leave upward and new hunks\n * arrive from below. `left`: outgoing hunks leave left and new hunks arrive\n * from the right. A function resolves the direction per changed hunk.\n */\n flow?: RiseFlowValue;\n /** Matched runs shorter than this are treated as changed text. */\n minChunk?: number;\n /** Treat Arabic/Persian kaf/yeh as the same letter for diffing. */\n normalizeVariants?: boolean;\n /** Do not let combining marks prevent a match. */\n ignoreDiacritics?: boolean;\n}\n\nexport interface MorphEffects {\n /** Defaults to enabled with the standard goo settings. */\n goo?: boolean | GooEffectOptions;\n /** Defaults to disabled. */\n rise?: boolean | RiseEffectOptions;\n}\n\nexport interface MorphOptions {\n /** Optional auto-cycling list. The first entry is shown immediately. */\n words?: string[];\n /** Length of one morph, in seconds. */\n morphTime?: number;\n /** Rest between automatic morphs, in seconds. */\n restTime?: number;\n effects?: MorphEffects;\n /** Content preset. See `presets`. */\n preset?: PresetName;\n /** Motion preset. Defaults to `default` when a content preset is used. */\n motion?: MotionName;\n dir?: MorphDirection;\n lang?: string;\n /** Start cycling `words` automatically. Defaults to true. */\n autoplay?: boolean;\n /** Wrap around at the end of `words`. Defaults to true. */\n loop?: boolean;\n /**\n * Timing curve for the overall morph and matched-text FLIP. Defaults to\n * ease-in-out cubic. Pass `t => t` for linear motion.\n */\n easing?: EasingFunction;\n onMorphStart?: MorphCallback;\n onMorphEnd?: MorphCallback;\n}\n\nexport interface Morph {\n /** Morph from the current visual state to a new string. */\n setText(text: string): Promise<void>;\n /** Advance to the next entry in `words`. */\n next(): Promise<void>;\n setWords(words: string[]): void;\n play(): void;\n pause(): void;\n destroy(): void;\n update(partialOptions: Partial<MorphOptions>): void;\n}\n\nexport interface ResolvedGoo {\n enabled: boolean;\n blur: number;\n threshold: number;\n atRest: boolean;\n}\n\nexport interface ResolvedRise {\n enabled: boolean;\n blur: number;\n travel: number;\n scale: number;\n stagger: number;\n overlap: number;\n easing: EasingFunction;\n flow: RiseFlowValue;\n minChunk: number;\n normalizeVariants: boolean;\n ignoreDiacritics: boolean;\n}\n\nexport interface ResolvedEffects {\n goo: ResolvedGoo;\n rise: ResolvedRise;\n}\n\nexport const DEFAULT_GOO: ResolvedGoo = {\n enabled: true,\n blur: 0.075,\n threshold: 140,\n atRest: true,\n};\n\nexport const DEFAULT_RISE: ResolvedRise = {\n enabled: false,\n blur: 0.1,\n travel: 0.3,\n scale: 0.94,\n stagger: 35,\n overlap: 0.15,\n easing: DEFAULT_RISE_EASING,\n flow: \"up\",\n minChunk: 2,\n normalizeVariants: true,\n ignoreDiacritics: true,\n};\n\nfunction nonNegative(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : fallback;\n}\n\nfunction clamp(value: number | undefined, min: number, max: number, fallback: number) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n return Math.max(min, Math.min(max, value));\n}\n\nexport function normalizeThreshold(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return 140;\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction gooFromOptions(options: GooEffectOptions, base: ResolvedGoo): ResolvedGoo {\n return {\n enabled: true,\n blur: nonNegative(options.blur, base.blur),\n threshold:\n options.threshold === undefined ? base.threshold : normalizeThreshold(options.threshold),\n atRest: typeof options.atRest === \"boolean\" ? options.atRest : base.atRest,\n };\n}\n\nfunction riseFromOptions(options: RiseEffectOptions, base: ResolvedRise): ResolvedRise {\n return {\n enabled: true,\n blur: nonNegative(options.blur, base.blur),\n travel: nonNegative(options.travel, base.travel),\n scale: clamp(options.scale, 0, 1, base.scale),\n stagger: nonNegative(options.stagger, base.stagger),\n overlap: clamp(options.overlap, 0, 1, base.overlap),\n easing: typeof options.easing === \"function\" ? options.easing : base.easing,\n flow:\n options.flow === \"up\" ||\n options.flow === \"down\" ||\n options.flow === \"left\" ||\n options.flow === \"right\" ||\n typeof options.flow === \"function\"\n ? options.flow\n : base.flow,\n minChunk:\n typeof options.minChunk === \"number\" && Number.isFinite(options.minChunk)\n ? Math.max(0, Math.floor(options.minChunk))\n : base.minChunk,\n normalizeVariants:\n typeof options.normalizeVariants === \"boolean\"\n ? options.normalizeVariants\n : base.normalizeVariants,\n ignoreDiacritics:\n typeof options.ignoreDiacritics === \"boolean\"\n ? options.ignoreDiacritics\n : base.ignoreDiacritics,\n };\n}\n\nexport function resolveInitialEffects(effects: MorphEffects | undefined): ResolvedEffects {\n const gooValue = effects?.goo;\n const riseValue = effects?.rise;\n\n const goo: ResolvedGoo =\n gooValue === false\n ? { ...DEFAULT_GOO, enabled: false }\n : gooValue === undefined || gooValue === true\n ? { ...DEFAULT_GOO }\n : gooFromOptions(gooValue, DEFAULT_GOO);\n\n const rise: ResolvedRise =\n riseValue === undefined || riseValue === false\n ? { ...DEFAULT_RISE, enabled: false }\n : riseValue === true\n ? { ...DEFAULT_RISE, enabled: true }\n : riseFromOptions(riseValue, DEFAULT_RISE);\n\n return { goo, rise };\n}\n\nexport function applyGooPatch(\n current: ResolvedGoo,\n patch: boolean | GooEffectOptions | undefined,\n): ResolvedGoo {\n if (patch === undefined) return current;\n if (patch === false) return { ...current, enabled: false };\n if (patch === true) return { ...current, enabled: true };\n return gooFromOptions(patch, current);\n}\n\nexport function applyRisePatch(\n current: ResolvedRise,\n patch: boolean | RiseEffectOptions | undefined,\n): ResolvedRise {\n if (patch === undefined) return current;\n if (patch === false) return { ...current, enabled: false };\n if (patch === true) return { ...current, enabled: true };\n return riseFromOptions(patch, current);\n}\n","import { cubicBezier, easeInOutCubic, easeOutCubic } from \"./easing\";\nimport type { MorphOptions, MotionName, PresetName, RiseFlow, RiseFlowContext } from \"./options\";\n\n/**\n * Normalise Persian, Arabic-Indic and Latin digits, then return the first\n * numeric value in the string. Used by the numbers preset.\n */\nexport function firstNumber(value: string): number | undefined {\n const normalised = value\n .replace(/[۰-۹]/g, (digit) => String((digit.codePointAt(0) ?? 0x06f0) - 0x06f0))\n .replace(/[٠-٩]/g, (digit) => String((digit.codePointAt(0) ?? 0x0660) - 0x0660))\n .replace(/٬/g, \"\")\n .replace(/(\\d),(?=\\d)/g, \"$1\")\n .replace(/٫/g, \".\");\n\n const match = normalised.match(/-?\\d+(?:\\.\\d+)?/);\n if (!match) return undefined;\n const number = Number(match[0]);\n return Number.isFinite(number) ? number : undefined;\n}\n\n/**\n * Numbers: up when the value increases, down when it decreases. Equal or\n * unparseable values fall back to up.\n */\nexport function flowByNumberChange(context: RiseFlowContext): RiseFlow {\n const from = firstNumber(context.from);\n const to = firstNumber(context.to);\n if (from === undefined || to === undefined || to === from) return \"up\";\n return to > from ? \"up\" : \"down\";\n}\n\n/**\n * Words: move every changed hunk toward the edge it belongs to. The exact\n * centre belongs to the end side. RTL flips the physical left/right mapping.\n */\nexport function flowByHunkPosition(context: RiseFlowContext): RiseFlow {\n const atStart = context.hunk.position < 0.5;\n if (context.rtl) return atStart ? \"right\" : \"left\";\n return atStart ? \"left\" : \"right\";\n}\n\nconst wordGoo = { blur: 0.1, threshold: 70, atRest: false };\nconst wordRise = { blur: 0.04, travel: 0.24, scale: 0.96 };\n\nexport const presets = {\n numbers: {\n effects: {\n goo: { ...wordGoo },\n rise: {\n ...wordRise,\n blur: 0.1,\n travel: 0.6,\n scale: 0.9,\n flow: flowByNumberChange,\n },\n },\n },\n wordsHorizontal: {\n effects: {\n goo: { ...wordGoo },\n rise: { ...wordRise, flow: flowByHunkPosition },\n },\n },\n wordsUp: {\n effects: {\n goo: { ...wordGoo },\n rise: { ...wordRise, flow: \"up\" },\n },\n },\n wordsDown: {\n effects: {\n goo: { ...wordGoo },\n rise: { ...wordRise, flow: \"down\" },\n },\n },\n} satisfies Record<PresetName, MorphOptions>;\n\nexport const motions = {\n default: {\n morphTime: 0.3,\n easing: easeInOutCubic,\n effects: {\n rise: { easing: easeOutCubic, stagger: 70, overlap: 0 },\n },\n },\n smooth: {\n morphTime: 0.8,\n easing: easeInOutCubic,\n effects: {\n rise: {\n easing: cubicBezier(0.25, 0.8, 0.35, 1),\n stagger: 30,\n overlap: 0.18,\n },\n },\n },\n snappy: {\n morphTime: 0.2,\n easing: cubicBezier(0.2, 0.8, 0.2, 1),\n effects: {\n rise: {\n easing: cubicBezier(0.16, 1, 0.3, 1),\n stagger: 50,\n overlap: 0,\n },\n },\n },\n gentle: {\n morphTime: 1.1,\n easing: easeInOutCubic,\n effects: {\n rise: {\n easing: cubicBezier(0.42, 0, 0.58, 1),\n stagger: 45,\n overlap: 0.2,\n },\n },\n },\n} satisfies Record<MotionName, MorphOptions>;\n\nexport const presetNames = Object.keys(presets) as PresetName[];\nexport const motionNames = Object.keys(motions) as MotionName[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeValue(base: unknown, override: unknown): unknown {\n if (override === undefined) return base;\n if (Array.isArray(override)) return [...override];\n if (isRecord(base) && isRecord(override)) return mergeOptions(base, override);\n return override;\n}\n\nfunction mergeOptions(\n ...sources: Array<MorphOptions | Record<string, unknown> | undefined>\n): MorphOptions {\n const merged: Record<string, unknown> = {};\n\n for (const source of sources) {\n if (!source) continue;\n for (const [key, value] of Object.entries(source)) {\n if (key === \"preset\" || key === \"motion\" || value === undefined) continue;\n merged[key] = mergeValue(merged[key], value);\n }\n }\n\n return merged as MorphOptions;\n}\n\n/**\n * Resolve `preset` and `motion` into concrete core options. Preset values are\n * applied first, the motion next, and explicit options last.\n */\nexport function resolveMorphOptions(options: MorphOptions): MorphOptions {\n const { preset, motion, ...overrides } = options;\n if (!preset && !motion) return options;\n\n const motionName: MotionName | undefined = motion ?? (preset ? \"default\" : undefined);\n\n return mergeOptions(\n preset ? presets[preset] : undefined,\n motionName ? motions[motionName] : undefined,\n overrides,\n );\n}\n\n/**\n * Resolve a named content preset with optional motion and inline overrides.\n */\nexport function resolvePreset(name: PresetName, overrides: MorphOptions = {}): MorphOptions {\n return resolveMorphOptions({ ...overrides, preset: name });\n}\n\nexport function isRiseFlow(value: unknown): value is RiseFlow {\n return value === \"up\" || value === \"down\" || value === \"left\" || value === \"right\";\n}\n","/**\n * Zero-dependency atomization for Arabic-script text.\n *\n * Atoms are grapheme clusters (a base letter plus its marks) grouped into the\n * units a diff can safely animate. Arabic contextual forms are derived from\n * Unicode joining rules rather than font-specific glyph IDs, which keeps the\n * library dependency-free while preserving joins and ZWNJ.\n */\n\nexport interface Atom {\n /** Source slice for this atom, including combining marks. */\n text: string;\n /** Stable identity used for diagnostics and exact equality. */\n key: string;\n /** UTF-16 start offset in the source string. */\n start: number;\n /** UTF-16 end offset in the source string. */\n end: number;\n /** Contextual forms, e.g. \"initial,medial,final\". */\n formKey: string;\n}\n\nconst ZWNJ = \"\\u200C\";\nconst ZWJ = \"\\u200D\";\n\nexport const DIACRITICS_RE =\n /[\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06ED\\u08D3-\\u08E1\\u08E3-\\u08FF]/g;\n\nconst ALEF_VARIANTS = new Set([\n \"\\u0622\", // آ\n \"\\u0623\", // أ\n \"\\u0625\", // إ\n \"\\u0627\", // ا\n \"\\u0671\", // ٱ\n]);\n\n/** Characters that do not join on their left (next) side. */\nconst RIGHT_JOINING = new Set(\n [\n \"\\u0622\", // آ\n \"\\u0623\", // أ\n \"\\u0624\", // ؤ\n \"\\u0625\", // إ\n \"\\u0627\", // ا\n \"\\u0629\", // ة\n \"\\u062F\", // د\n \"\\u0630\", // ذ\n \"\\u0631\", // ر\n \"\\u0632\", // ز\n \"\\u0648\", // و\n \"\\u0698\", // ژ\n ].map((char) => char.normalize(\"NFC\")),\n);\n\nconst NON_JOINING = new Set([\n \"\\u0621\", // ء\n]);\n\nexport function isMark(char: string): boolean {\n return /^\\p{M}$/u.test(char);\n}\n\nexport function isArabicLetter(char: string): boolean {\n return /\\p{L}/u.test(char) && /\\p{Script=Arabic}/u.test(char);\n}\n\nexport function isDiacritic(char: string): boolean {\n return /^[\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06ED\\u08D3-\\u08E1\\u08E3-\\u08FF]$/u.test(char);\n}\n\nexport function canJoinPrevious(char: string): boolean {\n return isArabicLetter(char) && !NON_JOINING.has(char);\n}\n\nexport function canJoinNext(char: string): boolean {\n return isArabicLetter(char) && !RIGHT_JOINING.has(char) && !NON_JOINING.has(char);\n}\n\ninterface Neighbor {\n char: string;\n index: number;\n}\n\n/**\n * Find the nearest base letter to the right/left. Combining marks and ZWJ are\n * transparent. ZWNJ, whitespace and punctuation break joining.\n */\nfunction neighbor(text: string, index: number, direction: -1 | 1): Neighbor | null {\n let cursor = index + direction;\n while (cursor >= 0 && cursor < text.length) {\n const char = text[cursor];\n if (isMark(char) || char === ZWJ) {\n cursor += direction;\n continue;\n }\n if (char === ZWNJ || /\\s/u.test(char) || !isArabicLetter(char)) return null;\n return { char, index: cursor };\n }\n return null;\n}\n\nfunction formOf(text: string, index: number): string {\n const char = text[index];\n if (!isArabicLetter(char)) return \"x\";\n\n const previous = neighbor(text, index, -1);\n const next = neighbor(text, index, 1);\n\n const joinsPrevious = previous !== null && canJoinNext(previous.char) && canJoinPrevious(char);\n const joinsNext = next !== null && canJoinNext(char) && canJoinPrevious(next.char);\n\n if (joinsPrevious && joinsNext) return \"medial\";\n if (joinsPrevious) return \"final\";\n if (joinsNext) return \"initial\";\n return \"isolated\";\n}\n\n/** Contextual form signature for a source range. */\nexport function formSignature(text: string, start: number, end: number): string {\n const forms: string[] = [];\n for (let index = start; index < end; index += 1) {\n if (isArabicLetter(text[index])) forms.push(formOf(text, index));\n }\n return forms.length > 0 ? forms.join(\",\") : \"x\";\n}\n\ninterface GraphemeSegment {\n segment: string;\n index: number;\n}\n\ntype GraphemeSegmenter = {\n segment(input: string): Iterable<GraphemeSegment>;\n};\n\ntype SegmenterConstructor = new (\n locales?: string | string[],\n options?: { granularity: \"grapheme\" },\n) => GraphemeSegmenter;\n\nlet cachedSegmenter: GraphemeSegmenter | null | undefined;\n\nfunction getSegmenter(): GraphemeSegmenter | null {\n if (cachedSegmenter !== undefined) return cachedSegmenter;\n const intl = Intl as unknown as { Segmenter?: SegmenterConstructor };\n if (typeof intl.Segmenter !== \"function\") {\n cachedSegmenter = null;\n return cachedSegmenter;\n }\n try {\n cachedSegmenter = new intl.Segmenter(undefined, { granularity: \"grapheme\" });\n } catch {\n cachedSegmenter = null;\n }\n return cachedSegmenter;\n}\n\n/**\n * Fallback grapheme scanner for environments without Intl.Segmenter. It keeps\n * combining marks, variation selectors, emoji modifiers and ZWJ sequences with\n * their base.\n */\nfunction fallbackSegments(text: string): GraphemeSegment[] {\n const segments: GraphemeSegment[] = [];\n let start = 0;\n let current = \"\";\n let previousWasZWJ = false;\n\n for (let index = 0; index < text.length;) {\n const codePoint = text.codePointAt(index);\n if (codePoint === undefined) break;\n const char = String.fromCodePoint(codePoint);\n const mark = /^\\p{M}$/u.test(char);\n const variation = /^[\\uFE00-\\uFE0F]$/u.test(char);\n const modifier = /^[\\u{1F3FB}-\\u{1F3FF}]$/u.test(char);\n const joinControl = char === ZWJ;\n const joinAfter = previousWasZWJ;\n const join = mark || variation || modifier || joinControl || joinAfter;\n\n if (!join && current.length > 0) {\n segments.push({ segment: current, index: start });\n start = index;\n current = \"\";\n }\n if (current.length === 0) start = index;\n current += char;\n previousWasZWJ = char === ZWJ;\n index += char.length;\n }\n\n if (current.length > 0) segments.push({ segment: current, index: start });\n return segments;\n}\n\nexport function segmentGraphemes(text: string): GraphemeSegment[] {\n if (text.length === 0) return [];\n const segmenter = getSegmenter();\n if (!segmenter) return fallbackSegments(text);\n return Array.from(segmenter.segment(text), (part) => ({\n segment: part.segment,\n index: part.index,\n }));\n}\n\nfunction firstArabicLetter(text: string): string {\n for (const char of text) {\n if (isArabicLetter(char)) return char;\n }\n return \"\";\n}\n\nfunction isLamSegment(text: string): boolean {\n return firstArabicLetter(text) === \"\\u0644\";\n}\n\nfunction isAlefSegment(text: string): boolean {\n return ALEF_VARIANTS.has(firstArabicLetter(text));\n}\n\n/**\n * Group common multi-character Arabic ligatures that must stay in one rendered\n * span. Lam-alef is the important one for Persian and Arabic.\n */\nfunction atomRanges(text: string): Array<{ start: number; end: number }> {\n const segments = segmentGraphemes(text);\n const ranges: Array<{ start: number; end: number }> = [];\n\n for (let index = 0; index < segments.length; index += 1) {\n const current = segments[index];\n if (!current) continue;\n const next = segments[index + 1];\n // ZWNJ explicitly prevents the lam-alef relationship.\n if (\n next &&\n isLamSegment(current.segment) &&\n !current.segment.includes(ZWNJ) &&\n isAlefSegment(next.segment)\n ) {\n ranges.push({ start: current.index, end: next.index + next.segment.length });\n index += 1;\n } else {\n ranges.push({ start: current.index, end: current.index + current.segment.length });\n }\n }\n\n return ranges;\n}\n\n/** Build atoms from source text. No DOM or font access. */\nexport function createAtoms(text: string): Atom[] {\n return atomRanges(text).map(({ start, end }) => {\n const atomText = text.slice(start, end);\n const formKey = formSignature(text, start, end);\n return {\n text: atomText,\n key: `${atomText}\\u0000${formKey}`,\n start,\n end,\n formKey,\n };\n });\n}\n\n/** Glyph-free base key used by normalization: marks removed. */\nexport function baseAtomText(atom: Atom): string {\n return atom.text.replace(DIACRITICS_RE, \"\");\n}\n\n/** True when an atom is only whitespace/punctuation, not a word character. */\nexport function isWordBreakAtom(atom: Atom): boolean {\n if (atom.text.includes(ZWNJ) || atom.text.includes(ZWJ)) return false;\n return !/[\\p{L}\\p{N}]/u.test(atom.text);\n}\n\nexport { ZWNJ, ZWJ };\n","import type { Atom } from \"./atoms\";\nimport { isWordBreakAtom } from \"./atoms\";\nimport type { DiffOp } from \"./diff\";\n\nexport type ChunkKind = \"match\" | \"add\" | \"remove\";\n\nexport interface Chunk {\n id: string;\n kind: ChunkKind;\n /** Atom indices on the outgoing side. Empty for added chunks. */\n aIndices: number[];\n /** Atom indices on the incoming side. Empty for removed chunks. */\n bIndices: number[];\n}\n\nexport interface ChunkOptions {\n /** Matched runs shorter than this are cross-faded unless they are a word. */\n minChunk?: number;\n}\n\ntype MatchOp = Extract<DiffOp, { type: \"match\" }>;\n\nfunction atWordEdge(atoms: Atom[], start: number, end: number): boolean {\n const before = start === 0 || isWordBreakAtom(atoms[start - 1]!);\n const after = end === atoms.length - 1 || isWordBreakAtom(atoms[end + 1]!);\n return before && after;\n}\n\nfunction isWholeWord(run: MatchOp[], a: Atom[], b: Atom[]): boolean {\n const aStart = run[0]!.aIndex;\n const aEnd = run[run.length - 1]!.aIndex;\n const bStart = run[0]!.bIndex;\n const bEnd = run[run.length - 1]!.bIndex;\n return atWordEdge(a, aStart, aEnd) && atWordEdge(b, bStart, bEnd);\n}\n\n/**\n * Turn diff operations into rigid chunks.\n *\n * Only matches that are adjacent in both strings may become chunks. Short\n * scattered matches are downgraded to remove/add pairs; otherwise a single\n * isolated letter would fly across the line while the rest of the word\n * cross-fades around it.\n */\nexport function diffToChunks(\n a: Atom[],\n b: Atom[],\n operations: DiffOp[],\n options: ChunkOptions = {},\n): Chunk[] {\n const minChunk = Math.max(0, Math.floor(options.minChunk ?? 2));\n const chunks: Chunk[] = [];\n let id = 0;\n\n const push = (kind: ChunkKind, aIndices: number[], bIndices: number[]) => {\n chunks.push({ id: `chunk-${id++}`, kind, aIndices, bIndices });\n };\n\n let index = 0;\n while (index < operations.length) {\n const operation = operations[index]!;\n\n if (operation.type === \"match\") {\n const run: MatchOp[] = [operation];\n let nextIndex = index + 1;\n while (nextIndex < operations.length) {\n const next = operations[nextIndex]!;\n if (next.type !== \"match\") break;\n const last = run[run.length - 1]!;\n if (next.aIndex !== last.aIndex + 1 || next.bIndex !== last.bIndex + 1) {\n break;\n }\n run.push(next);\n nextIndex += 1;\n }\n\n if (run.length >= minChunk || isWholeWord(run, a, b)) {\n push(\n \"match\",\n run.map((match) => match.aIndex),\n run.map((match) => match.bIndex),\n );\n } else {\n for (const match of run) {\n push(\"remove\", [match.aIndex], []);\n push(\"add\", [], [match.bIndex]);\n }\n }\n index = nextIndex;\n continue;\n }\n\n if (operation.type === \"delete\") {\n const indices: number[] = [];\n let nextIndex = index;\n while (nextIndex < operations.length) {\n const current = operations[nextIndex]!;\n if (current.type !== \"delete\") break;\n indices.push(current.aIndex);\n nextIndex += 1;\n }\n push(\"remove\", indices, []);\n index = nextIndex;\n continue;\n }\n\n const indices: number[] = [];\n let nextIndex = index;\n while (nextIndex < operations.length) {\n const current = operations[nextIndex]!;\n if (current.type !== \"insert\") break;\n indices.push(current.bIndex);\n nextIndex += 1;\n }\n push(\"add\", [], indices);\n index = nextIndex;\n }\n\n // A dropped short match produces remove+add; merge adjacent pieces so one\n // span covers the whole changed run and keeps its internal kerning.\n const mergeSide = (kind: \"remove\" | \"add\"): Chunk[] => {\n const sideChunks = chunks\n .filter((chunk) => chunk.kind === kind)\n .sort((left, right) => {\n const aIndex = kind === \"remove\" ? left.aIndices[0] : left.bIndices[0];\n const bIndex = kind === \"remove\" ? right.aIndices[0] : right.bIndices[0];\n return (aIndex ?? 0) - (bIndex ?? 0);\n });\n\n const merged: Chunk[] = [];\n for (const chunk of sideChunks) {\n const last = merged[merged.length - 1];\n const lastIndices = last ? (kind === \"remove\" ? last.aIndices : last.bIndices) : [];\n const indices = kind === \"remove\" ? chunk.aIndices : chunk.bIndices;\n if (\n last &&\n lastIndices.length > 0 &&\n indices.length > 0 &&\n indices[0] === lastIndices[lastIndices.length - 1]! + 1\n ) {\n if (kind === \"remove\") last.aIndices.push(...chunk.aIndices);\n else last.bIndices.push(...chunk.bIndices);\n } else {\n merged.push({\n id: \"\",\n kind,\n aIndices: [...chunk.aIndices],\n bIndices: [...chunk.bIndices],\n });\n }\n }\n return merged;\n };\n\n const merged = [\n ...mergeSide(\"remove\"),\n ...mergeSide(\"add\"),\n ...chunks.filter((chunk) => chunk.kind === \"match\"),\n ];\n\n // Changed text animates as whole hunks. Split after whitespace so no hunk\n // spans two words; ZWNJ is not whitespace, so Persian compounds stay whole.\n const splitChanged = (chunk: Chunk): Chunk[] => {\n if (chunk.kind === \"match\") return [chunk];\n\n const indices = chunk.kind === \"remove\" ? chunk.aIndices : chunk.bIndices;\n const atoms = chunk.kind === \"remove\" ? a : b;\n const pieces: Chunk[] = [];\n let current: number[] = [];\n\n const flush = () => {\n if (current.length === 0) return;\n pieces.push({\n id: \"\",\n kind: chunk.kind,\n aIndices: chunk.kind === \"remove\" ? current : [],\n bIndices: chunk.kind === \"add\" ? current : [],\n });\n current = [];\n };\n\n for (const atomIndex of indices) {\n current.push(atomIndex);\n if (/\\s/u.test(atoms[atomIndex]?.text ?? \"\")) flush();\n }\n flush();\n\n return pieces.length > 0 ? pieces : [chunk];\n };\n\n const split = merged.flatMap(splitChanged);\n split.forEach((chunk, chunkIndex) => {\n chunk.id = `chunk-${chunkIndex}`;\n });\n return split;\n}\n","import type { Atom } from \"./atoms\";\nimport { DIACRITICS_RE, ZWNJ } from \"./atoms\";\n\nexport interface DiffOptions {\n /** Treat Arabic kaf/yeh and Persian kaf/yeh as the same letter. */\n normalizeVariants?: boolean;\n /** Do not let combining marks prevent a match. */\n ignoreDiacritics?: boolean;\n}\n\nexport type DiffOp =\n | { type: \"match\"; aIndex: number; bIndex: number }\n | { type: \"delete\"; aIndex: number }\n | { type: \"insert\"; bIndex: number };\n\nconst VARIANT_MAP: Record<string, string> = {\n \"\\u064A\": \"\\u06CC\", // ي -> ی\n \"\\u0643\": \"\\u06A9\", // ك -> ک\n};\n\nexport function normalizeVariantText(text: string): string {\n return text.replace(/[\\u064A\\u0643]/g, (char) => VARIANT_MAP[char] ?? char);\n}\n\nfunction normalizedText(atom: Atom, options: DiffOptions): string {\n // ZWNJ is a join control. Its shaping effect is already represented by\n // formKey, so it must not stop two identically shaped letters from matching.\n let text = atom.text.normalize(\"NFC\").split(ZWNJ).join(\"\");\n if (options.normalizeVariants) text = normalizeVariantText(text);\n if (options.ignoreDiacritics) text = text.replace(DIACRITICS_RE, \"\");\n return text;\n}\n\n/**\n * Equality is deliberately layered:\n * 1. identical contextual form plus identical text match;\n * 2. the same form with only an invisible ZWNJ difference also matches;\n * 3. a contextual form change never matches;\n * 4. optional normalization bridges Arabic/Persian variants and marks.\n */\nexport function atomsEqual(a: Atom, b: Atom, options: DiffOptions = {}): boolean {\n if (a.formKey !== b.formKey) return false;\n return normalizedText(a, options) === normalizedText(b, options);\n}\n\n/** Longest-common-subsequence diff over atoms. */\nexport function diffAtoms(a: Atom[], b: Atom[], options: DiffOptions = {}): DiffOp[] {\n const rows = a.length;\n const columns = b.length;\n const table: Uint32Array[] = Array.from({ length: rows + 1 }, () => new Uint32Array(columns + 1));\n\n for (let row = rows - 1; row >= 0; row -= 1) {\n for (let column = columns - 1; column >= 0; column -= 1) {\n table[row]![column] = atomsEqual(a[row]!, b[column]!, options)\n ? table[row + 1]![column + 1]! + 1\n : Math.max(table[row + 1]![column]!, table[row]![column + 1]!);\n }\n }\n\n const operations: DiffOp[] = [];\n let row = 0;\n let column = 0;\n\n while (row < rows && column < columns) {\n if (atomsEqual(a[row]!, b[column]!, options)) {\n operations.push({ type: \"match\", aIndex: row, bIndex: column });\n row += 1;\n column += 1;\n } else if (table[row + 1]![column]! >= table[row]![column + 1]!) {\n operations.push({ type: \"delete\", aIndex: row });\n row += 1;\n } else {\n operations.push({ type: \"insert\", bIndex: column });\n column += 1;\n }\n }\n\n while (row < rows) {\n operations.push({ type: \"delete\", aIndex: row });\n row += 1;\n }\n while (column < columns) {\n operations.push({ type: \"insert\", bIndex: column });\n column += 1;\n }\n\n return operations;\n}\n","import type { Atom } from \"./atoms\";\nimport { canJoinNext, canJoinPrevious, createAtoms, isArabicLetter, isMark, ZWJ } from \"./atoms\";\nimport type { Chunk } from \"./chunks\";\nimport { diffToChunks } from \"./chunks\";\nimport { diffAtoms } from \"./diff\";\nimport { resetLayer } from \"./layers\";\nimport type { MorphLayer, MorphStage } from \"./layers\";\n\nexport interface ChunkView {\n chunk: Chunk;\n span: HTMLSpanElement;\n text: string;\n sourceStart: number;\n sourceEnd: number;\n side: \"a\" | \"b\";\n}\n\nexport interface MatchedView extends ChunkView {\n /** FLIP offset from the outgoing position to the incoming position. */\n dx: number;\n dy: number;\n}\n\nexport interface DiffScene {\n from: string;\n to: string;\n atomsA: Atom[];\n atomsB: Atom[];\n chunks: Chunk[];\n enter: ChunkView[];\n exit: ChunkView[];\n matched: MatchedView[];\n}\n\nexport interface SceneOptions {\n rtl: boolean;\n dir: \"rtl\" | \"ltr\" | \"auto\";\n minChunk: number;\n normalizeVariants: boolean;\n ignoreDiacritics: boolean;\n}\n\nfunction previousBase(text: string, index: number): string {\n let cursor = index - 1;\n while (cursor >= 0 && isMark(text[cursor]!)) cursor -= 1;\n return cursor >= 0 ? text[cursor]! : \"\";\n}\n\nfunction nextBase(text: string, index: number): string {\n let cursor = index;\n while (cursor < text.length && isMark(text[cursor]!)) cursor += 1;\n return cursor < text.length ? text[cursor]! : \"\";\n}\n\nfunction firstBaseBetween(text: string, start: number, end: number): string {\n let cursor = start;\n while (cursor < end && isMark(text[cursor]!)) cursor += 1;\n return cursor < end ? text[cursor]! : \"\";\n}\n\nfunction lastBaseBefore(text: string, end: number): string {\n let cursor = end - 1;\n while (cursor >= 0 && isMark(text[cursor]!)) cursor -= 1;\n return cursor >= 0 ? text[cursor]! : \"\";\n}\n\nfunction shouldPadStart(text: string, start: number, end: number): boolean {\n if (start <= 0) return false;\n const first = firstBaseBetween(text, start, end);\n const before = previousBase(text, start);\n if (!isArabicLetter(first) || !isArabicLetter(before)) return false;\n return canJoinPrevious(first) && canJoinNext(before);\n}\n\nfunction shouldPadEnd(text: string, start: number, end: number): boolean {\n if (end >= text.length) return false;\n const last = lastBaseBefore(text, end);\n const after = nextBase(text, end);\n if (!isArabicLetter(last) || !isArabicLetter(after)) return false;\n return canJoinNext(last) && canJoinPrevious(after);\n}\n\nexport function atomSourceRange(atoms: Atom[], indices: number[]): { start: number; end: number } {\n let start = Number.POSITIVE_INFINITY;\n let end = Number.NEGATIVE_INFINITY;\n for (const index of indices) {\n const atom = atoms[index];\n if (!atom) continue;\n start = Math.min(start, atom.start);\n end = Math.max(end, atom.end);\n }\n if (!Number.isFinite(start) || !Number.isFinite(end)) {\n return { start: 0, end: 0 };\n }\n return { start, end };\n}\n\nfunction styleChunk(span: HTMLSpanElement, dir: SceneOptions[\"dir\"]): void {\n span.dir = dir;\n span.style.display = \"inline-block\";\n span.style.whiteSpace = \"pre\";\n span.style.unicodeBidi = \"isolate\";\n span.style.direction = dir === \"auto\" ? \"inherit\" : dir;\n span.style.verticalAlign = \"baseline\";\n span.style.transformOrigin = \"center center\";\n span.style.willChange = \"transform, opacity, filter\";\n span.style.pointerEvents = \"none\";\n span.style.setProperty(\"letter-spacing\", \"0\", \"important\");\n}\n\nfunction renderLayer(\n layer: MorphLayer,\n source: string,\n atoms: Atom[],\n chunks: Chunk[],\n side: \"a\" | \"b\",\n options: SceneOptions,\n): ChunkView[] {\n resetLayer(layer);\n layer.line.replaceChildren();\n const records: ChunkView[] = [];\n\n for (const chunk of chunks) {\n const indices = side === \"a\" ? chunk.aIndices : chunk.bIndices;\n if (indices.length === 0) continue;\n\n const range = atomSourceRange(atoms, indices);\n if (range.end <= range.start) continue;\n\n const text = source.slice(range.start, range.end);\n const leadingPad = shouldPadStart(source, range.start, range.end) ? ZWJ : \"\";\n const trailingPad = shouldPadEnd(source, range.start, range.end) ? ZWJ : \"\";\n const span = layer.el.ownerDocument.createElement(\"span\");\n\n span.className = `rtm-chunk rtm-chunk--${chunk.kind}`;\n span.dataset.chunkId = chunk.id;\n span.dataset.chunkKind = chunk.kind;\n span.dataset.chunkSide = side;\n styleChunk(span, options.dir);\n span.textContent = leadingPad + text + trailingPad;\n\n records.push({\n chunk,\n span,\n text,\n sourceStart: range.start,\n sourceEnd: range.end,\n side,\n });\n }\n\n records.sort((left, right) => left.sourceStart - right.sourceStart);\n for (const record of records) layer.line.appendChild(record.span);\n return records;\n}\n\n/** Use a DOM Range, never the span box, so bearing/overflow is included. */\nexport function measureSpan(span: HTMLElement): DOMRect {\n const range = span.ownerDocument.createRange();\n range.selectNodeContents(span);\n const rangeRect =\n typeof range.getBoundingClientRect === \"function\" ? range.getBoundingClientRect() : null;\n const spanRect = span.getBoundingClientRect();\n if (!rangeRect) return spanRect;\n if (\n rangeRect.width === 0 &&\n rangeRect.height === 0 &&\n (spanRect.width > 0 || spanRect.height > 0)\n ) {\n return spanRect;\n }\n return rangeRect;\n}\n\nfunction readingOrder(records: ChunkView[], rtl: boolean): ChunkView[] {\n return records\n .map((record) => {\n const rect = record.span.getBoundingClientRect();\n return { record, x: rtl ? rect.right : rect.left };\n })\n .sort((left, right) => (rtl ? right.x - left.x : left.x - right.x))\n .map((entry) => entry.record);\n}\n\n/** Build two shaped layers from a source/target pair. */\nexport function buildDiffScene(\n stage: MorphStage,\n from: string,\n to: string,\n options: SceneOptions,\n): DiffScene {\n const atomsA = createAtoms(from);\n const atomsB = createAtoms(to);\n const operations = diffAtoms(atomsA, atomsB, {\n normalizeVariants: options.normalizeVariants,\n ignoreDiacritics: options.ignoreDiacritics,\n });\n const chunks = diffToChunks(atomsA, atomsB, operations, {\n minChunk: options.minChunk,\n });\n\n const oldRecords = renderLayer(stage.outgoing, from, atomsA, chunks, \"a\", options);\n const newRecords = renderLayer(stage.incoming, to, atomsB, chunks, \"b\", options);\n\n const oldMatched = new Map<string, ChunkView>();\n for (const record of oldRecords) {\n if (record.chunk.kind === \"match\") oldMatched.set(record.chunk.id, record);\n }\n\n const matched: MatchedView[] = [];\n for (const record of newRecords) {\n if (record.chunk.kind !== \"match\") continue;\n const old = oldMatched.get(record.chunk.id);\n if (!old) continue;\n\n old.span.style.opacity = \"0\";\n const oldRect = measureSpan(old.span);\n const newRect = measureSpan(record.span);\n matched.push({\n ...record,\n dx: oldRect.left - newRect.left,\n dy: oldRect.top - newRect.top,\n });\n }\n\n const enter = newRecords.filter((record) => record.chunk.kind === \"add\");\n for (const record of enter) record.span.style.opacity = \"0\";\n\n const exit = oldRecords.filter((record) => record.chunk.kind === \"remove\");\n\n return {\n from,\n to,\n atomsA,\n atomsB,\n chunks,\n enter,\n exit,\n matched,\n };\n}\n\nexport function enterOrder(scene: DiffScene, rtl: boolean): ChunkView[] {\n return readingOrder(scene.enter, rtl);\n}\n\nexport function exitOrder(scene: DiffScene, rtl: boolean): ChunkView[] {\n return readingOrder(scene.exit, rtl);\n}\n","import type { RiseTiming } from \"./effects/rise\";\nimport type { MorphDirection, RiseFlow, RiseFlowContext, RiseFlowValue } from \"./options\";\nimport { isRiseFlow } from \"./presets\";\nimport { atomSourceRange } from \"./scene\";\nimport type { ChunkView, DiffScene } from \"./scene\";\n\nexport type TransitionMode = \"goo\" | \"rise\" | \"fade\";\n\nexport interface Transition {\n from: string;\n to: string;\n mode: TransitionMode;\n duration: number;\n elapsed: number;\n raw: number;\n eased: number;\n /** Light fraction for goo mode, opacity for fade mode. */\n outStart: number;\n scene?: DiffScene;\n enter: ChunkView[];\n exit: ChunkView[];\n flow: RiseFlow;\n flowByChunk?: Map<string, RiseFlow>;\n timing?: RiseTiming;\n fastForward: boolean;\n promise: Promise<void>;\n resolve: () => void;\n}\n\nexport interface PendingMorph {\n text: string;\n promise: Promise<void>;\n resolve: () => void;\n}\n\nexport interface SavedStyle {\n position: string;\n display: string;\n minHeight: string;\n width: string;\n filter: string;\n}\n\nexport const DEFAULT_FONT_SIZE = 16;\nexport const MAX_FRAME_DELTA = 0.1;\nexport const REDUCED_MOTION_FADE = 0.18;\nexport const NO_EFFECT_FADE = 0.3;\nexport const FAST_FORWARD = 0.12;\nexport const GOO_SOFTEN = \" blur(0.6px)\";\n\nexport function nonNegative(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : fallback;\n}\n\nexport function sameWords(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((word, index) => word === b[index]);\n}\n\nexport function prefersReducedMotion(doc: Document): boolean {\n const view = doc.defaultView;\n if (!view || typeof view.matchMedia !== \"function\") return false;\n try {\n return view.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function reportCallbackError(error: unknown): void {\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(\"[rtl-text-transform]\", error);\n }\n}\n\nexport function combineBlur(gooPx: number, risePx: number): string {\n const goo = Math.max(0, gooPx);\n const rise = Math.max(0, risePx);\n if (goo < 0.01 && rise < 0.01) return \"none\";\n if (goo < 0.01) return `blur(${rise.toFixed(2)}px)`;\n if (rise < 0.01) return `blur(${goo.toFixed(2)}px)`;\n return `blur(${goo.toFixed(2)}px) blur(${rise.toFixed(2)}px)`;\n}\n\nfunction resolveFlow(flow: RiseFlowValue, context: RiseFlowContext): RiseFlow {\n if (typeof flow !== \"function\") return flow;\n try {\n const resolved = flow(context);\n return isRiseFlow(resolved) ? resolved : \"up\";\n } catch (error) {\n reportCallbackError(error);\n return \"up\";\n }\n}\n\nexport function flowForTransition(\n flow: RiseFlowValue,\n scene: DiffScene,\n from: string,\n to: string,\n dir: MorphDirection,\n rtl: boolean,\n): { fallback: RiseFlow; byChunk?: Map<string, RiseFlow> } {\n if (typeof flow !== \"function\") {\n return { fallback: flow };\n }\n\n const byChunk = new Map<string, RiseFlow>();\n for (const chunk of scene.chunks) {\n if (chunk.kind === \"match\") continue;\n const useTarget = chunk.bIndices.length > 0;\n const source = useTarget ? to : from;\n const atoms = useTarget ? scene.atomsB : scene.atomsA;\n const range = atomSourceRange(atoms, useTarget ? chunk.bIndices : chunk.aIndices);\n const text = source.slice(range.start, range.end);\n const length = source.length;\n const position =\n length > 0 ? Math.min(1, Math.max(0, (range.start + range.end) / 2 / length)) : 0;\n\n const context: RiseFlowContext = {\n from,\n to,\n dir,\n rtl,\n hunk: {\n id: chunk.id,\n kind: chunk.kind === \"add\" ? \"add\" : \"remove\",\n text,\n start: range.start,\n end: range.end,\n length,\n position,\n },\n };\n byChunk.set(chunk.id, resolveFlow(flow, context));\n }\n\n return { fallback: \"up\", byChunk };\n}\n","import { DEFAULT_MORPH_EASING } from \"./easing\";\nimport type { EasingFunction } from \"./easing\";\nimport {\n enterProgress,\n enterTransform,\n exitProgress,\n exitTransform,\n riseTiming,\n} from \"./effects/rise\";\nimport { acquireGooFilter } from \"./filter\";\nimport type { GooFilterHandle } from \"./filter\";\nimport {\n applyFadeState,\n applyGooState,\n clearLayer,\n createStage,\n removeStage,\n resetLayer,\n setLayerText,\n setLiveText,\n sizeHost,\n} from \"./layers\";\nimport type { MorphStage } from \"./layers\";\nimport { blurForFraction, canAdvance, clamp01, opacityForFraction, wrapIndex } from \"./math\";\nimport type {\n Morph,\n MorphCallback,\n MorphDirection,\n MorphOptions,\n ResolvedGoo,\n ResolvedRise,\n} from \"./options\";\nimport { applyGooPatch, applyRisePatch, resolveInitialEffects } from \"./options\";\nimport { resolveMorphOptions } from \"./presets\";\nimport { buildDiffScene, enterOrder, exitOrder } from \"./scene\";\nimport {\n combineBlur,\n DEFAULT_FONT_SIZE,\n FAST_FORWARD,\n flowForTransition,\n GOO_SOFTEN,\n MAX_FRAME_DELTA,\n NO_EFFECT_FADE,\n nonNegative,\n prefersReducedMotion,\n REDUCED_MOTION_FADE,\n reportCallbackError,\n sameWords,\n} from \"./transition\";\nimport type { PendingMorph, SavedStyle, Transition, TransitionMode } from \"./transition\";\n\n/**\n * Create a unified RTL text morph attached to `el`.\n *\n * The host is treated as a dedicated container. Its children are replaced by\n * two aria-hidden layers and one visually hidden live region; original content\n * is restored by `destroy()`.\n */\nexport function createMorph(el: HTMLElement, options: MorphOptions = {}): Morph {\n if (!el || !el.ownerDocument) {\n throw new TypeError(\"createMorph(el): el must be an HTMLElement\");\n }\n\n const resolvedOptions = resolveMorphOptions(options);\n const doc = el.ownerDocument;\n const originalNodes = Array.from(el.childNodes);\n const originalDir = el.getAttribute(\"dir\");\n const originalLang = el.getAttribute(\"lang\");\n const savedStyle: SavedStyle = {\n position: el.style.position,\n display: el.style.display,\n minHeight: el.style.minHeight,\n width: el.style.width,\n filter: el.style.filter,\n };\n\n const initialText = (el.textContent ?? \"\").trim();\n let words = Array.isArray(resolvedOptions.words)\n ? resolvedOptions.words.map((word) => String(word))\n : [];\n\n const initialEffects = resolveInitialEffects(resolvedOptions.effects);\n let goo: ResolvedGoo = initialEffects.goo;\n let rise: ResolvedRise = initialEffects.rise;\n\n let morphTime = nonNegative(resolvedOptions.morphTime, 1);\n let restTime = nonNegative(resolvedOptions.restTime, 0.25);\n let dir = resolvedOptions.dir;\n let lang = resolvedOptions.lang;\n let autoplay = resolvedOptions.autoplay ?? true;\n let loop = resolvedOptions.loop ?? true;\n let easing =\n typeof resolvedOptions.easing === \"function\" ? resolvedOptions.easing : DEFAULT_MORPH_EASING;\n let onMorphStart = resolvedOptions.onMorphStart;\n let onMorphEnd = resolvedOptions.onMorphEnd;\n let currentPreset = options.preset;\n let currentMotion = options.motion;\n\n if (dir) el.setAttribute(\"dir\", dir);\n if (lang) el.setAttribute(\"lang\", lang);\n\n let currentText = words.length > 0 ? words[0]! : initialText;\n let wordIndex = 0;\n let auto = autoplay;\n let autoRest: number | null =\n auto && words.length > 1 && canAdvance(wordIndex, words.length, loop) ? restTime : null;\n let paused = false;\n let destroyed = false;\n let hidden = doc.visibilityState === \"hidden\";\n let offscreen = false;\n let transition: Transition | null = null;\n let pending: PendingMorph | null = null;\n let rafId: number | null = null;\n let lastTimestamp: number | null = null;\n let filter: GooFilterHandle | null = goo.enabled ? acquireGooFilter(goo.threshold, doc) : null;\n\n sizeHost(el);\n const stage: MorphStage = createStage(el);\n\n function readFontSize(): number {\n const view = doc.defaultView;\n const computed = view?.getComputedStyle(el).fontSize;\n const parsed = computed ? Number.parseFloat(computed) : Number.NaN;\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n const inline = Number.parseFloat(el.style.fontSize);\n return Number.isFinite(inline) && inline > 0 ? inline : DEFAULT_FONT_SIZE;\n }\n\n function readDirection(): { dir: MorphDirection; rtl: boolean } {\n const attr = dir ?? (el.getAttribute(\"dir\") as MorphDirection | null) ?? \"rtl\";\n const view = doc.defaultView;\n const computed = view?.getComputedStyle(el).direction;\n const rtl = computed === \"rtl\" ? true : computed === \"ltr\" ? false : attr !== \"ltr\";\n return { dir: attr === \"ltr\" || attr === \"rtl\" || attr === \"auto\" ? attr : \"rtl\", rtl };\n }\n\n function applyEasing(curve: EasingFunction, value: number): number {\n try {\n const eased = curve(value);\n return Number.isFinite(eased) ? clamp01(eased) : value;\n } catch {\n return value;\n }\n }\n\n function ease(value: number): number {\n return applyEasing(easing, value);\n }\n\n function easeRise(value: number): number {\n return applyEasing(rise.easing, value);\n }\n\n function renderSettled(text: string): void {\n clearLayer(stage.outgoing);\n clearLayer(stage.incoming);\n setLayerText(stage.outgoing, text);\n setLayerText(stage.incoming, text);\n stage.outgoing.line.style.opacity = \"0\";\n stage.outgoing.line.style.filter = \"none\";\n stage.incoming.line.style.opacity = \"1\";\n stage.incoming.line.style.filter = \"none\";\n stage.incoming.line.style.transform = \"none\";\n }\n\n function syncFilter(): void {\n if (destroyed) return;\n const reduced = prefersReducedMotion(doc);\n const activeGoo =\n transition !== null && (transition.mode === \"goo\" || transition.mode === \"rise\");\n const canUseGoo =\n goo.enabled && filter !== null && !reduced && (transition === null ? goo.atRest : activeGoo);\n\n if (!canUseGoo) {\n el.style.filter = \"none\";\n return;\n }\n const soften = rise.enabled ? \"\" : GOO_SOFTEN;\n el.style.filter = `url(#${filter!.id})${soften}`;\n }\n\n function refreshFilter(): void {\n if (destroyed) return;\n if (!goo.enabled) {\n filter?.release();\n filter = null;\n syncFilter();\n return;\n }\n if (!filter || filter.threshold !== goo.threshold) {\n const next = acquireGooFilter(goo.threshold, doc);\n filter?.release();\n filter = next;\n }\n syncFilter();\n }\n\n function safeCallback(callback: MorphCallback | undefined, from: string, to: string): void {\n if (!callback) return;\n try {\n callback(from, to);\n } catch (error) {\n reportCallbackError(error);\n }\n }\n\n function canAutoAdvance(): boolean {\n return canAdvance(wordIndex, words.length, loop);\n }\n\n function needsLoop(): boolean {\n if (destroyed || paused || hidden || offscreen) return false;\n if (transition) return true;\n return auto && words.length > 1 && canAutoAdvance();\n }\n\n function requestFrame(): number {\n if (typeof requestAnimationFrame === \"function\") {\n return requestAnimationFrame(tick);\n }\n return setTimeout(() => tick(Date.now()), 16) as unknown as number;\n }\n\n function cancelFrame(id: number): void {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(id);\n } else {\n clearTimeout(id);\n }\n }\n\n function stopLoop(): void {\n if (rafId !== null) {\n cancelFrame(rafId);\n rafId = null;\n }\n lastTimestamp = null;\n }\n\n function syncLoop(): void {\n if (!needsLoop()) {\n stopLoop();\n return;\n }\n if (rafId !== null) return;\n lastTimestamp = null;\n rafId = requestFrame();\n }\n\n function renderGooOrFade(tr: Transition, eased: number): void {\n if (tr.mode === \"goo\" && goo.enabled) {\n const fontSize = readFontSize();\n applyGooState(stage.outgoing, tr.outStart * (1 - eased), fontSize, goo.blur);\n applyGooState(stage.incoming, eased, fontSize, goo.blur);\n } else {\n applyFadeState(stage.outgoing, tr.outStart * (1 - eased));\n applyFadeState(stage.incoming, eased);\n }\n }\n\n function renderRise(tr: Transition): void {\n const scene = tr.scene;\n const timing = tr.timing;\n if (!scene || !timing) return;\n\n const duration = tr.duration;\n const elapsed = Math.max(0, Math.min(duration, tr.elapsed));\n const global = duration > 0 ? clamp01(elapsed / duration) : 1;\n const globalEased = ease(global);\n const fontSize = readFontSize();\n\n for (let order = 0; order < tr.enter.length; order += 1) {\n const record = tr.enter[order]!;\n const local = easeRise(enterProgress(elapsed, order, timing));\n const gooOpacity = goo.enabled ? opacityForFraction(local) : local;\n const gooBlur = goo.enabled ? blurForFraction(local, fontSize, goo.blur) : 0;\n const motion = enterTransform(\n local,\n rise.travel,\n rise.scale,\n rise.blur,\n tr.flowByChunk?.get(record.chunk.id) ?? tr.flow,\n );\n record.span.style.opacity = String(gooOpacity);\n record.span.style.filter = combineBlur(gooBlur, motion.blurEm * fontSize);\n record.span.style.transform = `translate(${(motion.xEm * fontSize).toFixed(2)}px, ${(motion.yEm * fontSize).toFixed(2)}px) scale(${motion.scale.toFixed(4)})`;\n }\n\n for (let order = 0; order < tr.exit.length; order += 1) {\n const record = tr.exit[order]!;\n const local = easeRise(exitProgress(elapsed, order, timing));\n const remaining = 1 - local;\n const gooOpacity = goo.enabled ? opacityForFraction(remaining) : remaining;\n const gooBlur = goo.enabled ? blurForFraction(remaining, fontSize, goo.blur) : 0;\n const motion = exitTransform(\n local,\n rise.travel,\n rise.scale,\n rise.blur,\n tr.flowByChunk?.get(record.chunk.id) ?? tr.flow,\n );\n record.span.style.opacity = String(gooOpacity);\n record.span.style.filter = combineBlur(gooBlur, motion.blurEm * fontSize);\n record.span.style.transform = `translate(${(motion.xEm * fontSize).toFixed(2)}px, ${(motion.yEm * fontSize).toFixed(2)}px) scale(${motion.scale.toFixed(4)})`;\n }\n\n for (const record of scene.matched) {\n record.span.style.opacity = \"1\";\n record.span.style.filter = \"none\";\n record.span.style.transform = `translate(${(record.dx * (1 - globalEased)).toFixed(2)}px, ${(record.dy * (1 - globalEased)).toFixed(2)}px)`;\n }\n }\n\n function renderTransition(tr: Transition, raw: number): void {\n tr.raw = clamp01(raw);\n const eased = ease(tr.raw);\n tr.eased = eased;\n if (tr.mode === \"rise\") {\n renderRise(tr);\n } else {\n renderGooOrFade(tr, eased);\n }\n }\n\n function clearPending(): void {\n if (!pending) return;\n const queued = pending;\n pending = null;\n queued.resolve();\n }\n\n function completeTransition(tr: Transition): void {\n if (transition !== tr) return;\n transition = null;\n tr.elapsed = tr.duration;\n tr.raw = 1;\n tr.eased = 1;\n renderTransition(tr, 1);\n currentText = tr.to;\n const completedIndex = words.indexOf(tr.to);\n if (completedIndex >= 0) wordIndex = completedIndex;\n renderSettled(currentText);\n setLiveText(stage.live, currentText);\n tr.resolve();\n syncFilter();\n safeCallback(onMorphEnd, tr.from, tr.to);\n\n const queued = pending;\n pending = null;\n if (queued && !destroyed) {\n void startMorph(queued.text).then(queued.resolve, queued.resolve);\n return;\n }\n\n if (!destroyed) {\n if (auto && !paused) {\n if (canAutoAdvance()) {\n autoRest = restTime;\n } else {\n auto = false;\n autoRest = null;\n }\n }\n syncLoop();\n }\n }\n\n function snapTo(text: string): Promise<void> {\n clearPending();\n if (transition) {\n const tr = transition;\n transition = null;\n tr.resolve();\n }\n currentText = text;\n const settledIndex = words.indexOf(text);\n if (settledIndex >= 0) wordIndex = settledIndex;\n renderSettled(text);\n setLiveText(stage.live, text);\n autoRest = null;\n if (auto && !paused && words.length > 1) {\n if (canAutoAdvance()) autoRest = restTime;\n else auto = false;\n }\n syncFilter();\n syncLoop();\n return Promise.resolve();\n }\n\n function queueMorph(to: string): Promise<void> {\n if (pending?.text === to) return pending.promise;\n if (pending) pending.resolve();\n let resolve = (): void => undefined;\n const promise = new Promise<void>((done) => {\n resolve = done;\n });\n pending = { text: to, promise, resolve };\n if (transition) transition.fastForward = true;\n syncLoop();\n return promise;\n }\n\n function startMorph(to: string): Promise<void> {\n if (destroyed) return Promise.resolve();\n if (paused) return snapTo(to);\n if (transition && transition.to === to) return transition.promise;\n if (!transition && to === currentText) return Promise.resolve();\n\n let fromText: string;\n let outStart = 1;\n const previous = transition;\n\n if (previous) {\n if (previous.mode === \"rise\") return queueMorph(to);\n\n const progress = previous.eased;\n const outValue = previous.outStart * (1 - progress);\n const outOpacity = previous.mode === \"goo\" ? opacityForFraction(outValue) : outValue;\n const inOpacity = previous.mode === \"goo\" ? opacityForFraction(progress) : progress;\n const dominantOpacity = Math.max(outOpacity, inOpacity);\n\n if (inOpacity > outOpacity) fromText = previous.to;\n else fromText = previous.from;\n\n transition = null;\n previous.resolve();\n\n const reduced = prefersReducedMotion(doc);\n const nextMode: TransitionMode = reduced\n ? \"fade\"\n : rise.enabled\n ? \"rise\"\n : goo.enabled\n ? \"goo\"\n : \"fade\";\n outStart =\n nextMode === \"goo\" ? Math.pow(clamp01(dominantOpacity), 1 / 0.4) : clamp01(dominantOpacity);\n } else {\n fromText = currentText;\n }\n\n const reduced = prefersReducedMotion(doc);\n const mode: TransitionMode = reduced\n ? \"fade\"\n : rise.enabled\n ? \"rise\"\n : goo.enabled\n ? \"goo\"\n : \"fade\";\n\n const duration =\n mode === \"fade\"\n ? morphTime <= 0\n ? 0\n : Math.min(reduced ? REDUCED_MOTION_FADE : NO_EFFECT_FADE, morphTime)\n : morphTime;\n\n let resolve = (): void => undefined;\n const promise = new Promise<void>((done) => {\n resolve = done;\n });\n\n const tr: Transition = {\n from: fromText,\n to,\n mode,\n duration,\n elapsed: 0,\n raw: 0,\n eased: 0,\n outStart,\n enter: [],\n exit: [],\n flow: \"up\",\n fastForward: false,\n promise,\n resolve,\n };\n\n transition = tr;\n autoRest = null;\n\n if (mode === \"rise\") {\n const direction = readDirection();\n const scene = buildDiffScene(stage, fromText, to, {\n rtl: direction.rtl,\n dir: direction.dir,\n minChunk: rise.minChunk,\n normalizeVariants: rise.normalizeVariants,\n ignoreDiacritics: rise.ignoreDiacritics,\n });\n tr.scene = scene;\n tr.enter = enterOrder(scene, direction.rtl);\n tr.exit = exitOrder(scene, direction.rtl);\n const flowState = flowForTransition(\n rise.flow,\n scene,\n fromText,\n to,\n direction.dir,\n direction.rtl,\n );\n tr.flow = flowState.fallback;\n tr.flowByChunk = flowState.byChunk;\n tr.timing = riseTiming(\n duration,\n Math.max(tr.enter.length, tr.exit.length),\n rise.stagger,\n rise.overlap,\n );\n renderRise(tr);\n } else {\n resetLayer(stage.outgoing);\n resetLayer(stage.incoming);\n setLayerText(stage.outgoing, fromText);\n setLayerText(stage.incoming, to);\n renderGooOrFade(tr, 0);\n }\n\n setLiveText(stage.live, to);\n syncFilter();\n safeCallback(onMorphStart, fromText, to);\n\n if (destroyed) {\n if (transition === tr) transition = null;\n return promise;\n }\n\n if (duration <= 0) {\n completeTransition(tr);\n return promise;\n }\n\n syncLoop();\n return promise;\n }\n\n function tick(timestamp: number): void {\n rafId = null;\n if (!needsLoop()) {\n lastTimestamp = null;\n return;\n }\n\n if (lastTimestamp === null) {\n lastTimestamp = timestamp;\n rafId = requestFrame();\n return;\n }\n\n const dt = Math.min(Math.max((timestamp - lastTimestamp) / 1000, 0), MAX_FRAME_DELTA);\n lastTimestamp = timestamp;\n\n if (transition) {\n const tr = transition;\n let step = dt;\n if (tr.fastForward && tr.duration > 0) {\n const remaining = Math.max(0, tr.duration - tr.elapsed);\n step *= Math.max(1, remaining / FAST_FORWARD);\n }\n tr.elapsed = Math.min(tr.duration, tr.elapsed + step);\n const raw = tr.duration > 0 ? clamp01(tr.elapsed / tr.duration) : 1;\n renderTransition(tr, raw);\n if (raw >= 1) completeTransition(tr);\n } else if (auto && !paused) {\n if (autoRest === null) {\n if (canAutoAdvance()) autoRest = restTime;\n else auto = false;\n }\n if (autoRest !== null) {\n autoRest -= dt;\n if (autoRest <= 0) {\n if (!canAutoAdvance()) {\n auto = false;\n autoRest = null;\n } else {\n wordIndex = wrapIndex(wordIndex + 1, words.length, loop);\n const nextWord = words[wordIndex];\n if (nextWord !== undefined) {\n autoRest = null;\n void startMorph(nextWord);\n }\n }\n }\n }\n }\n\n if (rafId === null && needsLoop()) {\n rafId = requestFrame();\n } else if (!needsLoop()) {\n lastTimestamp = null;\n }\n }\n\n function onVisibilityChange(): void {\n hidden = doc.visibilityState === \"hidden\";\n syncLoop();\n }\n\n doc.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n let observer: IntersectionObserver | null = null;\n const view = doc.defaultView;\n if (view && typeof view.IntersectionObserver === \"function\") {\n observer = new view.IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry) return;\n offscreen = !entry.isIntersecting;\n syncLoop();\n },\n { rootMargin: \"80px\" },\n );\n observer.observe(el);\n }\n\n function setText(text: string): Promise<void> {\n if (destroyed) return Promise.resolve();\n const value = String(text);\n if (paused) return snapTo(value);\n return startMorph(value);\n }\n\n function next(): Promise<void> {\n if (destroyed || words.length === 0) return Promise.resolve();\n if (!canAdvance(wordIndex, words.length, loop)) {\n return Promise.resolve();\n }\n wordIndex = wrapIndex(wordIndex + 1, words.length, loop);\n const target = words[wordIndex];\n if (target === undefined) return Promise.resolve();\n return startMorph(target);\n }\n\n function setWords(nextWords: string[]): void {\n if (destroyed) return;\n words = Array.isArray(nextWords) ? nextWords.map((word) => String(word)) : [];\n\n if (words.length === 0) {\n wordIndex = 0;\n autoRest = null;\n syncLoop();\n return;\n }\n\n const reference = pending?.text ?? transition?.to ?? currentText;\n const found = words.indexOf(reference);\n wordIndex = found >= 0 ? found : 0;\n autoRest = null;\n if (autoplay && !paused && words.length > 1 && canAutoAdvance()) {\n auto = true;\n autoRest = restTime;\n }\n syncLoop();\n }\n\n function play(): void {\n if (destroyed) return;\n paused = false;\n if (!transition && pending) {\n const queued = pending;\n pending = null;\n void startMorph(queued.text).then(queued.resolve, queued.resolve);\n }\n if (words.length > 1 && canAutoAdvance()) {\n auto = true;\n if (!transition && autoRest === null) autoRest = restTime;\n }\n syncLoop();\n }\n\n function pause(): void {\n if (destroyed) return;\n paused = true;\n stopLoop();\n }\n\n function applyUpdate(partial: Partial<MorphOptions>): void {\n if (destroyed) return;\n\n if (partial.words !== undefined) {\n const nextWords = Array.isArray(partial.words)\n ? partial.words.map((word) => String(word))\n : [];\n if (!sameWords(nextWords, words)) setWords(nextWords);\n }\n\n if (partial.morphTime !== undefined) {\n morphTime = nonNegative(partial.morphTime, morphTime);\n }\n if (partial.restTime !== undefined) {\n restTime = nonNegative(partial.restTime, restTime);\n }\n\n let effectsChanged = false;\n if (partial.effects !== undefined) {\n if (partial.effects.goo !== undefined) {\n const nextGoo = applyGooPatch(goo, partial.effects.goo);\n effectsChanged =\n effectsChanged ||\n nextGoo.enabled !== goo.enabled ||\n nextGoo.threshold !== goo.threshold ||\n nextGoo.blur !== goo.blur ||\n nextGoo.atRest !== goo.atRest;\n goo = nextGoo;\n }\n if (partial.effects.rise !== undefined) {\n const nextRise = applyRisePatch(rise, partial.effects.rise);\n effectsChanged = effectsChanged || nextRise.enabled !== rise.enabled;\n rise = nextRise;\n }\n refreshFilter();\n }\n\n if (partial.dir !== undefined) {\n dir = partial.dir;\n el.setAttribute(\"dir\", partial.dir);\n }\n if (partial.lang !== undefined) {\n lang = partial.lang;\n el.setAttribute(\"lang\", partial.lang);\n }\n if (partial.easing !== undefined) {\n easing = typeof partial.easing === \"function\" ? partial.easing : DEFAULT_MORPH_EASING;\n }\n if (partial.onMorphStart !== undefined) {\n onMorphStart = partial.onMorphStart;\n }\n if (partial.onMorphEnd !== undefined) {\n onMorphEnd = partial.onMorphEnd;\n }\n if (partial.loop !== undefined && partial.loop !== loop) {\n loop = partial.loop;\n if (autoplay && !paused && !transition && words.length > 1 && canAutoAdvance()) {\n auto = true;\n autoRest = restTime;\n } else if (auto && words.length > 1 && canAutoAdvance() && autoRest === null) {\n autoRest = restTime;\n }\n }\n if (partial.autoplay !== undefined && partial.autoplay !== autoplay) {\n autoplay = partial.autoplay;\n auto = partial.autoplay;\n autoRest = null;\n if (auto && !paused && words.length > 1 && canAutoAdvance()) {\n autoRest = restTime;\n }\n }\n\n if (effectsChanged && !transition) {\n renderSettled(currentText);\n }\n syncFilter();\n syncLoop();\n }\n\n function update(partial: Partial<MorphOptions>): void {\n if (destroyed) return;\n\n if (partial.preset !== undefined || partial.motion !== undefined) {\n const nextPreset = partial.preset ?? currentPreset;\n const nextMotion =\n partial.motion ?? (partial.preset !== undefined ? \"default\" : currentMotion);\n const resolved = resolveMorphOptions({\n ...partial,\n preset: nextPreset,\n motion: nextMotion,\n });\n currentPreset = nextPreset;\n currentMotion = nextMotion;\n applyUpdate(resolved);\n return;\n }\n\n applyUpdate(partial);\n }\n\n function restoreStyle(name: keyof SavedStyle, value: string): void {\n if (value) {\n el.style[name] = value;\n } else {\n el.style.removeProperty(\n name === \"minHeight\" ? \"min-height\" : name === \"filter\" ? \"filter\" : name,\n );\n }\n }\n\n function destroy(): void {\n if (destroyed) return;\n destroyed = true;\n paused = true;\n stopLoop();\n doc.removeEventListener(\"visibilitychange\", onVisibilityChange);\n observer?.disconnect();\n observer = null;\n\n clearPending();\n if (transition) {\n const tr = transition;\n transition = null;\n tr.resolve();\n }\n\n filter?.release();\n filter = null;\n\n removeStage(stage);\n if (originalNodes.length > 0) el.append(...originalNodes);\n\n restoreStyle(\"position\", savedStyle.position);\n restoreStyle(\"display\", savedStyle.display);\n restoreStyle(\"minHeight\", savedStyle.minHeight);\n restoreStyle(\"width\", savedStyle.width);\n restoreStyle(\"filter\", savedStyle.filter);\n\n if (originalDir === null) el.removeAttribute(\"dir\");\n else el.setAttribute(\"dir\", originalDir);\n if (originalLang === null) el.removeAttribute(\"lang\");\n else el.setAttribute(\"lang\", originalLang);\n }\n\n renderSettled(currentText);\n setLiveText(stage.live, currentText);\n syncFilter();\n syncLoop();\n\n return {\n setText,\n next,\n setWords,\n play,\n pause,\n destroy,\n update,\n };\n}\n"]}
|