stickyflow 0.11.3 → 0.12.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/binding/index.cjs +9 -9
  3. package/dist/binding/index.d.cts +3 -3
  4. package/dist/binding/index.d.ts +3 -3
  5. package/dist/binding/index.js +3 -3
  6. package/dist/{chunk-WZA3DJJH.cjs → chunk-3OF37CZX.cjs} +15 -15
  7. package/dist/{chunk-WZA3DJJH.cjs.map → chunk-3OF37CZX.cjs.map} +1 -1
  8. package/dist/{chunk-V22J7Z4H.cjs → chunk-3XPNGIMV.cjs} +37 -37
  9. package/dist/chunk-3XPNGIMV.cjs.map +1 -0
  10. package/dist/{chunk-G6IW2IX3.js → chunk-4SXXMOXR.js} +31 -5
  11. package/dist/chunk-4SXXMOXR.js.map +1 -0
  12. package/dist/{chunk-GQRJSA73.cjs → chunk-EG7VZJZX.cjs} +23 -23
  13. package/dist/{chunk-GQRJSA73.cjs.map → chunk-EG7VZJZX.cjs.map} +1 -1
  14. package/dist/{chunk-BFQWCOEC.js → chunk-FYSJMUJI.js} +3 -3
  15. package/dist/{chunk-BFQWCOEC.js.map → chunk-FYSJMUJI.js.map} +1 -1
  16. package/dist/{chunk-W25SXORW.js → chunk-LDRUTQF7.js} +4 -4
  17. package/dist/{chunk-W25SXORW.js.map → chunk-LDRUTQF7.js.map} +1 -1
  18. package/dist/{chunk-IQQ5KBL6.js → chunk-Q4OIDWT6.js} +6 -6
  19. package/dist/chunk-Q4OIDWT6.js.map +1 -0
  20. package/dist/{chunk-UHKFJBY5.cjs → chunk-SKGJXCAO.cjs} +31 -5
  21. package/dist/chunk-SKGJXCAO.cjs.map +1 -0
  22. package/dist/{chunk-EBHO2FJ5.js → chunk-UCOMSZPC.js} +10 -9
  23. package/dist/chunk-UCOMSZPC.js.map +1 -0
  24. package/dist/{chunk-K5PGMZAD.cjs → chunk-ZE2KRWOM.cjs} +663 -662
  25. package/dist/chunk-ZE2KRWOM.cjs.map +1 -0
  26. package/dist/index.cjs +36 -36
  27. package/dist/index.d.cts +3 -3
  28. package/dist/index.d.ts +3 -3
  29. package/dist/index.js +5 -5
  30. package/dist/interaction/index.cjs +275 -237
  31. package/dist/interaction/index.cjs.map +1 -1
  32. package/dist/interaction/index.js +41 -3
  33. package/dist/interaction/index.js.map +1 -1
  34. package/dist/{runtime-C-C5v9po.d.cts → runtime-BJDaqo6f.d.cts} +1 -1
  35. package/dist/{runtime-lCAfU-1Q.d.ts → runtime-DaconR36.d.ts} +1 -1
  36. package/dist/{runtimeTypes-BDA_CfWh.d.ts → runtimeTypes-BE_GI1yU.d.ts} +1 -1
  37. package/dist/{runtimeTypes-B7p6b1Bi.d.cts → runtimeTypes-BE_nllY6.d.cts} +1 -1
  38. package/dist/stickyflow-diagram.global.js +39 -39
  39. package/dist/stickyflow-diagram.global.js.map +1 -1
  40. package/dist/viewer/index.cjs +9 -9
  41. package/dist/viewer/index.d.cts +1 -1
  42. package/dist/viewer/index.d.ts +1 -1
  43. package/dist/viewer/index.js +4 -4
  44. package/dist/web-component/index.cjs +6 -6
  45. package/dist/web-component/index.js +4 -4
  46. package/package.json +1 -1
  47. package/dist/chunk-EBHO2FJ5.js.map +0 -1
  48. package/dist/chunk-G6IW2IX3.js.map +0 -1
  49. package/dist/chunk-IQQ5KBL6.js.map +0 -1
  50. package/dist/chunk-K5PGMZAD.cjs.map +0 -1
  51. package/dist/chunk-UHKFJBY5.cjs.map +0 -1
  52. package/dist/chunk-V22J7Z4H.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/viewer/components/rollingNumberDom.ts","../src/runtime/viewer/components/documentComponents.ts","../src/runtime/viewer/components/rulerKnob.ts","../src/runtime/viewer/display/rootAttributesPatch.ts","../src/runtime/viewer/display/classifySceneDiff.ts","../src/runtime/viewer/display/definitionsPatch.ts","../src/runtime/viewer/display/elementPatch.ts","../src/runtime/viewer/display/sceneNodesPatch.ts","../src/runtime/viewer/display/scenePatch.ts","../src/runtime/viewer/display/svgDocument.ts","../src/runtime/viewer/display/viewport.ts","../src/runtime/viewer/display/index.ts","../src/runtime/viewer/events.ts","../src/runtime/viewer/export/raster.ts","../src/runtime/viewer/export/snapshot.ts","../src/runtime/viewer/interaction/changeFlash.ts","../src/runtime/viewer/interaction/keyboard.ts","../src/runtime/viewer/interaction/modifiers.ts","../src/runtime/viewer/interaction/selection.ts","../src/runtime/viewer/interaction/pointerSelection.ts","../src/runtime/viewer/interaction/pointer.ts","../src/runtime/viewer/interaction/overlayPainter.ts","../src/runtime/viewer/interaction/selectionController.ts","../src/runtime/viewer/interaction/wheel.ts","../src/runtime/viewer/interaction/index.ts","../src/runtime/viewer/shaders/defaults.ts","../src/runtime/viewer/shaders/builtins/button.ts","../src/runtime/viewer/shaders/builtins/chromaticGlassPlate.ts","../src/runtime/viewer/shaders/builtins/chromaticHalo.ts","../src/runtime/viewer/shaders/builtins/eclipseOrb.ts","../src/runtime/viewer/shaders/builtins/emberMatrix.ts","../src/runtime/viewer/shaders/builtins/emberSlits.ts","../src/runtime/viewer/shaders/builtins/glassDots.ts","../src/runtime/viewer/shaders/builtins/glassRefraction.ts","../src/runtime/viewer/shaders/builtins/glowCard.ts","../src/runtime/viewer/shaders/builtins/halftoneHalo.ts","../src/runtime/viewer/shaders/builtins/halo.ts","../src/runtime/viewer/shaders/builtins/ledMatrix.ts","../src/runtime/viewer/shaders/builtins/lightBand.ts","../src/runtime/viewer/shaders/builtins/lumenPortal.ts","../src/runtime/viewer/shaders/builtins/lumenPortalLight.ts","../src/runtime/viewer/shaders/builtins/orb.ts","../src/runtime/viewer/shaders/builtins/pixelConstellation.ts","../src/runtime/viewer/shaders/builtins/plasmaGauge.ts","../src/runtime/viewer/shaders/builtins/prismSlats.ts","../src/runtime/viewer/shaders/builtins/reactivePanel.ts","../src/runtime/viewer/shaders/builtins/ruler.ts","../src/runtime/viewer/shaders/builtins/silkFolds.ts","../src/runtime/viewer/shaders/builtins/smearOrb.ts","../src/runtime/viewer/shaders/builtins/tickScale.ts","../src/runtime/viewer/shaders/builtins/violetGlass.ts","../src/runtime/viewer/shaders/builtins/violetGlassLight.ts","../src/runtime/viewer/shaders/builtins/vortex.ts","../src/runtime/viewer/shaders/builtins/waves.ts","../src/runtime/viewer/shaders/programs.ts","../src/runtime/viewer/shaders/backdrop.ts","../src/runtime/viewer/shaders/uniforms.ts","../src/runtime/viewer/shaders/webgl.ts","../src/runtime/viewer/shaders/createSurface.ts","../src/runtime/viewer/shaders/reactiveLightField.ts","../src/runtime/viewer/shaders/renderSurface.ts","../src/runtime/viewer/shaders/surfaceClock.ts","../src/runtime/viewer/shaders/surface.ts","../src/runtime/viewer/source.ts","../src/runtime/viewer/session.ts","../src/runtime/viewer/connectKeyboard.ts","../src/runtime/viewer/connectInteraction.ts","../src/runtime/viewer/index.ts"],"names":["number","Emitter","positive","color","fragmentSource","parameter","parameters","TRAIL_LENGTH"],"mappings":"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","file":"chunk-Q4OIDWT6.js","sourcesContent":["import type { RollingNumberComponentStyle } from '../../../model/component';\n\ntype RollingNumberTheme = Required<RollingNumberComponentStyle>;\n\nconst HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n\nconst setStyles = (element: HTMLElement, styles: Partial<CSSStyleDeclaration>): void => {\n Object.assign(element.style, styles);\n};\n\nfunction createDigit(document: Document, character: string, theme: RollingNumberTheme): HTMLSpanElement {\n const digit = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n digit.setAttribute('data-sf-rolling-current', 'true');\n digit.textContent = character;\n setStyles(digit, {\n position: 'absolute',\n inset: '0',\n display: 'grid',\n placeItems: 'center',\n color: theme.color,\n fontWeight: theme.fontWeight,\n lineHeight: '1',\n });\n return digit;\n}\n\nfunction createDigitCell(document: Document, character: string, theme: RollingNumberTheme): HTMLSpanElement {\n const cell = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n cell.setAttribute('data-sf-rolling-digit', 'true');\n if (theme.variant === 'plain') {\n setStyles(cell, {\n position: 'relative',\n display: 'inline-block',\n width: '0.62em',\n height: '1.1em',\n overflow: 'hidden',\n });\n cell.appendChild(createDigit(document, character, theme));\n return cell;\n }\n setStyles(cell, {\n position: 'relative',\n display: 'inline-block',\n width: '0.72em',\n height: '1.2em',\n overflow: 'hidden',\n border: `1px solid ${theme.divider}`,\n borderRadius: '0.09em',\n background: theme.surface,\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.7), inset 0 -0.16em 0.38em rgba(0,0,0,0.12)',\n });\n cell.appendChild(createDigit(document, character, theme));\n\n const divider = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n setStyles(divider, {\n position: 'absolute',\n zIndex: '2',\n left: '0',\n right: '0',\n top: '50%',\n height: '1px',\n background: theme.divider,\n pointerEvents: 'none',\n });\n cell.appendChild(divider);\n return cell;\n}\n\nfunction animateDigit(element: HTMLElement, keyframes: Keyframe[], duration: number): Animation | null {\n if (duration === 0 || typeof element.animate !== 'function') {\n return null;\n }\n return element.animate(keyframes, {\n duration,\n easing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n fill: 'forwards',\n });\n}\n\nfunction fadeDigit(cell: HTMLSpanElement, character: string, theme: RollingNumberTheme, duration: number): void {\n const previous = cell.querySelector<HTMLSpanElement>('[data-sf-rolling-current]');\n previous?.removeAttribute('data-sf-rolling-current');\n const next = createDigit(cell.ownerDocument, character, theme);\n next.style.opacity = '0';\n cell.insertBefore(next, cell.lastElementChild ?? null);\n const hidden = { opacity: 0, filter: 'blur(0.025em)', transform: 'scale(0.985)' };\n const shown = { opacity: 1, filter: 'blur(0)', transform: 'scale(1)' };\n const incoming = animateDigit(next, [hidden, shown], duration);\n const outgoing = previous ? animateDigit(previous, [shown, hidden], duration) : null;\n const finish = (): void => {\n previous?.remove();\n next.style.opacity = '1';\n };\n if (incoming) {\n incoming.finished.then(finish, finish);\n } else {\n outgoing?.cancel();\n finish();\n }\n}\n\nfunction replaceDigit(cell: HTMLSpanElement, character: string, theme: RollingNumberTheme, duration: number): void {\n if (theme.motion === 'fade') {\n fadeDigit(cell, character, theme, duration);\n return;\n }\n const previous = cell.querySelector<HTMLSpanElement>('[data-sf-rolling-current]');\n previous?.removeAttribute('data-sf-rolling-current');\n const next = createDigit(cell.ownerDocument, character, theme);\n next.style.transform = 'translateY(100%)';\n next.style.opacity = '0.25';\n cell.insertBefore(next, cell.lastElementChild);\n\n const incoming = animateDigit(\n next,\n [\n { transform: 'translateY(100%)', opacity: 0.25 },\n { transform: 'translateY(0)', opacity: 1 },\n ],\n duration,\n );\n const outgoing = previous\n ? animateDigit(\n previous,\n [\n { transform: 'translateY(0)', opacity: 1 },\n { transform: 'translateY(-100%)', opacity: 0.25 },\n ],\n duration,\n )\n : null;\n\n const finish = (): void => {\n previous?.remove();\n next.style.transform = 'translateY(0)';\n next.style.opacity = '1';\n };\n if (incoming) {\n incoming.finished.then(finish, finish);\n } else {\n outgoing?.cancel();\n finish();\n }\n}\n\nexport function updateRollingDigits(\n digits: HTMLDivElement,\n previousValue: string,\n nextValue: string,\n theme: RollingNumberTheme,\n duration: number,\n): void {\n if (previousValue.length !== nextValue.length) {\n digits.replaceChildren(...[...nextValue].map(character => createDigitCell(digits.ownerDocument, character, theme)));\n digits.setAttribute('aria-label', nextValue);\n return;\n }\n\n const cells = [...digits.querySelectorAll<HTMLSpanElement>('[data-sf-rolling-digit]')];\n [...nextValue].forEach((character, index) => {\n if (previousValue[index] !== character) {\n replaceDigit(cells[index], character, theme, duration);\n }\n });\n digits.setAttribute('aria-label', nextValue);\n}\n","import {\n DEFAULT_ROLLING_NUMBER_STYLE,\n formatRollingNumber,\n type RollingNumberComponentStyle,\n} from '../../../model/component';\nimport { updateRollingDigits } from './rollingNumberDom';\n\ntype RollingNumberSurface = SVGForeignObjectElement;\n\nexport interface DocumentComponentsHandle {\n setValue(componentId: string, value: string | number): boolean;\n refresh(): void;\n clearValues(): void;\n destroy(): void;\n}\n\nfunction findRollingNumber(svg: SVGSVGElement, componentId: string): RollingNumberSurface | undefined {\n return [...svg.querySelectorAll<RollingNumberSurface>('foreignObject[data-sf-widget=\"rollingNumber\"]')].find(\n surface => surface.getAttribute('data-sf-id') === componentId,\n );\n}\n\nconst FADE_INTERVAL = 140;\n\nfunction componentDigits(surface: RollingNumberSurface): HTMLDivElement | undefined {\n return surface.querySelector<HTMLDivElement>('[data-sf-rolling-digits]') ?? undefined;\n}\n\nfunction componentStyle(surface: RollingNumberSurface): Required<RollingNumberComponentStyle> {\n const encoded = surface.getAttribute('data-sf-widget-style');\n if (!encoded) {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n try {\n return { ...DEFAULT_ROLLING_NUMBER_STYLE, ...(JSON.parse(encoded) as RollingNumberComponentStyle) };\n } catch {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n}\n\nfunction positiveInteger(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n const number = Number(value);\n return Number.isInteger(number) && number > 0 ? number : undefined;\n}\n\nfunction durationFor(surface: RollingNumberSurface): number {\n const duration = Number(surface.getAttribute('data-sf-widget-duration'));\n if (!Number.isFinite(duration) || duration < 0) {\n return 420;\n }\n const reduceMotion = surface.ownerDocument.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n return reduceMotion ? 0 : duration;\n}\n\nfunction setRollingNumber(surface: RollingNumberSurface, value: string | number, animate: boolean): boolean {\n const digits = componentDigits(surface);\n if (!digits) {\n return false;\n }\n const previousValue = surface.getAttribute('data-sf-widget-value') ?? '';\n const nextValue = formatRollingNumber(value, positiveInteger(surface.getAttribute('data-sf-widget-digits')));\n if (previousValue === nextValue) {\n return true;\n }\n updateRollingDigits(digits, previousValue, nextValue, componentStyle(surface), animate ? durationFor(surface) : 0);\n surface.setAttribute('data-sf-widget-value', nextValue);\n return true;\n}\n\nexport function mountDocumentComponents(svg: SVGSVGElement): DocumentComponentsHandle {\n const valueOverrides = new Map<string, string | number>();\n const lastApplied = new Map<string, number>();\n const pending = new Map<string, ReturnType<typeof setTimeout>>();\n return {\n setValue(componentId: string, value: string | number): boolean {\n const surface = findRollingNumber(svg, componentId);\n if (!surface) {\n return false;\n }\n valueOverrides.set(componentId, value);\n if (componentStyle(surface).motion !== 'fade') {\n return setRollingNumber(surface, value, true);\n }\n const now = Date.now();\n const wait = (lastApplied.get(componentId) ?? 0) + FADE_INTERVAL - now;\n if (wait <= 0) {\n lastApplied.set(componentId, now);\n return setRollingNumber(surface, value, true);\n }\n if (!pending.has(componentId)) {\n pending.set(\n componentId,\n setTimeout(() => {\n pending.delete(componentId);\n lastApplied.set(componentId, Date.now());\n const current = findRollingNumber(svg, componentId);\n const latest = valueOverrides.get(componentId);\n if (current && latest !== undefined) {\n setRollingNumber(current, latest, true);\n }\n }, wait),\n );\n }\n return true;\n },\n refresh(): void {\n for (const [componentId, value] of valueOverrides) {\n const surface = findRollingNumber(svg, componentId);\n if (surface) {\n setRollingNumber(surface, value, false);\n }\n }\n },\n clearValues(): void {\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n valueOverrides.clear();\n },\n destroy(): void {\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n valueOverrides.clear();\n },\n };\n}\n","import { parseHexRgb } from '../../../model/color';\n\nconst bases = new WeakMap<Element, string>();\nconst written = new WeakMap<Element, string>();\nconst fills = new WeakMap<Element, string>();\n\nfunction clamp01(value: number): number {\n return Math.min(1, Math.max(0, Number.isFinite(value) ? value : 0));\n}\n\nfunction parameters(surface: Element): Record<string, unknown> {\n try {\n return JSON.parse(surface.getAttribute('data-sf-shader-params') ?? '{}') as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nfunction positive(value: unknown, fallback: number): number {\n return Number(value) > 0 ? Number(value) : fallback;\n}\n\nfunction rangeOf(params: Record<string, unknown>): { min: number; max: number } {\n return {\n min: Number(params.min) || 0,\n max: Number.isFinite(Number(params.max)) && params.max !== undefined ? Number(params.max) : 100,\n };\n}\n\nexport function rulerProgress(surface: Element, value: number): number {\n const { min, max } = rangeOf(parameters(surface));\n return clamp01(max === min ? 0 : (value - min) / (max - min));\n}\n\nfunction move(node: Element, dx: number, dy: number): void {\n const current = node.getAttribute('transform') ?? '';\n const base = current === written.get(node) ? (bases.get(node) ?? '') : current;\n bases.set(node, base);\n const next = `translate(${dx} ${dy}) ${base}`.trim();\n written.set(node, next);\n node.setAttribute('transform', next);\n}\n\nconst WHITE: [number, number, number] = [255, 255, 255];\n\nfunction shade(node: SVGElement, bump: number, target: [number, number, number]): void {\n const base = fills.get(node) ?? node.getAttribute('fill') ?? '';\n fills.set(node, base);\n const rgb = parseHexRgb(base);\n if (!rgb) {\n return;\n }\n const mixed = rgb.map((channel, index) => Math.round(channel + (target[index] - channel) * bump));\n const fill = `rgb(${mixed[0]}, ${mixed[1]}, ${mixed[2]})`;\n node.style.fill = fill;\n for (const child of node.querySelectorAll<SVGElement>('tspan')) {\n child.style.fill = fill;\n }\n}\n\n// What a ruler needs to place its knob and to lift its numbers: where it is, which way it runs and how it is set.\ninterface Ruler {\n id: string;\n params: Record<string, unknown>;\n x: number;\n y: number;\n width: number;\n height: number;\n horizontal: boolean;\n progress: number;\n inset: number;\n // The length of the ruler, and how far it reaches across.\n extent: number;\n across: number;\n // How far the wire bends in around the knob.\n depth: number;\n}\n\nfunction rulerOf(surface: Element, progressOf: (id: string) => number | undefined): Ruler {\n const params = parameters(surface);\n const id = surface.getAttribute('data-sf-id') ?? '';\n const width = Number(surface.getAttribute('width'));\n const height = Number(surface.getAttribute('height'));\n const horizontal = params.axis === 'horizontal';\n const across = horizontal ? height : width;\n const dent = params.dent === undefined ? 1 : Number(params.dent);\n return {\n id,\n params,\n x: Number(surface.getAttribute('x')),\n y: Number(surface.getAttribute('y')),\n width,\n height,\n horizontal,\n progress: clamp01(progressOf(id) ?? Number(params.progress)),\n inset: positive(params.inset, 0.05),\n extent: horizontal ? width : height,\n across,\n depth: (dent < 0 ? 1 : dent) * 0.16 * across,\n };\n}\n\n// Lays the shape that the ruler names as its knob on the wire at the current value. Returns the half of the knob that lies across the\n// ruler, as a share of the ruler, or nothing when there is no such shape.\nfunction placeKnob(svg: SVGSVGElement, ruler: Ruler): number | undefined {\n const { params, x, y, width, height, horizontal, across, depth } = ruler;\n const knobId = typeof params.knob === 'string' ? params.knob : '';\n if (!knobId) {\n return undefined;\n }\n const nodes = [...svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(knobId)}\"]`)];\n const primary = nodes.find(node => node.hasAttribute('data-sf-primary')) as SVGGraphicsElement | undefined;\n if (!primary?.getBBox) {\n return undefined;\n }\n move(primary, 0, 0);\n const box = primary.getBBox();\n const half = (horizontal ? box.height : box.width) / 2;\n const along = ruler.inset + (1 - 2 * ruler.inset) * ruler.progress;\n const line = positive(params.line, 0.7);\n const gap = (params.gap === undefined ? 0.04 : Number(params.gap)) * across;\n const side = line * across - depth + half + gap;\n const target = horizontal ? { x: x + width * along, y: y + side } : { x: x + side, y: y + height * (1 - along) };\n const dx = target.x - (box.x + box.width / 2);\n const dy = target.y - (box.y + box.height / 2);\n for (const node of nodes) {\n move(node, dx, dy);\n }\n return half / across;\n}\n\n// The numbers near the knob are lifted out of the line and take the color of the light, the more the nearer they are.\nfunction liftLabels(svg: SVGSVGElement, ruler: Ruler): void {\n const { id, params, horizontal, extent, inset, progress, depth } = ruler;\n const { min, max } = rangeOf(params);\n const peak = (typeof params.peak === 'string' ? parseHexRgb(params.peak) : null) ?? WHITE;\n const spread = positive(params.spread, 0.07) * extent;\n const start = inset * extent;\n const span = (1 - 2 * inset) * extent;\n const knobAt = start + span * progress;\n for (const label of svg.querySelectorAll<SVGTextElement>(`text[data-sf-id=\"${CSS.escape(id)}\"]`)) {\n const value = Number(label.textContent);\n if (!Number.isFinite(value) || max === min) {\n continue;\n }\n const labelAt = start + span * clamp01((value - min) / (max - min));\n const bump = Math.exp(-(((labelAt - knobAt) / spread) ** 2));\n const shift = depth * 0.4 * bump;\n move(label, horizontal ? 0 : -shift, horizontal ? -shift : 0);\n shade(label, bump, peak);\n }\n}\n\nexport function placeRulerKnobs(\n svg: SVGSVGElement,\n progressOf: (id: string) => number | undefined,\n): Map<string, number> {\n const radii = new Map<string, number>();\n for (const surface of svg.querySelectorAll('foreignObject[data-sf-shader=\"ruler\"]')) {\n const ruler = rulerOf(surface, progressOf);\n const radius = placeKnob(svg, ruler);\n if (radius !== undefined) {\n radii.set(ruler.id, radius);\n }\n liftLabels(svg, ruler);\n }\n return radii;\n}\n","const CAMERA_OWNED_ATTRIBUTES = new Set(['viewbox', 'width', 'height']);\n\nexport function patchRootAttributes(svg: SVGSVGElement, next: SVGSVGElement): void {\n for (const attribute of Array.from(svg.attributes)) {\n if (!CAMERA_OWNED_ATTRIBUTES.has(attribute.name.toLowerCase())) {\n svg.removeAttribute(attribute.name);\n }\n }\n for (const attribute of Array.from(next.attributes)) {\n if (!CAMERA_OWNED_ATTRIBUTES.has(attribute.name.toLowerCase())) {\n svg.setAttribute(attribute.name, attribute.value);\n }\n }\n}\n","import type { SceneDiff } from './types';\n\nexport function classifySceneDiff(\n oldOwnerIds: ReadonlySet<string>,\n newOwnerIds: ReadonlySet<string>,\n touchedOwnerIds: ReadonlySet<string>,\n): SceneDiff {\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n for (const id of touchedOwnerIds) {\n const wasPresent = oldOwnerIds.has(id);\n const isPresent = newOwnerIds.has(id);\n if (isPresent && !wasPresent) {\n added.push(id);\n } else if (wasPresent && !isPresent) {\n removed.push(id);\n } else if (wasPresent && isPresent) {\n changed.push(id);\n }\n }\n return { added, removed, changed };\n}\n","export function patchDefinitions(svg: SVGSVGElement, next: SVGSVGElement): Element | null {\n const currentDefinitions = svg.querySelector(':scope > defs');\n const nextDefinitions = next.querySelector(':scope > defs');\n if (nextDefinitions) {\n if (currentDefinitions) {\n currentDefinitions.replaceWith(nextDefinitions);\n } else {\n svg.insertBefore(nextDefinitions, svg.firstChild);\n }\n return nextDefinitions;\n }\n currentDefinitions?.remove();\n return currentDefinitions;\n}\n","function patchAttributes(current: Element, next: Element): boolean {\n let changed = false;\n for (const attribute of Array.from(current.attributes)) {\n if (!next.hasAttribute(attribute.name)) {\n current.removeAttribute(attribute.name);\n changed = true;\n }\n }\n for (const attribute of Array.from(next.attributes)) {\n if (current.getAttribute(attribute.name) !== attribute.value) {\n current.setAttribute(attribute.name, attribute.value);\n changed = true;\n }\n }\n return changed;\n}\n\nfunction childrenEqual(a: Element, b: Element): boolean {\n const aChildren = Array.from(a.childNodes);\n const bChildren = Array.from(b.childNodes);\n if (aChildren.length !== bChildren.length) {\n return false;\n }\n for (let i = 0; i < aChildren.length; i++) {\n const x = aChildren[i];\n const y = bChildren[i];\n if (x.nodeType !== y.nodeType) {\n return false;\n }\n if (x.nodeType === Node.TEXT_NODE) {\n if (x.textContent !== y.textContent) {\n return false;\n }\n continue;\n }\n if (x.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n const xElement = x as Element;\n const yElement = y as Element;\n if (xElement.tagName !== yElement.tagName) {\n return false;\n }\n if (xElement.attributes.length !== yElement.attributes.length) {\n return false;\n }\n for (const attribute of Array.from(xElement.attributes)) {\n if (yElement.getAttribute(attribute.name) !== attribute.value) {\n return false;\n }\n }\n if (!childrenEqual(xElement, yElement)) {\n return false;\n }\n }\n return true;\n}\n\nfunction replaceTextContent(current: Element, next: Element): void {\n while (current.firstChild) {\n current.removeChild(current.firstChild);\n }\n while (next.firstChild) {\n current.appendChild(next.firstChild);\n }\n}\n\nexport function patchSceneElement(current: Element, next: Element): boolean {\n const componentRestyled =\n next.hasAttribute('data-sf-widget') &&\n (current.getAttribute('data-sf-widget-style') !== next.getAttribute('data-sf-widget-style') ||\n current.getAttribute('data-sf-widget-value') !== next.getAttribute('data-sf-widget-value'));\n const attributesChanged = patchAttributes(current, next);\n let contentChanged = false;\n if (componentRestyled) {\n contentChanged = true;\n replaceTextContent(current, next);\n }\n if (next.tagName.toLowerCase() === 'text' && !childrenEqual(current, next)) {\n contentChanged = true;\n replaceTextContent(current, next);\n }\n return attributesChanged || contentChanged;\n}\n","import { classifySceneDiff } from './classifySceneDiff';\nimport { patchDefinitions } from './definitionsPatch';\nimport { patchSceneElement } from './elementPatch';\nimport type { SceneDiff } from './types';\n\nfunction ownerIdOf(element: Element): string {\n return element.getAttribute('data-sf-id') ?? element.id;\n}\n\n// A document may have the same name twice, as two Repeat blocks do with templates of one name. Elements are matched by id and by how many of that\n// id came before, so every one of them is patched, kept or dropped on its own and none is left behind.\nfunction keyedElements(svg: SVGSVGElement): Array<[string, Element]> {\n const seen = new Map<string, number>();\n return Array.from(svg.querySelectorAll(':scope > [id]'), (element): [string, Element] => {\n const count = seen.get(element.id) ?? 0;\n seen.set(element.id, count + 1);\n return [`${element.id}#${count}`, element];\n });\n}\n\nfunction currentElementsById(svg: SVGSVGElement): Map<string, Element> {\n return new Map(keyedElements(svg));\n}\n\nfunction reusableElement(current: Element | undefined, next: Element, markTouched: (ownerId: string) => void): Element {\n if (current && current.tagName === next.tagName) {\n if (patchSceneElement(current, next)) {\n markTouched(ownerIdOf(next));\n }\n return current;\n }\n current?.remove();\n markTouched(ownerIdOf(next));\n return next;\n}\n\nfunction placeAfter(svg: SVGSVGElement, element: Element, previousSibling: Node | null): void {\n const wantedNext = previousSibling ? previousSibling.nextSibling : svg.firstChild;\n if (wantedNext !== element) {\n svg.insertBefore(element, wantedNext);\n }\n}\n\nexport function patchSceneNodes(svg: SVGSVGElement, next: SVGSVGElement): SceneDiff {\n const definitions = patchDefinitions(svg, next);\n const currentById = currentElementsById(svg);\n const retainedIds = new Set<string>();\n\n const oldOwnerIds = new Set<string>();\n for (const element of currentById.values()) {\n oldOwnerIds.add(ownerIdOf(element));\n }\n const newOwnerIds = new Set<string>();\n const touchedOwnerIds = new Set<string>();\n const markTouched = (ownerId: string): void => {\n touchedOwnerIds.add(ownerId);\n };\n\n let previousSibling: Node | null = definitions;\n for (const [key, nextElement] of keyedElements(next)) {\n retainedIds.add(key);\n newOwnerIds.add(ownerIdOf(nextElement));\n const liveElement = reusableElement(currentById.get(key), nextElement, markTouched);\n placeAfter(svg, liveElement, previousSibling);\n previousSibling = liveElement;\n }\n\n for (const [key, element] of currentById) {\n if (!retainedIds.has(key)) {\n touchedOwnerIds.add(ownerIdOf(element));\n element.remove();\n }\n }\n\n return classifySceneDiff(oldOwnerIds, newOwnerIds, touchedOwnerIds);\n}\n","import { patchRootAttributes } from './rootAttributesPatch';\nimport { patchSceneNodes } from './sceneNodesPatch';\nimport type { SceneDiff } from './types';\n\nexport function patchDisplayContent(svg: SVGSVGElement, next: SVGSVGElement): SceneDiff {\n patchRootAttributes(svg, next);\n return patchSceneNodes(svg, next);\n}\n","import type { ViewBox } from './types';\n\nexport function parseSvg(svgString: string): SVGSVGElement {\n const document = new DOMParser().parseFromString(svgString, 'image/svg+xml');\n const root: Element = document.documentElement;\n if (root.nodeName.toLowerCase() !== 'svg') {\n throw new Error('viewer: source did not parse to an <svg> root');\n }\n return root as SVGSVGElement;\n}\n\nexport function readViewBox(svg: SVGSVGElement): ViewBox {\n const values = (svg.getAttribute('viewBox') ?? '0 0 100 100').split(/\\s+/).map(Number);\n return { x: values[0], y: values[1], w: values[2], h: values[3] };\n}\n","import type { ViewBox } from './types';\n\nexport class ViewportController {\n readonly #svg: SVGSVGElement;\n #natural: ViewBox;\n #view: ViewBox;\n\n constructor(svg: SVGSVGElement, natural: ViewBox) {\n this.#svg = svg;\n this.#natural = natural;\n this.#view = { ...natural };\n }\n\n apply(): void {\n this.#svg.setAttribute('viewBox', `${this.#view.x} ${this.#view.y} ${this.#view.w} ${this.#view.h}`);\n }\n\n fit(): void {\n this.#view = { ...this.#natural };\n this.apply();\n }\n\n get(): ViewBox {\n return { ...this.#view };\n }\n\n setNatural(natural: ViewBox): void {\n this.#natural = natural;\n }\n\n #userPoint(clientX: number, clientY: number): { x: number; y: number } | null {\n const matrix = this.#svg.getScreenCTM();\n if (!matrix) {\n return null;\n }\n const point = new DOMPoint(clientX, clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n }\n\n zoomBy(factor: number, clientX?: number, clientY?: number): void {\n const rect = this.#svg.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return;\n }\n const centerX = clientX ?? rect.left + rect.width / 2;\n const centerY = clientY ?? rect.top + rect.height / 2;\n const anchor = this.#userPoint(centerX, centerY);\n this.#view = { ...this.#view, w: this.#view.w / factor, h: this.#view.h / factor };\n this.apply();\n const moved = anchor ? this.#userPoint(centerX, centerY) : null;\n if (anchor && moved) {\n this.#view.x += anchor.x - moved.x;\n this.#view.y += anchor.y - moved.y;\n }\n this.apply();\n }\n\n panBy(dxPixels: number, dyPixels: number): void {\n const scale = this.#svg.getScreenCTM()?.a;\n const pixelsPerUnit = scale && scale > 0 ? scale : 1;\n this.#view.x -= dxPixels / pixelsPerUnit;\n this.#view.y -= dyPixels / pixelsPerUnit;\n this.apply();\n }\n}\n","import { patchDisplayContent } from './scenePatch';\nimport { parseSvg, readViewBox } from './svgDocument';\nimport type { DisplayHandle, ViewBox } from './types';\nimport { ViewportController } from './viewport';\n\nexport { classifySceneDiff } from './classifySceneDiff';\nexport type { DisplayHandle, SceneDiff, ViewBox } from './types';\n\nexport function mountDisplay(container: HTMLElement, svgString: string): DisplayHandle {\n const svg = parseSvg(svgString);\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.style.display = 'block';\n svg.style.touchAction = 'none';\n const viewport = new ViewportController(svg, readViewBox(svg));\n container.appendChild(svg);\n viewport.apply();\n return {\n svg,\n fit: () => viewport.fit(),\n getViewport: (): ViewBox => viewport.get(),\n zoomBy: (factor, clientX, clientY) => viewport.zoomBy(factor, clientX, clientY),\n panBy: (dxPixels, dyPixels) => viewport.panBy(dxPixels, dyPixels),\n updateContent(nextSvgString) {\n const next = parseSvg(nextSvgString);\n const diff = patchDisplayContent(svg, next);\n viewport.setNatural(readViewBox(next));\n return diff;\n },\n destroy() {\n svg.remove();\n },\n };\n}\n","import type { Modifiers, OwnerRef } from '../dom';\nimport { Emitter as GenericEmitter, type Unsubscribe } from '../eventing/emitter';\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\nexport type { Modifiers, OwnerRef };\n\nexport interface OwnerPointerEvent {\n diagramId: string;\n owner: OwnerRef;\n modifiers: Modifiers;\n}\n\nexport interface SelectionChangeEvent {\n diagramId: string;\n selection: OwnerRef[];\n}\n\nexport interface ViewerErrorEvent {\n diagramId: string;\n code: 'contract-mismatch' | 'render-failed' | 'no-svg';\n message: string;\n}\n\nexport interface SceneDiffEvent {\n diagramId: string;\n added: string[];\n removed: string[];\n changed: string[];\n}\n\nexport interface ViewerEventMap {\n ready: { diagramId: string };\n canvasObjectClick: OwnerPointerEvent;\n linkClick: OwnerPointerEvent;\n ownerHover: OwnerPointerEvent | { diagramId: string; owner: null };\n selectionChange: SelectionChangeEvent;\n sceneDiff: SceneDiffEvent;\n error: ViewerErrorEvent;\n}\n\nexport type ViewerEventName = keyof ViewerEventMap;\nexport type ViewerEventHandler<T extends ViewerEventName> = (event: ViewerEventMap[T]) => void;\nexport type { Unsubscribe };\n\nexport const NO_MODIFIERS: Modifiers = { shift: false, ctrl: false, meta: false, alt: false };\n\nexport function ownerPointerEvent(diagramId: string, owner: OwnerRef, modifiers: Modifiers): OwnerPointerEvent {\n return { diagramId, owner, modifiers };\n}\n\nexport class Emitter extends GenericEmitter<ViewerEventMap> {}\n","import { readViewBox } from '../display/svgDocument';\nimport type { ViewerImageExportOptions } from './types';\n\nfunction positive(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction loadImage(document: Document, source: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const ImageConstructor = document.defaultView?.Image;\n if (!ImageConstructor) {\n reject(new Error('viewer export: Image is unavailable in this environment.'));\n return;\n }\n const image = new ImageConstructor();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('viewer export: the SVG snapshot could not be decoded.'));\n image.src = source;\n });\n}\n\nfunction canvasBlob(canvas: HTMLCanvasElement, mimeType: string, quality: number | undefined): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n blob => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(`viewer export: ${mimeType} encoding failed.`));\n }\n },\n mimeType,\n quality,\n );\n });\n}\n\nexport async function rasterizeSvgSnapshot(\n svg: SVGSVGElement,\n snapshot: string,\n options: ViewerImageExportOptions = {},\n): Promise<Blob> {\n const viewBox = readViewBox(svg);\n const scale = positive(options.scale, 1);\n const width = Math.max(1, Math.round(viewBox.w * scale));\n const height = Math.max(1, Math.round(viewBox.h * scale));\n const canvas = svg.ownerDocument.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('viewer export: a 2D canvas context is unavailable.');\n }\n const blob = new Blob([snapshot], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n const image = await loadImage(svg.ownerDocument, url);\n const background = options.backgroundColor ?? (options.format === 'jpeg' ? '#ffffff' : undefined);\n if (background) {\n context.fillStyle = background;\n context.fillRect(0, 0, width, height);\n }\n context.drawImage(image, 0, 0, width, height);\n const mimeType = options.format === 'jpeg' ? 'image/jpeg' : 'image/png';\n return await canvasBlob(canvas, mimeType, options.quality);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n","import { DEFAULT_ROLLING_NUMBER_STYLE, type RollingNumberComponentStyle } from '../../../model/component';\n\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nfunction copyAttributes(source: Element, target: Element): void {\n for (const attribute of source.attributes) {\n if (!attribute.name.startsWith('data-sf-shader')) {\n target.setAttribute(attribute.name, attribute.value);\n }\n }\n}\n\nfunction removeRuntimeOverlays(svg: SVGSVGElement): void {\n for (const overlay of svg.querySelectorAll(\n '[data-sf-selection-overlay], [data-sf-change-overlay], [id*=\"link-hit-\"]',\n )) {\n overlay.remove();\n }\n}\n\nfunction svgElement(document: Document, name: string, attributes: Record<string, string | number>): SVGElement {\n const element = document.createElementNS(SVG_NAMESPACE, name);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n return element;\n}\n\nfunction readComponentStyle(surface: Element): Required<RollingNumberComponentStyle> {\n try {\n return {\n ...DEFAULT_ROLLING_NUMBER_STYLE,\n ...(JSON.parse(surface.getAttribute('data-sf-widget-style') ?? '{}') as RollingNumberComponentStyle),\n };\n } catch {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n}\n\ninterface Cells {\n size: number;\n plain: boolean;\n cellWidth: number;\n cellHeight: number;\n gap: number;\n}\n\ninterface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nfunction cellsOf(box: Box, plain: boolean, fontSize = 0): Cells {\n const size = fontSize > 0 ? fontSize : Math.max(1, Math.min(box.width, box.height) * 0.28);\n return {\n size,\n plain,\n cellWidth: plain ? size * 0.62 : size * 0.72 + 2,\n cellHeight: plain ? size * 1.1 : size * 1.2 + 2,\n gap: size * (plain ? 0.02 : 0.1),\n };\n}\n\nfunction groupOf(document: Document, surface: Element, style: Required<RollingNumberComponentStyle>): SVGElement {\n const group = svgElement(document, 'g', { 'font-family': style.fontFamily });\n for (const attribute of ['id', 'transform', 'data-sf-id', 'data-sf-role', 'data-sf-kind']) {\n const attributeValue = surface.getAttribute(attribute);\n if (attributeValue !== null) {\n group.setAttribute(attribute, attributeValue);\n }\n }\n return group;\n}\n\nfunction labelText(\n document: Document,\n label: string,\n box: Box,\n top: number,\n cells: Cells,\n style: Required<RollingNumberComponentStyle>,\n): SVGElement {\n const text = svgElement(document, 'text', {\n x: box.x + box.width / 2,\n y: top - cells.size * 0.14,\n 'text-anchor': 'middle',\n 'font-size': cells.size * 0.16,\n 'font-weight': 600,\n 'letter-spacing': cells.size * 0.04,\n fill: style.labelColor,\n });\n text.textContent = label;\n return text;\n}\n\nfunction digitCell(\n document: Document,\n character: string,\n cellX: number,\n top: number,\n cells: Cells,\n style: Required<RollingNumberComponentStyle>,\n): SVGElement[] {\n const { size, plain, cellWidth, cellHeight } = cells;\n const nodes: SVGElement[] = [];\n if (!plain) {\n nodes.push(\n svgElement(document, 'rect', {\n x: cellX + 0.5,\n y: top + 0.5,\n width: cellWidth - 1,\n height: cellHeight - 1,\n rx: size * 0.09,\n fill: style.surface,\n stroke: style.divider,\n 'stroke-width': 1,\n }),\n );\n }\n const digit = svgElement(document, 'text', {\n x: cellX + cellWidth / 2,\n y: top + cellHeight / 2,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'central',\n 'font-size': size,\n 'font-weight': style.fontWeight,\n fill: style.color,\n });\n digit.textContent = character;\n nodes.push(digit);\n if (!plain) {\n nodes.push(\n svgElement(document, 'line', {\n x1: cellX + 0.5,\n x2: cellX + cellWidth - 0.5,\n y1: top + cellHeight / 2,\n y2: top + cellHeight / 2,\n stroke: style.divider,\n 'stroke-width': 1,\n }),\n );\n }\n return nodes;\n}\n\nfunction flattenRollingNumbers(svg: SVGSVGElement): void {\n const document = svg.ownerDocument;\n for (const surface of svg.querySelectorAll('foreignObject[data-sf-widget=\"rollingNumber\"]')) {\n const box: Box = {\n x: Number(surface.getAttribute('x')),\n y: Number(surface.getAttribute('y')),\n width: Number(surface.getAttribute('width')),\n height: Number(surface.getAttribute('height')),\n };\n const value = surface.getAttribute('data-sf-widget-value') ?? '';\n const style = readComponentStyle(surface);\n const label = surface.querySelector('div > span:not([data-sf-rolling-digit])')?.textContent ?? '';\n const cells = cellsOf(box, style.variant === 'plain', style.fontSize);\n const labelBlock = label ? cells.size * 0.3 : 0;\n const rowWidth = value.length * cells.cellWidth + Math.max(0, value.length - 1) * cells.gap;\n const left = box.x + (box.width - rowWidth) / 2;\n const top = box.y + (box.height - (labelBlock + cells.cellHeight)) / 2 + labelBlock;\n const group = groupOf(document, surface, style);\n if (label) {\n group.appendChild(labelText(document, label, box, top, cells, style));\n }\n [...value].forEach((character, index) => {\n const cellX = left + index * (cells.cellWidth + cells.gap);\n for (const node of digitCell(document, character, cellX, top, cells, style)) {\n group.appendChild(node);\n }\n });\n surface.replaceWith(group);\n }\n}\n\nexport function freezeShaderSurfaces(svg: SVGSVGElement, captures: readonly (string | undefined)[]): SVGSVGElement {\n const clone = svg.cloneNode(true) as SVGSVGElement;\n removeRuntimeOverlays(clone);\n const surfaces = [...clone.querySelectorAll<SVGForeignObjectElement>('foreignObject[data-sf-shader]')];\n surfaces.forEach((surface, index) => {\n const capture = captures[index];\n if (!capture) {\n surface.remove();\n return;\n }\n const image = clone.ownerDocument.createElementNS(SVG_NAMESPACE, 'image');\n copyAttributes(surface, image);\n image.setAttribute('href', capture);\n image.setAttribute('preserveAspectRatio', 'none');\n surface.replaceWith(image);\n });\n flattenRollingNumbers(clone);\n const viewBox = (clone.getAttribute('viewBox') ?? '').split(/\\s+/).map(Number);\n if (viewBox.length === 4 && viewBox.every(Number.isFinite)) {\n clone.setAttribute('width', String(viewBox[2]));\n clone.setAttribute('height', String(viewBox[3]));\n }\n clone.setAttribute('xmlns', SVG_NAMESPACE);\n return clone;\n}\n\nexport function serializeSvgSnapshot(svg: SVGSVGElement, captures: readonly (string | undefined)[]): string {\n return new XMLSerializer().serializeToString(freezeShaderSurfaces(svg, captures));\n}\n","import {\n CHANGE_COLOR,\n FLASH_DURATION_MS,\n findOwnerNode,\n isPrimary,\n linkChangeOverlay,\n REDUCED_MOTION_DURATION_MS,\n shapeChangeOverlay,\n startChangeFade,\n} from '../../dom';\n\nexport interface ChangeFlash {\n flash(ownerIds: readonly string[], color?: string): void;\n destroy(): void;\n}\n\nexport function createChangeFlash(svg: SVGSVGElement): ChangeFlash {\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n const flash = (ownerIds: readonly string[], color: string = CHANGE_COLOR): void => {\n const ids = [...new Set(ownerIds)];\n if (ids.length === 0) {\n return;\n }\n const doc = svg.ownerDocument;\n const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n for (const id of ids) {\n const primary = findOwnerNode(svg, id, isPrimary);\n if (!primary) {\n continue;\n }\n const pending = timers.get(id);\n if (pending) {\n clearTimeout(pending);\n }\n for (const stale of svg.querySelectorAll(`[data-sf-change-overlay=\"${CSS.escape(id)}\"]`)) {\n stale.remove();\n }\n const overlay =\n primary.getAttribute('data-sf-role') === 'link'\n ? linkChangeOverlay(doc, primary as SVGPathElement, id, color)\n : shapeChangeOverlay(doc, primary, id, color);\n svg.appendChild(overlay);\n startChangeFade(overlay, reducedMotion);\n const duration = reducedMotion ? REDUCED_MOTION_DURATION_MS : FLASH_DURATION_MS;\n timers.set(\n id,\n setTimeout(() => {\n overlay.remove();\n timers.delete(id);\n }, duration),\n );\n }\n };\n\n return {\n flash,\n destroy(): void {\n for (const timer of timers.values()) {\n clearTimeout(timer);\n }\n timers.clear();\n },\n };\n}\n","import type { SelectionController } from './selectionController';\n\nexport function bindKeyboardSelection(\n svg: SVGSVGElement,\n selection: SelectionController,\n selectable: boolean,\n): () => void {\n const onKeyDown = (event: KeyboardEvent) => {\n if (selectable && event.key === 'Escape') {\n selection.dispatch({ type: 'clear' });\n }\n };\n svg.addEventListener('keydown', onKeyDown);\n return () => {\n svg.removeEventListener('keydown', onKeyDown);\n };\n}\n","import type { Modifiers } from '../events';\n\nexport function modifiersOf(event: MouseEvent | KeyboardEvent): Modifiers {\n return {\n shift: event.shiftKey,\n ctrl: event.ctrlKey,\n meta: event.metaKey,\n alt: event.altKey,\n };\n}\n","export type SelectionAction =\n | { type: 'clear' }\n | { type: 'set'; ids: string[] }\n | { type: 'select'; id: string }\n | { type: 'toggle'; id: string }\n | { type: 'add'; id: string };\n\nexport function selectionReducer(current: ReadonlySet<string>, action: SelectionAction): Set<string> {\n switch (action.type) {\n case 'clear':\n return new Set();\n case 'set':\n return new Set(action.ids);\n case 'select':\n return new Set([action.id]);\n case 'add':\n return new Set([...current, action.id]);\n case 'toggle': {\n const next = new Set(current);\n if (next.has(action.id)) {\n next.delete(action.id);\n } else {\n next.add(action.id);\n }\n return next;\n }\n }\n}\n\nexport function clickAction(id: string, modifiers: { shift: boolean; ctrl: boolean; meta: boolean }): SelectionAction {\n return modifiers.ctrl || modifiers.meta || modifiers.shift ? { type: 'toggle', id } : { type: 'select', id };\n}\n","import { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { Emitter, OwnerRef } from '../events';\nimport { modifiersOf } from './modifiers';\nimport { clickAction } from './selection';\nimport type { SelectionController } from './selectionController';\n\nconst SELECTION_OVERLAY_CONTROL_SELECTOR =\n '[data-sf-resize-handle], [data-sf-link-endpoint], [data-sf-link-segment], [data-sf-quick-duplicate]';\n\nexport function isSelectionOverlayControl(target: Element | null): boolean {\n return Boolean(target?.closest(SELECTION_OVERLAY_CONTROL_SELECTOR));\n}\n\nexport class OwnerPointerController {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #diagramId: string;\n readonly #selection: SelectionController;\n\n constructor(svg: SVGSVGElement, emitter: Emitter, diagramId: string, selection: SelectionController) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#diagramId = diagramId;\n this.#selection = selection;\n }\n\n hover(event: PointerEvent): void {\n const owner = resolveOwner(event.target as Element | null);\n this.#emitter.emit(\n 'ownerHover',\n owner\n ? { diagramId: this.#diagramId, owner, modifiers: modifiersOf(event) }\n : { diagramId: this.#diagramId, owner: null },\n );\n }\n\n select(event: PointerEvent): void {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!owner) {\n this.#clearWhenOutsideOverlay(target);\n return;\n }\n this.#selectOwner(owner, event);\n }\n\n #clearWhenOutsideOverlay(target: Element | null): void {\n if (!isSelectionOverlayControl(target)) {\n this.#selection.dispatch({ type: 'clear' });\n }\n }\n\n #selectOwner(owner: OwnerRef, event: PointerEvent): void {\n this.#selection.remember(owner);\n const modifiers = modifiersOf(event);\n this.#selection.dispatch(clickAction(owner.id, modifiers));\n this.#emitter.emit(owner.role === 'link' ? 'linkClick' : 'canvasObjectClick', {\n diagramId: this.#diagramId,\n owner,\n modifiers,\n });\n const node = findOwnerNode(this.#svg, owner.id, isPrimary);\n if (node && !node.hasAttribute('tabindex')) {\n node.setAttribute('tabindex', '-1');\n }\n node?.focus({ preventScroll: true });\n }\n}\n","import { isCameraGesture, resolveOwner } from '../../dom';\nimport type { DisplayHandle } from '../display';\nimport type { Emitter } from '../events';\nimport { isSelectionOverlayControl, OwnerPointerController } from './pointerSelection';\nimport type { SelectionController } from './selectionController';\n\nconst DRAG_THRESHOLD = 4;\ninterface PointerDownState {\n x: number;\n y: number;\n moved: boolean;\n panable: boolean;\n}\n\nexport interface PointerInteractionBinding {\n display: DisplayHandle;\n emitter: Emitter;\n diagramId: string;\n selection: SelectionController;\n selectable: boolean;\n}\n\nclass PointerInteractionSession {\n readonly #display: DisplayHandle;\n readonly #ownerPointer: OwnerPointerController;\n readonly #selectable: boolean;\n #down: PointerDownState | null = null;\n\n constructor(display: DisplayHandle, ownerPointer: OwnerPointerController, selectable: boolean) {\n this.#display = display;\n this.#ownerPointer = ownerPointer;\n this.#selectable = selectable;\n }\n\n bind(): () => void {\n this.#display.svg.addEventListener('pointerdown', this.#onPointerDown);\n this.#display.svg.addEventListener('pointermove', this.#onPointerMove);\n this.#display.svg.addEventListener('pointerup', this.#onPointerUp);\n return () => this.#destroy();\n }\n\n readonly #onPointerDown = (event: PointerEvent): void => {\n const target = event.target as Element | null;\n const overContent = Boolean(resolveOwner(target)) || isSelectionOverlayControl(target);\n this.#down = {\n x: event.clientX,\n y: event.clientY,\n moved: false,\n panable: isCameraGesture(event) || !overContent,\n };\n };\n\n readonly #onPointerMove = (event: PointerEvent): void => {\n if (this.#continueDrag(event)) {\n return;\n }\n if (this.#selectable) {\n this.#ownerPointer.hover(event);\n }\n };\n\n readonly #onPointerUp = (event: PointerEvent): void => {\n const wasDrag = this.#down?.moved ?? false;\n this.#down = null;\n // Only the main button selects: the right one opens a menu for what is already selected.\n if (!wasDrag && this.#selectable && event.button === 0) {\n this.#ownerPointer.select(event);\n }\n };\n\n #continueDrag(event: PointerEvent): boolean {\n if (!this.#down) {\n return false;\n }\n if (!this.#down.moved && Math.hypot(event.clientX - this.#down.x, event.clientY - this.#down.y) > DRAG_THRESHOLD) {\n this.#down.moved = true;\n }\n if (!this.#down.moved) {\n return false;\n }\n if (this.#down.panable && isCameraGesture(event)) {\n this.#display.panBy(event.movementX, event.movementY);\n }\n return true;\n }\n\n #destroy(): void {\n this.#display.svg.removeEventListener('pointerdown', this.#onPointerDown);\n this.#display.svg.removeEventListener('pointermove', this.#onPointerMove);\n this.#display.svg.removeEventListener('pointerup', this.#onPointerUp);\n }\n}\n\nexport function bindPointerInteraction(binding: PointerInteractionBinding): () => void {\n const { display, emitter, diagramId, selection, selectable } = binding;\n const ownerPointer = new OwnerPointerController(display.svg, emitter, diagramId, selection);\n return new PointerInteractionSession(display, ownerPointer, selectable).bind();\n}\n","import {\n DERIVED_HEIGHT_ROLES,\n findOwnerNode,\n isometricSelectionOverlay,\n isPrimary,\n linkSelectionOverlay,\n pathSelectionOverlay,\n quickDuplicateBubbles,\n shapeSelectionOverlay,\n} from '../../dom';\nimport type { OwnerRef } from '../events';\n\nexport function paintSelectionOverlays(\n svg: SVGSVGElement,\n selectedIds: ReadonlySet<string>,\n owners: ReadonlyMap<string, OwnerRef>,\n): void {\n for (const overlay of svg.querySelectorAll('[data-sf-selection-overlay]')) {\n overlay.remove();\n }\n const document = svg.ownerDocument;\n for (const id of selectedIds) {\n const primary = findOwnerNode(svg, id, isPrimary);\n if (!primary) {\n continue;\n }\n const owner = owners.get(id);\n const overlay =\n owner?.role === 'link'\n ? linkSelectionOverlay(document, primary as SVGPathElement, id, svg)\n : owner?.role === 'path'\n ? pathSelectionOverlay(document, primary as SVGPathElement, id, svg)\n : owner?.role === 'isometric'\n ? isometricSelectionOverlay(document, primary, id, svg)\n : shapeSelectionOverlay(document, primary, id, svg, owner ? DERIVED_HEIGHT_ROLES.has(owner.role) : false);\n svg.appendChild(overlay);\n if (owner?.role === 'shape' && selectedIds.size === 1) {\n svg.appendChild(quickDuplicateBubbles(document, primary, id, svg));\n }\n }\n}\n","import { resolveOwner } from '../../dom';\nimport type { Emitter, OwnerRef } from '../events';\nimport { paintSelectionOverlays } from './overlayPainter';\nimport { type SelectionAction, selectionReducer } from './selection';\n\nexport class SelectionController {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #diagramId: string;\n readonly #owners = new Map<string, OwnerRef>();\n #ids = new Set<string>();\n\n constructor(svg: SVGSVGElement, emitter: Emitter, diagramId: string) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#diagramId = diagramId;\n }\n\n getOwners(): OwnerRef[] {\n return [...this.#ids].map(id => this.#owners.get(id)).filter((owner): owner is OwnerRef => Boolean(owner));\n }\n\n remember(owner: OwnerRef): void {\n this.#owners.set(owner.id, owner);\n }\n\n dispatch(action: SelectionAction): void {\n this.#ids = selectionReducer(this.#ids, action);\n paintSelectionOverlays(this.#svg, this.#ids, this.#owners);\n this.#emitter.emit('selectionChange', {\n diagramId: this.#diagramId,\n selection: this.getOwners(),\n });\n }\n\n repaint(): void {\n if (this.#ids.size > 0) {\n paintSelectionOverlays(this.#svg, this.#ids, this.#owners);\n }\n }\n\n selectIds(ids: string[]): void {\n for (const id of ids) {\n const element = this.#svg.querySelector(`[data-sf-id=\"${CSS.escape(id)}\"]`);\n const owner = resolveOwner(element);\n if (owner) {\n this.remember(owner);\n }\n }\n this.dispatch({ type: 'set', ids });\n }\n}\n","import { isCameraGesture } from '../../dom';\nimport type { DisplayHandle } from '../display';\nimport type { SelectionController } from './selectionController';\n\nexport function bindWheelZoom(display: DisplayHandle, selection: SelectionController): () => void {\n const onWheel = (event: WheelEvent) => {\n if (!isCameraGesture(event)) {\n return;\n }\n event.preventDefault();\n display.zoomBy(event.deltaY < 0 ? 1.1 : 1 / 1.1, event.clientX, event.clientY);\n selection.repaint();\n };\n display.svg.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n display.svg.removeEventListener('wheel', onWheel);\n };\n}\n","import type { DisplayHandle } from '../display';\nimport type { Emitter, OwnerRef } from '../events';\nimport { createChangeFlash } from './changeFlash';\nimport { bindKeyboardSelection } from './keyboard';\nimport { bindPointerInteraction } from './pointer';\nimport { SelectionController } from './selectionController';\nimport { bindWheelZoom } from './wheel';\n\nexport interface InteractionHandle {\n getSelection(): OwnerRef[];\n select(ids: string[]): void;\n repaint(): void;\n flashChanged(ownerIds: readonly string[], color?: string): void;\n destroy(): void;\n}\n\nexport interface BindInteractionOptions {\n selectable?: boolean;\n}\n\nexport function bindInteraction(\n display: DisplayHandle,\n emitter: Emitter,\n diagramId: string,\n options: BindInteractionOptions = {},\n): InteractionHandle {\n const selectable = options.selectable ?? true;\n const selection = new SelectionController(display.svg, emitter, diagramId);\n const unbindPointer = bindPointerInteraction({ display, emitter, diagramId, selection, selectable });\n const unbindWheel = bindWheelZoom(display, selection);\n const unbindKeyboard = bindKeyboardSelection(display.svg, selection, selectable);\n const changeFlash = createChangeFlash(display.svg);\n return {\n getSelection: () => selection.getOwners(),\n select: ids => selection.selectIds(ids),\n repaint: () => selection.repaint(),\n flashChanged: (ownerIds, color) => changeFlash.flash(ownerIds, color),\n destroy() {\n unbindPointer();\n unbindWheel();\n unbindKeyboard();\n changeFlash.destroy();\n },\n };\n}\n","export const SHADER_DEFAULTS = {\n numbers: {\n intensity: 0.85,\n speed: 0.18,\n progress: -1,\n boost: 0,\n dent: -1,\n day: -1,\n light: 135,\n gloss: 0.15,\n depth: 0.4,\n rim: 0.2,\n },\n colors: {\n color: [0.08, 0.02, 0.22],\n accent: [0.58, 0.31, 1],\n hot: [1, 0.45, 0.82],\n },\n} as const;\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uLight;\nuniform float uGloss;\nuniform float uDepth;\nuniform float uRim;\nuniform float uPressed;\nuniform vec3 uColor;\nvarying vec2 vUv;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float pixel = 2.0 / max(uResolution.y, 1.0);\n float pressed = clamp(uPressed, 0.0, 1.0);\n\n float radius = 0.9 * (1.0 - 0.025 * pressed);\n float r = length(p);\n vec2 direction = r > 0.0001 ? p / r : vec2(0.0, 1.0);\n float angle = radians(uLight);\n vec2 toLight = vec2(cos(angle), sin(angle));\n vec3 light = normalize(vec3(toLight, 0.85));\n\n vec3 base = dot(uColor, uColor) > 0.0 ? uColor : vec3(0.15, 0.15, 0.17);\n float depth = max(uDepth, 0.0) * (1.0 - 0.65 * pressed);\n float inside = clamp(r / radius, 0.0, 1.0);\n\n vec3 normal = normalize(vec3(direction * pow(inside, 1.6) * depth * 1.4, 1.0));\n float diffuse = clamp(dot(normal, light), 0.0, 1.0);\n vec3 color = base * (0.5 + 0.7 * diffuse) * (1.0 - 0.18 * pressed);\n\n vec3 reflected = reflect(-light, normal);\n float specular = pow(max(reflected.z, 0.0), 26.0) * max(uGloss, 0.0) * (1.0 - 0.8 * pressed);\n color += vec3(specular) * 0.9;\n\n float lit = max(dot(direction, toLight), 0.0);\n float away = max(dot(direction, -toLight), 0.0);\n float edge = smoothstep(0.55, 1.0, inside);\n color *= 1.0 - 0.45 * edge * away * min(depth, 1.5) - 0.12 * edge;\n color += mix(base, vec3(1.0), 0.6) * max(uRim, 0.0) * smoothstep(0.9, 1.0, inside) * lit * (1.0 - 0.7 * pressed);\n\n float disc = 1.0 - smoothstep(radius - pixel, radius + pixel, r);\n\n vec2 shadowAt = -toLight * 0.06 * (1.0 - 0.7 * pressed);\n float shadowDistance = length(p - shadowAt);\n float shadow = (1.0 - smoothstep(radius * 0.55, 0.99, shadowDistance)) * 0.55 * (1.0 - 0.4 * pressed);\n\n float alpha = clamp(disc + shadow * (1.0 - disc), 0.0, 1.0);\n gl_FragColor = vec4(clamp(color * disc, 0.0, 1.0), alpha);\n}\n`;\n\nexport const buttonProgram: ShaderProgram = {\n name: 'button',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform sampler2D uBackdrop;\nuniform vec2 uBackdropOrigin;\nuniform vec2 uBackdropScale;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uThickness;\nuniform float uRefraction;\nuniform vec3 uPinkColor;\nuniform vec3 uVioletColor;\nuniform vec3 uBlueColor;\nuniform vec3 uEdgeColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float depth = mix(0.025, 0.105, clamp(uThickness, 0.0, 1.0));\n float radius = 0.79;\n float distance = length(p) - radius;\n float pixel = 2.0 / max(min(uResolution.x, uResolution.y), 1.0);\n float alpha = 1.0 - smoothstep(-pixel, pixel, distance);\n if (alpha < 0.001) discard;\n\n float edge = smoothstep(0.66, 0.995, length(p) / radius);\n vec2 normal = p / max(length(p), 0.001);\n vec2 opticalWarp = normal * edge * max(uRefraction, 0.0) * 0.12;\n opticalWarp += vec2(sin(p.y * 8.0 + time * 0.35), cos(p.x * 7.0 - time * 0.27)) * 0.002;\n vec2 backdropUv = clamp(uBackdropOrigin + (vUv + opticalWarp) * uBackdropScale, 0.001, 0.999);\n vec3 backdrop = texture2D(uBackdrop, backdropUv).rgb;\n\n float wave = sin(p.x * 3.1 - time * 0.38) * 0.025;\n float pinkBand = bell(p.y - 0.42 + wave, 0.20);\n float pinkShelf = smoothstep(0.16, 0.30, p.y + wave);\n float whiteCap = smoothstep(0.59, 0.75, p.y + wave) * 0.95;\n vec3 face = backdrop * 0.19 + vec3(0.004, 0.002, 0.011);\n face += uVioletColor * bell(p.y + 0.56, 0.18) * 0.10;\n face += uBlueColor * bell(p.x - 0.49, 0.18) * bell(p.y + 0.22, 0.39) * 0.09;\n face += uPinkColor * pinkBand * pinkShelf * 1.05;\n face += uEdgeColor * whiteCap * 0.88;\n\n float left = 1.0 - smoothstep(-0.68, -0.34, p.x);\n float right = smoothstep(0.36, 0.68, p.x);\n float upper = smoothstep(0.0, 0.58, p.y);\n float lower = 1.0 - smoothstep(-0.52, -0.04, p.y);\n float rim = bell(distance + 0.004, 0.007);\n float bevel = bell(distance + depth * 0.55, depth * 0.48);\n float innerArc = bell(distance + depth * 1.13, depth * 0.23) * right * lower;\n face += uEdgeColor * rim * (0.61 + 0.35 * upper);\n face += uPinkColor * bevel * (0.18 + 0.58 * left * upper);\n face += uBlueColor * bevel * right * lower * 0.49;\n face += uVioletColor * innerArc * 0.27;\n face += uEdgeColor * bell(distance + depth * 1.3, depth * 0.31) * left * upper * 0.22;\n float movingGlint = bell(p.x + 0.42 - sin(time * 0.47) * 0.075, 0.055);\n face += uEdgeColor * movingGlint * bell(p.y - 0.26, 0.48) * left * 0.15;\n gl_FragColor = vec4(clamp(face * max(uIntensity, 0.0), 0.0, 1.0) * alpha, alpha);\n}\n`;\n\nexport const chromaticGlassPlateProgram: ShaderProgram = {\n name: 'chromaticGlassPlate',\n fragmentSource,\n usesBackdrop: true,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uRingRadius;\nuniform float uRingWidth;\nuniform float uBloom;\nuniform float uMotion;\nuniform bool uLightMode;\nuniform vec3 uWarmColor;\nuniform vec3 uCoolColor;\nuniform vec3 uAccentColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nfloat displacedRing(vec2 point, float radius, float width, float phase, float time, float motion) {\n float angle = atan(point.y, point.x);\n float wave = sin(angle * 2.0 + phase + time * 0.4) * 0.052;\n wave += sin(angle * 3.0 - phase * 0.45 + time * 0.27) * 0.025;\n wave += sin(angle * 6.0 - phase * 0.7 - time * 0.23) * 0.011;\n return bell(length(point) - radius - wave * motion, width);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float radius = clamp(uRingRadius, 0.25, 0.88);\n float width = max(uRingWidth, 0.025);\n float motion = max(uMotion, 0.0);\n\n vec2 coolOffset = vec2(-0.052, -0.012) * (0.7 + motion * 0.3);\n vec2 warmOffset = vec2(0.042, 0.024) * (0.7 + motion * 0.3);\n vec2 accentOffset = vec2(0.016, -0.044) * (0.7 + motion * 0.3);\n float coolRing = displacedRing(p + coolOffset, radius, width * 1.18, 0.4, time, motion);\n float warmRing = displacedRing(p + warmOffset, radius, width * 1.05, 2.6, time, motion);\n float accentRing = displacedRing(p + accentOffset, radius, width, 4.8, time, motion);\n float coreRing = displacedRing(p, radius, width * 0.48, 1.7, time, motion);\n\n vec3 color = uCoolColor * coolRing * 0.72;\n color += uWarmColor * warmRing * 0.68;\n color += uAccentColor * accentRing * 0.64;\n if (!uLightMode) {\n color += uHighlightColor * coreRing * 1.35;\n }\n float broadBloom = displacedRing(p, radius, width * 2.35, 0.0, time, motion);\n color += mix(uCoolColor, uWarmColor, smoothstep(-0.8, 0.8, p.y)) * broadBloom * max(uBloom, 0.0) * 0.2;\n\n float ringAlpha = max(max(coolRing, warmRing), max(accentRing, coreRing));\n float alpha = clamp(ringAlpha * 0.9 + broadBloom * max(uBloom, 0.0) * 0.18, 0.0, 1.0);\n if (uLightMode) {\n color = mix(color, uHighlightColor, smoothstep(0.16, 0.82, coreRing));\n }\n float circleMask = 1.0 - smoothstep(0.965, 1.0, length(p));\n alpha *= circleMask * max(uIntensity, 0.0);\n color *= circleMask * max(uIntensity, 0.0);\n\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), clamp(alpha, 0.0, 1.0));\n}\n`;\n\nexport const chromaticHaloProgram: ShaderProgram = {\n name: 'chromaticHalo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uGlow;\nuniform float uDay;\nuniform vec3 uTopColor;\nuniform vec3 uMiddleColor;\nuniform vec3 uBottomColor;\nuniform vec3 uRimColor;\nvarying vec2 vUv;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n float time = uTime * max(uSpeed, 0.0);\n float glow = max(uGlow, 0.0);\n float intensity = max(uIntensity, 0.0);\n\n float current = sin(p.x * 4.2 - time * 0.75) * 0.025;\n current += sin(p.y * 5.0 + p.x * 2.3 + time * 0.55) * 0.018;\n float vertical = p.y + current;\n float useDay = step(0.0, uDay);\n float day = clamp(uDay, 0.0, 1.0);\n float capStart = mix(-0.04, -0.62 + day * 0.98, useDay);\n float tone = mix(1.0, mix(0.2, 1.2, day), useDay);\n vec3 bodyColor = mix(uBottomColor, uMiddleColor, smoothstep(-0.69, -0.06, vertical)) * tone;\n bodyColor = mix(bodyColor, uTopColor, smoothstep(capStart, capStart + 0.42, vertical));\n\n float side = smoothstep(0.35, 0.9, abs(p.x) / max(radius, 0.001));\n float lower = 1.0 - smoothstep(-0.35, 0.38, p.y);\n float ring = exp(-pow((radius - 0.765) / 0.03, 2.0));\n float rimLight = ring * (0.28 + side * 0.55 + lower * 0.52) * mix(1.0, 0.35 + 0.65 * day, useDay);\n float crest = ring * smoothstep(0.3, 0.68, p.y) * mix(1.0, 0.15 + 0.85 * day, useDay);\n bodyColor = mix(bodyColor, uRimColor, clamp(rimLight * 0.78 * intensity, 0.0, 1.0));\n bodyColor = mix(bodyColor, vec3(1.0, 0.94, 0.86), clamp(crest * 0.84 * intensity, 0.0, 1.0));\n\n float bodyAlpha = 1.0 - smoothstep(0.758, 0.778, radius);\n float halo = exp(-pow(max(radius - 0.765, 0.0) / 0.12, 2.0));\n halo *= (0.14 + rimLight * 0.28 + crest * 0.2) * glow * intensity;\n float crownGlow = exp(-pow(p.x / 0.48, 2.0) - pow((p.y - 0.83) / 0.16, 2.0));\n halo += crownGlow * 0.16 * glow * intensity;\n float outsideAlpha = clamp(halo, 0.0, 0.85) * (1.0 - smoothstep(0.84, 1.0, radius));\n vec3 haloColor = mix(uRimColor, vec3(1.0, 0.91, 0.77), crest * 0.55 + crownGlow * 0.45);\n float alpha = bodyAlpha + (1.0 - bodyAlpha) * outsideAlpha;\n vec3 premultipliedColor = bodyColor * bodyAlpha;\n premultipliedColor += haloColor * (1.0 - bodyAlpha) * outsideAlpha;\n\n gl_FragColor = vec4(premultipliedColor, alpha);\n}\n`;\n\nexport const eclipseOrbProgram: ShaderProgram = {\n name: 'eclipseOrb',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uCellCount;\nuniform float uGrain;\nuniform vec3 uBaseColor;\nuniform vec3 uTopColor;\nuniform vec3 uCoreColor;\nuniform vec3 uBottomColor;\nuniform vec3 uCoolColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat pixelNoise(vec2 uv) {\n vec2 pixel = floor(uv * uResolution);\n return fract(sin(dot(pixel, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float cells = max(uCellCount, 1.0);\n vec2 grid = (p + 1.0) * cells * 0.5;\n vec2 cell = fract(grid) - 0.5;\n vec2 samplePoint = (floor(grid) + 0.5) * 2.0 / cells - 1.0;\n vec2 q = samplePoint;\n q.x += sin(samplePoint.y * 3.4 + time * 0.34) * 0.035;\n q.y += sin(samplePoint.x * 4.0 - time * 0.29) * 0.045;\n\n float upperCurve = 0.56 + 0.11 * sin(q.x * 3.1 + time * 0.41);\n float topLight = band(q.y - upperCurve, 0.25) * (0.48 + 0.52 * abs(q.x));\n topLight += band(q.x + 0.77, 0.28) * band(q.y - 0.46, 0.35) * 0.58;\n topLight += band(q.x - 0.76, 0.28) * band(q.y - 0.43, 0.36) * 0.68;\n topLight *= 1.0 - band(q.x + 0.02, 0.45) * band(q.y - 0.78, 0.28) * 0.88;\n\n float coreLight = band(q.x + 0.02 + 0.08 * sin(time * 0.28), 0.58);\n coreLight *= band(q.y + 0.19 + 0.07 * sin(q.x * 3.0 - time * 0.31), 0.44);\n float bottomLight = band(q.y + 0.82, 0.38) * band(q.x - 0.02, 0.85);\n float coolLight = band(q.x + 0.79, 0.31) * band(q.y + 0.03, 0.29);\n coolLight += band(q.x - 0.89, 0.23) * band(q.y + 0.02, 0.25) * 0.48;\n\n float centerCut = band(q.y - 0.12 + 0.08 * sin(q.x * 3.2 + time * 0.33), 0.16);\n centerCut *= band(q.x + 0.03, 0.99);\n float rightCut = band(q.x - 0.68, 0.35) * band(q.y + 0.37, 0.26);\n float occlusion = clamp(centerCut * 0.78 + rightCut * 0.79, 0.0, 0.9);\n\n vec3 color = uBaseColor;\n color += uTopColor * topLight * 0.91;\n color += uCoreColor * coreLight * 1.05;\n color += uBottomColor * bottomLight * 0.86;\n color += uCoolColor * coolLight * 0.68;\n color *= 1.0 - occlusion;\n\n float squareRadius = max(abs(cell.x), abs(cell.y));\n float dot = 1.0 - smoothstep(0.23, 0.43, squareRadius);\n color *= 0.21 + dot * 0.79;\n float noise = (pixelNoise(vUv) - 0.5) * max(uGrain, 0.0);\n color += vec3(noise) * (0.25 + dot * 0.75);\n\n float edge = 1.0 - smoothstep(0.955, 0.995, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * edge, 0.0, 1.0), edge);\n}\n`;\n\nexport const emberMatrixProgram: ShaderProgram = {\n name: 'emberMatrix',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uSlitCount;\nuniform float uOrientation;\nuniform bool uHole;\nuniform float uHoleSize;\nuniform float uGlow;\nuniform float uMotion;\nuniform vec3 uHotColor;\nuniform vec3 uCoreColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float radius = length(p);\n\n float wave = sin(p.y * 6.4 - time * 0.9) * 0.04 * motion;\n wave += sin(p.x * 5.1 + time * 0.6) * 0.026 * motion;\n float ringRadius = length(p + vec2(wave, 0.0));\n float holeSize = clamp(uHoleSize, 0.0, 0.72);\n float ring = uHole ? smoothstep(holeSize - 0.08, holeSize + 0.08, ringRadius) : 1.0;\n ring *= 1.0 - smoothstep(0.65, 0.83, ringRadius);\n float ringCore = bell(ringRadius - 0.56, 0.19);\n\n float count = clamp(uSlitCount, 12.0, 90.0);\n vec2 slitPoint = uOrientation < 0.5 ? p : vec2(p.y, p.x);\n float phase = slitPoint.x * count * 3.14159265;\n phase += sin(slitPoint.y * 3.6 - time * 0.95) * 0.75 * motion;\n phase += time * 2.2 * motion;\n float bars = pow(0.5 + 0.5 * cos(phase), 1.9);\n float slit = 0.12 + 0.88 * bars;\n float sideFade = 1.0 - smoothstep(0.67, 0.91, abs(p.x));\n\n float upperLight = bell(p.y - 0.45 - sin(time * 0.6) * 0.1 * motion, 0.21);\n float lowerLight = bell(p.y + 0.48 + sin(time * 0.5 + 1.7) * 0.1 * motion, 0.24);\n vec3 heat = mix(uHotColor, uCoreColor, smoothstep(-0.57, 0.55, p.y));\n heat = mix(heat, uHighlightColor, upperLight * 0.45 + lowerLight * 0.28);\n float molten = ring * slit * sideFade;\n vec3 color = heat * molten * (0.64 + ringCore * 0.68);\n\n float verticalTrail = bell(max(ringRadius - 0.69, 0.0), 0.24);\n verticalTrail *= smoothstep(0.25, 0.75, abs(p.y));\n verticalTrail *= slit * sideFade;\n float bloom = bell(ringRadius - 0.57, 0.29) * ring;\n float glow = max(uGlow, 0.0);\n float glowMask = (verticalTrail * 0.25 + bloom * 0.17) * glow;\n color += heat * glowMask;\n\n float frameFade = 1.0 - smoothstep(0.89, 1.0, max(abs(p.x), abs(p.y)));\n float alpha = clamp((molten * 0.92 + glowMask) * frameFade * max(uIntensity, 0.0), 0.0, 1.0);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0), 0.0, 1.0) * alpha, alpha);\n}\n`;\n\nexport const emberSlitsProgram: ShaderProgram = {\n name: 'emberSlits',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uDots;\nuniform float uDotSize;\nuniform float uStagger;\nuniform float uSphere;\nuniform float uAngle;\nuniform float uSpread;\nuniform float uWarp;\nuniform float uGlow;\nuniform float uRound;\nuniform float uScatter;\nuniform float uLens;\nuniform float uGrain;\nuniform vec3 uBaseColor;\nuniform vec3 uColorA;\nuniform vec3 uColorB;\nuniform vec3 uColorC;\nuniform vec3 uColorD;\nuniform vec3 uRimColor;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x), u.y);\n}\n\nfloat fbm(vec2 p) {\n return 0.5 * noise(p) + 0.25 * noise(p * 2.03 + 3.1) + 0.125 * noise(p * 4.01 + 7.7);\n}\n\nvec2 turn(vec2 point, float angle) {\n float c = cos(angle);\n float s = sin(angle);\n return vec2(c * point.x - s * point.y, s * point.x + c * point.y);\n}\n\n// How far the grid is stretched at a distance r from the middle; with sphere the dots follow the surface of a ball.\nfloat stretch(float r, float sphere) {\n float rr = clamp(r, 0.0001, 0.9999);\n return mix(1.0, asin(rr) / rr, sphere);\n}\n\n// The color under the dots: an uneven cloud of color whose edge bleeds out into the dark, with a red glow around it.\n// body is how much of the cloud is there, from 1 inside to 0 far outside.\nvec3 field(vec2 q, float angle, float t, out float body, out float distance) {\n vec2 p = turn(q, -angle);\n vec2 bend = vec2(fbm(p * 2.2 + vec2(t * 0.3, 1.7)), fbm(p * 2.2 + vec2(8.3, -t * 0.25))) - 0.35;\n vec2 w = p + bend * max(uWarp, 0.0) * 0.4;\n float rr = length(w) / max(uSpread, 0.2);\n distance = rr;\n body = 1.0 - smoothstep(0.78, 1.22, rr);\n\n vec3 c = uColorB;\n c = mix(c, uColorA, smoothstep(-0.1, 0.95, dot(w, normalize(vec2(-0.6, 0.7)))) * 0.95);\n c = mix(c, uColorC, smoothstep(-0.05, 0.6, dot(w, normalize(vec2(0.7, -0.45)))) * 0.9);\n c = mix(c, uColorD, smoothstep(0.18, 0.85, dot(w, normalize(vec2(0.85, -0.55)))) * 0.97);\n float ring = smoothstep(0.8, 1.05, rr) * max(uGlow, 0.0);\n c = mix(c, uRimColor, clamp(ring, 0.0, 1.0));\n return mix(uBaseColor, c, body);\n}\n\nvoid main() {\n float side = min(uResolution.x, uResolution.y);\n vec2 q = (vUv * uResolution - uResolution * 0.5) / (side * 0.5);\n float r = length(q);\n // On a circle the picture ends at its edge; on a rectangle the dots run on over the whole surface and may lie beyond the cloud.\n float edge = uRound > 0.5 ? 1.0 - smoothstep(0.985, 1.0, r) : 1.0;\n if (edge <= 0.0) discard;\n\n float t = uTime * max(uSpeed, 0.0);\n float angle = radians(uAngle);\n float cells = max(uDots, 2.0) * 0.5;\n vec2 g = q * stretch(r, uSphere) * cells;\n\n // The dot that is nearest wins, so dots that lie close cut each other along a straight line.\n float stagger = clamp(uStagger, 0.0, 1.0);\n vec2 cell = floor(g);\n float best = 1e9;\n vec2 centre = vec2(0.0);\n for (int j = -1; j <= 1; j++) {\n for (int i = -1; i <= 1; i++) {\n vec2 c = cell + vec2(float(i), float(j));\n float shift = stagger * 0.5 * mod(c.y, 2.0);\n vec2 mid = vec2(c.x + 0.5 + shift, c.y + 0.5);\n float d = length(g - mid);\n if (d < best) {\n best = d;\n centre = mid;\n }\n }\n }\n\n // Where the middle of that dot lies on the screen, found by running the stretch backwards.\n vec2 gc = centre / cells;\n float gl = length(gc);\n float rc = gl;\n for (int k = 0; k < 5; k++) {\n rc = gl / stretch(rc, uSphere);\n }\n rc = clamp(rc, 0.0, 1.0);\n vec2 qc = gl > 0.0001 ? gc / gl * rc : vec2(0.0);\n\n float radius = clamp(uDotSize, 0.2, 0.9);\n float aa = 1.6 / side * cells * 2.0;\n float inside = 1.0 - smoothstep(radius - aa, radius + aa, best);\n\n float bodyHere;\n float bodyDot;\n float farHere;\n float farDot;\n vec3 colorHere = field(q, angle, t, bodyHere, farHere);\n field(qc, angle, t, bodyDot, farDot);\n\n // Between the dots the cloud is darker, so the dots read as glass lying on it.\n vec3 gap = colorHere * mix(0.3, 0.9, bodyHere);\n\n // Every dot is a lens with a gradient of its own: lighter on the side that faces the middle, dark on the side that faces out.\n // The darker side grows toward the edge of the cloud, until the dots there are nearly black.\n vec2 e = (g - centre) / max(radius, 0.001);\n vec2 outward = length(qc) > 0.0001 ? normalize(qc) : vec2(0.0, 1.0);\n vec2 outwardGrid = outward;\n float along = clamp(dot(e, outwardGrid), -1.0, 1.0);\n float edgeness = 1.0 - smoothstep(0.1, 0.9, bodyDot);\n float lens = clamp(uLens, 0.0, 1.5);\n float darken = lens * (0.1 + 0.9 * edgeness) * smoothstep(-0.55, 1.0, along);\n float lift = lens * 0.09 * (1.0 - edgeness) * (-along);\n vec3 glass = colorHere * (1.0 + lift) * (1.0 - clamp(darken, 0.0, 0.96));\n\n // A dot beyond the cloud is drawn in the dark glow color when the dice fall that way, more of them close to the cloud than far from it.\n float luck = hash(centre + 17.0);\n float shown = step(luck, clamp(uScatter, 0.0, 1.0) * (1.0 - smoothstep(1.0, 2.0, farDot))) * (1.0 - bodyDot);\n vec3 outer = mix(uRimColor, mix(uColorD, uColorC, hash(centre + 5.0)), 0.35 * hash(centre + 9.0)) * (0.25 + 0.4 * hash(centre + 3.0));\n outer *= 1.0 - 0.8 * smoothstep(-0.55, 1.0, along);\n glass = mix(glass, outer, shown);\n\n vec3 color = mix(gap, glass, inside);\n color *= max(uIntensity, 0.0);\n color += (hash(gl_FragCoord.xy + t) - 0.5) * max(uGrain, 0.0);\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), edge);\n}\n`;\n\nexport const glassDotsProgram: ShaderProgram = {\n name: 'glassDots',\n fragmentSource,\n defaultParameters: {\n speed: 0,\n intensity: 1,\n dots: 13,\n dotSize: 0.5,\n stagger: 0,\n sphere: 0,\n angle: 0,\n spread: 0.86,\n warp: 1,\n glow: 0.75,\n round: 0,\n scatter: 0.45,\n lens: 0.75,\n grain: 0.06,\n baseColor: '#121212',\n colorA: '#f4b49c',\n colorB: '#4a9c93',\n colorC: '#34559c',\n colorD: '#ec3f93',\n rimColor: '#d93a24',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform sampler2D uBackdrop;\nuniform vec2 uBackdropOrigin;\nuniform vec2 uBackdropScale;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uIor;\nuniform float uRefraction;\nuniform float uRoughness;\nuniform float uChromaticAberration;\nuniform float uEdgeLight;\nuniform vec3 uTint;\nuniform vec3 uEdgeColor;\nvarying vec2 vUv;\n\nfloat hash(vec2 point) {\n return fract(sin(dot(point, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat smoothNoise(vec2 point) {\n vec2 cell = floor(point);\n vec2 local = fract(point);\n local = local * local * (3.0 - 2.0 * local);\n float a = hash(cell);\n float b = hash(cell + vec2(1.0, 0.0));\n float c = hash(cell + vec2(0.0, 1.0));\n float d = hash(cell + vec2(1.0, 1.0));\n return mix(mix(a, b, local.x), mix(c, d, local.x), local.y);\n}\n\nvoid main() {\n float time = uTime * max(uSpeed, 0.0);\n vec2 sphereOffset = vec2(\n sin(time * 0.72) * 0.04,\n cos(time * 0.56) * 0.026\n );\n float sphereScale = 0.95;\n vec2 p = (vUv * 2.0 - 1.0 - sphereOffset) / sphereScale;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float roughness = max(uRoughness, 0.0);\n vec2 flow = vec2(\n smoothNoise(p * 2.4 + vec2(0.7, -0.3)),\n smoothNoise(p * 2.8 + vec2(-0.4, 0.8))\n ) - 0.5;\n float sphereDepth = sqrt(max(1.0 - radius * radius, 0.0));\n vec2 glassMotion = vec2(\n sin(p.y * 3.2 + 0.6),\n cos(p.x * 2.8 - 0.35)\n ) * 0.014;\n vec3 surfaceNormal = normalize(vec3(p + glassMotion + flow * roughness * 0.22, sphereDepth));\n float eta = 1.0 / max(uIor, 1.001);\n vec3 refracted = refract(vec3(0.0, 0.0, -1.0), surfaceNormal, eta);\n vec2 distortion = refracted.xy * max(uRefraction, 0.0);\n distortion += flow * (0.008 + roughness * 0.025);\n\n vec2 backdropUv = uBackdropOrigin + vUv * uBackdropScale;\n vec2 refractedUv = clamp(backdropUv + distortion * uBackdropScale, 0.001, 0.999);\n float chroma = max(uChromaticAberration, 0.0) * 0.012;\n vec2 chromaOffset = normalize(distortion + vec2(0.0001)) * chroma * uBackdropScale;\n float red = texture2D(uBackdrop, clamp(refractedUv + chromaOffset, 0.001, 0.999)).r;\n float green = texture2D(uBackdrop, refractedUv).g;\n float blue = texture2D(uBackdrop, clamp(refractedUv - chromaOffset, 0.001, 0.999)).b;\n vec3 sharpBackdrop = vec3(red, green, blue);\n vec2 texel = uBackdropScale / max(uResolution, vec2(1.0));\n vec2 blurOffset = texel * (0.65 + roughness * 5.0);\n vec3 blurredBackdrop = texture2D(uBackdrop, refractedUv + vec2(blurOffset.x, 0.0)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv - vec2(blurOffset.x, 0.0)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv + vec2(0.0, blurOffset.y)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv - vec2(0.0, blurOffset.y)).rgb;\n blurredBackdrop *= 0.25;\n vec3 backdrop = mix(sharpBackdrop, blurredBackdrop, clamp(roughness * 1.15, 0.0, 1.0));\n\n float fresnel = pow(1.0 - sphereDepth, 2.35);\n float innerRim = smoothstep(0.72, 0.995, radius);\n vec2 fixedLightPosition = vec2(-0.46, 0.7);\n vec2 surfacePosition = sphereOffset + p * sphereScale * 0.22;\n vec3 lightDirection = normalize(vec3(fixedLightPosition - surfacePosition, 0.62));\n float highlight = pow(max(dot(lightDirection, surfaceNormal), 0.0), 28.0);\n float hotSpot = pow(max(dot(lightDirection, surfaceNormal), 0.0), 92.0);\n float angle = atan(p.y, p.x);\n float lightAngle = atan(lightDirection.y, lightDirection.x);\n float movingRim = 0.68 + 0.32 * sin(angle * 2.0 - lightAngle);\n float rimGlint = pow(max(cos(angle - lightAngle), 0.0), 20.0) * innerRim;\n vec3 color = mix(backdrop, backdrop * uTint, 0.025 + fresnel * 0.09);\n color += uEdgeColor * innerRim * max(uEdgeLight, 0.0) * (0.1 + fresnel * 0.5) * movingRim;\n color += uEdgeColor * rimGlint * max(uEdgeLight, 0.0) * 0.72;\n color += uEdgeColor * highlight * 0.5;\n color += vec3(1.0) * hotSpot * 0.58;\n color += vec3(1.0) * fresnel * 0.05;\n color *= max(uIntensity, 0.0);\n\n float edgeWidth = 2.2 / max(min(uResolution.x, uResolution.y), 1.0);\n float edgeAlpha = 1.0 - smoothstep(1.0 - edgeWidth, 1.0, radius);\n vec3 finalColor = clamp(color, 0.0, 1.0) * edgeAlpha;\n gl_FragColor = vec4(finalColor, edgeAlpha);\n}\n`;\n\nexport const glassRefractionProgram: ShaderProgram = {\n name: 'glassRefraction',\n fragmentSource,\n usesBackdrop: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uGlowHeight;\nuniform float uGlowSpread;\nuniform float uCore;\nuniform float uRim;\nuniform float uGrain;\nuniform float uWarp;\nuniform float uAngle;\nuniform float uCornerRadius;\nuniform vec3 uBaseColor;\nuniform vec3 uColorA;\nuniform vec3 uColorB;\nuniform vec3 uColorC;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat blob(vec2 p, vec2 center, vec2 size) {\n vec2 d = (p - center) / size;\n return exp(-dot(d, d));\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x), u.y);\n}\n\nfloat fbm(vec2 p) {\n return 0.5 * noise(p) + 0.25 * noise(p * 2.03 + 3.1) + 0.125 * noise(p * 4.01 + 7.7);\n}\n\nvoid main() {\n vec2 size = max(uResolution, vec2(1.0));\n float radius = uCornerRadius * min(size.x, size.y);\n vec2 q = abs(vUv * size - size * 0.5) - size * 0.5 + radius;\n float distance = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n float shape = 1.0 - smoothstep(-1.0, 1.0, distance);\n if (shape <= 0.0) discard;\n\n // The light comes from one side. Angle 0 is the bottom edge, and it turns clockwise: 90 is the left, 180 the top, 270 the right.\n // depth is 0 at the edge the light comes from and 1 at the far side, side runs along that edge.\n float turn = radians(uAngle);\n vec2 toward = vec2(-sin(turn), -cos(turn));\n vec2 across = vec2(-toward.y, toward.x);\n vec2 offset = (vUv - 0.5) * size;\n float reachAlong = 0.5 * (abs(toward.x) * size.x + abs(toward.y) * size.y);\n float reachAcross = 0.5 * (abs(across.x) * size.x + abs(across.y) * size.y);\n float depth = clamp(0.5 - dot(offset, toward) / (2.0 * reachAlong), 0.0, 1.0);\n float side = clamp(0.5 + dot(offset, across) / (2.0 * reachAcross), 0.0, 1.0);\n float aspect = reachAcross / reachAlong;\n\n float t = uTime * max(uSpeed, 0.0);\n float height = clamp(uGlowHeight, 0.05, 1.0);\n float spread = max(uGlowSpread, 0.05);\n // The body is the base color with a faint lift toward the far side, like glass that catches the light.\n vec3 color = uBaseColor + vec3(0.035) * smoothstep(0.55, 1.0, 1.0 - depth);\n\n // Three soft lights sit low in the card and drift slowly; the middle one is the broadest.\n vec2 p = vec2(side * aspect, depth);\n // The lights are bent by slow noise, so their edges curl like smoke instead of staying round.\n vec2 bend = vec2(fbm(p * 2.6 + vec2(t * 0.6, 0.0)), fbm(p * 2.6 + vec2(5.2, -t * 0.5))) - 0.35;\n p += bend * max(uWarp, 0.0) * 0.45;\n float wander = 0.05 * sin(t);\n float a = blob(p, vec2((0.18 + wander) * aspect, 0.0), vec2(0.5 * spread * aspect, 0.42 * height));\n float b = blob(p, vec2((0.52 - wander) * aspect, -0.04), vec2(0.62 * spread * aspect, 0.5 * height));\n float c = blob(p, vec2((0.86 + wander * 0.6) * aspect, 0.02), vec2(0.5 * spread * aspect, 0.44 * height));\n // Each light is thicker in some places than in others, so the colors mix unevenly.\n float patchy = fbm(p * 4.0 + 11.0);\n a *= 0.55 + 0.9 * patchy;\n b *= 0.55 + 0.9 * (1.0 - patchy);\n c *= 0.55 + 0.9 * fbm(p * 4.0 + 23.0);\n vec3 glow = uColorA * a + uColorB * b + uColorC * c;\n\n // A haze reaches higher than the lights, so the color fades out into the body.\n float haze = smoothstep(height, 0.0, depth);\n glow += mix(uColorB, uColorA, side) * haze * haze * 0.35;\n color += glow * max(uIntensity, 0.0);\n\n // Near the exit edge the lights are so strong that they turn white.\n float hot = smoothstep(height * 0.38, 0.0, depth) * (a + b + c) * clamp(uCore, 0.0, 1.0);\n color = mix(color, vec3(0.93, 0.95, 1.0), clamp(hot, 0.0, 1.0));\n\n // A thin rim along the edge, strongest on the side away from the light.\n float rim = (1.0 - smoothstep(0.0, 1.6, -distance)) * smoothstep(0.0, 1.0, -distance + 1.0);\n color += vec3(0.62, 0.66, 0.78) * rim * max(uRim, 0.0) * (0.35 + 0.65 * smoothstep(0.2, 1.0, 1.0 - depth));\n\n // The grit sits in the lit parts and fades in the dark body, as on film.\n float lit = clamp(dot(glow, vec3(0.45)) * max(uIntensity, 0.0) + hot, 0.0, 1.0);\n float grit = hash(gl_FragCoord.xy) - 0.5;\n grit += 0.5 * (hash(floor(gl_FragCoord.xy * 0.5) + 17.0) - 0.5);\n color += grit * max(uGrain, 0.0) * (0.3 + 2.2 * lit * (1.0 - 0.5 * lit));\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), shape);\n}\n`;\n\nexport const glowCardProgram: ShaderProgram = {\n name: 'glowCard',\n fragmentSource,\n defaultParameters: {\n speed: 0.12,\n intensity: 1,\n glowHeight: 0.55,\n glowSpread: 1,\n core: 0.7,\n rim: 0.55,\n grain: 0.12,\n warp: 1,\n angle: 0,\n cornerRadius: 0.08,\n baseColor: '#0b0b12',\n colorA: '#2f6bff',\n colorB: '#9d5cff',\n colorC: '#34d3c4',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uDotCount;\nuniform float uRingRadius;\nuniform float uRingWidth;\nuniform float uGlow;\nuniform float uMotion;\nuniform vec3 uWarmColor;\nuniform vec3 uLightColor;\nuniform vec3 uCoolColor;\nvarying vec2 vUv;\n\nmat2 rotate(float angle) {\n float sine = sin(angle);\n float cosine = cos(angle);\n return mat2(cosine, -sine, sine, cosine);\n}\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n\n float speed = max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float time = uTime * speed;\n float rotation = time * 0.08 * motion;\n vec2 gridPosition = rotate(rotation) * p;\n float cells = max(uDotCount, 8.0);\n vec2 grid = (gridPosition + 1.0) * cells * 0.5;\n vec2 cell = fract(grid) - 0.5;\n vec2 samplePoint = (floor(grid) + 0.5) * 2.0 / cells - 1.0;\n samplePoint = rotate(-rotation) * samplePoint;\n\n float angle = atan(samplePoint.y, samplePoint.x);\n float radius = length(samplePoint);\n float travelingWave = sin(angle * 3.0 - time * 0.72) * 0.024 * motion;\n travelingWave += sin(angle * 7.0 + time * 0.31) * 0.009 * motion;\n float ringRadius = clamp(uRingRadius, 0.2, 0.92) + travelingWave;\n float ringWidth = max(uRingWidth, 0.025);\n float ring = bell(radius - ringRadius, ringWidth);\n\n float lowerBloom = bell(samplePoint.x + 0.08, 0.72) * bell(samplePoint.y + 0.56, 0.42);\n float upperArc = bell(radius - ringRadius + 0.025, ringWidth * 0.7) * smoothstep(-0.18, 0.72, samplePoint.y);\n float light = clamp(ring * (0.58 + lowerBloom * 0.64 + upperArc * 0.25), 0.0, 1.0);\n float shimmer = 0.9 + 0.1 * sin(angle * 9.0 + time * 0.48);\n float dotRadius = mix(0.055, 0.43, pow(light, 0.72) * shimmer);\n float dotDistance = length(cell);\n float dot = 1.0 - smoothstep(dotRadius - 0.045, dotRadius + 0.045, dotDistance);\n\n float warmWeight = smoothstep(-0.22, 0.72, samplePoint.y);\n warmWeight *= 0.76 + 0.24 * (1.0 - smoothstep(-0.45, 0.72, samplePoint.x));\n float coolWeight = smoothstep(-0.85, 0.42, samplePoint.x);\n coolWeight *= 1.0 - smoothstep(-0.78, 0.3, samplePoint.y);\n vec3 color = mix(uLightColor, uWarmColor, clamp(warmWeight, 0.0, 1.0));\n color = mix(color, uCoolColor, clamp(coolWeight * 0.72, 0.0, 0.82));\n color = mix(color, uLightColor, lowerBloom * ring * 0.58);\n\n float circleMask = 1.0 - smoothstep(0.965, 1.0, length(p));\n float dotAlpha = dot * pow(light, 0.82) * smoothstep(0.06, 0.24, light) * circleMask;\n float glow = bell(length(p) - ringRadius, ringWidth * 1.75) * max(uGlow, 0.0) * 0.17;\n glow *= circleMask;\n float alpha = clamp((dotAlpha + glow) * max(uIntensity, 0.0), 0.0, 1.0);\n vec3 glowColor = mix(uWarmColor, uCoolColor, 1.0 - smoothstep(-0.75, 0.55, samplePoint.y));\n vec3 finalColor = color * dotAlpha + glowColor * glow;\n\n gl_FragColor = vec4(clamp(finalColor * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const halftoneHaloProgram: ShaderProgram = {\n name: 'halftoneHalo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform float uIntensity;\nuniform float uSpeed;\nuniform float uThickness;\nuniform float uProgress;\nuniform float uBoost;\nvarying vec2 vUv;\n\nconst float TWO_PI = 6.28318530718;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius > 1.0) discard;\n\n float angle = atan(p.y, p.x);\n float time = uTime * max(uSpeed, 0.0);\n float controlled = step(0.0, uProgress);\n float progress = clamp(uProgress, 0.0, 1.0);\n float boost = clamp(uBoost, 0.0, 1.0);\n float width = max(uThickness, 0.015);\n float wave = sin(angle * 2.0 - time * 2.4) * 0.5 + 0.5;\n float fineWave = sin(angle * 7.0 + time * 1.15) * 0.5 + 0.5;\n float ringRadius = 0.72 + sin(angle * 3.0 - time * 1.5) * (0.025 + boost * 0.012);\n float ring = exp(-pow((radius - ringRadius) / width, 2.0));\n float outerRim = exp(-pow((radius - 0.94) / 0.025, 2.0));\n\n float startAngle = -2.35;\n float sweep = 4.70;\n float arcPosition = mod(startAngle - angle + TWO_PI, TWO_PI);\n float arcHead = progress * sweep;\n float idleTravel = sin(time * 0.82) * 0.025 * (1.0 - boost);\n float displayedHead = clamp(arcHead + idleTravel, 0.0, sweep);\n float arcEdge = 0.025;\n float arcMask = (1.0 - smoothstep(displayedHead - arcEdge, displayedHead + arcEdge, arcPosition));\n arcMask *= 1.0 - step(sweep, arcPosition);\n float arcActive = smoothstep(0.0, 0.012, progress);\n arcMask *= arcActive;\n\n float ambientHead = -2.25 + sin(time * 0.45) * 0.35;\n float progressHead = startAngle - displayedHead;\n float headAngle = mix(ambientHead, progressHead, controlled);\n float angleFromHead = atan(sin(angle - headAngle), cos(angle - headAngle));\n float flare = exp(-pow(angleFromHead / (0.18 + boost * 0.035), 2.0));\n flare *= exp(-pow((radius - 0.73) / 0.12, 2.0));\n float ambientBand = ring * (0.32 + wave * 0.38);\n float startDelta = atan(sin(angle - startAngle), cos(angle - startAngle));\n float radialDelta = radius - ringRadius;\n float startCapDistance = length(vec2(radialDelta, startDelta * ringRadius));\n float endCapDistance = length(vec2(radialDelta, angleFromHead * ringRadius));\n float roundedCaps = max(\n exp(-pow(startCapDistance / width, 2.0)),\n exp(-pow(endCapDistance / width, 2.0))\n ) * arcActive;\n float progressShape = max(ring * arcMask, roundedCaps);\n float progressBand = progressShape * (0.72 + boost * 0.55);\n float idleBand = ring * (0.16 + wave * 0.16 + fineWave * 0.06);\n float band = mix(ambientBand, idleBand + progressBand, controlled);\n float pulse = 1.0 + boost * (0.18 + sin(time * 8.0) * 0.08);\n float energy = clamp((band + outerRim * (0.24 + boost * 0.12) + flare * (1.35 + boost * 0.55) + fineWave * ring * 0.12) * uIntensity * pulse, 0.0, 1.0);\n vec3 base = uColor * (0.1 + 0.28 * (1.0 - radius));\n vec3 color = mix(base, uAccent, energy);\n color += uAccent * flare * (0.3 + boost * 0.35);\n float alpha = 1.0 - smoothstep(0.96, 1.0, radius);\n gl_FragColor = vec4(color, alpha);\n}\n`;\n\nexport const haloProgram: ShaderProgram = {\n name: 'halo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uColumns;\nuniform float uCellAspect;\nuniform float uGap;\nuniform float uGlow;\nuniform float uDepth;\nuniform float uGrain;\nuniform float uRotation;\nuniform float uRipple;\nuniform float uWave;\nuniform float uVariation;\nuniform float uFade;\nuniform float uOriginX;\nuniform float uOriginY;\nuniform float uSpread;\nuniform float uDrift;\nuniform float uReaction;\nuniform float uPointerSize;\nuniform float uHover;\nuniform vec2 uPointer;\nuniform vec3 uWake[16];\nuniform float uCornerRadius;\nuniform vec3 uBaseColor;\nuniform vec3 uOffColor;\nuniform vec3 uColor;\nuniform vec3 uHotColor;\nvarying vec2 vUv;\n\nfloat boxMask(vec2 uv) {\n vec2 halfBox = uResolution * 0.5;\n float radius = uCornerRadius * min(uResolution.x, uResolution.y);\n vec2 q = abs(uv * uResolution - halfBox) - halfBox + radius;\n float d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n return 1.0 - smoothstep(-1.0, 1.0, d);\n}\n\nfloat roundedBox(vec2 point, vec2 halfSize, float radius) {\n vec2 q = abs(point) - halfSize + radius;\n return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n}\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n float shape = boxMask(vUv);\n if (shape <= 0.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float columns = max(uColumns, 2.0);\n vec2 cellPx = vec2(uResolution.x / columns);\n cellPx.y *= max(uCellAspect, 0.2);\n vec2 rows = uResolution / cellPx;\n\n // The grid can be turned around the middle of the surface.\n float angle = radians(uRotation);\n vec2 centered = (vUv - 0.5) * uResolution;\n vec2 turned = vec2(cos(angle) * centered.x - sin(angle) * centered.y, sin(angle) * centered.x + cos(angle) * centered.y);\n vec2 turnedUv = turned / uResolution + 0.5;\n vec2 grid = vec2(turnedUv.x, 1.0 - turnedUv.y) * rows;\n vec2 cell = floor(grid);\n vec2 local = (fract(grid) - 0.5) * cellPx;\n vec2 center = (cell + 0.5) / rows;\n\n // The light of the surface sits at its origin, sways to the sides, and falls off with the spread. A spread of 0 puts it out.\n float spread = max(uSpread, 0.05);\n float lit = smoothstep(0.0, 0.05, uSpread);\n vec2 p = vec2(center.x, 1.0 - center.y);\n vec2 origin = vec2(uOriginX + uDrift * sin(time * 0.7), uOriginY);\n float aspect = uResolution.x / uResolution.y;\n float blob = exp(-pow(length((p - origin) * vec2(1.0, 1.55)) / spread, 2.0) * 5.5) * lit;\n float wave = 0.5 + 0.5 * sin(p.x * 5.0 + time * 1.3 + sin(p.y * 3.0 - time));\n float rise = pow(max(1.0 - abs(p.y - uOriginY) / spread, 0.0), 3.0) * (1.0 - 0.7 * uWave + 0.7 * uWave * wave) * lit;\n float glowLevel = blob * 1.15 + rise * 0.5 + 0.03;\n\n // Rings that run outward from the light, and a different brightness for every light.\n float rings = 1.0 + uRipple * 0.5 * sin(length((p - origin) * vec2(1.0, 1.55)) * 16.0 - time * 2.5);\n float jitter = 1.0 - uVariation * 0.55 * hash(cell);\n float vignette = 1.0 - clamp(uFade, 0.0, 1.0) * smoothstep(0.3, 0.8, length(p - 0.5) * 1.3);\n\n // The lights near the pointer glow up while it is over the surface, and the places it has been dim down one after the other.\n float near = exp(-pow(length((p - uPointer) * vec2(aspect, 1.0)) / max(uPointerSize, 0.01), 2.0)) * uHover;\n float wake = 0.0;\n for (int i = 0; i < 16; i++) {\n wake += uWake[i].z * exp(-pow(length((p - uWake[i].xy) * vec2(aspect, 1.0)) / max(uPointerSize * 0.88, 0.01), 2.0));\n }\n float touch = min(near + wake, 1.3) * max(uReaction, 0.0);\n float level = clamp(glowLevel * rings * jitter * vignette * max(uIntensity, 0.0) + touch * 1.1, 0.0, 1.0);\n\n vec3 tint = mix(uOffColor, uColor, smoothstep(0.0, 0.6, level));\n tint = mix(tint, uHotColor, smoothstep(0.55, 1.0, level));\n\n vec2 halfSize = cellPx * 0.5 * (1.0 - clamp(uGap, 0.0, 0.8));\n float d = roundedBox(local, halfSize, min(halfSize.x, halfSize.y));\n float body = 1.0 - smoothstep(-0.9, 0.9, d);\n // Depth shades a light like a small bulb: bright in the upper part, darker at the rim.\n float sheen = 1.0 - smoothstep(0.0, halfSize.y * 1.2, abs(local.y + halfSize.y * 0.35));\n float rim = smoothstep(-halfSize.x * 0.7, 0.0, d);\n float depth = clamp(uDepth, 0.0, 1.0);\n vec3 cellColor = tint * (1.0 - 0.4 * depth + 0.4 * depth * sheen) * (1.0 - 0.35 * depth * rim);\n\n vec3 color = uBaseColor + tint * level * max(uGlow, 0.0) * 0.18;\n color = mix(color, cellColor, body);\n color += (hash(gl_FragCoord.xy) - 0.5) * max(uGrain, 0.0) * 0.2;\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), shape);\n}\n`;\n\nexport const ledMatrixProgram: ShaderProgram = {\n name: 'ledMatrix',\n fragmentSource,\n defaultParameters: {\n speed: 0.25,\n intensity: 1,\n columns: 44,\n cellAspect: 1.7,\n gap: 0.3,\n originX: 0.42,\n originY: 0.04,\n spread: 1,\n drift: 0.2,\n depth: 0.5,\n glow: 1,\n grain: 0.2,\n rotation: 0,\n ripple: 0.3,\n wave: 1,\n variation: 0.2,\n fade: 0.3,\n reaction: 1,\n pointerSize: 0.17,\n trail: 1.4,\n cornerRadius: 0.025,\n baseColor: '#050505',\n offColor: '#262626',\n color: '#a3a3a3',\n hotColor: '#ffffff',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uThickness;\nuniform float uBloom;\nuniform float uWave;\nuniform float uGrain;\nuniform float uCornerRadius;\nuniform vec3 uBaseColor;\nuniform vec3 uColorA;\nuniform vec3 uColorB;\nuniform vec3 uColorC;\nvarying vec2 vUv;\n\nfloat boxMask(vec2 uv) {\n vec2 halfBox = uResolution * 0.5;\n float radius = uCornerRadius * min(uResolution.x, uResolution.y);\n vec2 q = abs(uv * uResolution - halfBox) - halfBox + radius;\n float d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n return 1.0 - smoothstep(-1.0, 1.0, d);\n}\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n float shape = boxMask(vUv);\n if (shape <= 0.0) discard;\n\n float t = uTime * max(uSpeed, 0.0);\n float aspect = uResolution.x / uResolution.y;\n vec2 p = vec2(vUv.x, 1.0 - vUv.y);\n\n // The middle of the band wanders across the surface, and its width breathes along the way.\n float middle = 0.5 + uWave * (0.11 * sin(p.x * 3.4 + t) + 0.05 * sin(p.x * 7.1 - t * 1.4));\n float width = max(uThickness, 0.002) * (0.65 + 0.35 * sin(p.x * 2.4 + t * 0.6));\n float offset = (p.y - middle) * aspect * 0.6;\n float core = exp(-pow(offset / width, 2.0));\n float halo = exp(-pow(offset / (width * (2.5 + uBloom * 5.0)), 2.0));\n\n // Blue at one end, pink at the other, and the colors drift a little.\n float along = clamp(p.x + 0.12 * sin(t * 0.8), 0.0, 1.0);\n vec3 tint = along < 0.5 ? mix(uColorA, uColorB, along * 2.0) : mix(uColorB, uColorC, along * 2.0 - 1.0);\n float pulse = 0.6 + 0.4 * sin(p.x * 6.0 - t * 2.0);\n\n vec3 color = uBaseColor;\n color += tint * halo * 0.55 * pulse * max(uBloom, 0.0);\n color += mix(tint, vec3(1.0), 0.55) * core * (0.55 + 0.45 * pulse);\n color *= max(uIntensity, 0.0);\n color += (hash(gl_FragCoord.xy + t) - 0.5) * max(uGrain, 0.0);\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), shape);\n}\n`;\n\nexport const lightBandProgram: ShaderProgram = {\n name: 'lightBand',\n fragmentSource,\n defaultParameters: {\n speed: 0.3,\n intensity: 1,\n thickness: 0.035,\n bloom: 1,\n wave: 1,\n grain: 0.02,\n cornerRadius: 0.02,\n baseColor: '#0f0e14',\n colorA: '#7ea8ff',\n colorB: '#c13fd6',\n colorC: '#ff6fb8',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n vec2 q = p;\n q.x += sin(p.y * 4.0 + time * 0.58) * 0.02;\n q.y += sin(p.x * 3.3 - time * 0.43) * 0.013;\n float distance = length(q) - 0.64;\n float body = 1.0 - smoothstep(-0.012, 0.01, distance);\n float nearGlow = band(max(distance, 0.0), 0.19) * 0.62;\n float wideGlow = band(max(distance, 0.0), 0.48) * 0.3;\n float frameFade = 1.0 - smoothstep(0.88, 1.0, length(p));\n float halo = max(nearGlow, wideGlow) * frameFade;\n float alpha = body + (1.0 - body) * halo;\n if (alpha < 0.002) discard;\n\n float vertical = 0.5 + 0.5 * q.y;\n float warmWeight = smoothstep(-0.44, 0.42, q.x + q.y * 0.14 + sin(time * 0.62 + q.y * 3.0) * 0.065);\n vec3 glowColor = mix(uCoolColor, uWarmColor, warmWeight);\n float breath = 0.78 + 0.22 * sin(time * 1.12 + q.y * 3.0);\n float rim = band(distance + 0.014, 0.042);\n float edge = band(distance + 0.006, 0.014);\n float bevel = band(distance + 0.092, 0.07);\n\n vec3 color = uBaseColor * (0.62 + 0.23 * vertical);\n color += uWarmColor * smoothstep(-0.68, 0.6, q.x) * 0.13;\n color += uWarmColor * band(q.x - 0.38, 0.32) * band(q.y + 0.14, 0.74) * 0.11;\n color += uCoolColor * band(q.x + 0.28, 0.42) * band(q.y - 0.47, 0.35) * 0.11;\n color *= 1.0 - band(q.x - 0.06, 0.3) * band(q.y + 0.2, 0.5) * 0.46;\n color += glowColor * bevel * 0.14;\n color += glowColor * rim * 0.41 * breath;\n color += mix(uCoolColor, vec3(1.0), 0.45) * edge * (1.0 - warmWeight) * 0.43;\n color += mix(uWarmColor, vec3(1.0), 0.38) * edge * warmWeight * 0.45;\n\n float topFlare = band(q.y - 0.6, 0.07) * band(q.x + 0.2, 0.28);\n float bottomFlare = band(q.y + 0.61, 0.07) * band(q.x - 0.15, 0.35);\n color += uCoolColor * topFlare * 0.39;\n color += uWarmColor * bottomFlare * 0.31;\n vec3 premultiplied = color * body + glowColor * (1.0 - body) * halo * breath;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const lumenPortalProgram: ShaderProgram = {\n name: 'lumenPortal',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nuniform vec3 uShadowColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n vec2 q = p;\n q.x += sin(p.y * 4.1 + time * 0.55) * 0.013;\n q.y += sin(p.x * 3.4 - time * 0.41) * 0.01;\n float distance = length(q) - 0.65;\n float body = 1.0 - smoothstep(-0.012, 0.012, distance);\n float nearHalo = band(max(distance, 0.0), 0.12) * 0.19;\n float wideHalo = band(max(distance, 0.0), 0.28) * 0.055;\n float frameFade = 1.0 - smoothstep(0.89, 1.0, length(p));\n float outside = max(nearHalo, wideHalo) * frameFade;\n float alpha = body * 0.96 + (1.0 - body) * outside;\n if (alpha < 0.002) discard;\n\n float warmWeight = smoothstep(-0.46, 0.47, q.x + q.y * 0.17 + sin(time * 0.58 + q.y * 3.0) * 0.052);\n vec3 rimColor = mix(uCoolColor, uWarmColor, warmWeight);\n float breath = 0.84 + 0.16 * sin(time * 0.91 + q.y * 2.5);\n float innerRim = band(distance + 0.038, 0.052);\n float outerRim = band(distance + 0.002, 0.025);\n float fineEdge = band(distance + 0.008, 0.01);\n float bevelShade = band(distance + 0.11, 0.055);\n\n vec3 color = uBaseColor;\n color = mix(color, uCoolColor, band(q.x + 0.27, 0.39) * band(q.y - 0.35, 0.43) * 0.09);\n color = mix(color, uWarmColor, band(q.x - 0.31, 0.43) * band(q.y + 0.31, 0.48) * 0.085);\n color = mix(color, uShadowColor, bevelShade * 0.11);\n color = mix(color, rimColor, innerRim * 0.46 * breath);\n color = mix(color, rimColor, outerRim * 0.62 * breath);\n color = mix(color, uShadowColor, fineEdge * 0.12);\n\n float topGlint = band(q.y - 0.6, 0.06) * band(q.x + 0.2, 0.22);\n float bottomGlint = band(q.y + 0.61, 0.06) * band(q.x - 0.16, 0.29);\n color += uCoolColor * topGlint * 0.12;\n color += uWarmColor * bottomGlint * 0.1;\n\n vec3 premultiplied = color * body * 0.96;\n premultiplied += mix(uShadowColor, rimColor, 0.58) * (1.0 - body) * outside * breath;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const lumenPortalLightProgram: ShaderProgram = {\n name: 'lumenPortalLight',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform float uIntensity;\nuniform float uSpeed;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius > 1.0) discard;\n\n float angle = atan(p.y, p.x);\n float time = uTime * max(uSpeed, 0.0);\n float fold = sin(angle * 3.0 - time * 1.7 + radius * 7.0);\n float ribbon = exp(-pow(radius - (0.69 + fold * 0.07), 2.0) * 95.0);\n float rim = smoothstep(0.58, 0.98, radius) * (1.0 - smoothstep(0.94, 1.0, radius));\n float light = exp(-length(p - vec2(-0.42, -0.34)) * 4.2);\n float grain = (hash(gl_FragCoord.xy + time) - 0.5) * 0.035;\n float energy = clamp((ribbon * 0.8 + rim * 0.55 + light * 0.7) * uIntensity, 0.0, 1.0);\n vec3 color = mix(uColor * (0.12 + 0.32 * (1.0 - radius)), uAccent, energy);\n color += grain;\n float alpha = 1.0 - smoothstep(0.94, 1.0, radius);\n gl_FragColor = vec4(color, alpha);\n}\n`;\n\nexport const orbProgram: ShaderProgram = {\n name: 'orb',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uCellCount;\nuniform float uDensity;\nuniform vec3 uBaseColor;\nuniform vec3 uTopColor;\nuniform vec3 uWarmColor;\nuniform vec3 uCenterColor;\nuniform vec3 uVioletColor;\nuniform vec3 uBottomColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nfloat noise(vec2 p) {\n vec2 cell = floor(p);\n vec2 blend = fract(p);\n blend = blend * blend * (3.0 - 2.0 * blend);\n float lower = mix(hash(cell), hash(cell + vec2(1.0, 0.0)), blend.x);\n float upper = mix(hash(cell + vec2(0.0, 1.0)), hash(cell + vec2(1.0, 1.0)), blend.x);\n return mix(lower, upper, blend.y);\n}\n\nvec3 strandColor(float y) {\n vec3 color = mix(uBottomColor, uVioletColor, smoothstep(-0.9, -0.43, y));\n color = mix(color, uCenterColor, smoothstep(-0.38, 0.05, y));\n color = mix(color, uWarmColor, smoothstep(0.14, 0.48, y));\n return mix(color, uTopColor, smoothstep(0.64, 0.9, y));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float cells = max(uCellCount, 1.0);\n vec2 grid = (p + 1.0) * cells * 0.5;\n vec2 cellId = floor(grid);\n vec2 q = (cellId + 0.5) * 2.0 / cells - 1.0;\n vec2 flow = vec2(\n 0.1 * sin(time * 0.48 + q.y * 2.6),\n 0.08 * cos(time * 0.4 + q.x * 2.1)\n );\n vec2 movingQ = q + flow;\n\n float path = -0.29 + 0.19 * sin(movingQ.y * 4.0 + time * 0.27);\n path += 0.09 * sin(movingQ.y * 7.7 - time * 0.19);\n float strand = band(movingQ.x - path, 0.26) * 0.11;\n float top = band(movingQ.x + 0.52, 0.28) * band(movingQ.y - 0.78, 0.19) * 0.75;\n float warm = band(movingQ.x + 0.46, 0.2) * band(movingQ.y - 0.47, 0.23) * 0.76;\n float center = band(movingQ.x + 0.06, 0.25) * band(movingQ.y - 0.02, 0.21) * 1.14;\n float lower = band(movingQ.x + 0.38, 0.32) * band(movingQ.y + 0.48, 0.27) * 0.86;\n float bottom = band(movingQ.x + 0.56, 0.36) * band(movingQ.y + 0.85, 0.19) * 0.88;\n float blue = band(movingQ.x - 0.28, 0.19) * band(movingQ.y + 0.64, 0.18) * 0.94;\n float field = strand + top + warm + center + lower + bottom + blue;\n field *= 0.35 + 1.25 * noise(movingQ * 5.1 + vec2(time * 0.075, -time * 0.04));\n\n float chance = clamp(field * max(uDensity, 0.0), 0.0, 0.96);\n float seed = hash(cellId);\n float active = smoothstep(seed - 0.055, seed + 0.055, chance);\n vec2 local = fract(grid) - 0.5;\n local -= vec2(\n 0.11 * sin(time * 0.72 + seed * 6.28318),\n 0.11 * cos(time * 0.61 + seed * 4.71239)\n );\n float growth = 0.78 + 0.34 * (0.5 + 0.5 * sin(time * 0.83 + seed * 5.3));\n float size = mix(0.27, 0.34, hash(cellId + vec2(19.3, 7.1))) * growth;\n float squareRadius = max(abs(local.x), abs(local.y));\n float outer = 1.0 - smoothstep(size - 0.045, size + 0.015, squareRadius);\n float inner = 1.0 - smoothstep(size - 0.17, size - 0.105, squareRadius);\n float outline = max(outer - inner, 0.0);\n float glow = band(squareRadius - size + 0.075, 0.115) * 0.24;\n\n float pulse = 0.76 + 0.24 * sin(time * 1.1 - q.y * 5.1 + seed * 6.28318);\n float variation = 0.43 + 0.57 * hash(cellId + vec2(3.7, 27.4));\n float highlight = band(movingQ.x + 0.07, 0.25) * band(movingQ.y - 0.02, 0.24);\n vec3 colorSum = strandColor(movingQ.y) * strand;\n colorSum += uTopColor * top + uWarmColor * warm + uCenterColor * center;\n colorSum += uVioletColor * lower + uBottomColor * (bottom + blue);\n vec3 cellColor = colorSum / max(strand + top + warm + center + lower + bottom + blue, 0.001);\n cellColor = mix(cellColor, vec3(1.0, 0.96, 0.76), highlight * 0.54);\n vec3 color = uBaseColor + cellColor * active * variation * pulse * (outline + glow);\n\n float edge = 1.0 - smoothstep(0.965, 0.997, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * edge, 0.0, 1.0), edge);\n}\n`;\n\nexport const pixelConstellationProgram: ShaderProgram = {\n name: 'pixelConstellation',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uDent;\nuniform float uBoost;\nuniform float uFlare;\nuniform float uStart;\nuniform float uSweep;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uHot;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nfloat wrap(float angle) {\n return atan(sin(angle), cos(angle));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float radius = length(p);\n float angle = atan(p.y, p.x);\n\n float sweep = radians(uSweep > 0.0 ? uSweep : 270.0);\n float start = radians(uStart != 0.0 ? uStart : 225.0);\n float progress = clamp(uProgress < 0.0 ? 0.35 : uProgress, 0.0, 1.0);\n float needleAngle = start - progress * sweep;\n float delta = wrap(angle - needleAngle);\n\n float dentValue = clamp(uDent < 0.0 ? progress : uDent, 0.0, 1.0);\n float engage = smoothstep(0.0, 0.28, dentValue);\n float boost = smoothstep(0.0, 1.0, clamp(uBoost, 0.0, 1.0));\n float energy = smoothstep(0.0, 1.0, dentValue);\n float level = (uFlare > 0.0 ? uFlare : 1.0) * engage * (0.45 + 0.5 * energy + 0.3 * boost);\n\n float heat = smoothstep(0.15, 1.0, clamp(0.75 * energy + 0.5 * boost, 0.0, 1.0));\n vec3 cool = mix(uAccent, vec3(0.18, 0.28, 0.95), 0.55);\n vec3 hot = uHot;\n vec3 tint = mix(cool, hot, heat);\n\n float ripple = 0.5 + 0.5 * sin(delta * 9.0 - time * 1.4);\n float wake = (progress - dentValue) * sweep;\n float lo = min(0.0, wake);\n float hi = max(0.0, wake);\n float segment = delta < lo ? lo - delta : (delta > hi ? delta - hi : 0.0);\n float wakePos = hi > lo ? clamp((delta - lo) / (hi - lo), 0.0, 1.0) : 0.0;\n float fromNeedle = wake >= 0.0 ? wakePos : 1.0 - wakePos;\n float taper = mix(1.0, 0.45, fromNeedle * smoothstep(0.02, 0.2, abs(wake)));\n float dent = bell(segment, 0.13 + 0.02 * ripple) * (0.82 + 0.18 * ripple) * taper;\n float shoulder = bell(delta, 0.34);\n float ahead = wake >= 0.0 ? -1.0 : 1.0;\n float pile = bell(delta - ahead * 0.17, 0.15) * clamp(abs(wake) * 2.2, 0.0, 1.0) * engage;\n float baseRadius = 0.72;\n float orbRadius = baseRadius * (1.0 - 0.32 * level * dent - 0.07 * level * shoulder + 0.13 * pile);\n float body = 1.0 - smoothstep(orbRadius - 0.012, orbRadius + 0.012, radius);\n float depth = clamp(radius / orbRadius, 0.0, 1.25);\n float roundDepth = clamp(radius / baseRadius, 0.0, 1.2);\n\n float local = clamp(heat * (0.7 + 0.3 * bell(delta, 0.9)) + 0.25 * heat * bell(delta, 0.3), 0.0, 1.0);\n vec3 rim = mix(cool, hot, local);\n vec3 bodyColor = mix(uColor, rim * (0.5 + 0.25 * energy), pow(roundDepth, 2.6));\n bodyColor += mix(uAccent, hot, local) * (0.26 + 0.3 * energy) * bell(roundDepth - 0.93, 0.13);\n bodyColor *= (0.82 + 0.18 * smoothstep(-0.5, 0.5, -p.x)) * (0.9 + 0.6 * energy * energy);\n\n float ribbons = 0.5 + 0.5 * sin(depth * 24.0 - delta * 8.0 + time * 1.1);\n float zone = max(bell(delta, 0.3), dent * 0.8) * bell(depth - 0.84, 0.32) * level * (1.0 + 0.9 * energy);\n vec3 ribbonColor = mix(tint, hot, smoothstep(0.2, 0.9, ribbons) * (0.35 + 0.65 * heat));\n bodyColor = mix(bodyColor, ribbonColor, clamp(zone * (0.4 + 0.45 * ribbons), 0.0, 1.0));\n float edge = max(max(bell(delta, 0.2), dent * 0.7), pile * 0.8) * bell(depth - 0.99, 0.09) * level;\n bodyColor += mix(hot, vec3(1.0, 0.92, 1.0), 0.45) * edge * (0.45 + 1.3 * energy);\n\n float outside = max(radius - orbRadius, 0.0);\n float notchLight = max(max(bell(delta, 0.2), dent * 0.8), pile * 0.6) * level;\n float halo = exp(-outside * (12.0 - 6.0 * notchLight * (0.4 + energy))) * (1.0 - body) * (0.2 + 0.5 * energy * energy + 0.9 * notchLight * (0.5 + energy));\n vec3 haloColor = mix(tint, hot, clamp(notchLight * 1.2, 0.0, 1.0));\n\n float cross = abs(p.x * sin(needleAngle) - p.y * cos(needleAngle));\n float along = p.x * cos(needleAngle) + p.y * sin(needleAngle);\n float needleSpan = smoothstep(0.1, 0.2, along) * (1.0 - smoothstep(0.9, 0.96, along));\n float needle = smoothstep(0.0055, 0.0008, cross) * needleSpan;\n float needleGlow = bell(cross, 0.02) * needleSpan * (0.25 + 0.35 * energy);\n\n vec3 color = bodyColor * body + haloColor * halo + vec3(1.0, 0.94, 1.0) * needle + hot * needleGlow;\n float alpha = max(max(body, clamp(halo, 0.0, 1.0)), max(needle, needleGlow * 0.8));\n\n float fade = 1.0 - smoothstep(0.88, 0.99, radius);\n float gain = max(uIntensity, 0.0) * fade;\n gl_FragColor = vec4(clamp(color * gain, 0.0, 1.0), clamp(alpha * gain, 0.0, 1.0));\n}\n`;\n\nexport const plasmaGaugeProgram: ShaderProgram = {\n name: 'plasmaGauge',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uRibCount;\nuniform float uGrain;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat lightField(vec2 p, float time) {\n float upperCurve = 0.43 + 0.16 * sin(p.x * 2.8 + time * 0.58) - p.x * 0.08;\n float lowerCurve = -0.46 + 0.13 * sin(p.x * 2.9 - time * 0.43 + 1.4);\n float upper = band(p.y - upperCurve, 0.2) * band(p.x + 0.03, 0.88);\n float lower = band(p.y - lowerCurve, 0.19) * band(p.x - 0.05, 0.85);\n float leftColumn = band(p.x + 0.39 + 0.1 * sin(p.y * 2.9 + time * 0.5), 0.23);\n leftColumn *= band(p.y + 0.01, 0.59);\n float centerShadow = 1.0 - band(p.x - 0.35, 0.46) * band(p.y + 0.01, 0.28) * 0.9;\n float drift = 0.84 + 0.16 * sin(p.x * 3.5 - p.y * 2.2 + time * 0.72);\n return clamp((upper + lower + leftColumn * 0.74) * centerShadow * drift, 0.0, 1.5);\n}\n\nfloat grain(vec2 uv) {\n vec2 pixel = floor(uv * uResolution);\n return fract(sin(dot(pixel, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n float time = uTime * max(uSpeed, 0.0);\n\n float field = lightField(p, time);\n float redField = lightField(p + vec2(0.027, 0.0), time);\n float blueField = lightField(p - vec2(0.027, 0.0), time);\n float coolRegion = band(p.x + 0.58, 0.38) * 0.74;\n float warmRegion = band(p.x + 0.02, 0.34) * band(p.y + 0.08, 0.75) * 0.88;\n vec3 spectralTint = mix(uHighlightColor, uCoolColor, coolRegion);\n spectralTint = mix(spectralTint, uWarmColor, warmRegion);\n vec3 light = spectralTint * field * 1.25;\n light += uWarmColor * max(redField - blueField, 0.0) * 2.6;\n light += uCoolColor * max(blueField - redField, 0.0) * 2.6;\n\n float ribCoordinate = (p.x + 1.0) * max(uRibCount, 1.0) * 0.5;\n float rib = fract(ribCoordinate);\n float glassFace = smoothstep(0.08, 0.18, rib) * (1.0 - smoothstep(0.77, 0.94, rib));\n float groove = 1.0 - glassFace;\n float refraction = 0.8 + 0.2 * sin(rib * 3.14159);\n vec3 color = uBaseColor + light * (0.12 + glassFace * 0.95) * refraction;\n color *= 1.0 - groove * 0.83;\n\n float leftEdge = band(rib - 0.18, 0.028);\n float rightEdge = band(rib - 0.79, 0.04);\n color += mix(uCoolColor, uHighlightColor, 0.48) * leftEdge * (0.07 + field * 0.19);\n color += uHighlightColor * rightEdge * (0.025 + field * 0.075);\n color += uCoolColor * band(p.x + 0.78, 0.28) * band(p.y, 0.7) * 0.09;\n\n float noise = (grain(vUv) - 0.5) * max(uGrain, 0.0);\n color += vec3(noise) * (0.18 + field * 0.82);\n float fade = 1.0 - smoothstep(0.88, 1.0, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * fade, 0.0, 1.0), fade);\n}\n`;\n\nexport const prismSlatsProgram: ShaderProgram = {\n name: 'prismSlats',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uEmission;\nuniform float uReception;\nuniform float uEmitterFill;\nuniform float uGrain;\nuniform float uGrainScale;\nuniform float uCornerRadius;\nuniform float uBorderWidth;\nuniform float uGlowRadius;\nuniform float uSurfacePadding;\nuniform float uLightX;\nuniform float uLightY;\nuniform float uLightStrength;\nuniform float uPixelScale;\nuniform vec2 uResolution;\nuniform vec3 uShapeColor;\nuniform vec3 uBaseColor;\nuniform vec3 uEdgeColor;\nuniform vec3 uLightColor;\nvarying vec2 vUv;\n\nfloat roundedBoxDistance(vec2 point, vec2 halfSize, float radius) {\n vec2 offset = abs(point) - halfSize + radius;\n return min(max(offset.x, offset.y), 0.0) + length(max(offset, 0.0)) - radius;\n}\n\nfloat random(vec2 point) {\n return fract(sin(dot(mod(point, 289.0), vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n vec2 pixel = vUv * uResolution;\n float pixelScale = max(uPixelScale, 0.0001);\n float padding = clamp(uSurfacePadding * pixelScale, 0.0, min(uResolution.x, uResolution.y) * 0.45);\n vec2 panelHalfSize = max(vec2(1.0), uResolution * 0.5 - padding);\n vec2 panelPoint = pixel - uResolution * 0.5;\n float radius = min(max(uCornerRadius * pixelScale, 0.0), min(panelHalfSize.x, panelHalfSize.y));\n float distance = roundedBoxDistance(panelPoint, panelHalfSize, radius);\n float body = 1.0 - smoothstep(-1.25, 0.75, distance);\n float borderWidth = max(uBorderWidth * pixelScale, 0.5);\n float edge = exp(-pow(distance / borderWidth, 2.0));\n float innerEdge = exp(-pow((distance + borderWidth * 2.25) / (borderWidth * 2.2), 2.0)) * body;\n\n vec2 lightPosition = vec2(uLightX, 1.0 - uLightY) * uResolution;\n float lightDistance = length(pixel - lightPosition);\n float lightRadius = max(uGlowRadius * pixelScale, 1.0);\n float receivedLight = exp(-pow(lightDistance / lightRadius, 2.0));\n receivedLight *= max(uReception, 0.0) * max(uLightStrength, 0.0);\n\n float speed = max(uSpeed, 0.0);\n float breath = 0.88 + 0.12 * sin(uTime * speed * 6.2831853);\n float emittedLight = max(uEmission, 0.0) * breath;\n float outsideFalloff = exp(-max(distance, 0.0) / max(lightRadius * 0.22, 1.0));\n float outsideGlow = outsideFalloff * (emittedLight * 1.35 + receivedLight * 0.9);\n float frameDistance = min(min(pixel.x, uResolution.x - pixel.x), min(pixel.y, uResolution.y - pixel.y));\n float frameFade = smoothstep(0.0, max(padding * 0.65, 1.0), frameDistance);\n outsideGlow *= frameFade;\n\n vec3 baseColor = dot(uBaseColor, uBaseColor) > 0.0 ? uBaseColor : uShapeColor;\n vec3 edgeColor = dot(uEdgeColor, uEdgeColor) > 0.0 ? uEdgeColor : vec3(0.22, 0.72, 1.0);\n vec3 lightColor = dot(uLightColor, uLightColor) > 0.0 ? uLightColor : edgeColor;\n vec3 color = baseColor * (0.82 + receivedLight * 0.42);\n\n // Emission lights the material itself instead of leaving a dark cutout behind.\n // A soft centre bias keeps the fill dimensional while the edge remains crisp.\n vec2 normalizedPoint = panelPoint / max(panelHalfSize, vec2(1.0));\n float centreLight = 1.0 - smoothstep(0.05, 1.25, length(normalizedPoint));\n float fillLight = clamp(emittedLight * max(uEmitterFill, 0.0), 0.0, 1.0) * body;\n vec3 illuminatedFill = mix(edgeColor, lightColor, 0.62 + centreLight * 0.28);\n color = mix(color, illuminatedFill * (0.72 + centreLight * 0.62), fillLight);\n\n // Fine object-space luminance grain. It is intentionally emission-gated so\n // receiver panels stay clean and the texture stays fixed on the active tile.\n float grainScale = max(uGrainScale * pixelScale, 0.75);\n vec2 grainCell = floor(pixel / grainScale);\n float grainValue = random(grainCell);\n float grainLight = (grainValue - 0.36) * max(uGrain, 0.0) * fillLight;\n color += lightColor * grainLight * (0.5 + centreLight * 0.75);\n\n color += edgeColor * edge * (0.42 + emittedLight * 1.7);\n color += lightColor * edge * receivedLight * 2.5;\n color += lightColor * innerEdge * receivedLight * 1.25;\n\n float intensity = max(uIntensity, 0.0);\n float halo = outsideGlow * (1.0 - body) * 0.9 * intensity;\n float alpha = body + halo;\n if (alpha < 0.002) discard;\n\n vec3 haloColor = mix(edgeColor, lightColor, clamp(receivedLight * 1.5, 0.0, 1.0));\n vec3 premultiplied = color * body * intensity + haloColor * halo;\n gl_FragColor = vec4(clamp(premultiplied, 0.0, 1.0), clamp(alpha, 0.0, 1.0));\n}\n`;\n\nexport const reactivePanelProgram: ShaderProgram = {\n name: 'reactivePanel',\n fragmentSource,\n defaultParameters: {\n intensity: 0.5,\n speed: 0.18,\n emission: 0,\n reception: 0.85,\n emitterFill: 0,\n grain: 0,\n grainScale: 1.5,\n cornerRadius: 18,\n borderWidth: 2,\n glowRadius: 90,\n lightX: 0.5,\n lightY: 0.5,\n lightStrength: 0,\n baseColor: '#09101c',\n edgeColor: '#33b8ff',\n lightColor: '#59d1ff',\n },\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uTicks;\nuniform float uMajor;\nuniform float uLength;\nuniform float uThickness;\nuniform float uRound;\nuniform float uDent;\nuniform float uSpread;\nuniform float uInset;\nuniform float uLine;\nuniform float uGap;\nuniform float uKnobRadius;\nuniform float uAxis;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uGlow;\nuniform vec3 uCore;\nuniform vec3 uPeak;\nvarying vec2 vUv;\n\nfloat wireAt(float at, float lineAt, float depth, float radius, float knob, float spread) {\n float reach = abs(at - knob);\n if (uKnobRadius > 0.0) {\n float outline = max(sqrt(max(radius * radius - reach * reach, 0.0)) - (radius - depth), 0.0);\n float shoulder = max(sqrt(2.0 * depth * radius) * 0.9, 1.0);\n float soft = depth * exp(-(reach * reach) / (shoulder * shoulder));\n float k = max(depth * 0.15, 1.0);\n float h = max(k - abs(outline - soft), 0.0) / k;\n return lineAt - (max(outline, soft) + h * h * k * 0.25);\n }\n float away = reach / spread;\n return lineAt - depth * exp(-away * away);\n}\n\nvoid main() {\n vec2 px = vUv * uResolution;\n float horizontal = step(0.5, uAxis);\n float along = mix(px.y, px.x, horizontal);\n float across = mix(px.x, uResolution.y - px.y, horizontal);\n float extent = mix(uResolution.y, uResolution.x, horizontal);\n float width = mix(uResolution.x, uResolution.y, horizontal);\n\n float inset = uInset > 0.0 ? uInset : 0.05;\n float lineAt = (uLine > 0.0 ? uLine : 0.7) * width;\n float count = max(uTicks > 0.0 ? uTicks : 50.0, 2.0);\n float every = max(uMajor > 0.0 ? uMajor : 5.0, 1.0);\n float unit = (uThickness > 0.0 ? uThickness : 0.012) * width;\n float halfLine = max(unit * 0.5, 0.75);\n float spread = (uSpread > 0.0 ? uSpread : 0.07) * extent;\n float depth = (uDent < 0.0 ? 1.0 : uDent) * 0.16 * width;\n\n float start = inset * extent;\n float span = (1.0 - 2.0 * inset) * extent;\n float knob = start + span * clamp(uProgress, 0.0, 1.0);\n\n float away = (along - knob) / spread;\n float bump = exp(-away * away);\n float radius = (uKnobRadius + (uGap > 0.0 ? uGap : 0.04)) * width;\n float wire = wireAt(along, lineAt, depth, radius, knob, spread);\n float slope = (wireAt(along + 1.0, lineAt, depth, radius, knob, spread) - wireAt(along - 1.0, lineAt, depth, radius, knob, spread)) * 0.5;\n float lineDistance = abs(across - wire) / sqrt(1.0 + slope * slope);\n float line = 1.0 - smoothstep(halfLine - 0.75, halfLine + 0.75, lineDistance);\n float wireDistance = abs(across - wire);\n vec3 lineColor = mix(uColor, uAccent, bump);\n\n vec3 glowColor = dot(uGlow, uGlow) > 0.0 ? uGlow : uAccent;\n float glowSide = across < wire ? 1.0 : 0.35;\n float glow = bump * exp(-wireDistance / (0.1 * width)) * glowSide * 1.3 * max(uIntensity, 0.0);\n vec3 coreColor = dot(uCore, uCore) > 0.0 ? uCore : mix(glowColor, vec3(1.0), 0.55);\n float core = bump * bump * exp(-wireDistance / (0.035 * width)) * glowSide * 1.6 * max(uIntensity, 0.0);\n float reachEdge = min(min(along, extent - along), min(across, width - across));\n float fade = smoothstep(0.0, 0.14 * width, reachEdge);\n glow *= fade;\n core *= fade;\n\n float spacing = span / count;\n float position = (along - start) / spacing;\n float index = floor(position + 0.5);\n float inRange = step(0.0, index) * step(index, count);\n float tickAlong = abs(position - index) * spacing;\n float major = 1.0 - step(0.5, mod(index, every));\n float tickLength = (uLength > 0.0 ? uLength : 0.1) * width * mix(1.0, 1.9, major);\n float tickDistance = (start + index * spacing - knob) / spread;\n float tickBump = exp(-tickDistance * tickDistance);\n float tickEnd = lineAt - 0.12 * width - depth * 0.4 * tickBump;\n float halfTick = halfLine * mix(0.75, 1.2, major);\n float corner = halfTick * clamp(uRound, 0.0, 1.0);\n vec2 q = abs(vec2(across - (tickEnd - tickLength * 0.5), tickAlong)) - vec2(tickLength * 0.5, halfTick) + corner;\n float edge = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - corner;\n float tick = (1.0 - smoothstep(-0.75, 0.75, edge)) * inRange * mix(0.4, 1.0, tickBump);\n vec3 peakColor = dot(uPeak, uPeak) > 0.0 ? uPeak : vec3(1.0);\n vec3 tickColor = mix(uColor, peakColor, tickBump);\n\n float alpha = clamp(tick + line * 0.95 + glow + core, 0.0, 1.0);\n vec3 rgb = tickColor * tick + lineColor * line * 0.95 + glowColor * glow + coreColor * core;\n gl_FragColor = vec4(clamp(rgb, 0.0, 1.0), alpha);\n}\n`;\n\nexport const rulerProgram: ShaderProgram = {\n name: 'ruler',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uScale;\nuniform float uSharpness;\nuniform float uDepth;\nuniform float uGlow;\nuniform float uGrain;\nuniform float uRotation;\nuniform float uRipple;\nuniform float uWave;\nuniform float uVariation;\nuniform float uFade;\nuniform float uReaction;\nuniform float uHover;\nuniform vec2 uPointer;\nuniform float uCornerRadius;\nuniform vec3 uBaseColor;\nuniform vec3 uColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat boxMask(vec2 uv) {\n vec2 halfBox = uResolution * 0.5;\n float radius = uCornerRadius * min(uResolution.x, uResolution.y);\n vec2 q = abs(uv * uResolution - halfBox) - halfBox + radius;\n float d = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n return 1.0 - smoothstep(-1.0, 1.0, d);\n}\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvec2 turn(vec2 point, float angle) {\n float c = cos(angle);\n float s = sin(angle);\n return vec2(c * point.x - s * point.y, s * point.x + c * point.y);\n}\n\nvoid main() {\n float shape = boxMask(vUv);\n if (shape <= 0.0) discard;\n\n float t = uTime * max(uSpeed, 0.0);\n float aspect = uResolution.x / uResolution.y;\n float angle = radians(uRotation);\n float zoom = max(uScale, 0.2) * 2.0;\n vec2 p = turn((vUv - 0.5) * vec2(aspect, 1.0), angle) * zoom;\n\n // An irregular, slow bend of the whole cloth, so no two folds are alike.\n p += uVariation * 1.3 * vec2(sin(p.y * 0.37 + 3.1), cos(p.x * 0.41 + 1.7));\n\n // Bend the plane a few times, then lay a wave over it: the crests of the wave are the folds of the cloth.\n for (int i = 0; i < 3; i++) {\n float k = float(i);\n p += 0.22 * uWave * vec2(sin(p.y * 1.7 + t * 0.6 + k * 1.3), cos(p.x * 1.5 - t * 0.5 + k * 1.9));\n }\n\n // The cloth lifts where the pointer is over it.\n vec2 touch = turn((uPointer - 0.5) * vec2(aspect, 1.0), angle) * zoom;\n float lift = exp(-pow(length(p - touch) * 0.55, 2.0)) * uHover * max(uReaction, 0.0);\n\n float phase = p.x * 0.8 + p.y * 2.2 + 1.2 * sin(p.y * 0.9 - t * 0.3) + 0.8 * sin(p.x * 1.3 + t * 0.2) + lift * 2.4;\n phase += uRipple * 0.35 * sin(p.x * 7.0 + p.y * 5.0 + t * 1.1);\n float wave = 0.5 + 0.5 * sin(phase);\n\n float crest = pow(wave, max(uSharpness, 0.5));\n float body = pow(wave, mix(1.0, 3.2, clamp(uDepth, 0.0, 1.0)));\n float bloom = pow(wave, 1.3) * max(uGlow, 0.0);\n\n vec3 color = mix(uBaseColor, uColor, body * 0.9);\n color += uHighlightColor * (crest * (0.65 + 0.35 * lift) + bloom * 0.28);\n color *= max(uIntensity, 0.0);\n color *= 1.0 - clamp(uFade, 0.0, 1.0) * smoothstep(0.3, 0.78, length(vUv - 0.5) * 1.35);\n color += (hash(gl_FragCoord.xy) - 0.5) * max(uGrain, 0.0);\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), shape);\n}\n`;\n\nexport const silkFoldsProgram: ShaderProgram = {\n name: 'silkFolds',\n fragmentSource,\n defaultParameters: {\n speed: 0.2,\n intensity: 1,\n scale: 2.2,\n sharpness: 5,\n depth: 0.5,\n glow: 0.3,\n grain: 0.08,\n rotation: 0,\n ripple: 0.3,\n wave: 1,\n variation: 0,\n fade: 0.3,\n reaction: 1,\n cornerRadius: 0.02,\n baseColor: '#030303',\n color: '#4d4d4d',\n highlightColor: '#ffffff',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uBlur;\nuniform float uGlow;\nuniform float uMotion;\nuniform float uDirection;\nuniform float uReach;\nuniform vec3 uShapeColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nmat2 rotate(float angle) {\n float sine = sin(angle);\n float cosine = cos(angle);\n return mat2(cosine, -sine, sine, cosine);\n}\n\nvec2 orient(vec2 point, float direction) {\n if (direction < 0.5) return point;\n if (direction < 1.5) return vec2(-point.x, point.y);\n if (direction < 2.5) return vec2(-point.y, point.x);\n return vec2(point.y, -point.x);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float blur = clamp(uBlur, 0.02, 0.55);\n\n vec2 q = orient(p, uDirection) - vec2(0.12, 0.0);\n float sweep = sin(time * 0.55) * 0.42 * motion;\n vec2 qb = rotate(sweep) * q;\n float radius = length(q);\n float reach = clamp(uReach + sin(time * 0.41 + 1.3) * 0.16 * motion, 0.0, 1.0);\n float left = 1.0 - smoothstep(-0.42, mix(-0.24, 0.46, reach), qb.x);\n float upper = smoothstep(-0.05, 0.46, qb.y);\n float lower = 1.0 - smoothstep(-0.46, 0.05, qb.y);\n float blurSide = left * (0.50 + 0.50 * max(upper, lower));\n float breathing = 1.0 + sin(time * 0.72) * 0.28 * motion;\n float edgeWidth = mix(0.015, blur * breathing, blurSide);\n float body = 1.0 - smoothstep(0.49 - edgeWidth, 0.49 + edgeWidth, radius);\n\n float upperPlume = bell(qb.x + 0.33 + sin(time * 0.62) * 0.07 * motion, 0.37 + blur * 0.42);\n upperPlume *= bell(qb.y - 0.28 + sin(time * 0.47) * 0.05 * motion, 0.24 + blur * 0.5);\n float lowerPlume = bell(qb.x + 0.32 - sin(time * 0.58) * 0.07 * motion, 0.34 + blur * 0.42);\n lowerPlume *= bell(qb.y + 0.34 - sin(time * 0.44) * 0.05 * motion, 0.26 + blur * 0.5);\n float plume = (upperPlume * 0.44 + lowerPlume * 0.40) * left * max(uGlow, 0.0);\n\n vec3 lightColor = mix(uShapeColor, vec3(1.0), 0.24);\n vec3 darkColor = mix(uShapeColor, vec3(0.0), 0.7);\n float vertical = smoothstep(-0.45, 0.44, q.y);\n vec3 orbColor = mix(uShapeColor * 0.82, lightColor, vertical * 0.48);\n float shade = bell(q.x + 0.22, 0.38) * bell(q.y, 0.28);\n orbColor = mix(orbColor, darkColor, shade * 0.43);\n orbColor *= 0.76 + bell(q.x - 0.27, 0.36) * 0.32;\n\n vec3 plumeColor = mix(uShapeColor, lightColor, smoothstep(-0.26, 0.30, q.y) * 0.35);\n float alpha = body + (1.0 - body) * plume;\n float frameFade = 1.0 - smoothstep(0.85, 1.0, max(abs(p.x), abs(p.y)));\n alpha = clamp(alpha * frameFade * max(uIntensity, 0.0), 0.0, 1.0);\n vec3 premultiplied = orbColor * body + plumeColor * (1.0 - body) * plume;\n gl_FragColor = vec4(clamp(premultiplied * frameFade * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const smearOrbProgram: ShaderProgram = {\n name: 'smearOrb',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uTicks;\nuniform float uMajor;\nuniform float uStart;\nuniform float uSweep;\nuniform float uRadius;\nuniform float uLength;\nuniform float uThickness;\nuniform float uRound;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nvarying vec2 vUv;\n\nconst float TAU = 6.28318530718;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float radius = length(p);\n float angle = atan(p.y, p.x);\n float pixel = 2.0 / max(uResolution.y, 1.0);\n\n float sweep = radians(uSweep > 0.0 ? uSweep : 270.0);\n float start = radians(uStart != 0.0 ? uStart : 225.0);\n float gap = TAU - sweep;\n float fraction = (mod(start - angle + gap * 0.5, TAU) - gap * 0.5) / sweep;\n\n float count = max(uTicks, 2.0);\n float inArc = step(-0.25 / count, fraction) * step(fraction, 1.0 + 0.25 / count);\n float phase = fraction * count;\n float index = floor(phase + 0.5);\n float arcDistance = abs(fract(phase + 0.5) - 0.5) / count * sweep * radius;\n float every = max(uMajor, 1.0);\n float major = 1.0 - step(0.5, mod(index, every));\n\n float outer = uRadius > 0.0 ? uRadius : 0.9;\n float tickLength = (uLength > 0.0 ? uLength : 0.05) * mix(1.0, 1.8, major);\n float halfWidth = max((uThickness > 0.0 ? uThickness : 0.003) * mix(1.0, 1.4, major), pixel * 0.9);\n float halfLength = tickLength * 0.5;\n float corner = min(halfWidth, halfLength) * clamp(uRound, 0.0, 1.0);\n vec2 q = vec2(arcDistance, abs(radius - (outer - halfLength))) - vec2(halfWidth, halfLength) + corner;\n float edge = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - corner;\n float tick = (1.0 - smoothstep(-pixel, pixel, edge)) * inArc;\n\n float progress = uProgress < 0.0 ? 1.0 : clamp(uProgress, 0.0, 1.0);\n float lit = clamp(progress * count - index + 1.0, 0.0, 1.0);\n vec3 base = uColor;\n vec3 color = mix(base, uAccent, lit);\n float alpha = tick * mix(0.32, 1.0, lit) * max(uIntensity, 0.0);\n gl_FragColor = vec4(color * alpha, clamp(alpha, 0.0, 1.0));\n}\n`;\n\nexport const tickScaleProgram: ShaderProgram = {\n name: 'tickScale',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat glassDistance(vec2 p, float time) {\n float angle = atan(p.y, p.x);\n float edge = 0.72;\n edge += sin(angle * 3.0 + time * 0.52) * 0.038;\n edge += sin(angle * 5.0 - time * 0.37 + 1.6) * 0.025;\n edge += sin(angle * 9.0 + time * 0.29) * 0.008;\n return length(p) - edge;\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.y += 0.025;\n float time = uTime * max(uSpeed, 0.0);\n float distance = glassDistance(p, time);\n float body = 1.0 - smoothstep(-0.012, 0.01, distance);\n float halo = band(max(distance, 0.0), 0.12) * 0.24;\n float alpha = body + (1.0 - body) * halo;\n if (alpha < 0.002) discard;\n\n float lowerLight = 1.0 - smoothstep(-0.6, 0.45, p.y);\n float liquid = 0.5 + 0.5 * sin(p.x * 3.5 - p.y * 2.2 + time * 0.61);\n vec3 color = mix(uBaseColor, uColor, 0.17 + lowerLight * 0.3 + liquid * 0.09);\n color += uColor * band(p.x + 0.36, 0.42) * band(p.y + 0.12, 0.5) * 0.16;\n color *= 0.55 + 0.45 * smoothstep(-0.52, 0.5, p.y + 0.2);\n\n float innerFold = p.y + 0.22 + 0.19 * sin(p.x * 4.0 + time * 0.53);\n float secondFold = p.y - 0.42 + 0.11 * sin(p.x * 5.5 - time * 0.42);\n float foldLight = band(innerFold, 0.041) * smoothstep(-0.65, -0.1, p.x);\n foldLight += band(secondFold, 0.027) * smoothstep(0.05, 0.6, p.x);\n color += uHighlightColor * foldLight * 0.64;\n color += uColor * band(innerFold + 0.07, 0.065) * 0.31;\n float softReflection = band(p.x + 0.3 + 0.1 * sin(p.y * 3.5 + time * 0.35), 0.2);\n softReflection *= band(p.y - 0.38, 0.35);\n color += uHighlightColor * softReflection * 0.1;\n\n float dome = sqrt(max(0.04, 1.0 - dot(p, p) / 0.62));\n vec3 surfaceNormal = normalize(vec3(p.x * 1.18, p.y * 1.18, dome));\n surfaceNormal.xy += vec2(sin(p.y * 8.0 + time * 0.31), cos(p.x * 7.0 - time * 0.27)) * 0.065;\n surfaceNormal = normalize(surfaceNormal);\n vec3 reflection = reflect(vec3(0.0, 0.0, -1.0), surfaceNormal);\n float softbox = band(reflection.x + 0.42, 0.34) * band(reflection.y - 0.43, 0.24);\n float sidebox = band(reflection.x - 0.57, 0.19) * band(reflection.y + 0.11, 0.5);\n color += uHighlightColor * softbox * 0.21;\n color += uColor * sidebox * 0.22;\n\n float e = 0.008;\n vec2 normal = normalize(vec2(\n glassDistance(p + vec2(e, 0.0), time) - glassDistance(p - vec2(e, 0.0), time),\n glassDistance(p + vec2(0.0, e), time) - glassDistance(p - vec2(0.0, e), time)\n ));\n float light = pow(max(0.0, dot(normal, normalize(vec2(-0.62, 0.78)))), 2.0);\n float sideLight = pow(max(0.0, dot(normal, normalize(vec2(0.8, -0.58)))), 4.0);\n float rim = band(distance + 0.012, 0.031);\n float sharpRim = band(distance + 0.004, 0.009);\n color += uColor * rim * (0.25 + light * 0.53);\n color += uHighlightColor * sharpRim * (light * 0.78 + sideLight * 0.38);\n color += uHighlightColor * band(distance + 0.09, 0.025) * light * 0.23;\n color += uColor * band(length(p - vec2(0.27, -0.31)) - 0.26, 0.09) * 0.1;\n\n vec3 premultiplied = color * body + uColor * (1.0 - body) * halo * 0.48;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const violetGlassProgram: ShaderProgram = {\n name: 'violetGlass',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uColor;\nuniform vec3 uHighlightColor;\nuniform vec3 uShadowColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat glassDistance(vec2 p, float time) {\n float angle = atan(p.y, p.x);\n float edge = 0.69;\n edge += sin(angle * 3.0 + time * 0.48) * 0.025;\n edge += sin(angle * 5.0 - time * 0.36 + 1.7) * 0.016;\n return length(p) - edge;\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n float distance = glassDistance(p, time);\n float body = 1.0 - smoothstep(-0.012, 0.012, distance);\n float outside = band(max(distance, 0.0), 0.13) * 0.16;\n outside *= 1.0 - smoothstep(0.86, 1.0, length(p));\n float alpha = body * 0.94 + (1.0 - body) * outside;\n if (alpha < 0.002) discard;\n\n float lowerTint = 1.0 - smoothstep(-0.54, 0.46, p.y);\n float flow = 0.5 + 0.5 * sin(p.x * 3.8 - p.y * 2.4 + time * 0.57);\n vec3 color = mix(uBaseColor, uColor, 0.08 + lowerTint * 0.19 + flow * 0.045);\n color *= 1.0 - band(p.x - 0.27, 0.31) * band(p.y + 0.25, 0.48) * 0.11;\n\n float fold = p.y + 0.17 + 0.15 * sin(p.x * 4.1 + time * 0.49);\n float secondFold = p.y - 0.43 + 0.08 * sin(p.x * 5.2 - time * 0.32);\n float foldShade = band(fold + 0.045, 0.055) * smoothstep(-0.55, 0.18, p.x);\n foldShade += band(secondFold + 0.03, 0.038) * smoothstep(-0.1, 0.58, p.x);\n color = mix(color, uShadowColor, foldShade * 0.13);\n color += uHighlightColor * band(fold, 0.028) * 0.11;\n color += uHighlightColor * band(secondFold, 0.019) * 0.09;\n\n float dome = sqrt(max(0.04, 1.0 - dot(p, p) / 0.57));\n vec3 normal = normalize(vec3(p.x * 1.15, p.y * 1.15, dome));\n normal.xy += vec2(sin(p.y * 7.0 + time * 0.29), cos(p.x * 6.0 - time * 0.24)) * 0.04;\n vec3 reflection = reflect(vec3(0.0, 0.0, -1.0), normalize(normal));\n float softbox = band(reflection.x + 0.45, 0.28) * band(reflection.y - 0.39, 0.22);\n color += uHighlightColor * softbox * 0.12;\n\n float rim = band(distance + 0.018, 0.041);\n float thinRim = band(distance + 0.004, 0.012);\n float innerShade = band(distance + 0.094, 0.055);\n float upperLight = smoothstep(-0.34, 0.78, p.y - p.x * 0.24);\n color = mix(color, uShadowColor, innerShade * (0.08 + (1.0 - upperLight) * 0.1));\n color = mix(color, uColor, rim * (0.36 + upperLight * 0.15));\n color = mix(color, uShadowColor, thinRim * (1.0 - upperLight) * 0.29);\n color += uHighlightColor * thinRim * upperLight * 0.17;\n\n vec3 premultiplied = color * body * 0.94;\n premultiplied += mix(uShadowColor, uColor, 0.36) * (1.0 - body) * outside;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const violetGlassLightProgram: ShaderProgram = {\n name: 'violetGlassLight',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uRings;\nuniform float uRingWidth;\nuniform float uTwist;\nuniform float uArms;\nuniform float uWobble;\nuniform float uVariation;\nuniform float uOffsetX;\nuniform float uOffsetY;\nuniform float uSquash;\nuniform float uEye;\nuniform float uAngle;\nuniform float uSpread;\nuniform float uGlow;\nuniform float uGloss;\nuniform float uGlossHeight;\nuniform float uVignette;\nuniform float uGrain;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uCool;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float edge = length(p);\n if (edge > 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n\n // The rings are measured from a middle that can lie off the middle of the face, and squeezed to give a little depth.\n vec2 q = p - vec2(uOffsetX, uOffsetY);\n q.y /= max(uSquash, 0.2);\n float radius = length(q);\n float around = atan(q.y, q.x);\n float turn = around / 6.2831853;\n // The twist turns the pattern more the nearer it is to the middle. The rings themselves stay round.\n float angle = around + uTwist * pow(1.0 - radius, 2.0) * 3.0 + time * 0.3 * (1.0 - radius);\n\n // The phase of the rings: outwards from the middle, drifting inwards with time. Whole arms make the rings join into a spiral, and a\n // whole number leaves no seam. The wobble bends the rings so no two are alike.\n float bend = uWobble * (0.12 * sin(angle * 2.0 + time * 0.6 + radius * 3.0) + 0.06 * sin(angle * 3.0 - time * 0.45));\n float phase = (radius + bend) * uRings - time * 0.25 + floor(uArms + 0.5) * turn;\n float away = abs(fract(phase) - 0.5);\n float width = mix(0.04, 0.32, clamp(uRingWidth, 0.0, 1.0));\n // Every ring has a brightness of its own, so a few stand out and the others are faint.\n float own = mix(1.0, 0.25 + 1.0 * hash(vec2(floor(phase), 3.7)), clamp(uVariation, 0.0, 1.0));\n float ring = exp(-pow(away / width, 2.0)) * own;\n float fineAway = abs(fract(phase * 2.3 + 0.5) - 0.5);\n float fine = exp(-pow(fineAway / (width * 0.8), 2.0)) * 0.5;\n float halo = exp(-pow(away / (width * 3.0), 2.0));\n\n // Rings fade in from the eye and out towards the rim, and some arcs of a ring are brighter than the rest.\n float envelope = smoothstep(uEye, uEye + 0.3, radius) * (1.0 - smoothstep(0.72, 1.05, edge));\n float arcs = 0.45 + 0.55 * (0.5 + 0.5 * sin(angle * 2.0 + radius * 4.0 + time * 0.5 + 1.0));\n\n // One side of the face is warm and the other cool, and the spread says how sharp the change is.\n float side = cos(angle - radians(uAngle));\n float warm = mix(0.5, smoothstep(-0.7, 0.9, side), clamp(uSpread, 0.0, 1.0));\n vec3 hue = mix(uCool, uAccent, warm);\n\n vec3 color = uColor * (0.4 + 0.5 * (1.0 - edge));\n color += hue * (ring * 0.9 + fine * 0.3) * envelope * arcs * uGlow;\n color += hue * halo * envelope * 0.1 * uGlow;\n // The dark eye.\n color *= 0.55 + 0.45 * smoothstep(0.0, uEye + 0.12, radius);\n\n // A soft light on the glass at the bottom, with a clear lower edge.\n float below = smoothstep(-1.0 + uGlossHeight, -1.0 + uGlossHeight * 0.35, p.y);\n float across = 1.0 - smoothstep(0.45, 1.0, abs(p.x));\n color += mix(uCool, vec3(1.0), 0.5) * below * across * uGloss;\n\n color *= 1.0 - smoothstep(0.55, 1.0, edge) * uVignette;\n color += (hash(gl_FragCoord.xy + time) - 0.5) * uGrain;\n\n float alpha = 1.0 - smoothstep(0.985, 1.0, edge);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const vortexProgram: ShaderProgram = {\n name: 'vortex',\n fragmentSource,\n defaultParameters: {\n speed: 0.3,\n intensity: 1,\n rings: 12,\n ringWidth: 0.28,\n twist: 0.6,\n arms: 0,\n wobble: 0.12,\n variation: 0.85,\n offsetX: 0,\n offsetY: 0,\n squash: 1,\n eye: 0.3,\n angle: 215,\n spread: 0.6,\n glow: 0.6,\n gloss: 0.45,\n glossHeight: 0.4,\n vignette: 0.6,\n grain: 0.02,\n color: '#05060f',\n accent: '#e0368f',\n cool: '#3d4bff',\n },\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uLayers;\nuniform float uLevel;\nuniform float uAmplitude;\nuniform float uFrequency;\nuniform float uTilt;\nuniform float uSoftness;\nuniform float uEdge;\nuniform float uShade;\nuniform float uGlow;\nuniform float uVignette;\nuniform float uGrain;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uCool;\nuniform vec3 uHighlight;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float edge = length(p);\n if (edge > 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float angle = radians(uTilt);\n vec2 q = vec2(cos(angle) * p.x - sin(angle) * p.y, sin(angle) * p.x + cos(angle) * p.y);\n\n // The ground, a little lighter in the middle.\n vec3 color = uColor * (0.6 + 0.4 * (1.0 - edge));\n float count = clamp(uLayers, 1.0, 8.0);\n float soft = max(uSoftness, 0.004);\n\n // The layers lie one behind the other, the farthest first. Each one fills the area under a wave line, and the line itself catches the light.\n for (int i = 0; i < 8; i++) {\n float index = float(i);\n if (index >= count) break;\n float depth = index / max(count - 1.0, 1.0);\n float base = uLevel + mix(0.5, -0.55, depth);\n float swing = uAmplitude * (0.55 + 0.45 * depth);\n float line = base\n + swing * 0.6 * sin(q.x * uFrequency * (1.0 + 0.3 * index) + index * 1.7 + time * (0.4 + 0.08 * index))\n + swing * 0.4 * sin(q.x * uFrequency * 2.1 - index * 2.3 - time * 0.3);\n float under = smoothstep(soft, -soft, q.y - line);\n // A layer is lit at its crest and falls into shadow below it, so it reads as a fold of cloth and not as a flat band.\n float sink = clamp((line - q.y) / 0.35, 0.0, 1.0);\n vec3 layer = mix(uAccent, uCool, depth) * mix(1.15, 1.0 - 0.6 * uShade, sink);\n color = mix(color, layer, under * (0.5 + 0.2 * depth));\n float crest = exp(-pow((q.y - line) / (0.012 + soft * 0.5), 2.0));\n color += uHighlight * crest * uEdge * (0.35 + 0.65 * (1.0 - depth));\n }\n\n // A soft light over the surface, and a dark edge.\n color += uHighlight * uGlow * 0.18 * exp(-pow((q.y - 0.55) / 0.45, 2.0));\n color *= 1.0 - smoothstep(0.6, 1.0, edge) * uVignette;\n color += (hash(gl_FragCoord.xy + time) - 0.5) * uGrain;\n\n float alpha = 1.0 - smoothstep(0.985, 1.0, edge);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const wavesProgram: ShaderProgram = {\n name: 'waves',\n fragmentSource,\n defaultParameters: {\n speed: 0.25,\n intensity: 1,\n layers: 5,\n level: 0,\n amplitude: 0.14,\n frequency: 3.2,\n tilt: -12,\n softness: 0.05,\n edge: 0.5,\n shade: 0.6,\n glow: 0.5,\n vignette: 0.4,\n grain: 0.02,\n color: '#0e0828',\n accent: '#6b3fd4',\n cool: '#2f5fe0',\n highlight: '#b9a0ff',\n },\n};\n","import { buttonProgram } from './builtins/button';\nimport { chromaticGlassPlateProgram } from './builtins/chromaticGlassPlate';\nimport { chromaticHaloProgram } from './builtins/chromaticHalo';\nimport { eclipseOrbProgram } from './builtins/eclipseOrb';\nimport { emberMatrixProgram } from './builtins/emberMatrix';\nimport { emberSlitsProgram } from './builtins/emberSlits';\nimport { glassDotsProgram } from './builtins/glassDots';\nimport { glassRefractionProgram } from './builtins/glassRefraction';\nimport { glowCardProgram } from './builtins/glowCard';\nimport { halftoneHaloProgram } from './builtins/halftoneHalo';\nimport { haloProgram } from './builtins/halo';\nimport { ledMatrixProgram } from './builtins/ledMatrix';\nimport { lightBandProgram } from './builtins/lightBand';\nimport { lumenPortalProgram } from './builtins/lumenPortal';\nimport { lumenPortalLightProgram } from './builtins/lumenPortalLight';\nimport { orbProgram } from './builtins/orb';\nimport { pixelConstellationProgram } from './builtins/pixelConstellation';\nimport { plasmaGaugeProgram } from './builtins/plasmaGauge';\nimport { prismSlatsProgram } from './builtins/prismSlats';\nimport { reactivePanelProgram } from './builtins/reactivePanel';\nimport { rulerProgram } from './builtins/ruler';\nimport { silkFoldsProgram } from './builtins/silkFolds';\nimport { smearOrbProgram } from './builtins/smearOrb';\nimport { tickScaleProgram } from './builtins/tickScale';\nimport { violetGlassProgram } from './builtins/violetGlass';\nimport { violetGlassLightProgram } from './builtins/violetGlassLight';\nimport { vortexProgram } from './builtins/vortex';\nimport { wavesProgram } from './builtins/waves';\nimport type { ShaderProgram } from './types';\n\nconst builtins = [\n orbProgram,\n haloProgram,\n halftoneHaloProgram,\n chromaticHaloProgram,\n chromaticGlassPlateProgram,\n glassRefractionProgram,\n emberSlitsProgram,\n smearOrbProgram,\n pixelConstellationProgram,\n plasmaGaugeProgram,\n tickScaleProgram,\n rulerProgram,\n buttonProgram,\n prismSlatsProgram,\n eclipseOrbProgram,\n emberMatrixProgram,\n violetGlassProgram,\n violetGlassLightProgram,\n lumenPortalProgram,\n lumenPortalLightProgram,\n reactivePanelProgram,\n ledMatrixProgram,\n lightBandProgram,\n silkFoldsProgram,\n glowCardProgram,\n glassDotsProgram,\n vortexProgram,\n wavesProgram,\n];\nconst programs = new Map<string, ShaderProgram>(builtins.map(program => [program.name, program]));\n\nexport function registerShaderProgram(program: ShaderProgram): () => void {\n if (!program.name.trim()) {\n throw new Error('registerShaderProgram: name must not be empty.');\n }\n if (!program.fragmentSource.includes('void main')) {\n throw new Error(`registerShaderProgram: \"${program.name}\" has no main function.`);\n }\n programs.set(program.name, program);\n return () => {\n if (programs.get(program.name) === program) {\n programs.delete(program.name);\n }\n };\n}\n\nexport function shaderProgram(name: string): ShaderProgram | undefined {\n return programs.get(name);\n}\n","export interface ShaderBackdrop {\n image: HTMLImageElement;\n height: number;\n width: number;\n}\n\nconst MIN_BACKDROP_DENSITY = 2.5;\nconst MAX_BACKDROP_PIXELS = 4096;\n\nconst TRANSPARENT = /^rgba?(s*d+,s*d+,s*d+,s*0s*)$|^transparent$/;\n\nfunction hostBackground(svg: SVGSVGElement): string | undefined {\n const view = svg.ownerDocument.defaultView;\n for (let element: Element | null = svg.parentElement; element && view; element = element.parentElement) {\n const color = view.getComputedStyle(element).backgroundColor;\n if (color && !TRANSPARENT.test(color.trim())) {\n return color;\n }\n }\n return undefined;\n}\n\nfunction backdropClone(svg: SVGSVGElement, owner: Element, width: number, height: number): SVGSVGElement {\n const clone = svg.cloneNode(true) as SVGSVGElement;\n const ownerIndex = [...svg.children].indexOf(owner);\n if (ownerIndex >= 0) {\n while (clone.children.length > ownerIndex) {\n clone.lastElementChild?.remove();\n }\n }\n for (const surface of clone.querySelectorAll('foreignObject[data-sf-shader]')) {\n surface.remove();\n }\n const background = hostBackground(svg);\n if (background) {\n const { x, y, width: viewWidth, height: viewHeight } = svg.viewBox.baseVal;\n const fill = svg.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'rect');\n fill.setAttribute('x', String(x));\n fill.setAttribute('y', String(y));\n fill.setAttribute('width', String(viewWidth));\n fill.setAttribute('height', String(viewHeight));\n fill.setAttribute('fill', background);\n clone.insertBefore(fill, clone.firstChild);\n }\n clone.setAttribute('width', String(width));\n clone.setAttribute('height', String(height));\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n return clone;\n}\n\nexport function captureShaderBackdrop(svg: SVGSVGElement, owner: Element): Promise<ShaderBackdrop | undefined> {\n const density = Math.max(globalThis.devicePixelRatio || 1, MIN_BACKDROP_DENSITY);\n const scale = Math.min(density, MAX_BACKDROP_PIXELS / Math.max(1, Math.max(svg.clientWidth, svg.clientHeight)));\n const width = Math.max(1, Math.round(svg.clientWidth * scale));\n const height = Math.max(1, Math.round(svg.clientHeight * scale));\n const view = svg.ownerDocument.defaultView;\n if (!view) {\n return Promise.resolve(undefined);\n }\n\n const markup = new XMLSerializer().serializeToString(backdropClone(svg, owner, width, height));\n const image = svg.ownerDocument.createElement('img');\n const source = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n\n return new Promise(resolve => {\n image.onload = () => resolve({ image, width, height });\n image.onerror = () => resolve(undefined);\n image.src = source;\n });\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport type { Surface } from './surfaceTypes';\n\nexport function color(\n value: ShaderParameter | undefined,\n fallback: [number, number, number],\n): [number, number, number] {\n if (typeof value !== 'string') {\n return fallback;\n }\n const match = /^#([0-9a-f]{6})$/i.exec(value);\n if (!match) {\n return fallback;\n }\n const integer = Number.parseInt(match[1], 16);\n return [((integer >> 16) & 255) / 255, ((integer >> 8) & 255) / 255, (integer & 255) / 255];\n}\n\nexport function number(value: ShaderParameter | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nexport function uniform1f(surface: Surface, name: string, value: number): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform1f(location, value);\n }\n}\n\nexport function uniform3f(surface: Surface, name: string, value: [number, number, number]): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform3f(location, ...value);\n }\n}\n\nexport function uniform2f(surface: Surface, name: string, value: [number, number]): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform2f(location, ...value);\n }\n}\n\nexport function uniformName(parameter: string): string {\n return `u${parameter.charAt(0).toUpperCase()}${parameter.slice(1)}`;\n}\n\nfunction enumParameter(name: string, value: string): number | undefined {\n const values: Record<string, Record<string, number>> = {\n direction: { left: 0, right: 1, top: 2, bottom: 3 },\n orientation: { vertical: 0, horizontal: 1 },\n axis: { vertical: 0, horizontal: 1 },\n };\n return values[name]?.[value];\n}\n\nexport function applyParameters(surface: Surface, elapsed: number): void {\n for (const [key, value] of Object.entries(surface.parameters)) {\n const name = uniformName(key);\n if (typeof value === 'number') {\n const lag = surface.parameters[`${key}Lag`];\n if (typeof lag === 'number' && lag > 0) {\n const current = surface.smoothed.get(key) ?? value;\n const next = current + (value - current) * (1 - Math.exp(-elapsed / lag));\n surface.smoothed.set(key, next);\n uniform1f(surface, name, next);\n continue;\n }\n uniform1f(surface, name, value);\n continue;\n }\n if (typeof value === 'boolean') {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform1i(location, value ? 1 : 0);\n }\n continue;\n }\n const enumValue = enumParameter(key, value);\n if (enumValue !== undefined) {\n uniform1f(surface, name, enumValue);\n continue;\n }\n if (/^#[0-9a-f]{6}$/i.test(value)) {\n uniform3f(surface, name, color(value, [0, 0, 0]));\n }\n }\n}\n","const VERTEX_SOURCE = `\nattribute vec2 aPosition;\nvarying vec2 vUv;\n\nvoid main() {\n vUv = aPosition * 0.5 + 0.5;\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}\n`;\n\nfunction compile(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n const shader = gl.createShader(type);\n if (!shader) {\n return undefined;\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n gl.deleteShader(shader);\n return undefined;\n }\n return shader;\n}\n\nexport function linkProgram(gl: WebGLRenderingContext, fragmentSource: string): WebGLProgram | undefined {\n const vertex = compile(gl, gl.VERTEX_SHADER, VERTEX_SOURCE);\n const fragment = compile(gl, gl.FRAGMENT_SHADER, fragmentSource);\n if (!vertex || !fragment) {\n if (vertex) {\n gl.deleteShader(vertex);\n }\n if (fragment) {\n gl.deleteShader(fragment);\n }\n return undefined;\n }\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return undefined;\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return undefined;\n }\n return program;\n}\n\nexport function transparentTexture(gl: WebGLRenderingContext): WebGLTexture | undefined {\n const texture = gl.createTexture();\n if (!texture) {\n return undefined;\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));\n return texture;\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport { shaderProgram } from './programs';\nimport type { Surface } from './surfaceTypes';\nimport type { ShaderProgram } from './types';\nimport { color } from './uniforms';\nimport { linkProgram, transparentTexture } from './webgl';\n\nconst FULL_SCREEN_QUAD = new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]);\n\nfunction parametersOf(owner: Element): Record<string, ShaderParameter> {\n try {\n return JSON.parse(owner.getAttribute('data-sf-shader-params') ?? '{}') as Record<string, ShaderParameter>;\n } catch {\n return {};\n }\n}\n\nfunction surfacePaddingOf(owner: Element): number {\n const padding = Number(owner.getAttribute('data-sf-shader-padding'));\n return Number.isFinite(padding) ? Math.max(0, padding) : 0;\n}\n\nfunction bindFullScreenQuad(gl: WebGLRenderingContext, program: WebGLProgram): WebGLBuffer | undefined {\n const buffer = gl.createBuffer();\n if (!buffer) {\n return undefined;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, FULL_SCREEN_QUAD, gl.STATIC_DRAW);\n const position = gl.getAttribLocation(program, 'aPosition');\n if (position < 0) {\n gl.deleteBuffer(buffer);\n return undefined;\n }\n gl.enableVertexAttribArray(position);\n gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);\n return buffer;\n}\n\nfunction findBaseGeometry(owner: Element, definition: ShaderProgram): Element | undefined {\n const ownerId = owner.getAttribute('data-sf-id');\n if (!definition.replacesBaseFill || !ownerId) {\n return undefined;\n }\n const candidates = [...(owner.closest('svg')?.querySelectorAll('[data-sf-primary=\"true\"]') ?? [])];\n return candidates.find(element => element !== owner && element.getAttribute('data-sf-id') === ownerId);\n}\n\nexport function createSurface(canvas: HTMLCanvasElement): Surface | undefined {\n const owner = canvas.closest('[data-sf-shader]');\n const name = owner?.getAttribute('data-sf-shader');\n const definition = name ? shaderProgram(name) : undefined;\n const gl = canvas.getContext('webgl', { alpha: true, antialias: true, premultipliedAlpha: true });\n if (!owner || !definition || !gl) {\n return undefined;\n }\n const program = linkProgram(gl, definition.fragmentSource);\n if (!program) {\n return undefined;\n }\n gl.useProgram(program);\n const buffer = bindFullScreenQuad(gl, program);\n if (!buffer) {\n gl.deleteProgram(program);\n return undefined;\n }\n const usesBackdrop = definition.usesBackdrop === true;\n const baseGeometry = findBaseGeometry(owner, definition);\n const baseFill = baseGeometry?.getAttribute('fill');\n baseGeometry?.setAttribute('fill', 'none');\n return {\n programName: definition.name,\n owner,\n canvas,\n gl,\n program,\n buffer,\n parameters: { ...definition.defaultParameters, ...parametersOf(owner) },\n surfacePadding: surfacePaddingOf(owner),\n smoothed: new Map(),\n pointer: { x: 0.5, y: 0.5 },\n hovering: false,\n hover: 0,\n trail: [],\n backdropTexture: usesBackdrop ? transparentTexture(gl) : undefined,\n backdropOrigin: [0, 0],\n backdropScale: [1, 1],\n usesBackdrop,\n shapeColor: color(owner.getAttribute('data-sf-shader-fill') ?? undefined, [1, 1, 1]),\n baseGeometry,\n baseFill,\n };\n}\n\nexport function releaseSurface(surface: Surface): void {\n if (surface.backdropTexture) {\n surface.gl.deleteTexture(surface.backdropTexture);\n }\n surface.gl.deleteBuffer(surface.buffer);\n surface.gl.deleteProgram(surface.program);\n if (!surface.baseGeometry) {\n return;\n }\n if (surface.baseFill === null || surface.baseFill === undefined) {\n surface.baseGeometry.removeAttribute('fill');\n } else {\n surface.baseGeometry.setAttribute('fill', surface.baseFill);\n }\n}\n\n// A surface that is still on the page, for the same shader, is kept when the drawing is patched, so the shader is not compiled again for\n// every small change, such as a slider that moves a parameter. It takes the parameters the drawing has now. A shader that replaces the fill\n// of its shape is made again, as the shape was patched.\nexport function refreshSurface(surface: Surface, svg: SVGSVGElement): boolean {\n const owner = surface.canvas.closest('[data-sf-shader]');\n const name = owner?.getAttribute('data-sf-shader');\n const definition = name ? shaderProgram(name) : undefined;\n if (!owner || !svg.contains(surface.canvas) || !definition) {\n return false;\n }\n if (definition.name !== surface.programName || definition.replacesBaseFill || surface.baseGeometry) {\n return false;\n }\n surface.owner = owner;\n surface.parameters = { ...definition.defaultParameters, ...parametersOf(owner) };\n surface.surfacePadding = surfacePaddingOf(owner);\n surface.shapeColor = color(owner.getAttribute('data-sf-shader-fill') ?? undefined, [1, 1, 1]);\n return true;\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport type { Surface } from './surfaceTypes';\nimport { color, number } from './uniforms';\n\ninterface SurfaceGeometry {\n centerX: number;\n centerY: number;\n width: number;\n height: number;\n localPoint(worldX: number, worldY: number): [number, number];\n}\n\nfunction geometryOf(surface: Surface): SurfaceGeometry | undefined {\n const x = Number(surface.owner.getAttribute('x'));\n const y = Number(surface.owner.getAttribute('y'));\n const width = Number(surface.owner.getAttribute('width'));\n const height = Number(surface.owner.getAttribute('height'));\n if (![x, y, width, height].every(Number.isFinite) || width <= 0 || height <= 0) {\n return undefined;\n }\n const matrix = (surface.owner as SVGGraphicsElement).getCTM?.();\n const a = matrix?.a ?? 1;\n const b = matrix?.b ?? 0;\n const c = matrix?.c ?? 0;\n const d = matrix?.d ?? 1;\n const e = matrix?.e ?? 0;\n const f = matrix?.f ?? 0;\n const determinant = a * d - b * c;\n const centerX = a * (x + width / 2) + c * (y + height / 2) + e;\n const centerY = b * (x + width / 2) + d * (y + height / 2) + f;\n const localPoint = (worldX: number, worldY: number): [number, number] => {\n if (Math.abs(determinant) < 0.000001) {\n return [worldX, worldY];\n }\n const translatedX = worldX - e;\n const translatedY = worldY - f;\n return [(d * translatedX - c * translatedY) / determinant, (-b * translatedX + a * translatedY) / determinant];\n };\n return { width, height, centerX, centerY, localPoint };\n}\n\nfunction parameter(parameters: Record<string, ShaderParameter>, key: string, fallback: number): number {\n return number(parameters[key], fallback);\n}\n\nexport function normalizedLightPosition(\n sourceX: number,\n sourceY: number,\n receiverX: number,\n receiverY: number,\n receiverWidth: number,\n receiverHeight: number,\n): [number, number] {\n return [(sourceX - receiverX) / receiverWidth, (sourceY - receiverY) / receiverHeight];\n}\n\nexport function updateReactiveLightFields(surfaces: Surface[]): void {\n const reactive = surfaces\n .filter(surface => surface.owner.getAttribute('data-sf-shader') === 'reactivePanel')\n .flatMap(surface => {\n const geometry = geometryOf(surface);\n return geometry ? [{ surface, geometry }] : [];\n });\n\n for (const receiver of reactive) {\n const sources: Array<{ candidate: (typeof reactive)[number]; emission: number; weight: number }> = [];\n for (const candidate of reactive) {\n if (candidate.surface === receiver.surface) {\n continue;\n }\n const emission = Math.max(\n 0,\n candidate.surface.smoothed.get('emission') ?? parameter(candidate.surface.parameters, 'emission', 0),\n );\n if (emission <= 0.0001) {\n continue;\n }\n const distance = Math.hypot(\n candidate.geometry.centerX - receiver.geometry.centerX,\n candidate.geometry.centerY - receiver.geometry.centerY,\n );\n sources.push({ candidate, emission, weight: emission / Math.max(distance, 1) });\n }\n const totalWeight = sources.reduce((sum, source) => sum + source.weight, 0);\n if (totalWeight <= 0) {\n receiver.surface.reactiveLight = undefined;\n continue;\n }\n let worldX = 0;\n let worldY = 0;\n let sourceEmission = 0;\n let radius = 0;\n const lightColor: [number, number, number] = [0, 0, 0];\n for (const source of sources) {\n const influence = source.weight / totalWeight;\n worldX += source.candidate.geometry.centerX * influence;\n worldY += source.candidate.geometry.centerY * influence;\n sourceEmission += source.emission;\n radius += Math.max(1, parameter(source.candidate.surface.parameters, 'glowRadius', 90)) * influence;\n const sourceColor = color(source.candidate.surface.parameters.lightColor, [0.35, 0.82, 1]);\n lightColor[0] += sourceColor[0] * influence;\n lightColor[1] += sourceColor[1] * influence;\n lightColor[2] += sourceColor[2] * influence;\n }\n const receiverStrength = Math.max(0, parameter(receiver.surface.parameters, 'lightStrength', 1));\n const [sourceX, sourceY] = receiver.geometry.localPoint(worldX, worldY);\n const receiverX = Number(receiver.surface.owner.getAttribute('x'));\n const receiverY = Number(receiver.surface.owner.getAttribute('y'));\n const [lightX, lightY] = normalizedLightPosition(\n sourceX,\n sourceY,\n receiverX,\n receiverY,\n receiver.geometry.width,\n receiver.geometry.height,\n );\n receiver.surface.reactiveLight = {\n x: lightX,\n y: lightY,\n strength: sourceEmission * receiverStrength * 1.8,\n radius,\n color: lightColor,\n };\n }\n}\n","import type { ShaderBackdrop } from './backdrop';\nimport { SHADER_DEFAULTS } from './defaults';\nimport type { Surface } from './surfaceTypes';\nimport { applyParameters, color, number, uniform1f, uniform2f, uniform3f, uniformName } from './uniforms';\n\nfunction syncBackdropBounds(surface: Surface): void {\n const svg = surface.canvas.closest('svg');\n if (!svg) {\n return;\n }\n const svgBounds = svg.getBoundingClientRect();\n const surfaceBounds = surface.canvas.getBoundingClientRect();\n if (svgBounds.width <= 0 || svgBounds.height <= 0) {\n return;\n }\n surface.backdropOrigin = [\n (surfaceBounds.left - svgBounds.left) / svgBounds.width,\n (svgBounds.bottom - surfaceBounds.bottom) / svgBounds.height,\n ];\n surface.backdropScale = [surfaceBounds.width / svgBounds.width, surfaceBounds.height / svgBounds.height];\n}\n\nexport function applyBackdrop(surface: Surface, backdrop: ShaderBackdrop): void {\n if (!surface.backdropTexture) {\n return;\n }\n syncBackdropBounds(surface);\n const { gl } = surface;\n gl.bindTexture(gl.TEXTURE_2D, surface.backdropTexture);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, backdrop.image);\n}\n\nconst MAX_SURFACE_PIXELS = 2560;\nconst TRAIL_LENGTH = 16;\n\n// The canvas gets the pixels it is shown with, up to a limit, and the number of canvas pixels for one pixel of the picture is returned.\nfunction fitCanvas(canvas: HTMLCanvasElement): { width: number; height: number; density: number; fit: number } {\n const shown = canvas.getBoundingClientRect();\n const density = Math.min(globalThis.devicePixelRatio || 1, 3);\n const fit = Math.min(1, MAX_SURFACE_PIXELS / Math.max(1, shown.width * density, shown.height * density));\n const width = Math.max(1, Math.round((shown.width || canvas.clientWidth) * density * fit));\n const height = Math.max(1, Math.round((shown.height || canvas.clientHeight) * density * fit));\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n }\n return { width, height, density, fit };\n}\n\nfunction bindBackdrop(surface: Surface, texture: WebGLTexture): void {\n const { gl } = surface;\n syncBackdropBounds(surface);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n const sampler = gl.getUniformLocation(surface.program, 'uBackdrop');\n if (sampler) {\n gl.uniform1i(sampler, 0);\n }\n uniform2f(surface, 'uBackdropOrigin', surface.backdropOrigin);\n uniform2f(surface, 'uBackdropScale', surface.backdropScale);\n}\n\nfunction uploadParameters(surface: Surface): void {\n const { parameters } = surface;\n for (const [key, fallback] of Object.entries(SHADER_DEFAULTS.numbers)) {\n uniform1f(surface, uniformName(key), number(parameters[key], fallback));\n }\n for (const [key, fallback] of Object.entries(SHADER_DEFAULTS.colors)) {\n uniform3f(surface, uniformName(key), color(parameters[key], [...fallback] as [number, number, number]));\n }\n uniform3f(surface, 'uShapeColor', surface.shapeColor);\n}\n\n// The pointer, how far the surface is hovered, and the trail: where the pointer has been, and how much of it is left. `trail` is how many\n// seconds a place takes to fade out.\nfunction uploadPointer(surface: Surface, seconds: number, elapsed: number): void {\n const { gl, parameters } = surface;\n surface.hover += ((surface.hovering ? 1 : 0) - surface.hover) * (1 - Math.exp(-elapsed / 0.18));\n uniform2f(surface, 'uPointer', [surface.pointer.x, surface.pointer.y]);\n uniform1f(surface, 'uHover', surface.hover);\n const fade = number(parameters.trail, 0);\n const places = new Float32Array(TRAIL_LENGTH * 3);\n if (fade > 0) {\n surface.trail.slice(-TRAIL_LENGTH).forEach((place, index) => {\n places.set([place.x, place.y, Math.exp(-Math.max(seconds - place.at, 0) / fade)], index * 3);\n });\n }\n const trail = gl.getUniformLocation(surface.program, 'uWake[0]');\n if (trail) {\n gl.uniform3fv(trail, places);\n }\n}\n\nfunction uploadReactiveLight(surface: Surface): void {\n if (!surface.reactiveLight) {\n return;\n }\n uniform1f(surface, 'uLightX', surface.reactiveLight.x);\n uniform1f(surface, 'uLightY', surface.reactiveLight.y);\n uniform1f(surface, 'uLightStrength', surface.reactiveLight.strength);\n uniform1f(surface, 'uGlowRadius', surface.reactiveLight.radius);\n uniform3f(surface, 'uLightColor', surface.reactiveLight.color);\n}\n\nexport function renderSurface(surface: Surface, seconds: number): void {\n const { canvas, gl } = surface;\n const { width, height, density, fit } = fitCanvas(canvas);\n gl.viewport(0, 0, width, height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.useProgram(surface.program);\n const resolution = gl.getUniformLocation(surface.program, 'uResolution');\n if (resolution) {\n gl.uniform2f(resolution, width, height);\n }\n const logicalWidth = Number(surface.owner.getAttribute('width'));\n uniform1f(\n surface,\n 'uPixelScale',\n Number.isFinite(logicalWidth) && logicalWidth > 0 ? width / logicalWidth : density * fit,\n );\n uniform1f(surface, 'uTime', seconds);\n if (surface.backdropTexture) {\n bindBackdrop(surface, surface.backdropTexture);\n }\n uploadParameters(surface);\n const elapsed = surface.lastSeconds === undefined ? 0 : Math.max(0, Math.min(seconds - surface.lastSeconds, 0.1));\n surface.lastSeconds = seconds;\n applyParameters(surface, elapsed);\n uploadPointer(surface, seconds, elapsed);\n uploadReactiveLight(surface);\n uniform1f(surface, 'uSurfacePadding', surface.surfacePadding);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n}\n","export interface SurfaceClock {\n now(): number;\n paused(): boolean;\n spent(): number;\n setPaused(paused: boolean): void;\n}\n\nexport function createSurfaceClock(view: Window | null | undefined): SurfaceClock {\n let pausedSince: number | null = null;\n let spentPaused = 0;\n const real = () => (view?.performance.now() ?? 0) / 1000;\n return {\n now: () => (pausedSince ?? real()) - spentPaused,\n paused: () => pausedSince !== null,\n spent: () => spentPaused,\n setPaused(paused) {\n if (paused && pausedSince === null) {\n pausedSince = real();\n } else if (!paused && pausedSince !== null) {\n spentPaused += real() - pausedSince;\n pausedSince = null;\n }\n },\n };\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport { captureShaderBackdrop } from './backdrop';\nimport { createSurface, refreshSurface, releaseSurface } from './createSurface';\nimport { updateReactiveLightFields } from './reactiveLightField';\nimport { applyBackdrop, renderSurface } from './renderSurface';\nimport { createSurfaceClock, type SurfaceClock } from './surfaceClock';\nimport type { Surface } from './surfaceTypes';\n\nexport interface ShaderSurfaceHandle {\n capture(): Array<string | undefined>;\n setParameters(ownerId: string, parameters: Record<string, ShaderParameter>): boolean;\n setPaused(paused: boolean): void;\n refresh(): void;\n destroy(): void;\n}\n\nconst RECAPTURE_DELAY_MS = 120;\n// A new place of the trail after this many seconds of movement, and as many places as the shaders read.\nconst TRAIL_SPACING = 0.055;\nconst TRAIL_LENGTH = 16;\n\nfunction capturePngs(svg: SVGSVGElement, surfaces: Surface[], seconds: number): Array<string | undefined> {\n const surfaceByCanvas = new Map(surfaces.map(surface => [surface.canvas, surface]));\n return [...svg.querySelectorAll<HTMLCanvasElement>('canvas[data-sf-shader-canvas]')].map(canvas => {\n const surface = surfaceByCanvas.get(canvas);\n if (!surface) {\n return undefined;\n }\n try {\n renderSurface(surface, seconds);\n return surface.canvas.toDataURL('image/png');\n } catch {\n return undefined;\n }\n });\n}\n\nfunction updateParameters(\n surfaces: Surface[],\n ownerId: string,\n parameters: Record<string, ShaderParameter>,\n seconds: number,\n): boolean {\n let changed = false;\n for (const surface of surfaces) {\n if (surface.owner.getAttribute('data-sf-id') !== ownerId) {\n continue;\n }\n Object.assign(surface.parameters, parameters);\n surface.owner.setAttribute('data-sf-shader-params', JSON.stringify(surface.parameters));\n changed = true;\n }\n if (changed) {\n updateReactiveLightFields(surfaces);\n for (const surface of surfaces) {\n renderSurface(surface, seconds);\n }\n }\n return changed;\n}\n\nfunction watchSvgChanges(\n svg: SVGSVGElement,\n view: (Window & typeof globalThis) | null,\n onChange: () => void,\n): () => void {\n if (!view) {\n return () => undefined;\n }\n const mutations = new view.MutationObserver(onChange);\n mutations.observe(svg, { attributes: true, attributeFilter: ['viewBox'] });\n const sizes = view.ResizeObserver ? new view.ResizeObserver(onChange) : undefined;\n sizes?.observe(svg);\n return () => {\n mutations.disconnect();\n sizes?.disconnect();\n };\n}\n\n// What a surface has gathered while it ran, which a refresh gives to the new surface of the same owner so the picture does not start over.\ntype SurfaceMemory = Pick<Surface, 'smoothed' | 'reactiveLight' | 'pointer' | 'hover' | 'hovering' | 'trail'>;\n\nfunction rememberSurfaces(surfaces: Surface[]): Map<string, SurfaceMemory> {\n return new Map(\n surfaces.flatMap(surface => {\n const ownerId = surface.owner.getAttribute('data-sf-id');\n return ownerId\n ? [\n [\n ownerId,\n {\n smoothed: new Map(surface.smoothed),\n reactiveLight: surface.reactiveLight,\n pointer: surface.pointer,\n hover: surface.hover,\n hovering: surface.hovering,\n trail: surface.trail,\n },\n ],\n ]\n : [];\n }),\n );\n}\n\nfunction createSurfaces(\n svg: SVGSVGElement,\n memory: Map<string, SurfaceMemory>,\n kept: Map<HTMLCanvasElement, Surface>,\n): Surface[] {\n return [...svg.querySelectorAll<HTMLCanvasElement>('canvas[data-sf-shader-canvas]')].flatMap(canvas => {\n const keptSurface = kept.get(canvas);\n if (keptSurface) {\n return [keptSurface];\n }\n const surface = createSurface(canvas);\n const ownerId = surface?.owner.getAttribute('data-sf-id');\n const previous = ownerId ? memory.get(ownerId) : undefined;\n if (surface && previous) {\n Object.assign(surface, previous);\n }\n return surface ? [surface] : [];\n });\n}\n\n// A shader that reacts to the pointer reads where it is over the surface, and how far it is over it.\nfunction followPointer(surface: Surface, event: PointerEvent, now: number): void {\n const box = surface.canvas.getBoundingClientRect();\n const inside =\n box.width > 0 &&\n box.height > 0 &&\n event.clientX >= box.left &&\n event.clientX <= box.right &&\n event.clientY >= box.top &&\n event.clientY <= box.bottom;\n surface.hovering = inside;\n if (!inside) {\n return;\n }\n surface.pointer = { x: (event.clientX - box.left) / box.width, y: 1 - (event.clientY - box.top) / box.height };\n const last = surface.trail[surface.trail.length - 1];\n if (!last || now - last.at >= TRAIL_SPACING) {\n surface.trail.push({ ...surface.pointer, at: now });\n if (surface.trail.length > TRAIL_LENGTH) {\n surface.trail.shift();\n }\n }\n}\n\n// The shader surfaces of one drawing: it makes them from the canvases in it, draws them every frame, keeps their backdrops up to date and\n// lets them follow the pointer.\nclass ShaderSurfaces implements ShaderSurfaceHandle {\n private surfaces: Surface[] = [];\n private frame: number | undefined;\n private backdropGeneration = 0;\n private recapture: number | undefined;\n private readonly view: (Window & typeof globalThis) | null;\n private readonly clock: SurfaceClock;\n private readonly unwatch: () => void;\n\n constructor(private readonly svg: SVGSVGElement) {\n this.view = svg.ownerDocument.defaultView;\n this.clock = createSurfaceClock(this.view);\n this.unwatch = watchSvgChanges(svg, this.view, this.scheduleRecapture);\n svg.addEventListener('pointermove', this.track);\n svg.addEventListener('pointerleave', this.leave);\n this.refresh();\n }\n\n capture(): Array<string | undefined> {\n return capturePngs(this.svg, this.surfaces, this.clock.now());\n }\n\n setParameters(ownerId: string, parameters: Record<string, ShaderParameter>): boolean {\n return updateParameters(this.surfaces, ownerId, parameters, this.clock.now());\n }\n\n setPaused(paused: boolean): void {\n this.clock.setPaused(paused);\n }\n\n refresh(): void {\n const memory = rememberSurfaces(this.surfaces);\n this.cancelFrame();\n const kept = new Map<HTMLCanvasElement, Surface>();\n for (const surface of this.surfaces) {\n if (refreshSurface(surface, this.svg)) {\n kept.set(surface.canvas, surface);\n }\n }\n for (const surface of this.surfaces) {\n if (!kept.has(surface.canvas)) {\n releaseSurface(surface);\n }\n }\n const generation = ++this.backdropGeneration;\n this.surfaces = createSurfaces(this.svg, memory, kept);\n updateReactiveLightFields(this.surfaces);\n this.captureBackdrops(generation);\n if (this.surfaces.length > 0) {\n this.startFrames();\n }\n }\n\n destroy(): void {\n this.backdropGeneration += 1;\n this.unwatch();\n this.svg.removeEventListener('pointermove', this.track);\n this.svg.removeEventListener('pointerleave', this.leave);\n if (this.recapture !== undefined) {\n this.view?.clearTimeout(this.recapture);\n }\n this.stop();\n }\n\n private readonly draw = (milliseconds: number): void => {\n if (!this.clock.paused()) {\n updateReactiveLightFields(this.surfaces);\n for (const surface of this.surfaces) {\n renderSurface(surface, milliseconds / 1000 - this.clock.spent());\n }\n }\n this.frame = this.view?.requestAnimationFrame(this.draw);\n };\n\n private cancelFrame(): void {\n if (this.frame !== undefined) {\n this.view?.cancelAnimationFrame(this.frame);\n this.frame = undefined;\n }\n }\n\n private stop(): void {\n this.cancelFrame();\n for (const surface of this.surfaces) {\n releaseSurface(surface);\n }\n this.surfaces = [];\n }\n\n private captureBackdrops(generation: number): void {\n for (const surface of this.surfaces) {\n if (!surface.usesBackdrop) {\n continue;\n }\n void captureShaderBackdrop(this.svg, surface.owner).then(backdrop => {\n if (backdrop && generation === this.backdropGeneration) {\n applyBackdrop(surface, backdrop);\n }\n });\n }\n }\n\n private startFrames(): void {\n if (!this.view?.requestAnimationFrame) {\n for (const surface of this.surfaces) {\n renderSurface(surface, 0);\n }\n return;\n }\n if (this.clock.paused()) {\n for (const surface of this.surfaces) {\n renderSurface(surface, this.clock.now());\n }\n }\n this.frame = this.view.requestAnimationFrame(this.draw);\n }\n\n private readonly scheduleRecapture = (): void => {\n if (this.recapture !== undefined) {\n this.view?.clearTimeout(this.recapture);\n }\n this.recapture = this.view?.setTimeout(() => {\n this.recapture = undefined;\n this.captureBackdrops(this.backdropGeneration);\n }, RECAPTURE_DELAY_MS);\n };\n\n private readonly track = (event: PointerEvent): void => {\n const now = this.clock.now();\n for (const surface of this.surfaces) {\n followPointer(surface, event, now);\n }\n };\n\n private readonly leave = (): void => {\n for (const surface of this.surfaces) {\n surface.hovering = false;\n }\n };\n}\n\nexport function mountShaderSurfaces(svg: SVGSVGElement): ShaderSurfaceHandle {\n return new ShaderSurfaces(svg);\n}\n","import { type RenderOptions, render } from '../../render';\nimport { isContractCompatible, parseContractVersion } from '../dom';\nimport type { ViewerSource } from './types';\n\nexport function renderViewerSource(next: ViewerSource, defaultRenderOptions?: RenderOptions): string {\n const svg =\n next.svg ??\n (next.source != null\n ? render(next.source, { ...(next.renderOptions ?? defaultRenderOptions), linkHitAreas: true }).svg\n : null);\n if (svg == null) {\n throw new Error('createViewer: provide either `source` (SFL) or `svg`.');\n }\n return svg;\n}\n\nexport function assertCreateViewerContract(svg: string): void {\n const version = parseContractVersion(svg);\n if (!isContractCompatible(version)) {\n throw new Error(`createViewer: incompatible DOM contract (svg=${version}). Renderer and viewer versions differ.`);\n }\n}\n\nexport function assertViewerUpdateContract(svg: string): void {\n const version = parseContractVersion(svg);\n if (!isContractCompatible(version)) {\n throw new Error(`viewer.update: incompatible DOM contract (svg=${version}). Renderer and viewer versions differ.`);\n }\n}\n","import type { ShaderParameter } from '../../model/shader';\nimport { type DocumentComponentsHandle, mountDocumentComponents } from './components';\nimport { placeRulerKnobs, rulerProgress } from './components/rulerKnob';\nimport type { DisplayHandle, ViewBox } from './display';\nimport { mountDisplay } from './display';\nimport { Emitter, type OwnerRef, type Unsubscribe, type ViewerEventHandler, type ViewerEventName } from './events';\nimport { rasterizeSvgSnapshot, serializeSvgSnapshot, type ViewerImageExportOptions } from './export';\nimport { bindInteraction, type InteractionHandle } from './interaction';\nimport { mountShaderSurfaces, type ShaderSurfaceHandle } from './shaders';\nimport { assertViewerUpdateContract, renderViewerSource } from './source';\nimport type { Viewer, ViewerOptions, ViewerSource } from './types';\n\nexport class ViewerSession implements Viewer {\n private readonly emitter = new Emitter();\n private readonly display: DisplayHandle;\n private readonly interaction: InteractionHandle | null;\n private readonly shaderSurfaces: ShaderSurfaceHandle;\n private readonly documentComponents: DocumentComponentsHandle;\n private readonly shaderParameterOverrides = new Map<string, Record<string, ShaderParameter>>();\n private readonly rulerProgressOverrides = new Map<string, number>();\n\n constructor(\n private readonly options: ViewerOptions,\n initialSvg: string,\n private readonly diagramId: string,\n ) {\n this.display = mountDisplay(options.container, initialSvg);\n this.shaderSurfaces = mountShaderSurfaces(this.display.svg);\n this.documentComponents = mountDocumentComponents(this.display.svg);\n this.interaction = options.interactive\n ? bindInteraction(this.display, this.emitter, diagramId, { selectable: options.selectable })\n : null;\n this.placeKnobs();\n }\n\n private placeKnobs(): void {\n const radii = placeRulerKnobs(this.display.svg, id => this.rulerProgressOverrides.get(id));\n for (const [id, knobRadius] of radii) {\n this.setShaderParameters(id, { knobRadius });\n }\n }\n\n get svg(): SVGSVGElement {\n return this.display.svg;\n }\n\n on<T extends ViewerEventName>(name: T, handler: ViewerEventHandler<T>): Unsubscribe {\n return this.emitter.on(name, handler);\n }\n\n getSelection(): OwnerRef[] {\n return this.interaction?.getSelection() ?? [];\n }\n\n select(ids: string[]): void {\n this.interaction?.select(ids);\n }\n\n fit(): void {\n this.display.fit();\n this.interaction?.repaint();\n }\n\n getViewport(): ViewBox {\n return this.display.getViewport();\n }\n\n exportSvg(): string {\n return serializeSvgSnapshot(this.svg, this.shaderSurfaces.capture());\n }\n\n exportImage(options?: ViewerImageExportOptions): Promise<Blob> {\n return rasterizeSvgSnapshot(this.svg, this.exportSvg(), options);\n }\n\n setShaderParameters(ownerId: string, parameters: Record<string, ShaderParameter>): boolean {\n const merged = { ...this.shaderParameterOverrides.get(ownerId), ...parameters };\n this.shaderParameterOverrides.set(ownerId, merged);\n return this.shaderSurfaces.setParameters(ownerId, parameters);\n }\n\n setWidgetValue(componentId: string, value: string | number): boolean {\n return this.setComponentValue(componentId, value);\n }\n\n setComponentValue(componentId: string, value: string | number): boolean {\n if (this.documentComponents.setValue(componentId, value)) {\n return true;\n }\n const ruler = [...this.svg.querySelectorAll('foreignObject[data-sf-shader=\"ruler\"]')].find(\n element => element.getAttribute('data-sf-id') === componentId,\n );\n if (ruler) {\n const progress = rulerProgress(ruler, Number(value));\n this.rulerProgressOverrides.set(componentId, progress);\n const applied = this.setShaderParameters(componentId, { progress });\n this.placeKnobs();\n return applied;\n }\n const scale = [...this.svg.querySelectorAll('foreignObject[data-sf-shader=\"tickScale\"]')].find(\n element => element.getAttribute('data-sf-id') === componentId,\n );\n if (!scale) {\n return false;\n }\n let max = 100;\n try {\n max = Number((JSON.parse(scale.getAttribute('data-sf-shader-params') ?? '{}') as { max?: number }).max) || 100;\n } catch {\n max = 100;\n }\n return this.setShaderParameters(componentId, { progress: Math.min(1, Math.max(0, Number(value) / max)) });\n }\n\n setPaused(paused: boolean): void {\n this.shaderSurfaces.setPaused(paused);\n }\n\n clearOverrides(): void {\n this.shaderParameterOverrides.clear();\n this.rulerProgressOverrides.clear();\n this.documentComponents.clearValues();\n }\n\n update(next: ViewerSource): void {\n const svg = renderViewerSource(next, this.options.renderOptions);\n assertViewerUpdateContract(svg);\n const diff = this.display.updateContent(svg);\n this.shaderSurfaces.refresh();\n this.documentComponents.refresh();\n this.placeKnobs();\n for (const [ownerId, parameters] of this.shaderParameterOverrides) {\n this.shaderSurfaces.setParameters(ownerId, parameters);\n }\n if (next.resetView) {\n this.display.fit();\n }\n const selectedIds = this.interaction?.getSelection().map(owner => owner.id) ?? [];\n if (selectedIds.length > 0) {\n this.interaction?.select(selectedIds);\n }\n this.emitter.emit('sceneDiff', { diagramId: this.diagramId, ...diff });\n if (next.highlightChanges) {\n const color = typeof next.highlightChanges === 'object' ? next.highlightChanges.color : undefined;\n this.interaction?.flashChanged([...diff.added, ...diff.changed], color);\n }\n }\n\n announceReady(): void {\n queueMicrotask(() => this.emitter.emit('ready', { diagramId: this.diagramId }));\n }\n\n destroy(): void {\n this.interaction?.destroy();\n this.shaderSurfaces.destroy();\n this.documentComponents.destroy();\n this.shaderParameterOverrides.clear();\n this.display.destroy();\n this.emitter.clear();\n }\n}\n","import type { BindingRuntime } from '../../binding';\nimport type { Viewer } from './types';\n\nexport interface KeyboardOptions {\n enabled?: () => boolean;\n}\n\nconst ACTIVATION_KEYS = new Set([' ', 'Enter']);\n\nfunction operatedId(runtime: BindingRuntime, target: EventTarget | null): string | null {\n const node = target instanceof Element ? target.closest('[data-sf-primary][data-sf-id]') : null;\n const id = node?.getAttribute('data-sf-id') ?? null;\n return id && runtime.interactive.pressable.has(id) ? id : null;\n}\n\nexport function connectKeyboard(viewer: Viewer, runtime: BindingRuntime, options: KeyboardOptions = {}): () => void {\n const focusChanged = (event: FocusEvent, focused: boolean) => {\n const id = operatedId(runtime, event.target);\n if (id) {\n runtime.setElementState(id, { focused });\n }\n };\n const activate = (event: KeyboardEvent) => {\n if (!ACTIVATION_KEYS.has(event.key) || event.repeat || options.enabled?.() === false) {\n return;\n }\n const id = operatedId(runtime, event.target);\n if (id) {\n event.preventDefault();\n runtime.activate(id);\n }\n };\n const listeners: Array<[string, (event: never) => void]> = [\n ['focusin', (event: FocusEvent) => focusChanged(event, true)],\n ['focusout', (event: FocusEvent) => focusChanged(event, false)],\n ['keydown', activate],\n ];\n for (const [type, listener] of listeners) {\n viewer.svg.addEventListener(type, listener as EventListener);\n }\n return () => {\n for (const [type, listener] of listeners) {\n viewer.svg.removeEventListener(type, listener as EventListener);\n }\n };\n}\n","import type { BindingRuntime } from '../../binding';\nimport { getComponentDescriptor } from '../../model/component';\nimport { connectKeyboard } from './connectKeyboard';\nimport type { Viewer } from './types';\n\nexport interface InteractionOptions {\n enabled?: () => boolean;\n paused?: () => boolean;\n}\n\nconst TAU = Math.PI * 2;\nconst LONGEST_TICK = 0.05;\n\nconst finite = (value: unknown, fallback: number): number =>\n Number.isFinite(Number(value)) && value !== '' ? Number(value) : fallback;\n\nfunction parameters(surface: Element): Record<string, unknown> {\n try {\n return JSON.parse(surface.getAttribute('data-sf-shader-params') ?? '{}') as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nfunction pointerValue(svg: SVGSVGElement, id: string, x: number, y: number): number | undefined {\n const surface = svg.querySelector(`foreignObject[data-sf-shader][data-sf-id=\"${CSS.escape(id)}\"]`);\n if (!surface) {\n return undefined;\n }\n const params = parameters(surface);\n const box = surface.getBoundingClientRect();\n const clamp = (value: number) => Math.min(1, Math.max(0, value));\n if (surface.getAttribute('data-sf-kind') === 'ruler') {\n const inset = finite(params.inset, 0) > 0 ? finite(params.inset, 0.05) : 0.05;\n const min = finite(params.min, 0);\n const max = finite(params.max, 100);\n const along = params.axis === 'horizontal' ? (x - box.left) / box.width : 1 - (y - box.top) / box.height;\n return min + clamp((along - inset) / (1 - 2 * inset)) * (max - min);\n }\n const start = (finite(params.start, 225) * Math.PI) / 180;\n const sweep = (finite(params.sweep, 270) * Math.PI) / 180;\n const gap = TAU - sweep;\n const angle = Math.atan2(-(y - (box.top + box.height / 2)), x - (box.left + box.width / 2));\n const shifted = start - angle + gap / 2;\n const fraction = clamp(((((shifted % TAU) + TAU) % TAU) - gap / 2) / sweep);\n return fraction * finite(params.max, 100);\n}\n\nfunction hit(svg: SVGSVGElement, ids: ReadonlySet<string>, x: number, y: number): string | null {\n let found: string | null = null;\n for (const node of svg.querySelectorAll('[data-sf-primary][data-sf-id]')) {\n const id = node.getAttribute('data-sf-id') ?? '';\n if (!ids.has(id)) {\n continue;\n }\n const box = node.getBoundingClientRect();\n if (x >= box.left && x <= box.right && y >= box.top && y <= box.bottom) {\n found = id;\n }\n }\n return found;\n}\n\ninterface Session {\n active: string | null;\n hovered: string | null;\n swallowClick: boolean;\n}\n\ninterface Wiring {\n runtime: BindingRuntime;\n svg: SVGSVGElement;\n options: InteractionOptions;\n session: Session;\n}\n\nfunction trackScales(wiring: Wiring, event: PointerEvent): void {\n const { runtime, svg } = wiring;\n for (const id of runtime.interactive.scales) {\n const value = pointerValue(svg, id, event.clientX, event.clientY);\n if (value !== undefined) {\n runtime.setElementState(id, { pointer: value });\n }\n }\n}\n\n// A slider, a knob or a row of options takes its value from where in the component the pointer is, as fractions of its width and height.\nfunction driveValue(wiring: Wiring, id: string, event: PointerEvent): void {\n const { runtime, svg } = wiring;\n const kind = getComponentDescriptor(runtime.graph.elements.get(id)?.componentType)?.interaction;\n if (kind !== 'slide' && kind !== 'pick' && kind !== 'turn' && kind !== 'range') {\n return;\n }\n const node = svg.querySelector(`[data-sf-primary][data-sf-id=\"${CSS.escape(id)}\"]`);\n if (!node) {\n return;\n }\n const box = node.getBoundingClientRect();\n if (box.width > 0 && box.height > 0) {\n const within = (value: number) => Math.min(1, Math.max(0, value));\n runtime.slide(id, within((event.clientX - box.left) / box.width), within((event.clientY - box.top) / box.height));\n }\n}\n\nfunction updateHover(wiring: Wiring, event: PointerEvent): void {\n const { runtime, svg, options, session } = wiring;\n const over =\n options.enabled?.() === false ? null : hit(svg, runtime.interactive.pressable, event.clientX, event.clientY);\n if (over === session.hovered) {\n return;\n }\n if (session.hovered) {\n runtime.setElementState(session.hovered, { hovered: false });\n }\n session.hovered = over;\n if (over) {\n runtime.setElementState(over, { hovered: true });\n }\n}\n\nfunction pressStart(wiring: Wiring, event: PointerEvent): void {\n const { runtime, svg, options, session } = wiring;\n session.swallowClick = false;\n const inside = event.target instanceof Node && svg.contains(event.target);\n if (event.button !== 0 || options.enabled?.() === false || !inside) {\n return;\n }\n const id = hit(svg, runtime.interactive.pressable, event.clientX, event.clientY);\n if (!id) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n session.swallowClick = true;\n session.active = id;\n trackScales(wiring, event);\n runtime.press(id);\n driveValue(wiring, id, event);\n runtime.drag(id);\n}\n\nfunction pressMove(wiring: Wiring, event: PointerEvent): void {\n const { runtime, session } = wiring;\n if (!session.active) {\n updateHover(wiring, event);\n return;\n }\n trackScales(wiring, event);\n driveValue(wiring, session.active, event);\n runtime.drag(session.active);\n}\n\nfunction pressEnd(wiring: Wiring, event: PointerEvent, tapOnElement: boolean): void {\n const { runtime, svg, session } = wiring;\n if (!session.active) {\n return;\n }\n event.stopPropagation();\n const id = session.active;\n session.active = null;\n const tapped = tapOnElement && hit(svg, runtime.interactive.pressable, event.clientX, event.clientY) === id;\n runtime.release(id, tapped);\n updateHover(wiring, event);\n}\n\nfunction swallowClick(session: Session, event: MouseEvent): void {\n if (!session.swallowClick) {\n return;\n }\n session.swallowClick = false;\n event.stopPropagation();\n event.preventDefault();\n}\n\nfunction startTicks(runtime: BindingRuntime, options: InteractionOptions): () => void {\n if (!runtime.graph.handlers.some(handler => handler.event === 'onTick')) {\n return () => undefined;\n }\n let previous = performance.now();\n let frame = 0;\n const loop = (now: number) => {\n if (options.paused?.() !== true) {\n runtime.tick(Math.min((now - previous) / 1000, LONGEST_TICK));\n }\n previous = now;\n frame = window.requestAnimationFrame(loop);\n };\n frame = window.requestAnimationFrame(loop);\n return () => window.cancelAnimationFrame(frame);\n}\n\nexport function connectInteraction(\n viewer: Viewer,\n runtime: BindingRuntime,\n options: InteractionOptions = {},\n): () => void {\n const session: Session = { active: null, hovered: null, swallowClick: false };\n const wiring: Wiring = { runtime, svg: viewer.svg, options, session };\n const listeners: Array<[string, (event: never) => void]> = [\n ['click', (event: MouseEvent) => swallowClick(session, event)],\n ['pointerdown', (event: PointerEvent) => pressStart(wiring, event)],\n ['pointermove', (event: PointerEvent) => pressMove(wiring, event)],\n ['pointerup', (event: PointerEvent) => pressEnd(wiring, event, true)],\n ['pointercancel', (event: PointerEvent) => pressEnd(wiring, event, false)],\n ];\n for (const [type, listener] of listeners) {\n window.addEventListener(type, listener as EventListener, true);\n }\n const disconnectKeyboard = connectKeyboard(viewer, runtime, options);\n const stopTicks = startTicks(runtime, options);\n\n return () => {\n for (const [type, listener] of listeners) {\n window.removeEventListener(type, listener as EventListener, true);\n }\n disconnectKeyboard();\n stopTicks();\n if (session.active) {\n runtime.release(session.active, false);\n }\n if (session.hovered) {\n runtime.setElementState(session.hovered, { hovered: false });\n }\n };\n}\n","import { ViewerSession } from './session';\nimport { assertCreateViewerContract, renderViewerSource } from './source';\nimport type { Viewer, ViewerOptions } from './types';\n\nexport function createViewer(options: ViewerOptions): Viewer {\n const diagramId = options.diagramId ?? 'diagram';\n const svg = renderViewerSource(options, options.renderOptions);\n assertCreateViewerContract(svg);\n const viewer = new ViewerSession(options, svg, diagramId);\n viewer.announceReady();\n return viewer;\n}\n\nexport { connectInteraction, type InteractionOptions } from './connectInteraction';\nexport type { SceneDiff, ViewBox } from './display';\nexport type {\n Modifiers,\n OwnerPointerEvent,\n OwnerRef,\n SceneDiffEvent,\n SelectionChangeEvent,\n Unsubscribe,\n ViewerErrorEvent,\n ViewerEventHandler,\n ViewerEventMap,\n ViewerEventName,\n} from './events';\nexport type { ViewerImageExportOptions, ViewerImageFormat } from './export';\nexport { registerShaderProgram, SHADER_DEFAULTS, type ShaderProgram, shaderProgram } from './shaders';\nexport type { Viewer, ViewerOptions, ViewerSource } from './types';\n"]}