@weasel-js/ui 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/ActionBar-CiKvEvXi.js.map +1 -1
- package/dist/chunks/ActionsBar-CzU6Of3B.js.map +1 -1
- package/dist/chunks/Badge-DU8ihE7Z.js.map +1 -1
- package/dist/chunks/Button-9QNIYugK.js.map +1 -1
- package/dist/chunks/{Callout-Dt0kBIls.js → Callout-CxxrEcSb.js} +1 -1
- package/dist/chunks/{Callout-Dt0kBIls.js.map → Callout-CxxrEcSb.js.map} +1 -1
- package/dist/chunks/Checkbox-CtK8H_OQ.js.map +1 -1
- package/dist/chunks/ColorField-sGLnThpB.js.map +1 -1
- package/dist/chunks/{ComboBox-pH8aDEL2.js → ComboBox-CotoRgNi.js} +1 -1
- package/dist/chunks/{ComboBox-pH8aDEL2.js.map → ComboBox-CotoRgNi.js.map} +1 -1
- package/dist/chunks/{CurveEditor-DrORWShU.js → CurveEditor-DAb2EMyR.js} +1 -1
- package/dist/chunks/{CurveEditor-DrORWShU.js.map → CurveEditor-DAb2EMyR.js.map} +1 -1
- package/dist/chunks/DataGrid-mUq38k0Q.js.map +1 -1
- package/dist/chunks/Dialog-CQymDCAl.js.map +1 -1
- package/dist/chunks/Field-BHSu2F3E.js.map +1 -1
- package/dist/chunks/Input-D_Xzgr2b.js.map +1 -1
- package/dist/chunks/Keycaps-B9dJMYx_.js.map +1 -1
- package/dist/chunks/NumberField-BQmELz32.js.map +1 -1
- package/dist/chunks/OptionsBar-CHOP_CiW.js.map +1 -1
- package/dist/chunks/Plot2D-CEnhzodm.js.map +1 -1
- package/dist/chunks/{PointPlotter-D528sBdT.js → PointPlotter-EkbCBK9j.js} +2 -2
- package/dist/chunks/{PointPlotter-D528sBdT.js.map → PointPlotter-EkbCBK9j.js.map} +1 -1
- package/dist/chunks/Powerline-C8rddbbK.js.map +1 -1
- package/dist/chunks/{Prefs-snBejOzK.js → Prefs-BkDJ5Cdz.js} +2 -2
- package/dist/chunks/{Prefs-snBejOzK.js.map → Prefs-BkDJ5Cdz.js.map} +1 -1
- package/dist/chunks/RadioGroup-Ci-I9NEx.js.map +1 -1
- package/dist/chunks/RangeSlider-CW-edtNx.js.map +1 -1
- package/dist/chunks/ResizeHandle-C2OBMqTs.js +81 -0
- package/dist/chunks/ResizeHandle-C2OBMqTs.js.map +1 -0
- package/dist/chunks/{Select-l7pAkVEG.js → Select-CLyBisCS.js} +14 -8
- package/dist/chunks/Select-CLyBisCS.js.map +1 -0
- package/dist/chunks/{SelectionPanel-CMglTgEf.js → SelectionPanel-DBdhAKIK.js} +2 -2
- package/dist/chunks/{SelectionPanel-CMglTgEf.js.map → SelectionPanel-DBdhAKIK.js.map} +1 -1
- package/dist/chunks/{Sidebar-BFcBx8QV.js → Sidebar-doLqiTZH.js} +1 -1
- package/dist/chunks/{Sidebar-BFcBx8QV.js.map → Sidebar-doLqiTZH.js.map} +1 -1
- package/dist/chunks/{SidebarPanel-CRnSlvee.js → SidebarPanel-DjTfOzB9.js} +1 -1
- package/dist/chunks/{SidebarPanel-CRnSlvee.js.map → SidebarPanel-DjTfOzB9.js.map} +1 -1
- package/dist/chunks/Slider-sUJGgmKR.js.map +1 -1
- package/dist/chunks/StatusBar-OOjfqCD8.js +41 -0
- package/dist/chunks/StatusBar-OOjfqCD8.js.map +1 -0
- package/dist/chunks/Switch-DxJLMYki.js.map +1 -1
- package/dist/chunks/{Tabs-DelDecks.js → Tabs-DOW5jtnq.js} +1 -1
- package/dist/chunks/{Tabs-DelDecks.js.map → Tabs-DOW5jtnq.js.map} +1 -1
- package/dist/chunks/{Toast-Bw3XQxmV.js → Toast-DLM2AsTz.js} +1 -1
- package/dist/chunks/{Toast-Bw3XQxmV.js.map → Toast-DLM2AsTz.js.map} +1 -1
- package/dist/chunks/ToggleBar-Defj6Asn.js.map +1 -1
- package/dist/chunks/{ToolButton-Dk_uJf7N.js → ToolButton-Dv6NdZKh.js} +1 -1
- package/dist/chunks/{ToolButton-Dk_uJf7N.js.map → ToolButton-Dv6NdZKh.js.map} +1 -1
- package/dist/chunks/{ToolGroup-D8-qdtuw.js → ToolGroup-BAthcF5H.js} +1 -1
- package/dist/chunks/{ToolGroup-D8-qdtuw.js.map → ToolGroup-BAthcF5H.js.map} +1 -1
- package/dist/chunks/ToolOptionsBar-ChiL-HVA.js.map +1 -1
- package/dist/chunks/{ToolPalette-xKHzPKYf.js → ToolPalette-DXVIEO0w.js} +3 -3
- package/dist/chunks/{ToolPalette-xKHzPKYf.js.map → ToolPalette-DXVIEO0w.js.map} +1 -1
- package/dist/chunks/Tooltip-Clgn4trm.js.map +1 -1
- package/dist/chunks/keyGlyph-BDH5fqkO.js.map +1 -1
- package/dist/components/Callout/index.js +1 -1
- package/dist/components/ComboBox/index.js +1 -1
- package/dist/components/CurveEditor/index.js +1 -1
- package/dist/components/PointPlotter/index.js +1 -1
- package/dist/components/Prefs/index.js +1 -1
- package/dist/components/ResizeHandle/ResizeHandle.d.ts +52 -0
- package/dist/components/ResizeHandle/ResizeHandle.d.ts.map +1 -0
- package/dist/components/ResizeHandle/index.d.ts +3 -0
- package/dist/components/ResizeHandle/index.d.ts.map +1 -0
- package/dist/components/ResizeHandle/index.js +2 -0
- package/dist/components/Select/Select.d.ts +8 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/SelectionPanel/index.js +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SidebarPanel/index.js +1 -1
- package/dist/components/StatusBar/StatusBar.d.ts +45 -0
- package/dist/components/StatusBar/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar/index.d.ts +3 -0
- package/dist/components/StatusBar/index.d.ts.map +1 -0
- package/dist/components/StatusBar/index.js +2 -0
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/ToolButton/index.js +1 -1
- package/dist/components/ToolGroup/index.js +1 -1
- package/dist/components/ToolPalette/index.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -43
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +8 -7
- package/dist/chunks/Select-l7pAkVEG.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge-DU8ihE7Z.js","names":[],"sources":["../../src/components/Badge/Badge.module.css","../../src/components/Badge/shapes/Pill.tsx","../../src/components/Badge/shapes/Plain.tsx","../../src/components/Badge/shapes/Square.tsx","../../src/components/Badge/shapes/Notched.tsx","../../src/components/Badge/shapes/Perforated.tsx","../../src/components/Badge/shapes/Hexagon.tsx","../../src/components/Badge/shapes/Starburst.tsx","../../src/components/Badge/shapes/Scalloped.tsx","../../src/components/Badge/shapes/Shield.tsx","../../src/components/Badge/shapes/Ribbon.tsx","../../src/components/Badge/shapes/Beavis.tsx","../../src/components/Badge/shapes/Sparkler.tsx","../../src/components/Badge/shapes/Postage.tsx","../../src/components/Badge/shapes/Cloud.tsx","../../src/components/Badge/shapes/House.tsx","../../src/components/Badge/shapes/Plaque.tsx","../../src/components/Badge/shapes/Crest.tsx","../../src/components/Badge/shapes/Urn.tsx","../../src/components/Badge/shapes/Coffin.tsx","../../src/components/Badge/shapes/Receipt.tsx","../../src/components/Badge/shapes/Wood.tsx","../../src/components/Badge/shapes/Quatrefoil.tsx","../../src/components/Badge/shapes/index.ts","../../src/components/Badge/bases/ChamferedRect.tsx","../../src/components/Badge/bases/RoundedRect.tsx","../../src/components/Badge/bases/polygonSampler.ts","../../src/components/Badge/bases/Polygon.tsx","../../src/components/Badge/bases/Puzzle.tsx","../../src/components/Badge/bases/Quatrefoil.tsx","../../src/components/Badge/bases/OctantSpline.tsx","../../src/components/Badge/bases/OctantBSpline.tsx","../../src/components/Badge/bases/Ribbon.tsx","../../src/components/Badge/bases/edgeProfiles.ts","../../src/components/Badge/bases/Powerline.tsx","../../src/components/Badge/bases/index.ts","../../src/components/Badge/effects/rangeMask.ts","../../src/components/Badge/effects/Spikes.tsx","../../src/components/Badge/effects/Puffs.tsx","../../src/components/Badge/effects/Bites.tsx","../../src/components/Badge/effects/Scallops.tsx","../../src/components/Badge/effects/Bevel.tsx","../../src/components/Badge/effects/Sheen.tsx","../../src/components/Badge/effects/Rivets.tsx","../../src/components/Badge/effects/Shadow.tsx","../../src/components/Badge/effects/Woodgrain.tsx","../../src/components/Badge/effects/Perforations.tsx","../../src/components/Badge/effects/Bevel2.tsx","../../src/components/Badge/effects/Outline.tsx","../../src/components/Badge/effects/Sunbeams.tsx","../../src/components/Badge/effects/Aqua.tsx","../../src/components/Badge/effects/Metal.tsx","../../src/components/Badge/effects/index.ts","../../src/components/Badge/Badge.tsx"],"sourcesContent":[".badge {\n position: relative;\n display: inline-flex;\n align-items: baseline;\n vertical-align: baseline;\n gap: var(--badge-gap, 4px);\n font-size: var(--badge-font-size, 10px);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--badge-fg, var(--wzl-muted, #9ea1a8));\n --badge-edge: var(--wzl-panel-border, #25272c);\n --badge-fill: var(--wzl-bg, #181a1e);\n --badge-fg: var(--badge-edge);\n background: transparent;\n border: 0;\n font: inherit;\n font-family: inherit;\n /* Badges never carry text-decoration. Symmetric: a badge inside a link\n suppresses the link's underline on the badge's text; a link inside a\n badge suppresses its own underline. The chip's colored background is\n the affordance signal. */\n text-decoration: none;\n}\n.badge * { text-decoration: none; }\n\n.badge[data-size='md'] {\n --badge-gap: 6px;\n --badge-pad-x: 10px;\n --badge-pad-y: 3px;\n --badge-font-size: 12px;\n}\n\n.deco {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: visible;\n}\n.deco :global(.badge-fill) { fill: var(--badge-fill); stroke: none; }\n.deco :global(.badge-stroke) { fill: none; stroke: var(--badge-edge); stroke-width: var(--badge-stroke-width, 1px); vector-effect: non-scaling-stroke; }\n.deco :global(.badge-focus) { fill: none; stroke: var(--badge-edge); stroke-width: calc(var(--badge-stroke-width, 1px) + 1px); vector-effect: non-scaling-stroke; opacity: 0.6; }\n.deco :global(.badge-bevel-light) { fill: rgba(255, 255, 255, 0.22); stroke: none; }\n.deco :global(.badge-bevel-medium-light) { fill: rgba(255, 255, 255, 0.10); stroke: none; }\n.deco :global(.badge-bevel-medium-dark) { fill: rgba(0, 0, 0, 0.16); stroke: none; }\n.deco :global(.badge-bevel-dark) { fill: rgba(0, 0, 0, 0.32); stroke: none; }\n\n.content {\n position: relative;\n display: inline-flex;\n align-items: baseline;\n gap: inherit;\n z-index: 1;\n}\n\n/* Tone edges double as text color in the outline/subtle variants, so they\n must be foreground-legible — hence accent-fg, not the accent fill. */\n.badge[data-tone='accent'] { --badge-edge: var(--wzl-accent-fg, var(--wzl-accent, #7fb069)); }\n.badge[data-tone='info'] { --badge-edge: #7ab8d4; }\n.badge[data-tone='warn'] { --badge-edge: #d4a574; }\n.badge[data-tone='danger'] { --badge-edge: #c43c3c; }\n.badge[data-tone='muted'] { --badge-edge: var(--wzl-muted, #9ea1a8); }\n.badge[data-tone='neutral'] { --badge-edge: var(--wzl-panel-border, #25272c); --badge-fg: var(--wzl-muted, #9ea1a8); }\n\n.badge[data-variant='outline'] {\n --badge-fill: var(--wzl-bg, #181a1e);\n --badge-fg: var(--badge-edge);\n}\n.badge[data-variant='solid'] {\n --badge-fill: var(--badge-edge);\n --badge-fg: #fff;\n font-weight: 600;\n}\n.badge[data-variant='subtle'] {\n --badge-fill: color-mix(in oklab, var(--badge-edge) 14%, transparent);\n --badge-fg: var(--badge-edge);\n}\n/* Neutral's edge is a border gray that vanishes when the outline/subtle\n variants (above) reuse it as the text color — re-assert the muted fg.\n Solid keeps the variant's white fg on the gray fill. */\n.badge[data-tone='neutral']:not([data-variant='solid']) { --badge-fg: var(--wzl-muted, #9ea1a8); }\n\n.badge {\n padding:\n calc(var(--badge-pad-y, 1px) + var(--badge-inset-top, 0px))\n calc(var(--badge-pad-x, 6px) + var(--badge-inset-right, 0px))\n calc(var(--badge-pad-y, 1px) + var(--badge-inset-bottom, 0px))\n calc(var(--badge-pad-x, 6px) + var(--badge-inset-left, 0px));\n}\n\n.badge[data-shape='pill'] {\n display: inline;\n border-radius: 9999px;\n box-sizing: border-box;\n -webkit-box-decoration-break: slice;\n box-decoration-break: slice;\n}\n.badge[data-shape='pill'] .content,\n.badge[data-shape='plain'] .content {\n display: inline;\n}\n.badge[data-shape='pill'][data-variant='solid'],\n.badge[data-shape='pill'][data-variant='subtle'] {\n background: var(--badge-fill);\n}\n/* Always reserve room for the border so variants that drop the visible stroke\n (e.g. subtle, or fragments after a slice) stay the same outer width. */\n.badge[data-shape='pill'] {\n border: var(--badge-stroke-width, 1px) solid transparent;\n}\n.badge[data-shape='pill'][data-variant='outline'],\n.badge[data-shape='pill'][data-variant='solid'] {\n /* Real border instead of inset box-shadow so `box-decoration-break: slice` cleanly removes\n the border-right of fragment 1 / border-left of fragment 2 at the line break. */\n border-color: var(--badge-edge);\n}\n.badge[data-shape='pill'][data-focused='true'] {\n outline: 2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);\n outline-offset: 2px;\n}\n\n.badge[data-shape='plain'] {\n display: inline;\n background: transparent;\n padding: 0;\n letter-spacing: 0.04em;\n text-transform: none;\n color: var(--badge-fg);\n -webkit-box-decoration-break: slice;\n box-decoration-break: slice;\n}\n.badge[data-shape='plain'][data-focused='true'] {\n outline: 2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);\n outline-offset: 3px;\n border-radius: 2px;\n}\n\n.badge[data-shape='plaque'] .content {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.14), 0 -0.5px 0 rgba(0, 0, 0, 0.5);\n}\n\nbutton.badge,\na.badge {\n cursor: pointer;\n outline: 0;\n /* `border: 0` from the base rule would otherwise zero out the reserved width for buttons.\n Make it transparent + zero-width so the width matches the span form, but visible borders\n from shape-specific rules still apply on top. */\n border: 0 solid transparent;\n}\nbutton.badge:hover,\na.badge:hover {\n --badge-edge: color-mix(in oklab, var(--badge-edge) 88%, white);\n}\n@media (prefers-reduced-motion: reduce) {\n button.badge:hover,\n a.badge:hover { --badge-edge: var(--badge-edge); }\n}\n\n.remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n margin-left: 2px;\n padding: 0;\n background: transparent;\n border: 0;\n border-radius: 50%;\n color: var(--badge-fg);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 1;\n vertical-align: middle;\n}\n.remove:hover { background: color-mix(in oklab, var(--badge-fg) 20%, transparent); }\n.remove > svg { display: block; }\n.badge[data-size='md'] .remove { width: 16px; height: 16px; font-size: 16px; }\n.badge[data-size='md'] .remove > svg { width: 12px; height: 12px; }\n","import type { ShapeModule } from '../types';\n\nconst Pill: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Pill;\n","import type { ShapeModule } from '../types';\n\nconst Plain: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Plain;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface SquareParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill). */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<SquareParams> = { erosion: 0.16 };\n\nconst Square: ShapeModule<SquareParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'rounded-rect', baseParams: { erosion: cfg.erosion } };\n },\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Square;\n","import type { ShapeModule } from '../types';\n\nexport interface NotchedParams {\n /** 0..1 fraction of max corner radius. */\n erosion?: number;\n /** rx/ry eccentricity of the corner arcs. */\n eccentricity?: number;\n}\n\nconst DEFAULTS: Required<NotchedParams> = { erosion: 0.28, eccentricity: 1 };\n\nfunction notchedPath(r: number, ecc: number) {\n const W = 100, H = 100;\n const rx = r * ecc;\n const ry = r / ecc;\n return [\n `M ${rx} 0`,\n `L ${W - rx} 0`,\n `A ${rx} ${ry} 0 0 0 ${W} ${ry}`,\n `L ${W} ${H - ry}`,\n `A ${rx} ${ry} 0 0 0 ${W - rx} ${H}`,\n `L ${rx} ${H}`,\n `A ${rx} ${ry} 0 0 0 0 ${H - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 0 ${rx} 0`,\n 'Z',\n ].join(' ');\n}\n\nconst Notched: ShapeModule<NotchedParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const e = Math.max(0, Math.min(cfg.erosion, 1));\n const r = e * 49;\n const ecc = Math.max(0.2, Math.min(cfg.eccentricity, 5));\n const d = notchedPath(r, ecc);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && (\n <path className=\"badge-fill\" d={d} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <path className=\"badge-stroke\" d={d} />\n )}\n {focused && <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />}\n </>\n );\n },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Notched;\n","import { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport type { ShapeModule } from '../types';\n\nexport interface PerforatedParams {\n holeRadius?: number;\n holePitch?: number;\n}\n\nconst DEFAULTS: Required<PerforatedParams> = { holeRadius: 3.5, holePitch: 11 };\n\nfunction PerforatedComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: PerforatedParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const maskId = useId();\n const ref = useRef<SVGGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const svg = ref.current?.ownerSVGElement;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, []);\n\n // Convert CSS-px hole sizing into viewBox units so holes look circular on either axis.\n const rx = (cfg.holeRadius / box.w) * 100;\n const ry = (cfg.holeRadius / box.h) * 100;\n const nH = Math.max(2, Math.round(box.w / cfg.holePitch));\n const nV = Math.max(2, Math.round(box.h / cfg.holePitch));\n\n const notches: { cx: number; cy: number }[] = [];\n for (let i = 0; i < nH; i++) {\n const t = (i + 0.5) / nH;\n notches.push({ cx: t * 100, cy: 0 });\n notches.push({ cx: t * 100, cy: 100 });\n }\n for (let i = 0; i < nV; i++) {\n const t = (i + 0.5) / nV;\n notches.push({ cx: 0, cy: t * 100 });\n notches.push({ cx: 100, cy: t * 100 });\n }\n\n return (\n <g ref={ref}>\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"-5\" y=\"-5\" width=\"110\" height=\"110\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"white\" />\n {notches.map((n, i) => (\n <ellipse key={i} cx={n.cx} cy={n.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </mask>\n </defs>\n {(variant === 'solid' || variant === 'subtle') && (\n <rect className=\"badge-fill\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <rect className=\"badge-stroke\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {focused && (\n <rect className=\"badge-focus\" x=\"-4\" y=\"-4\" width=\"108\" height=\"108\" mask={`url(#${maskId})`} />\n )}\n </g>\n );\n}\n\n// Avoid unused warning while keeping useEffect imported elsewhere if needed in future.\nvoid useEffect;\n\nconst Perforated: ShapeModule<PerforatedParams> = {\n Component: PerforatedComponent,\n insets: { top: 2, right: 4, bottom: 2, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Perforated;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HexagonParams {\n tipHeight?: number;\n /** Truncate the top and bottom tips, leaving a horizontal flat edge.\n * Measured as a distance from each tip vertically (0 = sharp point, tipHeight = fully flat). */\n tipTruncation?: number;\n}\n\nconst DEFAULTS: Required<HexagonParams> = { tipHeight: 25, tipTruncation: 0 };\n\nfunction hexVerts(tip: number, truncation: number): [number, number][] {\n const t = Math.max(0, Math.min(tip, 49));\n const trunc = Math.max(0, Math.min(truncation, t));\n if (trunc <= 0) {\n return [[50, 0], [100, t], [100, 100 - t], [50, 100], [0, 100 - t], [0, t]];\n }\n const ratio = trunc / t;\n const xL = 50 - 50 * ratio;\n const xR = 50 + 50 * ratio;\n return [\n [xL, trunc], [xR, trunc],\n [100, t], [100, 100 - t],\n [xR, 100 - trunc], [xL, 100 - trunc],\n [0, 100 - t], [0, t],\n ];\n}\n\nconst Hexagon: ShapeModule<HexagonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'polygon', baseParams: { vertices: hexVerts(cfg.tipHeight, cfg.tipTruncation) } };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Hexagon;\n","import type { ShapeModule } from '../types';\n\nexport interface StarburstParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n erosion?: number;\n}\n\nconst DEFAULTS: Required<StarburstParams> = {\n points: 12,\n outerR: 48,\n innerR: 36,\n rotation: -7,\n erosion: 0,\n};\n\nfunction starburstPath(points: number, outerR: number, innerR: number, rotationDeg: number, erosion: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotationDeg * Math.PI) / 180;\n const rnd = Math.max(0, Math.min(erosion, 1));\n const pts: [number, number][] = [];\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n if (rnd <= 0) {\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n d += (i === 0 ? 'M ' : ' L ') + pts[i][0].toFixed(2) + ' ' + pts[i][1].toFixed(2);\n }\n return d + ' Z';\n }\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n const prev = pts[(i + pts.length - 1) % pts.length];\n const curr = pts[i];\n const next = pts[(i + 1) % pts.length];\n const t = rnd * 0.45;\n const enterX = curr[0] + (prev[0] - curr[0]) * t;\n const enterY = curr[1] + (prev[1] - curr[1]) * t;\n const exitX = curr[0] + (next[0] - curr[0]) * t;\n const exitY = curr[1] + (next[1] - curr[1]) * t;\n if (i === 0) d += `M ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n else d += ` L ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n d += ` Q ${curr[0].toFixed(2)} ${curr[1].toFixed(2)} ${exitX.toFixed(2)} ${exitY.toFixed(2)}`;\n }\n return d + ' Z';\n}\n\nconst Starburst: ShapeModule<StarburstParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = starburstPath(cfg.points, cfg.outerR, cfg.innerR, cfg.rotation, cfg.erosion);\n const dFocus = starburstPath(cfg.points, cfg.outerR + 4, cfg.innerR + 3, cfg.rotation, cfg.erosion);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 8, right: 8, bottom: 8, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Starburst;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface ScallopedParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<ScallopedParams> = { scallopRadius: 5, scallopSpacing: 12, irregularity: 0 };\n\nconst Scalloped: ShapeModule<ScallopedParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'scallops',\n params: { scallopRadius: cfg.scallopRadius, scallopSpacing: cfg.scallopSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Scalloped;\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport type { ShapeModule } from '../types';\n\nexport interface ShieldParams {\n pointDepth?: number;\n shoulderY?: number;\n curveTightness?: number;\n /** 0..1 fraction of max top-corner rounding. */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<ShieldParams> = {\n pointDepth: 100,\n shoulderY: 55,\n curveTightness: 0.7,\n erosion: 0.33,\n};\n\nfunction ShieldComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: ShieldParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const ref = useRef<SVGGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const svg = ref.current?.ownerSVGElement;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, []);\n\n const pd = Math.max(60, Math.min(cfg.pointDepth, 110));\n const sh = Math.max(20, Math.min(cfg.shoulderY, pd - 5));\n const cpY = sh + (pd - sh) * Math.max(0.1, Math.min(cfg.curveTightness, 1));\n // Aspect-aware top corner radii (so the rounded corners stay circular in CSS).\n const cornerCss = Math.max(0, Math.min(cfg.erosion, 1)) * 12;\n const rxC = (cornerCss / box.w) * 100;\n const ryC = (cornerCss / box.h) * 100;\n const d = [\n `M ${rxC.toFixed(3)} 0`,\n `L ${(100 - rxC).toFixed(3)} 0`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 100 ${ryC.toFixed(3)}`,\n `L 100 ${sh}`,\n `Q 100 ${cpY} 50 ${pd}`,\n `Q 0 ${cpY} 0 ${sh}`,\n `L 0 ${ryC.toFixed(3)}`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 ${rxC.toFixed(3)} 0`,\n 'Z',\n ].join(' ');\n return (\n <g ref={ref}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </g>\n );\n}\n\nconst Shield: ShapeModule<ShieldParams> = {\n Component: ShieldComponent,\n insets: { top: 2, right: 8, bottom: 14, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Shield;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. The actual pointer width stays fixed regardless\n * of badge width — the underlying base recomputes viewBox vertices at\n * build time using the rendered box dimensions. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\nconst Ribbon: ShapeModule<RibbonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'ribbon', baseParams: cfg };\n },\n // Unused at render time when `compose` is set — the base's insets win — but\n // required by the ShapeModule contract.\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface BeavisParams {\n points?: number;\n cornerRadius?: number;\n spikeLen?: number;\n spikeBaseWidth?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<BeavisParams> = {\n points: 44,\n cornerRadius: 6,\n spikeLen: 12,\n spikeBaseWidth: 3,\n irregularity: 0,\n};\n\nconst Beavis: ShapeModule<BeavisParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n // Nominal badge half-height for cornerRadius → erosion: real badges are ~22px tall\n // so half = 11. Clamp into [0,1].\n const erosion = Math.max(0, Math.min(1, cfg.cornerRadius / 11));\n return {\n base: 'rounded-rect',\n baseParams: { erosion },\n effects: [\n {\n type: 'spikes',\n params: {\n count: cfg.points,\n length: cfg.spikeLen,\n baseWidth: cfg.spikeBaseWidth,\n vertScale: 1,\n horzScale: 1,\n diagonalScale: 1,\n irregularity: cfg.irregularity,\n },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Beavis;\n","import type { ShapeModule } from '../types';\n\nexport interface SparklerParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n}\n\nconst DEFAULTS: Required<SparklerParams> = {\n points: 16,\n outerR: 58,\n innerR: 50,\n rotation: -5,\n};\n\nfunction sparklerPath(points: number, outerR: number, innerR: number, rotation: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotation * Math.PI) / 180;\n let d = '';\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n const x = cx + Math.cos(a) * r;\n const y = cy + Math.sin(a) * r;\n d += (i === 0 ? 'M ' : ' L ') + x.toFixed(2) + ' ' + y.toFixed(2);\n }\n return d + ' Z';\n}\n\nconst Sparkler: ShapeModule<SparklerParams> = {\n Component: ({ variant, focused, params }) => {\n const { points, outerR, innerR, rotation } = { ...DEFAULTS, ...params };\n const d = sparklerPath(points, outerR, innerR, rotation);\n const dFocus = sparklerPath(points, outerR + 4, innerR + 3, rotation);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 4, right: 4, bottom: 4, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Sparkler;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface PostageParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<PostageParams> = { biteRadius: 3, biteSpacing: 8, irregularity: 0 };\n\nconst Postage: ShapeModule<PostageParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'bites',\n params: { biteRadius: cfg.biteRadius, biteSpacing: cfg.biteSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Postage;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CloudParams {\n bumpWidth?: number;\n puffiness?: number;\n /** 0..1 fraction of max body roundness. */\n erosion?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<CloudParams> = {\n bumpWidth: 24,\n puffiness: 14,\n erosion: 0.2,\n irregularity: 0,\n};\n\nconst Cloud: ShapeModule<CloudParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: cfg.erosion },\n effects: [\n {\n type: 'puffs',\n params: { bumpWidth: cfg.bumpWidth, puffiness: cfg.puffiness, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Cloud;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HouseParams {\n eaveY?: number;\n peakHeight?: number;\n roofOverhang?: number;\n}\n\nconst DEFAULTS: Required<HouseParams> = { eaveY: 32, peakHeight: 32, roofOverhang: 0 };\n\nconst House: ShapeModule<HouseParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const ey = Math.max(2, Math.min(cfg.eaveY, 95));\n const peakY = ey - Math.max(0, cfg.peakHeight);\n const ov = Math.max(0, Math.min(cfg.roofOverhang, 12));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [50, peakY],\n [100 + ov, ey],\n [100, ey],\n [100, 100],\n [0, 100],\n [0, ey],\n [-ov, ey],\n ],\n },\n };\n },\n insets: { top: 10, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default House;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type PlaqueCorner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface PlaqueParams {\n bevelWidth?: number;\n lightFrom?: PlaqueCorner;\n rivetRadius?: number;\n rivetInset?: number;\n sheenIntensity?: number;\n}\n\nconst DEFAULTS: Required<PlaqueParams> = {\n bevelWidth: 6,\n lightFrom: 'tl',\n rivetRadius: 2.4,\n rivetInset: 7,\n sheenIntensity: 0.22,\n};\n\nconst Plaque: ShapeModule<PlaqueParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n { type: 'bevel', params: { bevelWidth: cfg.bevelWidth, lightFrom: cfg.lightFrom } },\n { type: 'sheen', params: { lightFrom: cfg.lightFrom, intensity: cfg.sheenIntensity } },\n { type: 'rivets', params: { radius: cfg.rivetRadius, inset: cfg.rivetInset, lightFrom: cfg.lightFrom } },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Plaque;\n","import type { ShapeModule } from '../types';\n\nexport interface CrestParams {\n topInset?: number;\n pointDepth?: number;\n}\n\nconst DEFAULTS: Required<CrestParams> = { topInset: 12, pointDepth: 100 };\n\nfunction crestPath(topInset: number, pointDepth: number) {\n const ti = Math.max(0, Math.min(topInset, 35));\n const pd = Math.max(60, Math.min(pointDepth, 110));\n // 5-sided shield silhouette with rounded shoulders and a bottom point.\n return [\n `M ${ti} 6`,\n `Q ${ti / 2} 0 ${ti + 4} 0`,\n `L ${100 - ti - 4} 0`,\n `Q ${100 - ti / 2} 0 ${100 - ti} 6`,\n `L ${100 - ti * 0.4} ${pd * 0.35}`,\n `Q ${100 - ti} ${pd * 0.7} 50 ${pd}`,\n `Q ${ti} ${pd * 0.7} ${ti * 0.4} ${pd * 0.35}`,\n 'Z',\n ].join(' ');\n}\n\nconst Crest: ShapeModule<CrestParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = crestPath(cfg.topInset, cfg.pointDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: { top: 4, right: 10, bottom: 14, left: 10 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Crest;\n","import type { ShapeModule } from '../types';\n\nconst d = 'M 35 0 L 30 12 Q 15 30 15 55 Q 15 75 30 90 L 30 100 L 70 100 L 70 90 Q 85 75 85 55 Q 85 30 70 12 L 65 0 Z';\n\nconst Urn: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 4, right: 12, bottom: 4, left: 12 },\n stretches: true,\n};\n\nexport default Urn;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CoffinParams {\n headX?: number;\n headHalfHeight?: number;\n shoulderX?: number;\n shoulderHalfHeight?: number;\n footX?: number;\n footHalfHeight?: number;\n}\n\nconst DEFAULTS: Required<CoffinParams> = {\n headX: 6,\n headHalfHeight: 23,\n shoulderX: 33,\n shoulderHalfHeight: 36,\n footX: 100,\n footHalfHeight: 29,\n};\n\nconst Coffin: ShapeModule<CoffinParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const hX = Math.max(0, Math.min(cfg.headX, 40));\n const sX = Math.max(hX + 1, Math.min(cfg.shoulderX, 70));\n const fX = Math.max(sX + 1, Math.min(cfg.footX, 100));\n const hH = Math.max(2, Math.min(cfg.headHalfHeight, 50));\n const sDelta = Math.max(0, Math.min(cfg.shoulderHalfHeight, 50));\n const sH = Math.min(50, hH + sDelta);\n const fH = Math.max(2, Math.min(cfg.footHalfHeight, 50));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [hX, 50 - hH],\n [sX, 50 - sH],\n [fX, 50 - fH],\n [fX, 50 + fH],\n [sX, 50 + sH],\n [hX, 50 + hH],\n ],\n },\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 11 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Coffin;\n","import type { ShapeModule } from '../types';\n\nexport interface ReceiptParams {\n teeth?: number;\n tearDepth?: number;\n sideToTopRatio?: number;\n}\n\nconst DEFAULTS: Required<ReceiptParams> = { teeth: 11, tearDepth: 4, sideToTopRatio: 3 };\n\nfunction receiptPath(teeth: number, depth: number) {\n const N = Math.max(3, Math.floor(teeth));\n const baseDepth = Math.max(1, depth);\n const depthAt = (i: number) => baseDepth * (0.55 + 0.55 * Math.abs(Math.sin(i * 1.73 + 0.5)));\n let d = `M 0 0 L 100 0`;\n for (let i = 0; i < N; i++) {\n const yMid = ((i + 0.5) / N) * 100;\n const yEnd = ((i + 1) / N) * 100;\n d += ` L ${(100 - depthAt(i)).toFixed(3)} ${yMid.toFixed(3)} L 100 ${yEnd.toFixed(3)}`;\n }\n d += ` L 0 100`;\n for (let i = N - 1; i >= 0; i--) {\n const yMid = ((i + 0.5) / N) * 100;\n const yStart = (i / N) * 100;\n d += ` L ${depthAt(i + N).toFixed(3)} ${yMid.toFixed(3)} L 0 ${yStart.toFixed(3)}`;\n }\n return d + ' Z';\n}\n\nconst BASE_TOP = 2;\n\nconst Receipt: ShapeModule<ReceiptParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = receiptPath(cfg.teeth, cfg.tearDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.04) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: (params) => {\n const ratio = Math.max(0.2, Math.min(params.sideToTopRatio ?? DEFAULTS.sideToTopRatio, 10));\n const top = BASE_TOP;\n const side = Math.round(top * ratio);\n return { top, right: side, bottom: top, left: side };\n },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Receipt;\n","import type { ShapeModule } from '../types';\n\nconst body = 'M 8 30 Q 0 50 8 70 L 92 70 Q 100 50 92 30 Z';\n\nconst Wood: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && (\n <>\n {/* Long flowing grain curves */}\n <path className=\"badge-stroke\" d=\"M 12 38 Q 30 35 50 39 T 88 38\" opacity={0.5} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 46 Q 36 49 54 45 T 90 47\" opacity={0.4} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 12 54 Q 28 51 52 56 T 88 54\" opacity={0.55} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 62 Q 40 65 58 61 T 90 62\" opacity={0.4} fill=\"none\" />\n {/* Knots (concentric ellipses around a darker core) */}\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"3.4\" ry=\"2.8\" opacity={0.7} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"1.4\" ry=\"1.1\" opacity={0.85} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"70\" cy=\"42\" rx=\"2.4\" ry=\"2\" opacity={0.6} fill=\"none\" />\n </>\n )}\n {focused && (\n <path className=\"badge-focus\" d={body} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 10, right: 4, bottom: 10, left: 4 },\n stretches: true,\n};\n\nexport default Wood;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface QuatrefoilParams {\n spikeR?: number;\n lobeR?: number;\n valleyR?: number;\n valleyAt?: number;\n spikeCurvature?: number;\n spikeBend?: number;\n spikeTipErosion?: number;\n lobeCurvature?: number;\n lobeBend?: number;\n lobeTipErosion?: number;\n valleySmooth?: number;\n rotation?: number;\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nconst Quatrefoil: ShapeModule<QuatrefoilParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'quatrefoil', baseParams: cfg };\n },\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Quatrefoil;\n","import type { BadgeShape, ShapeModule } from '../types';\nimport Pill from './Pill';\nimport Plain from './Plain';\nimport Square, { type SquareParams } from './Square';\nimport Notched, { type NotchedParams } from './Notched';\nimport Perforated, { type PerforatedParams } from './Perforated';\nimport Hexagon, { type HexagonParams } from './Hexagon';\nimport Starburst, { type StarburstParams } from './Starburst';\nimport Scalloped, { type ScallopedParams } from './Scalloped';\nimport Shield, { type ShieldParams } from './Shield';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Beavis, { type BeavisParams } from './Beavis';\nimport Sparkler, { type SparklerParams } from './Sparkler';\nimport Postage, { type PostageParams } from './Postage';\nimport Cloud, { type CloudParams } from './Cloud';\nimport House, { type HouseParams } from './House';\nimport Plaque, { type PlaqueParams } from './Plaque';\nimport Crest, { type CrestParams } from './Crest';\nimport Urn from './Urn';\nimport Coffin, { type CoffinParams } from './Coffin';\nimport Receipt, { type ReceiptParams } from './Receipt';\nimport Wood from './Wood';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\n\nexport interface BadgeShapeParams {\n pill: Record<string, never>;\n plain: Record<string, never>;\n square: SquareParams;\n notched: NotchedParams;\n perforated: PerforatedParams;\n hexagon: HexagonParams;\n starburst: StarburstParams;\n scalloped: ScallopedParams;\n shield: ShieldParams;\n ribbon: RibbonParams;\n beavis: BeavisParams;\n sparkler: SparklerParams;\n postage: PostageParams;\n cloud: CloudParams;\n house: HouseParams;\n plaque: PlaqueParams;\n crest: CrestParams;\n urn: Record<string, never>;\n coffin: CoffinParams;\n receipt: ReceiptParams;\n wood: Record<string, never>;\n quatrefoil: QuatrefoilParams;\n}\n\nexport const SHAPES: Record<BadgeShape, ShapeModule<any>> = {\n pill: Pill,\n plain: Plain,\n square: Square,\n notched: Notched,\n perforated: Perforated,\n hexagon: Hexagon,\n starburst: Starburst,\n scalloped: Scalloped,\n shield: Shield,\n ribbon: Ribbon,\n beavis: Beavis,\n sparkler: Sparkler,\n postage: Postage,\n cloud: Cloud,\n house: House,\n plaque: Plaque,\n crest: Crest,\n urn: Urn,\n coffin: Coffin,\n receipt: Receipt,\n wood: Wood,\n quatrefoil: Quatrefoil,\n};\n\nexport const ALL_SHAPES: BadgeShape[] = [\n 'pill', 'plain', 'square', 'notched', 'perforated',\n 'hexagon',\n 'starburst', 'scalloped', 'shield', 'ribbon', 'beavis',\n 'sparkler', 'postage', 'cloud', 'house', 'plaque',\n 'crest', 'urn', 'coffin', 'receipt', 'wood', 'quatrefoil',\n];\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface ChamferedRectParams {\n /** CSS px length of each 45° corner chamfer. */\n chamfer?: number;\n}\n\nconst DEFAULTS: Required<ChamferedRectParams> = { chamfer: 6 };\n\nconst ChamferedRect: BaseModule<ChamferedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n // Chamfer per axis (CSS px → viewBox per-axis).\n const cx = cfg.chamfer * sx;\n const cy = cfg.chamfer * sy;\n // 8 vertices traced clockwise from top-left chamfer start.\n const verts: [number, number][] = [\n [cx, 0],\n [100 - cx, 0],\n [100, cy],\n [100, 100 - cy],\n [100 - cx, 100],\n [cx, 100],\n [0, 100 - cy],\n [0, cy],\n ];\n // Pre-compute CSS lengths of each segment and cumulative sums.\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n // Outward normal: edge direction in CSS rotated 90° clockwise.\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n // Going clockwise around the body, outward = (-tangent_y, tangent_x)... actually\n // for clockwise traversal in SVG (y-down), outward is to the LEFT of direction,\n // which is (ey, -ex) normalised.\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default ChamferedRect;\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface RoundedRectParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill / ellipse). */\n erosion?: number;\n /** Stretch the corner arcs horizontally vs vertically. 1 = circular at the badge's\n * native aspect; >1 wider corner arcs; <1 taller corner arcs. */\n eccentricity?: number;\n /** 0..1 vertical squeeze applied to the left and right ends, linearly tapering toward\n * the middle. 1 = ends fully collapsed to the centerline (lemon/lens silhouette). */\n pinch?: number;\n}\n\nconst DEFAULTS: Required<RoundedRectParams> = { erosion: 0.16, eccentricity: 1, pinch: 0 };\n\nconst RoundedRect: BaseModule<RoundedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const erosion = Math.max(0, Math.min(cfg.erosion, 1));\n const ecc = Math.max(0.1, Math.min(cfg.eccentricity, 10));\n // Max corner radius in CSS = half of the shorter axis (so erosion=1 gives a full pill/ellipse).\n const cornerCss = erosion * (Math.min(boxW, boxH) / 2);\n const rxC = cornerCss * sx * ecc;\n const ryC = cornerCss * sy / ecc;\n const rx = Math.max(0, Math.min(rxC, 50));\n const ry = Math.max(0, Math.min(ryC, 50));\n\n const topCss = (100 - 2 * rx) / sx;\n const sideCss = (100 - 2 * ry) / sy;\n const denom = cornerCss + cornerCss || 1;\n const hh = 0;\n const arcCss = (Math.PI * denom * (1 + 3 * hh / (10 + Math.sqrt(4 - 3 * hh)))) / 4;\n\n const segments = [\n { kind: 'h-edge', cssLen: topCss },\n { kind: 'tr-arc', cssLen: arcCss },\n { kind: 'v-edge', cssLen: sideCss },\n { kind: 'br-arc', cssLen: arcCss },\n { kind: 'h-edge-b', cssLen: topCss },\n { kind: 'bl-arc', cssLen: arcCss },\n { kind: 'v-edge-l', cssLen: sideCss },\n { kind: 'tl-arc', cssLen: arcCss },\n ];\n const cum: number[] = [0];\n for (const s of segments) cum.push(cum[cum.length - 1] + s.cssLen);\n const totalCss = cum[cum.length - 1];\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n let segIdx = 0;\n while (segIdx < segments.length - 1 && sm > cum[segIdx + 1]) segIdx++;\n const local = sm - cum[segIdx];\n const seg = segments[segIdx];\n const t = seg.cssLen > 0 ? local / seg.cssLen : 0;\n switch (seg.kind) {\n case 'h-edge':\n return { x: rx + (100 - 2 * rx) * t, y: 0, nx: 0, ny: -1 };\n case 'tr-arc': {\n const ang = -Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge':\n return { x: 100, y: ry + (100 - 2 * ry) * t, nx: 1, ny: 0 };\n case 'br-arc': {\n const ang = t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'h-edge-b':\n return { x: (100 - rx) - (100 - 2 * rx) * t, y: 100, nx: 0, ny: 1 };\n case 'bl-arc': {\n const ang = Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge-l':\n return { x: 0, y: (100 - ry) - (100 - 2 * ry) * t, nx: -1, ny: 0 };\n case 'tl-arc': {\n const ang = Math.PI + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n }\n return { x: 0, y: 0, nx: 0, ny: -1 };\n };\n\n // Vertical pinch toward the centerline, parameterised by horizontal distance from x=50.\n // pinch=0 → identity; pinch=1 → collapses the left/right ends to y=50.\n // Erosion supersedes pinch: as the corners round into a full ellipse there's nothing\n // structurally left to pinch (the ends already taper to the centerline). Scale by\n // (1 - erosion) so a fully pilled badge ignores the slider.\n const pinch = Math.max(0, Math.min(cfg.pinch, 1)) * (1 - erosion);\n const pinchY = (x: number, y: number): number => {\n if (pinch === 0) return y;\n const d = Math.abs(x - 50) / 50;\n return 50 + (y - 50) * (1 - d * pinch);\n };\n\n let bodyPath: string;\n let perimeterAtFinal = perimeterAt;\n if (pinch === 0) {\n bodyPath = [\n `M ${rx} 0`,\n `L ${100 - rx} 0`,\n `A ${rx} ${ry} 0 0 1 100 ${ry}`,\n `L 100 ${100 - ry}`,\n `A ${rx} ${ry} 0 0 1 ${100 - rx} 100`,\n `L ${rx} 100`,\n `A ${rx} ${ry} 0 0 1 0 ${100 - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 1 ${rx} 0`,\n 'Z',\n ].join(' ');\n } else {\n // Sample the unpinched perimeter densely and apply the y-pinch to each point.\n const N = 240;\n const samplePts: { x: number; y: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i / N) * totalCss;\n const pt = perimeterAt(sCss);\n samplePts.push({ x: pt.x, y: pinchY(pt.x, pt.y) });\n }\n bodyPath = samplePts.reduce((acc, p, i) =>\n acc + (i === 0 ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}` : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n '') + ' Z';\n\n // Warped perimeterAt: pinched point + normal recomputed from local warped tangent.\n perimeterAtFinal = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = perimeterAt(sm);\n const x = pt.x;\n const y = pinchY(pt.x, pt.y);\n const eps = totalCss / 480;\n const a = perimeterAt(sm - eps);\n const b = perimeterAt(sm + eps);\n const ax = a.x, ay = pinchY(a.x, a.y);\n const bx = b.x, by = pinchY(b.x, b.y);\n const tx = (bx - ax) / sx;\n const ty = (by - ay) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n return { x, y, nx: ty / tl, ny: -tx / tl };\n };\n }\n\n const sampler: BaseSampler = { bodyPath, perimeterAt: perimeterAtFinal, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default RoundedRect;\n","import type { BaseSampler, PerimeterPoint } from './types';\n\n/** Build a BaseSampler from a clockwise polygon's vertex list (viewBox 0..100). */\nexport function polygonSampler(verts: [number, number][], boxW: number, boxH: number): BaseSampler {\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n return { bodyPath, perimeterAt, totalCss };\n}\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport interface PolygonParams {\n /** Vertices in viewBox 0..100 coordinates, traced clockwise. */\n vertices?: [number, number][];\n}\n\nconst DEFAULT_VERTS: [number, number][] = [\n [0, 0], [100, 0], [100, 100], [0, 100],\n];\n\nconst Polygon: BaseModule<PolygonParams> = {\n build: (params, boxW, boxH) => {\n const verts = (params?.vertices && params.vertices.length >= 3) ? params.vertices : DEFAULT_VERTS;\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: { vertices: DEFAULT_VERTS },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default Polygon;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type PuzzleEdge = 'flat' | 'out' | 'in';\n\nexport interface PuzzleParams {\n top?: PuzzleEdge;\n right?: PuzzleEdge;\n bottom?: PuzzleEdge;\n left?: PuzzleEdge;\n /** Tab radius in viewBox units (0..50). */\n tabSize?: number;\n /** Sample density per tab arc. */\n arcSamples?: number;\n}\n\nconst DEFAULTS: Required<PuzzleParams> = {\n top: 'out',\n right: 'in',\n bottom: 'out',\n left: 'in',\n tabSize: 12,\n arcSamples: 18,\n};\n\n// Fraction of the tab radius the tab center sits beyond the body edge. A center offset of\n// `OFFSET_RATIO * r` gives a tab whose chord (intersection with the edge) has half-length\n// √(1 − OFFSET_RATIO²) · r. Smaller offset → wider neck.\nconst OFFSET_RATIO = 0.62;\n\n/** Sample a side's vertices walking clockwise from `start` to `end` along the edge, possibly\n * detouring around a tab. The starting vertex `start` is NOT included; the ending vertex `end`\n * IS included so successive edge calls chain cleanly. */\nfunction edgeVertices(\n start: [number, number],\n end: [number, number],\n outwardX: number,\n outwardY: number,\n type: PuzzleEdge,\n tabR: number,\n arcSamples: number,\n): [number, number][] {\n if (type === 'flat') return [end];\n const sign = type === 'out' ? 1 : -1;\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const len = Math.hypot(dx, dy) || 1;\n const tx = dx / len;\n const ty = dy / len;\n const mx = (start[0] + end[0]) / 2;\n const my = (start[1] + end[1]) / 2;\n const cx = mx + outwardX * sign * tabR * OFFSET_RATIO;\n const cy = my + outwardY * sign * tabR * OFFSET_RATIO;\n const half = tabR * Math.sqrt(Math.max(0, 1 - OFFSET_RATIO * OFFSET_RATIO));\n const p1: [number, number] = [mx - tx * half, my - ty * half];\n const p2: [number, number] = [mx + tx * half, my + ty * half];\n const apex: [number, number] = [\n mx + outwardX * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n my + outwardY * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n ];\n const r = Math.hypot(p1[0] - cx, p1[1] - cy);\n const θ1 = Math.atan2(p1[1] - cy, p1[0] - cx);\n const θ2 = Math.atan2(p2[1] - cy, p2[0] - cx);\n const θApex = Math.atan2(apex[1] - cy, apex[0] - cx);\n // Choose the arc direction that sweeps through θApex.\n const TAU = Math.PI * 2;\n const apexFromStart = ((θApex - θ1) % TAU + TAU) % TAU;\n const endFromStart = ((θ2 - θ1) % TAU + TAU) % TAU;\n // If the CCW sweep covers apex before reaching θ2, use CCW; otherwise CW.\n const sweep = apexFromStart < endFromStart ? endFromStart : endFromStart - TAU;\n\n const out: [number, number][] = [];\n out.push(p1);\n for (let i = 1; i <= arcSamples; i++) {\n const t = i / arcSamples;\n const θ = θ1 + sweep * t;\n out.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n out.push(end);\n return out;\n}\n\nconst Puzzle: BaseModule<PuzzleParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const r = Math.max(2, Math.min(cfg.tabSize, 40));\n const N = Math.max(6, Math.floor(cfg.arcSamples));\n // Clockwise traversal of the unit rect: TL → TR → BR → BL → TL.\n const TL: [number, number] = [0, 0];\n const TR: [number, number] = [100, 0];\n const BR: [number, number] = [100, 100];\n const BL: [number, number] = [0, 100];\n const verts: [number, number][] = [TL];\n verts.push(...edgeVertices(TL, TR, 0, -1, cfg.top, r, N));\n verts.push(...edgeVertices(TR, BR, 1, 0, cfg.right, r, N));\n verts.push(...edgeVertices(BR, BL, 0, 1, cfg.bottom, r, N));\n verts.push(...edgeVertices(BL, TL, -1, 0, cfg.left, r, N));\n // Drop the trailing duplicate of TL.\n if (verts.length > 1 && verts[verts.length - 1][0] === TL[0] && verts[verts.length - 1][1] === TL[1]) {\n verts.pop();\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 12, right: 16, bottom: 12, left: 16 },\n};\n\nexport default Puzzle;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * 8-fold-symmetric polar shape. The whole silhouette is defined by a single curve r(s)\n * over s ∈ [0, 1], where s=0 is the cardinal direction and s=1 is the diagonal. The full\n * shape comes from reflecting that octant curve eight times around the center. The curve\n * itself is two superellipse segments meeting at a valley:\n *\n * s ∈ [0, valleyAt] → spike segment, from `spikeR` down to `valleyR`\n * s ∈ [valleyAt, 1] → lobe segment, from `valleyR` up to `lobeR`\n *\n * Each segment has its own curvature, bend bias, and tip-erosion controls.\n */\nexport interface QuatrefoilParams {\n /** Radius at s=0 (cardinal direction). */\n spikeR?: number;\n /** Radius at s=1 (diagonal direction). */\n lobeR?: number;\n /** Radius at the junction between spike and lobe segments. */\n valleyR?: number;\n /** Position of the junction in [0, 1]. 0.5 = symmetric octant; <0.5 narrows the spike side. */\n valleyAt?: number;\n /** Spike-segment curvature (superellipse exponent). 1 = flat diagonal sides; <1 caves\n * inward (concave/star); >1 bulges outward (convex/square-shouldered). */\n spikeCurvature?: number;\n /** Spike-segment bend bias. Positive shifts the curve's bend toward the tip; negative\n * toward the base. */\n spikeBend?: number;\n /** Flat-top truncation of the cardinal tip (0..1). */\n spikeTipErosion?: number;\n /** Lobe-segment curvature, same semantics as spike. */\n lobeCurvature?: number;\n /** Lobe-segment bend bias. */\n lobeBend?: number;\n /** Flat-top truncation of the diagonal lobe peak (0..1). */\n lobeTipErosion?: number;\n /** Smooth the corner at the valley junction. 0 = sharp, higher = puffier crossover. */\n valleySmooth?: number;\n /** Rotate the pattern in degrees. */\n rotation?: number;\n /** Polygon sample count. */\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nfunction smoothMax(a: number, b: number, g: number): number {\n const d = a - b;\n return (a + b + Math.sqrt(d * d + g * g)) / 2;\n}\n\n/** Generalised superellipse-style profile from (0, 0) to (1, 1) with asymmetric exponents\n * controlled by curvature and bend. erosion truncates the top of the curve. */\nfunction curveSegment(t: number, curvature: number, bend: number, erosion: number): number {\n if (t <= 0) return 0;\n if (t >= 1) return 1 - erosion;\n const expA = Math.max(0.1, curvature * (1 + bend));\n const expB = Math.max(0.1, curvature * (1 - bend));\n const v = Math.pow(1 - Math.pow(1 - t, expA), 1 / expB);\n return Math.min(v, 1 - erosion);\n}\n\nexport function quatrefoilVertices(params: QuatrefoilParams = {}): [number, number][] {\n const cfg = { ...DEFAULTS, ...params };\n const spike = Math.max(5, Math.min(cfg.spikeR, 50));\n const lobe = Math.max(5, Math.min(cfg.lobeR, 50 * Math.SQRT2));\n const valley = Math.max(0, Math.min(cfg.valleyR, Math.min(spike, lobe)));\n const vAt = Math.max(0.05, Math.min(cfg.valleyAt, 0.95));\n const sCurv = Math.max(0.2, cfg.spikeCurvature);\n const sBend = Math.max(-0.95, Math.min(cfg.spikeBend, 0.95));\n const sErode = Math.max(0, Math.min(cfg.spikeTipErosion, 1));\n const lCurv = Math.max(0.2, cfg.lobeCurvature);\n const lBend = Math.max(-0.95, Math.min(cfg.lobeBend, 0.95));\n const lErode = Math.max(0, Math.min(cfg.lobeTipErosion, 1));\n const smooth = Math.max(0, cfg.valleySmooth);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(24, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const s = Math.abs(Math.sin(2 * (θ - rot))); // 0..1 across each octant\n // t1: spike-side parameter, 1 at cardinal (s=0), 0 at valley (s=vAt). Clamped to ≥ 0.\n const t1 = (vAt - s) / vAt;\n // t2: lobe-side parameter, 0 at valley (s=vAt), 1 at diagonal (s=1). Clamped to ≥ 0.\n const t2 = (s - vAt) / (1 - vAt);\n const rSpike = valley + (spike - valley) * curveSegment(Math.max(0, t1), sCurv, sBend, sErode);\n const rLobe = valley + (lobe - valley) * curveSegment(Math.max(0, t2), lCurv, lBend, lErode);\n // Smooth corner at the valley: outside the smoothing band both rSpike and rLobe equal\n // `valley` on the inactive side, so smoothMax just picks the active one. Near the join\n // both are close to valley and smoothMax lifts the corner.\n const r = smoothMax(rSpike, rLobe, smooth);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return verts;\n}\n\nconst Quatrefoil: BaseModule<QuatrefoilParams> = {\n build: (params, boxW, boxH) => polygonSampler(quatrefoilVertices(params), boxW, boxH),\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default Quatrefoil;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar-spline base. The silhouette comes from a single curve r(s) over\n * s ∈ [0, 1] that gets reflected/rotated to fill the full circle:\n *\n * - `mode: 'octant'`: 1/8 of the perimeter (cardinal → diagonal), mirrored within each\n * quadrant and rotated to fill the rest. 8-fold symmetric.\n * - `mode: 'quadrant'`: 1/4 of the perimeter (cardinal → next cardinal), rotated 4 times\n * with no internal mirror. 4-fold rotational symmetry; endpoints share radius.\n *\n * The interpolant is a **clamped natural cubic spline** with zero slope at both endpoints\n * (so the reflected/rotated full curve has no kink crossing the symmetry axes). C² across\n * the whole octant — continuous curvature, not just slope — which removes the \"lumpy\" feel\n * that local Hermite splines have when anchors are uneven.\n */\nexport interface OctantSplineParams {\n mode?: 'octant' | 'quadrant';\n /** Number of active anchors (3..12). */\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n /** Per-anchor weight (0..3). The spline is constructed to pass through every anchor exactly;\n * the weight biases how strongly that anchor influences the rest of the curve. Implementation\n * detail: blends the C² interpolant with a polynomial fit weighted by w. Default 1 = pure\n * C² interpolation; <1 lets the curve sweep past the anchor (anchor still passed through);\n * >1 makes the curve hug the anchor more tightly (sharper local bend). */\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_SPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_SPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Solve the clamped natural cubic spline with zero end-slopes. Returns the second-derivative\n * vector M[0..n] which feeds the standard cubic-spline evaluation formula. Solves a\n * tridiagonal system in O(n).\n */\nfunction solveCubicSpline(anchors: Anchor[]): number[] {\n const n = anchors.length - 1;\n const h: number[] = new Array(n);\n for (let i = 0; i < n; i++) h[i] = Math.max(1e-9, anchors[i + 1].s - anchors[i].s);\n // Build tridiagonal system for M[0..n] with clamped zero-slope BCs.\n // row 0: (h0/3) M0 + (h0/6) M1 = (r1-r0)/h0\n // row i (1..n-1): (h_{i-1}/6) M_{i-1} + ((h_{i-1}+h_i)/3) M_i + (h_i/6) M_{i+1}\n // = (r_{i+1}-r_i)/h_i - (r_i-r_{i-1})/h_{i-1}\n // row n: (h_{n-1}/6) M_{n-1} + (h_{n-1}/3) M_n = -(r_n-r_{n-1})/h_{n-1}\n const a: number[] = new Array(n + 1); // subdiagonal\n const b: number[] = new Array(n + 1); // diagonal\n const c: number[] = new Array(n + 1); // superdiagonal\n const d: number[] = new Array(n + 1); // rhs\n a[0] = 0;\n b[0] = h[0] / 3;\n c[0] = h[0] / 6;\n d[0] = (anchors[1].r - anchors[0].r) / h[0];\n for (let i = 1; i < n; i++) {\n a[i] = h[i - 1] / 6;\n b[i] = (h[i - 1] + h[i]) / 3;\n c[i] = h[i] / 6;\n d[i] = (anchors[i + 1].r - anchors[i].r) / h[i] - (anchors[i].r - anchors[i - 1].r) / h[i - 1];\n }\n a[n] = h[n - 1] / 6;\n b[n] = h[n - 1] / 3;\n c[n] = 0;\n d[n] = -(anchors[n].r - anchors[n - 1].r) / h[n - 1];\n // Thomas algorithm: forward sweep, then back-substitution.\n for (let i = 1; i <= n; i++) {\n const w = a[i] / b[i - 1];\n b[i] -= w * c[i - 1];\n d[i] -= w * d[i - 1];\n }\n const M: number[] = new Array(n + 1);\n M[n] = d[n] / b[n];\n for (let i = n - 1; i >= 0; i--) M[i] = (d[i] - c[i] * M[i + 1]) / b[i];\n return M;\n}\n\ninterface CompiledSpline {\n anchors: Anchor[];\n M: number[];\n}\n\nexport function compileSpline(anchors: Anchor[]): CompiledSpline {\n return { anchors, M: solveCubicSpline(anchors) };\n}\n\nexport function evalCompiled(s: number, spline: CompiledSpline): number {\n const { anchors, M } = spline;\n const N = anchors.length;\n if (N === 0) return 0;\n if (N === 1) return anchors[0].r;\n if (s <= anchors[0].s) return anchors[0].r;\n if (s >= anchors[N - 1].s) return anchors[N - 1].r;\n let i = 0;\n while (i < N - 1 && anchors[i + 1].s <= s) i++;\n const p0 = anchors[i];\n const p1 = anchors[i + 1];\n const h = p1.s - p0.s;\n if (h <= 0) return p0.r;\n const A = (p1.s - s) / h;\n const B = (s - p0.s) / h;\n // Apply per-anchor weight as a local sharpening factor on the C² interpolant. With both\n // weights = 1 this is pure natural cubic spline. Weights > 1 add a centered \"lift\" toward\n // the anchor (sharpens), < 1 subtracts (smooths past). The lift kernel is the standard\n // cubic-spline second-derivative term, scaled per-side by (w - 1).\n const liftA = ((A * A * A - A) * h * h) / 6;\n const liftB = ((B * B * B - B) * h * h) / 6;\n const baseLine = A * p0.r + B * p1.r;\n const curvatureTerm = liftA * M[i] * p0.w + liftB * M[i + 1] * p1.w;\n return baseLine + curvatureTerm;\n}\n\nconst OctantSpline: BaseModule<OctantSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const spline = compileSpline(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalCompiled(s, spline);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar NURBS base. Same anchor concept as `octant-spline` but the curve is an\n * **approximating** cubic NURBS — the control points pull the curve without sitting on it.\n * Each anchor's weight increases the local pull toward that control point.\n *\n * Endpoint behaviour: the curve uses mirror-phantom control points just outside [0, 1]\n * derived from the second-from-end anchors, which enforces zero slope at s=0 and s=1 so\n * the reflected/rotated full silhouette closes cleanly across the symmetry axes.\n */\nexport interface OctantBSplineParams {\n mode?: 'octant' | 'quadrant';\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_BSPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantBSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantBSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_BSPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantBSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantBSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantBSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0.01, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Cubic NURBS evaluation. Returns r at parameter u ∈ [0, 1].\n *\n * Implementation uses (s_i, r_i, w_i) as control points and treats `u` as the underlying\n * curve parameter, with the knot vector clamped at both ends. Because the control points'\n * `s` coordinates are themselves part of the curve, we need a parametric formulation:\n * S(u) = Σ w_i N_i(u) s_i / Σ w_i N_i(u)\n * R(u) = Σ w_i N_i(u) r_i / Σ w_i N_i(u)\n * Then we invert S(u) = s to get u and read out R(u).\n *\n * Two phantom control points are inserted at each end (mirror reflections of the second-\n * from-end anchors across the cardinal/diagonal axes), forcing zero slope at the endpoints\n * for clean symmetric closure.\n */\nfunction buildExtendedControls(anchors: Anchor[]): Anchor[] {\n const N = anchors.length;\n // Phantom controls outside [0, 1]. They are mirrored versions of the second-from-end\n // visible anchors. Symmetric reflection gives zero slope at the cardinal/diagonal endpoints.\n const phantomLeft1: Anchor = { s: -anchors[1].s, r: anchors[1].r, w: anchors[1].w };\n const phantomLeft2: Anchor = { s: -anchors[Math.min(2, N - 1)].s, r: anchors[Math.min(2, N - 1)].r, w: anchors[Math.min(2, N - 1)].w };\n const phantomRight1: Anchor = { s: 2 - anchors[N - 2].s, r: anchors[N - 2].r, w: anchors[N - 2].w };\n const phantomRight2: Anchor = { s: 2 - anchors[Math.max(N - 3, 0)].s, r: anchors[Math.max(N - 3, 0)].r, w: anchors[Math.max(N - 3, 0)].w };\n return [phantomLeft2, phantomLeft1, ...anchors, phantomRight1, phantomRight2];\n}\n\nfunction buildKnots(numCtrl: number, degree: number): number[] {\n // Clamped uniform knot vector of length numCtrl + degree + 1.\n const m = numCtrl + degree + 1;\n const knots: number[] = new Array(m);\n for (let i = 0; i <= degree; i++) knots[i] = 0;\n const interior = numCtrl - degree - 1;\n for (let i = 1; i <= interior; i++) knots[degree + i] = i / (interior + 1);\n for (let i = m - degree - 1; i < m; i++) knots[i] = 1;\n return knots;\n}\n\nfunction findSpan(u: number, knots: number[], degree: number, numCtrl: number): number {\n if (u >= knots[numCtrl]) return numCtrl - 1;\n if (u <= knots[degree]) return degree;\n let low = degree;\n let high = numCtrl;\n let mid = (low + high) >>> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) high = mid;\n else low = mid;\n mid = (low + high) >>> 1;\n }\n return mid;\n}\n\nfunction basisFns(span: number, u: number, knots: number[], degree: number): number[] {\n const N: number[] = new Array(degree + 1).fill(0);\n const left: number[] = new Array(degree + 1);\n const right: number[] = new Array(degree + 1);\n N[0] = 1;\n for (let j = 1; j <= degree; j++) {\n left[j] = u - knots[span + 1 - j];\n right[j] = knots[span + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const denom = right[r + 1] + left[j - r];\n const temp = denom === 0 ? 0 : N[r] / denom;\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\ninterface CompiledNurbs {\n extended: Anchor[];\n knots: number[];\n degree: number;\n}\n\nexport function compileNurbs(anchors: Anchor[]): CompiledNurbs {\n const extended = buildExtendedControls(anchors);\n const degree = 3;\n const knots = buildKnots(extended.length, degree);\n return { extended, knots, degree };\n}\n\nfunction evalNurbsAtU(u: number, nurbs: CompiledNurbs): { s: number; r: number } {\n const { extended, knots, degree } = nurbs;\n const numCtrl = extended.length;\n const uClamped = Math.max(0, Math.min(1, u));\n const span = findSpan(uClamped, knots, degree, numCtrl);\n const N = basisFns(span, uClamped, knots, degree);\n let sNum = 0;\n let rNum = 0;\n let wSum = 0;\n for (let i = 0; i <= degree; i++) {\n const ctrl = extended[span - degree + i];\n const wn = ctrl.w * N[i];\n sNum += wn * ctrl.s;\n rNum += wn * ctrl.r;\n wSum += wn;\n }\n return wSum > 0 ? { s: sNum / wSum, r: rNum / wSum } : { s: 0, r: 0 };\n}\n\n/** Invert S(u) = s by bisection. The NURBS is monotonic in s because the underlying knot\n * vector and control sequence are monotonic, so bisection converges quickly. */\nexport function evalNurbsAtS(s: number, nurbs: CompiledNurbs): number {\n if (s <= 0) return evalNurbsAtU(0, nurbs).r;\n if (s >= 1) return evalNurbsAtU(1, nurbs).r;\n let lo = 0, hi = 1;\n for (let iter = 0; iter < 30; iter++) {\n const mid = (lo + hi) * 0.5;\n const { s: sMid } = evalNurbsAtU(mid, nurbs);\n if (sMid < s) lo = mid; else hi = mid;\n if (hi - lo < 1e-5) break;\n }\n return evalNurbsAtU((lo + hi) * 0.5, nurbs).r;\n}\n\nconst OctantBSpline: BaseModule<OctantBSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const nurbs = compileNurbs(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalNurbsAtS(s, nurbs);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantBSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. Stays fixed regardless of badge width — viewBox\n * vertices are computed at build time using `boxW`. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\ninterface SidePoints {\n top: [number, number];\n mid: [number, number] | null;\n bottom: [number, number];\n}\n\nfunction sidePoints(mode: RibbonEnd, xBaseVb: number, signVb: number, taperVb: number): SidePoints {\n switch (mode) {\n case 'flat':\n return { top: [xBaseVb, 0], mid: null, bottom: [xBaseVb, 100] };\n case 'outward':\n return {\n top: [xBaseVb + signVb * taperVb, 0],\n mid: [xBaseVb, 50],\n bottom: [xBaseVb + signVb * taperVb, 100],\n };\n case 'inward':\n return {\n top: [xBaseVb, 0],\n mid: [xBaseVb + signVb * taperVb, 50],\n bottom: [xBaseVb, 100],\n };\n }\n}\n\nfunction sideInsetCss(mode: RibbonEnd, taperCss: number): number {\n const t = Math.max(0, taperCss);\n switch (mode) {\n case 'flat': return 4;\n case 'outward': return Math.round(t * 0.7);\n case 'inward': return Math.round(t * 0.8);\n }\n}\n\nconst Ribbon: BaseModule<RibbonParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const taperCss = Math.max(0, cfg.taperWidth);\n // Convert CSS px taper into viewBox-x units so the rendered pointer\n // is the same CSS-px depth regardless of badge width.\n const taperVb = boxW > 0 ? (taperCss / boxW) * 100 : 0;\n const l = sidePoints(cfg.left, 0, 1, taperVb);\n const r = sidePoints(cfg.right, 100, -1, taperVb);\n const verts: [number, number][] = [l.top];\n verts.push(r.top);\n if (r.mid) verts.push(r.mid);\n verts.push(r.bottom);\n verts.push(l.bottom);\n if (l.mid) verts.push(l.mid);\n return polygonSampler(verts, boxW, boxH);\n },\n insets: (params) => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n top: 0,\n right: sideInsetCss(cfg.right, cfg.taperWidth),\n bottom: 0,\n left: sideInsetCss(cfg.left, cfg.taperWidth),\n };\n },\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","export type EdgeProfile = (t: number, depth: number) => number;\n\nexport type BuiltInEdgeName =\n | 'flat'\n | 'chevron'\n | 'slant'\n | 'slant-up'\n | 'round'\n | 'scallop'\n | 'concave-chevron';\n\nexport type EdgeCap = BuiltInEdgeName | EdgeProfile;\n\nexport const EDGE_PROFILES: Record<BuiltInEdgeName, EdgeProfile> = {\n flat: (_t, _d) => 0,\n chevron: (t, d) => (1 - Math.abs(t - 0.5) * 2) * d,\n slant: (t, d) => t * d,\n 'slant-up': (t, d) => (1 - t) * d,\n round: (t, d) => Math.sin(t * Math.PI) * d,\n scallop: (t, d) => Math.sin(t * Math.PI * 3) * 0.4 * d,\n 'concave-chevron': (t, d) => -(1 - Math.abs(t - 0.5) * 2) * d,\n};\n\nexport function resolveEdge(cap: EdgeCap): EdgeProfile {\n if (typeof cap === 'function') return cap;\n return EDGE_PROFILES[cap] ?? EDGE_PROFILES.flat;\n}\n","import { resolveEdge, type EdgeCap } from './edgeProfiles';\nimport type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface PowerlineParams {\n /** Profile for the left edge (the cap segment N inherits from segment N-1). */\n leftEdge?: EdgeCap;\n /** Profile for the right edge (this segment's own end cap). */\n rightEdge?: EdgeCap;\n /** Protrusion depth in CSS px (positive values stick out beyond the rect). */\n depth?: number;\n}\n\nconst DEFAULTS: Required<PowerlineParams> = {\n leftEdge: 'flat',\n rightEdge: 'flat',\n depth: 6,\n};\n\n// Samples per vertical edge. 64 is smooth enough for chevron/round caps and\n// cheap to evaluate; the perimeter is sampled once per `build` call.\nconst EDGE_SAMPLES = 64;\n\nconst Powerline: BaseModule<PowerlineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const left = resolveEdge(cfg.leftEdge);\n const right = resolveEdge(cfg.rightEdge);\n const depth = cfg.depth;\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n\n const pts: { x: number; y: number; nx: number; ny: number }[] = [];\n\n // Top corners follow the same edge profiles as the rest of the verticals,\n // so a profile that protrudes/cuts at t=0 (e.g. slant-up) doesn't introduce\n // a corner kink between the flat top and the first vertical sample.\n pts.push({ x: left(0, depth) * sx, y: 0, nx: 0, ny: -1 });\n pts.push({ x: (boxW + right(0, depth)) * sx, y: 0, nx: 0, ny: -1 });\n\n for (let i = 1; i < EDGE_SAMPLES; i++) {\n const t = i / EDGE_SAMPLES;\n const xCss = boxW + right(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: 1, ny: 0 });\n }\n\n pts.push({ x: (boxW + right(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n pts.push({ x: (0 + left(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n\n for (let i = EDGE_SAMPLES - 1; i >= 1; i--) {\n const t = i / EDGE_SAMPLES;\n const xCss = 0 + left(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: -1, ny: 0 });\n }\n\n const cum: number[] = [0];\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1];\n const b = pts[i];\n const dxCss = (b.x - a.x) / sx;\n const dyCss = (b.y - a.y) / sy;\n cum.push(cum[i - 1] + Math.hypot(dxCss, dyCss));\n }\n const last = pts[pts.length - 1];\n const first = pts[0];\n const closeLen = Math.hypot((first.x - last.x) / sx, (first.y - last.y) / sy);\n const totalCss = cum[cum.length - 1] + closeLen;\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 1; i < pts.length; i++) {\n if (sm <= cum[i]) {\n const segLen = cum[i] - cum[i - 1];\n const t = segLen > 0 ? (sm - cum[i - 1]) / segLen : 0;\n const a = pts[i - 1];\n const b = pts[i];\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n nx: b.nx,\n ny: b.ny,\n };\n }\n }\n const lastIdx = pts.length - 1;\n const segLen = closeLen;\n const t = segLen > 0 ? (sm - cum[lastIdx]) / segLen : 0;\n return {\n x: pts[lastIdx].x + (first.x - pts[lastIdx].x) * t,\n y: pts[lastIdx].y + (first.y - pts[lastIdx].y) * t,\n nx: 0,\n ny: 1,\n };\n };\n\n const bodyPath = pts.reduce(\n (acc, p, i) =>\n acc + (i === 0\n ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}`\n : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n ''\n ) + ' Z';\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: (params) => {\n const depth = params?.depth ?? DEFAULTS.depth;\n const leftCap = params?.leftEdge ?? DEFAULTS.leftEdge;\n const rightCap = params?.rightEdge ?? DEFAULTS.rightEdge;\n const left = resolveEdge(leftCap);\n const right = resolveEdge(rightCap);\n // Sample the profiles to compute (a) each side's average offset, used to\n // shift padding so text reads centered in the visible silhouette (not the\n // bounding rect), and (b) each side's deepest inward cut, the floor below\n // which padding mustn't drop or text would crash into the cap.\n // Trapezoid integration over [0, 1] — exact for piecewise-linear profiles\n // (chevron, slant, slant-up) and accurate enough for the curved ones.\n const N = 32;\n let avgLeft = 0;\n let avgRight = 0;\n let maxLeftInward = 0;\n let maxRightInward = 0;\n for (let i = 0; i <= N; i++) {\n const t = i / N;\n const l = left(t, depth);\n const r = right(t, depth);\n const w = i === 0 || i === N ? 0.5 : 1;\n avgLeft += (w * l) / N;\n avgRight += (w * r) / N;\n if (l > maxLeftInward) maxLeftInward = l;\n if (-r > maxRightInward) maxRightInward = -r;\n }\n // Desired asymmetry: padLeft - padRight = avgLeft + avgRight (so the text\n // centroid sits at the silhouette's centroid). Hold padLeft + padRight = 2 * depth.\n const shift = (avgLeft + avgRight) / 2;\n const leftPad = Math.max(maxLeftInward, depth + shift);\n const rightPad = Math.max(maxRightInward, depth - shift);\n return { top: 0, right: rightPad, bottom: 0, left: leftPad };\n },\n};\n\nexport default Powerline;\n","import type { BaseModule } from './types';\nimport ChamferedRect, { type ChamferedRectParams } from './ChamferedRect';\nimport RoundedRect, { type RoundedRectParams } from './RoundedRect';\nimport Polygon, { type PolygonParams } from './Polygon';\nimport Puzzle, { type PuzzleParams } from './Puzzle';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\nimport OctantSpline, { type OctantSplineParams } from './OctantSpline';\nimport OctantBSpline, { type OctantBSplineParams } from './OctantBSpline';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Powerline, { type PowerlineParams } from './Powerline';\n\nexport type BadgeBase =\n | 'chamfered-rect'\n | 'rounded-rect'\n | 'polygon'\n | 'puzzle'\n | 'quatrefoil'\n | 'octant-spline'\n | 'octant-bspline'\n | 'ribbon'\n | 'powerline';\n\nexport interface BadgeBaseParams {\n 'chamfered-rect': ChamferedRectParams;\n 'rounded-rect': RoundedRectParams;\n 'polygon': PolygonParams;\n 'puzzle': PuzzleParams;\n 'quatrefoil': QuatrefoilParams;\n 'octant-spline': OctantSplineParams;\n 'octant-bspline': OctantBSplineParams;\n 'ribbon': RibbonParams;\n 'powerline': PowerlineParams;\n}\n\nexport const BASES: Record<BadgeBase, BaseModule<any>> = {\n 'chamfered-rect': ChamferedRect,\n 'rounded-rect': RoundedRect,\n 'polygon': Polygon,\n 'puzzle': Puzzle,\n 'quatrefoil': Quatrefoil,\n 'octant-spline': OctantSpline,\n 'octant-bspline': OctantBSpline,\n 'ribbon': Ribbon,\n 'powerline': Powerline,\n};\n","/**\n * Common range filter used by offsetAt-style effects. `range` is `[start, end]` as\n * fractions of `totalCss` in `[0, 1]`, where `end > start` includes a single contiguous\n * segment and `end < start` wraps around the closing point of the perimeter. Returns\n * the multiplier 1 inside the range and 0 outside (no feather yet — kept simple).\n */\nexport function rangeMask(s: number, totalCss: number, range?: [number, number]): number {\n if (!range) return 1;\n const [a, b] = range;\n if (a === b) return 0;\n const u = (((s % totalCss) + totalCss) % totalCss) / totalCss;\n if (a < b) return u >= a && u <= b ? 1 : 0;\n // Wrapping range like [0.9, 0.1].\n return u >= a || u <= b ? 1 : 0;\n}\n\nexport interface RangeMaskParams {\n /** Optional `[start, end]` as fractions of totalCss (0..1). Restricts the effect to a\n * contiguous slice of the perimeter; `end < start` wraps around. */\n range?: [number, number];\n}\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface SpikesEffectParams extends RangeMaskParams {\n count?: number;\n length?: number;\n baseWidth?: number;\n vertScale?: number;\n horzScale?: number;\n diagonalScale?: number;\n irregularity?: number;\n /**\n * 0..1 strength of curvature-based shortening on corners. At 1 we fully cancel the tip-arc\n * expansion `(1 + κL)` so neighbouring spike tips stay roughly evenly spaced even on tight\n * corner arcs; at 0 spikes are constant length and visibly fan outward around corners.\n */\n cornerCompensation?: number;\n}\n\nconst DEFAULTS: Required<Omit<SpikesEffectParams, 'range'>> = {\n count: 44,\n length: 8,\n baseWidth: 3,\n vertScale: 1.4,\n horzScale: 1,\n diagonalScale: 0.5,\n irregularity: 0,\n cornerCompensation: 1,\n};\n\nconst Spikes: EffectModule<SpikesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(3, Math.floor(cfg.count));\n const step = totalCss / N;\n const halfBase = Math.max(0.1, Math.min(step / 2 - 0.05, cfg.baseWidth / 2));\n const phaseOffset = phase * step;\n // Find the nearest spike center on the unwrapped axis, then wrap.\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n // Use shortest-distance metric on a closed perimeter.\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n if (Math.abs(ds) > halfBase) return { dx: 0, dy: 0 };\n // Triangular: peak at ds=0, zero at the base edges.\n const t = 1 - Math.abs(ds) / halfBase;\n const pCenter = perimeterAt(sc);\n // Use the actual perimeter normal — no 45° quantization, so spike angles\n // sweep smoothly through corner arcs.\n const dirX = pCenter.nx;\n const dirY = pCenter.ny;\n // Smoothly blend axis (vert/horz) and diagonal scales by how diagonal the\n // normal points. d = |sin(2θ)| ∈ [0,1]: 0 on the cardinal axes, 1 at 45°.\n const nxAbs = Math.abs(pCenter.nx);\n const nyAbs = Math.abs(pCenter.ny);\n const d = Math.min(1, 2 * nxAbs * nyAbs);\n const axisScale = nyAbs > nxAbs ? cfg.vertScale : cfg.horzScale;\n const scale = axisScale * (1 - d) + cfg.diagonalScale * d;\n const irrMult = 1 + cfg.irregularity * 0.5 * Math.sin(i * 1.73 + 0.7);\n // Numerical curvature κ ≈ |dn/ds| in CSS units. We average over a window roughly the\n // size of a spike footprint so the corner's influence smoothly bleeds onto adjacent\n // flat-edge samples instead of switching off at the arc boundary.\n const eps = Math.max(step * 0.5, halfBase);\n const SAMPLES = 5;\n let kappa = 0;\n for (let k = 0; k < SAMPLES; k++) {\n const u = (k + 0.5) / SAMPLES; // 0..1 across the window\n const sA = sc - eps + u * 2 * eps - eps / SAMPLES;\n const sB = sc - eps + u * 2 * eps + eps / SAMPLES;\n const pA = perimeterAt(sA);\n const pB = perimeterAt(sB);\n kappa += Math.hypot(pB.nx - pA.nx, pB.ny - pA.ny) / (sB - sA);\n }\n kappa /= SAMPLES;\n const baseLen = cfg.length * scale * irrMult * t;\n const comp = Math.max(0, Math.min(cfg.cornerCompensation, 1));\n const lenCss = Math.max(0, baseLen / (1 + comp * kappa * baseLen)) * mask;\n return { dx: dirX * lenCss, dy: dirY * lenCss };\n },\n defaults: DEFAULTS,\n};\n\nexport default Spikes;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PuffsEffectParams extends RangeMaskParams {\n bumpWidth?: number;\n puffiness?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<PuffsEffectParams, 'range'>> = {\n bumpWidth: 18,\n puffiness: 10,\n irregularity: 0,\n};\n\nconst Puffs: EffectModule<PuffsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(2, Math.round(totalCss / Math.max(6, cfg.bumpWidth)));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.floor((sm - phaseOffset) / step);\n const puffStart = i * step + phaseOffset;\n let t = (sm - puffStart) / step;\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localPy = Math.max(0.5, cfg.puffiness) * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n const disp = localPy * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Puffs;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface BitesEffectParams extends RangeMaskParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<BitesEffectParams, 'range'>> = {\n biteRadius: 3,\n biteSpacing: 8,\n irregularity: 0,\n};\n\nconst Bites: EffectModule<BitesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const br = Math.max(0.5, cfg.biteRadius);\n const bs = Math.max(2 * br + 0.5, cfg.biteSpacing);\n const N = Math.max(2, Math.floor(totalCss / bs));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = br * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Triangular inward dent: deepest at ds=0 (peak −localR), zero at ds=±localR.\n const t = 1 - Math.abs(ds) / localR;\n const inward = -localR * t;\n const pt = perimeterAt(s);\n return { dx: pt.nx * inward * mask, dy: pt.ny * inward * mask };\n },\n defaults: DEFAULTS,\n};\n\nexport default Bites;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface ScallopsEffectParams extends RangeMaskParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<ScallopsEffectParams, 'range'>> = {\n scallopRadius: 4,\n scallopSpacing: 10,\n irregularity: 0,\n};\n\nconst Scallops: EffectModule<ScallopsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const sr = Math.max(0.5, cfg.scallopRadius);\n const ss = Math.max(2 * sr + 0.5, cfg.scallopSpacing);\n const N = Math.max(2, Math.floor(totalCss / ss));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = sr * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Half-circle outward: peak at ds=0 = localR; zero at ±localR.\n const t = (ds + localR) / (2 * localR);\n const disp = localR * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Scallops;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface BevelEffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Which corner the light originates from (drives the highlight/shadow distribution across edges). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<BevelEffectParams> = { bevelWidth: 6, lightFrom: 'tl' };\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nfunction sideForNormal(nx: number, ny: number): Side {\n return Math.abs(ny) > Math.abs(nx)\n ? (ny < 0 ? 'top' : 'bottom')\n : (nx < 0 ? 'left' : 'right');\n}\n\nfunction bevelClasses(lightFrom: Corner): Record<Side, string> {\n const isTop = lightFrom[0] === 't';\n const isLeft = lightFrom[1] === 'l';\n return {\n top: isTop ? 'badge-bevel-light' : 'badge-bevel-dark',\n bottom: isTop ? 'badge-bevel-dark' : 'badge-bevel-light',\n left: isLeft ? 'badge-bevel-medium-light' : 'badge-bevel-medium-dark',\n right: isLeft ? 'badge-bevel-medium-dark' : 'badge-bevel-medium-light',\n };\n}\n\nconst SAMPLES = 240;\n\nconst Bevel: EffectModule<BevelEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cls = bevelClasses(cfg.lightFrom);\n const total = sampler.totalCss;\n\n // Sample outer + inset rings; tag each sample with the side it belongs to.\n const outer: { x: number; y: number; side: Side }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n outer.push({ x: pt.x, y: pt.y, side: sideForNormal(pt.nx, pt.ny) });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n // Group consecutive samples sharing a side into runs (wrap-aware).\n interface Run { side: Side; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const side = outer[i].side;\n if (!cur || cur.side !== side) {\n cur = { side, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n // Merge first and last runs if they wrap and share a side.\n if (runs.length > 1 && runs[0].side === runs[runs.length - 1].side) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n const outerPts = run.idxs.map((i) => outer[i]);\n const innerPts = run.idxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n if (pts.length === 0) return '';\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={cls[run.side]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface SheenEffectParams {\n lightFrom?: Corner;\n /** Peak gradient opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<SheenEffectParams> = { lightFrom: 'tl', intensity: 0.22 };\n\n// Gradient runs from the shadow corner (0%) to the lit corner (100%).\nconst FACE_COORDS: Record<Corner, { x1: string; y1: string; x2: string; y2: string }> = {\n tl: { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n tr: { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n bl: { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n br: { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n};\n\nconst Sheen: EffectModule<SheenEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const gradId = useId();\n const clipId = useId();\n const peak = Math.max(0, Math.min(cfg.intensity, 1));\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} {...FACE_COORDS[cfg.lightFrom]}>\n <stop offset=\"0%\" stopColor=\"black\" stopOpacity={peak} />\n <stop offset=\"45%\" stopColor=\"black\" stopOpacity=\"0.04\" />\n <stop offset=\"58%\" stopColor=\"white\" stopOpacity=\"0.04\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity={peak} />\n </linearGradient>\n </defs>\n <rect clipPath={`url(#${clipId})`} x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} style={{ pointerEvents: 'none' }} />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sheen;\n","import type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface RivetsEffectParams {\n /** Rivet radius in CSS px. */\n radius?: number;\n /** Inset from each corner in CSS px. */\n inset?: number;\n /** Light origin (drives which side of each rivet gets the highlight). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<RivetsEffectParams> = { radius: 2.4, inset: 7, lightFrom: 'tl' };\n\nconst Rivets: EffectModule<RivetsEffectParams> = {\n Component: ({ boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const rx = cfg.radius * sx;\n const ry = cfg.radius * sy;\n const ix = cfg.inset * sx;\n const iy = cfg.inset * sy;\n const litDx = cfg.lightFrom[1] === 'l' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const litDy = cfg.lightFrom[0] === 't' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const positions: [number, number][] = [\n [ix, iy],\n [100 - ix, iy],\n [ix, 100 - iy],\n [100 - ix, 100 - iy],\n ];\n return (\n <>\n {positions.map(([cx, cy], i) => (\n <g key={i}>\n <ellipse className=\"badge-bevel-dark\" cx={cx} cy={cy} rx={rx} ry={ry} />\n <ellipse className=\"badge-bevel-medium-dark\" cx={cx - litDx * 0.6 * sx} cy={cy - litDy * 0.6 * sy} rx={rx * 0.75} ry={ry * 0.75} />\n <ellipse className=\"badge-bevel-light\" cx={cx + litDx * sx} cy={cy + litDy * sy} rx={rx * 0.45} ry={ry * 0.45} />\n </g>\n ))}\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Rivets;\n","import type { EffectModule } from '../bases/types';\n\nexport interface ShadowEffectParams {\n /** Offset in CSS px. */\n dx?: number;\n dy?: number;\n /** Alpha 0..1. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<ShadowEffectParams> = { dx: 1, dy: 2, opacity: 0.28 };\n\nconst Shadow: EffectModule<ShadowEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const dxVb = cfg.dx * sx;\n const dyVb = cfg.dy * sy;\n return (\n <path\n d={sampler.bodyPath}\n transform={`translate(${dxVb.toFixed(3)} ${dyVb.toFixed(3)})`}\n fill={`rgba(0, 0, 0, ${Math.max(0, Math.min(cfg.opacity, 1))})`}\n stroke=\"none\"\n style={{ pointerEvents: 'none' }}\n />\n );\n },\n zone: 'background',\n defaults: DEFAULTS,\n};\n\nexport default Shadow;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface WoodgrainEffectParams {\n /** Number of grain curves. */\n lines?: number;\n /** Number of knot circles. */\n knots?: number;\n /** Overall grain opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<WoodgrainEffectParams> = { lines: 4, knots: 2, intensity: 0.55 };\n\n// Deterministic per-line/knot wobble.\nfunction osc(seed: number) {\n return Math.sin(seed * 1.73 + 0.5);\n}\n\nconst Woodgrain: EffectModule<WoodgrainEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const lines: string[] = [];\n for (let i = 0; i < cfg.lines; i++) {\n const y = ((i + 1) / (cfg.lines + 1)) * 100;\n // Two control points, slight vertical wobble.\n const dy1 = osc(i * 2 + 1) * 4;\n const dy2 = osc(i * 2 + 2) * 4;\n lines.push(`M -5 ${y.toFixed(2)} Q 35 ${(y + dy1).toFixed(2)} 60 ${y.toFixed(2)} T 105 ${(y + dy2).toFixed(2)}`);\n }\n const knotPositions: [number, number][] = [];\n for (let i = 0; i < cfg.knots; i++) {\n const cx = 30 + osc(i * 3 + 0.7) * 30 + 20;\n const cy = 50 + osc(i * 3 + 1.3) * 30;\n knotPositions.push([cx, cy]);\n }\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`} opacity={Math.max(0, Math.min(cfg.intensity, 1))} style={{ pointerEvents: 'none' }}>\n {lines.map((d, i) => (\n <path key={`l${i}`} className=\"badge-stroke\" d={d} fill=\"none\" />\n ))}\n {knotPositions.map(([cx, cy], i) => (\n <g key={`k${i}`}>\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={3} ry={2.4} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={1.2} ry={1} fill=\"none\" />\n </g>\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Woodgrain;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PerforationsEffectParams extends RangeMaskParams {\n /** Hole radius in CSS px. */\n holeRadius?: number;\n /** Spacing between hole centers along the perimeter, in CSS px. */\n holeSpacing?: number;\n}\n\nconst DEFAULTS: Required<Omit<PerforationsEffectParams, 'range'>> = {\n holeRadius: 3,\n holeSpacing: 11,\n};\n\nconst Perforations: EffectModule<PerforationsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const N = Math.max(2, Math.round(total / Math.max(2 * cfg.holeRadius, cfg.holeSpacing)));\n const step = total / N;\n const holes: { cx: number; cy: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i + 0.5) * step;\n if (rangeMask(sCss, total, params?.range) === 0) continue;\n const pt = sampler.perimeterAt(sCss);\n holes.push({ cx: pt.x, cy: pt.y });\n }\n const rx = cfg.holeRadius * sx;\n const ry = cfg.holeRadius * sy;\n return (\n <>\n {holes.map((h, i) => (\n <ellipse key={i} cx={h.cx} cy={h.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </>\n );\n },\n zone: 'mask',\n defaults: DEFAULTS as PerforationsEffectParams,\n};\n\nexport default Perforations;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface Bevel2EffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Compass angle the light originates from, in degrees. 0° = top, 90° =\n * right, 180° = bottom, 270° = left (CSS `linear-gradient` convention). */\n lightFrom?: number;\n}\n\nconst DEFAULTS: Required<Bevel2EffectParams> = { bevelWidth: 6, lightFrom: 315 };\n\nconst SAMPLES = 240;\n\n// Six shade buckets from brightest to darkest. Each maps to a CSS class.\nconst SHADE_CLASSES = [\n 'badge-bevel-light', // brightest (normal points straight at light)\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-dark',\n 'badge-bevel-medium-dark',\n 'badge-bevel-dark', // darkest (normal points away from light)\n];\n\nfunction lightDirFor(angleDeg: number): { lx: number; ly: number } {\n // Compass convention (0° = up, clockwise). Returns the unit vector pointing\n // outward from the badge toward the light source.\n const rad = (angleDeg * Math.PI) / 180;\n return { lx: Math.sin(rad), ly: -Math.cos(rad) };\n}\n\nconst Bevel2: EffectModule<Bevel2EffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const { lx, ly } = lightDirFor(cfg.lightFrom);\n\n const outer: { x: number; y: number; bucket: number }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n // dot(n, lightDir) where light points FROM the corner OUTWARD: surfaces whose\n // outward normal aligns with -light (facing the light source) are brightest.\n const d = -(pt.nx * lx + pt.ny * ly);\n // d ∈ [-1, 1]. Map to [0, SHADE_CLASSES.length).\n const t = Math.max(0, Math.min((d + 1) / 2, 0.9999));\n const bucket = Math.floor(t * SHADE_CLASSES.length);\n outer.push({ x: pt.x, y: pt.y, bucket });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n interface Run { bucket: number; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const bucket = outer[i].bucket;\n if (!cur || cur.bucket !== bucket) {\n cur = { bucket, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n if (runs.length > 1 && runs[0].bucket === runs[runs.length - 1].bucket) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n // Each band overlaps its neighbours by one sample on each side so the seams between\n // shade buckets render without gaps.\n const first = run.idxs[0];\n const last = run.idxs[run.idxs.length - 1];\n const prev = (first - 1 + SAMPLES) % SAMPLES;\n const next = (last + 1) % SAMPLES;\n const expandedIdxs = [prev, ...run.idxs, next];\n const outerPts = expandedIdxs.map((i) => outer[i]);\n const innerPts = expandedIdxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={SHADE_CLASSES[run.bucket]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel2;\n","import type { EffectModule } from '../bases/types';\n\nexport interface OutlineEffectParams {\n /** Stroke width in CSS px. */\n width?: number;\n /** Stroke color. */\n color?: string;\n /** Optional SVG dasharray (e.g. \"4 2\"). */\n dash?: string;\n /** CSS mix-blend-mode: 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten',\n * 'difference', etc. Useful when the outline color should react to whatever's behind it. */\n blendMode?: string;\n /** 0..1 stroke opacity. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<OutlineEffectParams> = {\n width: 1,\n color: 'var(--badge-edge)',\n dash: '',\n blendMode: 'normal',\n opacity: 1,\n};\n\nconst Outline: EffectModule<OutlineEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthVb = cfg.width * Math.max(sx, sy);\n return (\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke={cfg.color}\n strokeWidth={widthVb}\n strokeDasharray={cfg.dash || undefined}\n strokeOpacity={cfg.opacity}\n vectorEffect=\"non-scaling-stroke\"\n style={{ mixBlendMode: cfg.blendMode as never }}\n />\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Outline;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface SunbeamsEffectParams {\n /** Number of beams (parallelograms) cast across the body. */\n count?: number;\n /** Beam width in CSS px (measured horizontally before the skew). */\n width?: number;\n /** Gap between adjacent beams in CSS px. */\n gap?: number;\n /** Skew angle in degrees. 0 = vertical bars; positive = leaning right. */\n angle?: number;\n /** 0..1 lightness opacity. */\n opacity?: number;\n /** Beam color. Defaults to white. */\n color?: string;\n /** Drift the beam pattern left/right by N CSS px (lets you slide the \"window\" over the body). */\n offset?: number;\n /** 0..1 perturbs each beam's width, opacity, and angle slightly with a deterministic\n * per-beam noise; 0 = perfectly regular. */\n irregularity?: number;\n /** Gradient mask angle in degrees. 0 = left→right, 90 = top→bottom. */\n gradientAngle?: number;\n /** Position along the gradient axis (0..1) where the mask is fully opaque (beams visible). */\n gradientStart?: number;\n /** Position along the gradient axis (0..1) where the mask is fully transparent (beams faded out). */\n gradientEnd?: number;\n}\n\nconst DEFAULTS: Required<SunbeamsEffectParams> = {\n count: 3,\n width: 18,\n gap: 8,\n angle: 28,\n opacity: 0.18,\n color: '#ffffff',\n offset: 0,\n irregularity: 0,\n gradientAngle: 90,\n gradientStart: 0,\n gradientEnd: 1,\n};\n\nconst Sunbeams: EffectModule<SunbeamsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const maskId = useId();\n const gradId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n\n // Per-beam pseudo-random multipliers (deterministic by index).\n const widthMult = (i: number) => 1 + irr * 0.45 * Math.sin(i * 1.73 + 0.7);\n const opacityMult = (i: number) => 1 + irr * 0.5 * Math.sin(i * 2.31 + 1.3);\n const angleJitter = (i: number) => irr * 8 * Math.sin(i * 3.07 + 0.4); // degrees\n\n // Total horizontal span (centered on x=50). We compute using nominal widths so the\n // pattern's centering is stable as irregularity moves individual beam widths.\n const nominalWidthVb = cfg.width * sx;\n const gapVb = cfg.gap * sx;\n const offsetVb = cfg.offset * sx;\n const totalWidth = cfg.count * nominalWidthVb + (cfg.count - 1) * gapVb;\n let cursorX = 50 - totalWidth / 2 + offsetVb;\n const yTop = -50;\n const yBot = 150;\n\n const beams: { points: string; opacity: number }[] = [];\n for (let i = 0; i < cfg.count; i++) {\n const beamWidthVb = nominalWidthVb * widthMult(i);\n const x1 = cursorX;\n const x2 = cursorX + beamWidthVb;\n const tan = Math.tan(((cfg.angle + angleJitter(i)) * Math.PI) / 180);\n const horizPerVb = tan * (sx / sy);\n const halfShear = horizPerVb * (yBot - yTop) / 2;\n const pts = [\n [x1 + halfShear, yTop],\n [x2 + halfShear, yTop],\n [x2 - halfShear, yBot],\n [x1 - halfShear, yBot],\n ];\n beams.push({\n points: pts.map(([px, py]) => `${px.toFixed(3)},${py.toFixed(3)}`).join(' '),\n opacity: Math.max(0, Math.min(cfg.opacity * opacityMult(i), 1)),\n });\n cursorX += nominalWidthVb + gapVb;\n }\n\n // Gradient mask geometry: define a linear gradient from one edge of the viewBox to the\n // other along `gradientAngle`. Position the start/end stops along that 0..1 axis.\n const ga = (cfg.gradientAngle * Math.PI) / 180;\n const cosA = Math.cos(ga), sinA = Math.sin(ga);\n // Vector from centre to edge along the axis. Pick a long-enough span so 0..1 covers\n // the badge fully.\n const span = 100; // viewBox units along the axis from (50-50cos, 50-50sin) to (50+50cos, 50+50sin)\n const x1g = 50 - cosA * span / 2;\n const y1g = 50 - sinA * span / 2;\n const x2g = 50 + cosA * span / 2;\n const y2g = 50 + sinA * span / 2;\n\n const gs = Math.max(0, Math.min(cfg.gradientStart, 1));\n const ge = Math.max(0, Math.min(cfg.gradientEnd, 1));\n // Build stops so the gradient is white (opaque) at `gs` and black (transparent) at `ge`,\n // working whether gs < ge or vice versa.\n const stops = gs <= ge\n ? [\n { offset: 0, color: '#fff' },\n { offset: gs, color: '#fff' },\n { offset: ge, color: '#000' },\n { offset: 1, color: '#000' },\n ]\n : [\n { offset: 0, color: '#000' },\n { offset: ge, color: '#000' },\n { offset: gs, color: '#fff' },\n { offset: 1, color: '#fff' },\n ];\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} x1={x1g} y1={y1g} x2={x2g} y2={y2g} gradientUnits=\"userSpaceOnUse\">\n {stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.color} />)}\n </linearGradient>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} />\n </mask>\n </defs>\n <g clipPath={`url(#${clipId})`} mask={`url(#${maskId})`}>\n {beams.map((b, i) => (\n <polygon key={i} points={b.points} fill={cfg.color} opacity={b.opacity} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sunbeams;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Aqua-glass treatment — composes onto any badge silhouette by walking the\n * sampler's perimeter and painting four layered sub-effects in one pass:\n *\n * 1. Body gradient — vertical tint that runs translucent-top through a\n * bright equator band into a dark base.\n * 2. Specular gloss — upper-hemisphere white-fade clipped to the body.\n * 3. Bezel highlight — bright stroke along perimeter segments whose\n * outward normal points up (`ny < 0`). On a pill that's\n * the upper half; on a hex it's the three top edges;\n * on a starburst it's the upward tips. Normal-aware,\n * not bbox-aligned, which is what makes it work on\n * arbitrary silhouettes.\n * 4. Rim outline — faint dark stroke along the full perimeter.\n *\n * For the *truly* translucent look (with backdrop-filter blur reading the\n * surface behind the badge), use this with `variant=\"outline\"` so the badge's\n * own flat fill doesn't paint behind the gradient, and set\n * `backdrop-filter: blur(...)` on the host element via CSS.\n */\nexport interface AquaEffectParams {\n /** Body tint. Defaults to `var(--badge-edge)` so the badge's tone drives it. */\n accent?: string;\n /** Stop opacities along the body gradient (0..1). */\n topAlpha?: number;\n upperAlpha?: number;\n /** Equator Y position in viewBox units (0..100). */\n equator?: number;\n /** Half-width of the transition band around the equator (viewBox units). */\n equatorSpread?: number;\n /** Mix ratios for the bright equator and dark base stops (0..100, % accent). */\n equatorTint?: number;\n baseTint?: number;\n /** Specular gloss params. */\n glossTopAlpha?: number;\n glossMidAlpha?: number;\n /** Y extent the gloss covers, in viewBox units. 50 = upper hemisphere. */\n glossExtent?: number;\n /** Normal-aware bezel highlight. */\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n /** Full-perimeter rim. */\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<AquaEffectParams> = {\n accent: 'var(--badge-edge)',\n topAlpha: 0.45,\n upperAlpha: 0.7,\n equator: 52,\n equatorSpread: 12,\n equatorTint: 95,\n baseTint: 70,\n glossTopAlpha: 0.7,\n glossMidAlpha: 0.18,\n glossExtent: 50,\n bezelAlpha: 0.7,\n bezelWidth: 1,\n rimAlpha: 0.22,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Aqua: EffectModule<AquaEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n\n // Walk the perimeter and collect contiguous runs where the outward normal\n // points up (ny < 0) — those segments will get the bezel highlight.\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n // Wraparound: if first sample and last sample are both \"up\", merge the\n // tail into the head so the bezel renders as one stroke across s=0.\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n // Stroke widths in CSS px → viewBox units. The badge SVG is 100×100 with\n // preserveAspectRatio=\"none\", so use the larger inverse-scale to keep\n // the stroke from getting too thin in either axis.\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread * 1.6);\n const equatorBrightColor = `color-mix(in srgb, ${cfg.accent} ${cfg.equatorTint}%, white)`;\n const baseColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseTint}%, black)`;\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: cfg.accent, stopOpacity: cfg.topAlpha }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: cfg.accent, stopOpacity: cfg.upperAlpha }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorBrightColor, stopOpacity: 1 }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: cfg.accent, stopOpacity: 1 }} />\n <stop offset=\"100%\" style={{ stopColor: baseColor, stopOpacity: 1 }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: cfg.glossTopAlpha }} />\n <stop offset=\"60%\" style={{ stopColor: 'white', stopOpacity: cfg.glossMidAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n {/* 1. Body — vertical gradient over the silhouette */}\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {/* 2. Gloss — upper region, clipped to silhouette */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n\n {/* 3. Bezel — stroke segments where normal points up */}\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={cfg.bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n {/* 4. Rim — full perimeter at low opacity */}\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={cfg.rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Aqua;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Metal — opaque cousin of the Aqua treatment. Same four sub-passes (body\n * gradient, specular gloss, normal-aware bezel, perimeter rim), but tuned\n * for an opaque metallic surface with a single tunable `specularity`\n * parameter that drives how sharp / contrasty the highlights read.\n *\n * Low specularity → matte aluminum / brushed pewter feel: muted contrast,\n * soft gloss, faint bezel.\n * High specularity → chrome / polished steel: sharp specular peak at the\n * equator, bright bezel and rim, hard transitions in the body gradient.\n *\n * The same `specularity` knob multiplies the equator brightness, gloss\n * alpha, bezel alpha, and rim alpha — so one slider moves the whole\n * surface along a coherent matte-to-mirror axis.\n */\nexport interface MetalEffectParams {\n /** Base metal color. Defaults to a neutral steel; pass e.g. `'#c8a657'` for brass. */\n accent?: string;\n /** 0 = matte, 1 = mirror. Multiplies the brightness of the equator, gloss,\n * bezel, and rim simultaneously. */\n specularity?: number;\n /** Equator Y position (viewBox units, 0..100). */\n equator?: number;\n /** Half-width of the bright equator band. Smaller = sharper specular. */\n equatorSpread?: number;\n /** How dark the upper and lower extremes are (% accent vs black, 0..100). */\n topDarkness?: number;\n baseDarkness?: number;\n /** Gloss params. */\n glossExtent?: number;\n /** Per-zone alpha *baselines* — scaled by `specularity`. */\n glossAlphaTop?: number;\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<MetalEffectParams> = {\n accent: '#aab3bd', // neutral steel\n specularity: 0.6,\n equator: 50,\n equatorSpread: 8,\n topDarkness: 55,\n baseDarkness: 35,\n glossExtent: 50,\n glossAlphaTop: 0.55,\n bezelAlpha: 0.85,\n bezelWidth: 1,\n rimAlpha: 0.35,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Metal: EffectModule<MetalEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const spec = Math.max(0, Math.min(cfg.specularity, 1));\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n\n // --- Bezel sample walk (same as Aqua: runs where ny < 0). ---\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n // Gradient construction. Specularity sharpens by:\n // 1. Driving the equator peak from neutral accent toward pure white.\n // 2. Boosting gloss/bezel/rim alpha (applied below).\n // 3. Increasing the contrast between dark stops and the equator stop.\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread);\n // At spec=0 the equator is just the accent; at spec=1 it's almost white.\n const equatorWhiteMix = 100 - Math.round(spec * 85);\n const equatorColor = `color-mix(in srgb, ${cfg.accent} ${equatorWhiteMix}%, white)`;\n const topDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.topDarkness}%, black)`;\n const baseDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseDarkness}%, black)`;\n // Bright stops on either side of the peak collapse toward the peak as\n // specularity rises, sharpening the highlight.\n const upperBrightMix = 100 - Math.round(spec * 50);\n const lowerBrightMix = 100 - Math.round(spec * 30);\n const upperBrightColor = `color-mix(in srgb, ${cfg.accent} ${upperBrightMix}%, white)`;\n const lowerBrightColor = `color-mix(in srgb, ${cfg.accent} ${lowerBrightMix}%, white)`;\n\n const glossAlpha = cfg.glossAlphaTop * spec;\n const bezelAlpha = cfg.bezelAlpha * (0.4 + 0.6 * spec);\n const rimAlpha = cfg.rimAlpha * (0.6 + 0.4 * spec);\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: topDarkColor }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: upperBrightColor }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorColor }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: lowerBrightColor }} />\n <stop offset=\"100%\" style={{ stopColor: baseDarkColor }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: glossAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {glossAlpha > 0 && (\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Metal;\n","import type { EffectModule } from '../bases/types';\nimport Spikes, { type SpikesEffectParams } from './Spikes';\nimport Puffs, { type PuffsEffectParams } from './Puffs';\nimport Bites, { type BitesEffectParams } from './Bites';\nimport Scallops, { type ScallopsEffectParams } from './Scallops';\nimport Bevel, { type BevelEffectParams } from './Bevel';\nimport Sheen, { type SheenEffectParams } from './Sheen';\nimport Rivets, { type RivetsEffectParams } from './Rivets';\nimport Shadow, { type ShadowEffectParams } from './Shadow';\nimport Woodgrain, { type WoodgrainEffectParams } from './Woodgrain';\nimport Perforations, { type PerforationsEffectParams } from './Perforations';\nimport Bevel2, { type Bevel2EffectParams } from './Bevel2';\nimport Outline, { type OutlineEffectParams } from './Outline';\nimport Sunbeams, { type SunbeamsEffectParams } from './Sunbeams';\nimport Aqua, { type AquaEffectParams } from './Aqua';\nimport Metal, { type MetalEffectParams } from './Metal';\n\nexport type BadgeEffect =\n | 'spikes' | 'puffs' | 'bites' | 'scallops'\n | 'bevel' | 'bevel2' | 'sheen' | 'sunbeams' | 'rivets' | 'shadow' | 'woodgrain' | 'perforations' | 'outline'\n | 'aqua' | 'metal';\n\nexport interface BadgeEffectParams {\n spikes: SpikesEffectParams;\n puffs: PuffsEffectParams;\n bites: BitesEffectParams;\n scallops: ScallopsEffectParams;\n bevel: BevelEffectParams;\n bevel2: Bevel2EffectParams;\n sheen: SheenEffectParams;\n rivets: RivetsEffectParams;\n shadow: ShadowEffectParams;\n woodgrain: WoodgrainEffectParams;\n perforations: PerforationsEffectParams;\n outline: OutlineEffectParams;\n sunbeams: SunbeamsEffectParams;\n aqua: AquaEffectParams;\n metal: MetalEffectParams;\n}\n\nexport const EFFECTS: Record<BadgeEffect, EffectModule<any>> = {\n spikes: Spikes,\n puffs: Puffs,\n bites: Bites,\n scallops: Scallops,\n bevel: Bevel,\n bevel2: Bevel2,\n sheen: Sheen,\n rivets: Rivets,\n shadow: Shadow,\n woodgrain: Woodgrain,\n perforations: Perforations,\n outline: Outline,\n sunbeams: Sunbeams,\n aqua: Aqua,\n metal: Metal,\n};\n\nexport interface EffectSpec<E extends BadgeEffect = BadgeEffect> {\n type: E;\n params?: BadgeEffectParams[E];\n}\n","import { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode, type CSSProperties } from 'react';\nimport s from './Badge.module.css';\nimport { SHAPES, type BadgeShapeParams } from './shapes';\nimport { BASES, type BadgeBase, type BadgeBaseParams } from './bases';\nimport { EFFECTS, type EffectSpec, type BadgeEffect } from './effects';\nimport type { BadgeShape, BadgeTone, BadgeVariant, BadgeSize } from './types';\n\ninterface BadgeBaseProps {\n tone?: BadgeTone;\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** \"Edge bloat\": offset every base perimeter sample outward by N CSS px along the normal\n * before any compose effects run. Negative values shrink the silhouette. Photoshop-style\n * expand-selection on the body. */\n bloat?: number;\n padding?: number | string;\n /**\n * For CSS-rendered shapes (pill, plain) that fragment across line wraps, controls how the\n * background/border behaves at each break.\n * - `'slice'` (default): decoration is severed at the break (looks like one continuous badge cut by the line).\n * - `'clone'`: each fragment paints its own complete decoration (looks like two separate badges).\n */\n breakStyle?: 'slice' | 'clone';\n /** When set, perimeter-pattern shapes (beavis, cloud, postage, scalloped) continuously shift their pattern. */\n crawl?: boolean | number;\n /** Compose-mode: base shape underneath the badge content. When set, overrides the `shape` prop. */\n base?: BadgeBase;\n baseParams?: BadgeBaseParams[BadgeBase];\n /** Compose-mode: layered effects applied around / over the base. */\n effects?: EffectSpec[];\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n href?: string;\n as?: 'span' | 'button' | 'a';\n children: ReactNode;\n className?: string;\n /** Optional style overrides merged with the badge's own style. Useful for setting CSS\n * custom properties (e.g. `--badge-edge` to inject a custom tone color). */\n style?: CSSProperties;\n 'aria-label'?: string;\n}\n\ntype BadgePropsByShape = {\n [S in BadgeShape]: BadgeBaseProps & { shape?: S; shapeParams?: BadgeShapeParams[S] };\n}[BadgeShape];\n\nexport type BadgeProps = BadgePropsByShape;\n\nfunction chooseElement(props: BadgeProps): 'span' | 'button' | 'a' {\n if (props.as) return props.as;\n if (props.href) return 'a';\n if (props.onClick) return 'button';\n return 'span';\n}\n\nexport function Badge(props: BadgeProps) {\n const {\n shape = 'pill',\n tone = 'neutral',\n variant = 'outline',\n size = 'sm',\n onClick,\n onRemove,\n removeLabel,\n href,\n children,\n className,\n shapeParams,\n bloat,\n padding,\n style: styleOverride,\n breakStyle,\n crawl,\n base,\n baseParams,\n effects,\n } = props;\n const ariaLabel = props['aria-label'];\n const element = chooseElement(props);\n const [focused, setFocused] = useState(false);\n const [phase, setPhase] = useState(0);\n const shapeModule = SHAPES[shape] ?? SHAPES.pill;\n const resolvedShape = SHAPES[shape] ? shape : 'pill';\n const ShapeBody = shapeModule.Component;\n const params = { ...(shapeModule.defaults ?? {}), ...(shapeParams ?? {}) };\n\n useEffect(() => {\n if (!crawl) { setPhase(0); return; }\n const speed = typeof crawl === 'number' ? crawl : 0.2;\n let raf = 0;\n let last = performance.now();\n const tick = (now: number) => {\n const dt = (now - last) / 1000;\n last = now;\n setPhase((p) => (p + speed * dt) % 1);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [crawl]);\n const cls = [s.badge, className].filter(Boolean).join(' ');\n\n // Compose-mode: explicit `base` prop wins; otherwise the shape may declare its own\n // `compose()` spec to migrate legacy shapes through the new pipeline.\n const shapeComposeSpec = !base && shapeModule.compose ? shapeModule.compose(params) : null;\n const resolvedBaseKey = base ?? (shapeComposeSpec?.base as BadgeBase | undefined);\n const composeBase = resolvedBaseKey ? BASES[resolvedBaseKey] : null;\n const resolvedBaseParams = base\n ? baseParams\n : (shapeComposeSpec?.baseParams as BadgeBaseParams[BadgeBase] | undefined);\n const resolvedEffects: EffectSpec[] | undefined = base\n ? effects\n : (shapeComposeSpec?.effects as EffectSpec[] | undefined) ?? effects;\n const composeBaseParams = composeBase ? { ...(composeBase.defaults ?? {}), ...(resolvedBaseParams ?? {}) } : null;\n const decoRef = useRef<SVGSVGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n useLayoutEffect(() => {\n if (!composeBase) return;\n const svg = decoRef.current;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [composeBase]);\n\n const sampler = composeBase ? composeBase.build(composeBaseParams, box.w, box.h) : null;\n\n const insetsSource = composeBase\n ? (typeof composeBase.insets === 'function' ? composeBase.insets(composeBaseParams) : composeBase.insets) ?? { top: 0, right: 0, bottom: 0, left: 0 }\n : (typeof shapeModule.insets === 'function' ? shapeModule.insets(params) : shapeModule.insets);\n const insets = insetsSource;\n const style: CSSProperties = {\n ['--badge-inset-top' as never]: `${insets.top}px`,\n ['--badge-inset-right' as never]: `${insets.right}px`,\n ['--badge-inset-bottom' as never]: `${insets.bottom}px`,\n ['--badge-inset-left' as never]: `${insets.left}px`,\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(breakStyle !== undefined && {\n boxDecorationBreak: breakStyle,\n WebkitBoxDecorationBreak: breakStyle,\n }),\n ...styleOverride,\n };\n\n const commonProps = {\n className: cls,\n style,\n 'data-shape': composeBase ? 'compose' : resolvedShape,\n 'data-tone': tone,\n 'data-variant': variant,\n 'data-size': size,\n 'data-focused': focused ? 'true' : undefined,\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n 'aria-label': ariaLabel,\n };\n\n // Honest chaining: sample the base perimeter at COMPOSE_SAMPLES points and sum every\n // offset-style effect's contribution at each sample. Stacked transforms therefore compose\n // additively — `[bites, spikes]` produces a bitten outline with spikes radiating from\n // wherever bites haven't dented inward.\n const COMPOSE_SAMPLES = 600;\n const composedSampler = (() => {\n if (!composeBase || !sampler) return null;\n const offsetMods = (resolvedEffects ?? [])\n .map((eff) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n if (!mod?.offsetAt) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return { offsetAt: mod.offsetAt, params: effParams };\n })\n .filter(Boolean) as { offsetAt: NonNullable<typeof EFFECTS[BadgeEffect]['offsetAt']>; params: Record<string, unknown> }[];\n const bloatCss = bloat ?? 0;\n if (offsetMods.length === 0 && bloatCss === 0) return sampler;\n const sx = 100 / box.w;\n const sy = 100 / box.h;\n const totalCss = sampler.totalCss;\n // Compute the warped sample point at any CSS arc length s — base perimeter sample\n // bloated outward by a constant CSS distance plus the sum of every offset effect's\n // contribution at that sample.\n const warpedXY = (sCss: number) => {\n const sm = ((sCss % totalCss) + totalCss) % totalCss;\n const pt = sampler.perimeterAt(sm);\n let dx = pt.nx * bloatCss;\n let dy = pt.ny * bloatCss;\n for (const m of offsetMods) {\n const o = m.offsetAt(sm, {\n params: m.params as never,\n phase,\n totalCss,\n perimeterAt: sampler.perimeterAt,\n });\n dx += o.dx;\n dy += o.dy;\n }\n return { x: pt.x + dx * sx, y: pt.y + dy * sy };\n };\n let d = '';\n for (let i = 0; i < COMPOSE_SAMPLES; i++) {\n const sCss = (i / COMPOSE_SAMPLES) * totalCss;\n const w = warpedXY(sCss);\n d += (i === 0 ? `M ${w.x.toFixed(3)} ${w.y.toFixed(3)}` : ` L ${w.x.toFixed(3)} ${w.y.toFixed(3)}`);\n }\n d += ' Z';\n // Replace perimeterAt with a warped version: warped point + normal recomputed from\n // the warped tangent (clockwise rotation of unit tangent). This is what decorations\n // like Bevel and Perforations need to follow the actual bumpy outline.\n const warpedPerimeterAt = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = warpedXY(sm);\n const eps = totalCss / (COMPOSE_SAMPLES * 2);\n const wA = warpedXY(sm - eps);\n const wB = warpedXY(sm + eps);\n // Convert finite-difference tangent back to \"CSS px\" by un-scaling per-axis.\n const tx = (wB.x - wA.x) / sx;\n const ty = (wB.y - wA.y) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n // Outward normal: clockwise rotation of tangent (in CSS space), then renormalize\n // for unit length in viewBox terms when returned.\n const nxC = ty / tl;\n const nyC = -tx / tl;\n // Convert that CSS-space normal back to a viewBox-space unit-ish normal: the\n // existing PerimeterPoint contract has nx/ny used multiplicatively with sx/sy in\n // call sites, matching the convention base perimeters use.\n return { x: pt.x, y: pt.y, nx: nxC, ny: nyC };\n };\n return { bodyPath: d, perimeterAt: warpedPerimeterAt, totalCss };\n })();\n\n const decoEffects = (resolvedEffects ?? []).filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS]?.Component);\n const backgroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'background');\n const foregroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'foreground');\n const maskDecorations = decoEffects.filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS].zone === 'mask');\n const bodyMaskId = `badge-mask-${useId().replace(/:/g, '')}`;\n\n const renderDecoration = (eff: EffectSpec, i: number) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n const EffComponent = mod?.Component;\n if (!EffComponent || !composedSampler) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return <EffComponent key={`${eff.type as string}-${i}`} sampler={composedSampler} boxW={box.w} boxH={box.h} variant={variant} params={effParams} phase={phase} />;\n };\n\n const decoSvg = composeBase && composedSampler ? (\n <svg ref={decoRef} className={s.deco} viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {maskDecorations.length > 0 && (\n <defs>\n <mask id={bodyMaskId} maskUnits=\"userSpaceOnUse\" x=\"-10\" y=\"-10\" width=\"120\" height=\"120\">\n <rect x=\"-10\" y=\"-10\" width=\"120\" height=\"120\" fill=\"white\" />\n {maskDecorations.map(renderDecoration)}\n </mask>\n </defs>\n )}\n {backgroundDecorations.map(renderDecoration)}\n <g {...(maskDecorations.length > 0 ? { mask: `url(#${bodyMaskId})` } : {})}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={composedSampler.bodyPath} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={composedSampler.bodyPath} />}\n </g>\n {foregroundDecorations.map(renderDecoration)}\n </svg>\n ) : shapeModule.renderMode !== 'css' && ShapeBody ? (\n <svg\n className={s.deco}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio={shapeModule.stretches === false ? 'xMidYMid meet' : 'none'}\n aria-hidden=\"true\"\n >\n <ShapeBody variant={variant} focused={focused} params={params} phase={phase} />\n </svg>\n ) : null;\n\n const inner = (\n <>\n {decoSvg}\n <span className={s.content}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={s.remove}\n aria-label={removeLabel ?? 'Remove'}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M 2 2 L 8 8 M 8 2 L 2 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" fill=\"none\" />\n </svg>\n </button>\n )}\n </span>\n </>\n );\n\n if (element === 'button') {\n return (\n <button type=\"button\" {...commonProps} onClick={onClick}>\n {inner}\n </button>\n );\n }\n if (element === 'a') {\n return (\n <a href={href} {...commonProps} onClick={onClick}>\n {inner}\n </a>\n );\n }\n return <span {...commonProps}>{inner}</span>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Badge-DU8ihE7Z.js","names":[],"sources":["../../src/components/Badge/Badge.module.css","../../src/components/Badge/shapes/Pill.tsx","../../src/components/Badge/shapes/Plain.tsx","../../src/components/Badge/shapes/Square.tsx","../../src/components/Badge/shapes/Notched.tsx","../../src/components/Badge/shapes/Perforated.tsx","../../src/components/Badge/shapes/Hexagon.tsx","../../src/components/Badge/shapes/Starburst.tsx","../../src/components/Badge/shapes/Scalloped.tsx","../../src/components/Badge/shapes/Shield.tsx","../../src/components/Badge/shapes/Ribbon.tsx","../../src/components/Badge/shapes/Beavis.tsx","../../src/components/Badge/shapes/Sparkler.tsx","../../src/components/Badge/shapes/Postage.tsx","../../src/components/Badge/shapes/Cloud.tsx","../../src/components/Badge/shapes/House.tsx","../../src/components/Badge/shapes/Plaque.tsx","../../src/components/Badge/shapes/Crest.tsx","../../src/components/Badge/shapes/Urn.tsx","../../src/components/Badge/shapes/Coffin.tsx","../../src/components/Badge/shapes/Receipt.tsx","../../src/components/Badge/shapes/Wood.tsx","../../src/components/Badge/shapes/Quatrefoil.tsx","../../src/components/Badge/shapes/index.ts","../../src/components/Badge/bases/ChamferedRect.tsx","../../src/components/Badge/bases/RoundedRect.tsx","../../src/components/Badge/bases/polygonSampler.ts","../../src/components/Badge/bases/Polygon.tsx","../../src/components/Badge/bases/Puzzle.tsx","../../src/components/Badge/bases/Quatrefoil.tsx","../../src/components/Badge/bases/OctantSpline.tsx","../../src/components/Badge/bases/OctantBSpline.tsx","../../src/components/Badge/bases/Ribbon.tsx","../../src/components/Badge/bases/edgeProfiles.ts","../../src/components/Badge/bases/Powerline.tsx","../../src/components/Badge/bases/index.ts","../../src/components/Badge/effects/rangeMask.ts","../../src/components/Badge/effects/Spikes.tsx","../../src/components/Badge/effects/Puffs.tsx","../../src/components/Badge/effects/Bites.tsx","../../src/components/Badge/effects/Scallops.tsx","../../src/components/Badge/effects/Bevel.tsx","../../src/components/Badge/effects/Sheen.tsx","../../src/components/Badge/effects/Rivets.tsx","../../src/components/Badge/effects/Shadow.tsx","../../src/components/Badge/effects/Woodgrain.tsx","../../src/components/Badge/effects/Perforations.tsx","../../src/components/Badge/effects/Bevel2.tsx","../../src/components/Badge/effects/Outline.tsx","../../src/components/Badge/effects/Sunbeams.tsx","../../src/components/Badge/effects/Aqua.tsx","../../src/components/Badge/effects/Metal.tsx","../../src/components/Badge/effects/index.ts","../../src/components/Badge/Badge.tsx"],"sourcesContent":[".badge {\n position: relative;\n display: inline-flex;\n align-items: baseline;\n vertical-align: baseline;\n gap: var(--badge-gap, 4px);\n font-size: var(--badge-font-size, 10px);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--badge-fg, var(--wzl-muted, #9ea1a8));\n --badge-edge: var(--wzl-panel-border, #25272c);\n --badge-fill: var(--wzl-bg, #181a1e);\n --badge-fg: var(--badge-edge);\n background: transparent;\n border: 0;\n font: inherit;\n font-family: inherit;\n /* Badges never carry text-decoration. Symmetric: a badge inside a link\n suppresses the link's underline on the badge's text; a link inside a\n badge suppresses its own underline. The chip's colored background is\n the affordance signal. */\n text-decoration: none;\n}\n.badge * { text-decoration: none; }\n\n.badge[data-size='md'] {\n --badge-gap: 6px;\n --badge-pad-x: 10px;\n --badge-pad-y: 3px;\n --badge-font-size: 12px;\n}\n\n.deco {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: visible;\n}\n.deco :global(.badge-fill) { fill: var(--badge-fill); stroke: none; }\n.deco :global(.badge-stroke) { fill: none; stroke: var(--badge-edge); stroke-width: var(--badge-stroke-width, 1px); vector-effect: non-scaling-stroke; }\n.deco :global(.badge-focus) { fill: none; stroke: var(--badge-edge); stroke-width: calc(var(--badge-stroke-width, 1px) + 1px); vector-effect: non-scaling-stroke; opacity: 0.6; }\n.deco :global(.badge-bevel-light) { fill: rgba(255, 255, 255, 0.22); stroke: none; }\n.deco :global(.badge-bevel-medium-light) { fill: rgba(255, 255, 255, 0.10); stroke: none; }\n.deco :global(.badge-bevel-medium-dark) { fill: rgba(0, 0, 0, 0.16); stroke: none; }\n.deco :global(.badge-bevel-dark) { fill: rgba(0, 0, 0, 0.32); stroke: none; }\n\n.content {\n position: relative;\n display: inline-flex;\n align-items: baseline;\n gap: inherit;\n z-index: 1;\n}\n\n/* Tone edges double as text color in the outline/subtle variants, so they\n must be foreground-legible — hence accent-fg, not the accent fill. */\n.badge[data-tone='accent'] { --badge-edge: var(--wzl-accent-fg, var(--wzl-accent, #7fb069)); }\n.badge[data-tone='info'] { --badge-edge: #7ab8d4; }\n.badge[data-tone='warn'] { --badge-edge: #d4a574; }\n.badge[data-tone='danger'] { --badge-edge: #c43c3c; }\n.badge[data-tone='muted'] { --badge-edge: var(--wzl-muted, #9ea1a8); }\n.badge[data-tone='neutral'] { --badge-edge: var(--wzl-panel-border, #25272c); --badge-fg: var(--wzl-muted, #9ea1a8); }\n\n.badge[data-variant='outline'] {\n --badge-fill: var(--wzl-bg, #181a1e);\n --badge-fg: var(--badge-edge);\n}\n.badge[data-variant='solid'] {\n --badge-fill: var(--badge-edge);\n --badge-fg: #fff;\n font-weight: 600;\n}\n.badge[data-variant='subtle'] {\n --badge-fill: color-mix(in oklab, var(--badge-edge) 14%, transparent);\n --badge-fg: var(--badge-edge);\n}\n/* Neutral's edge is a border gray that vanishes when the outline/subtle\n variants (above) reuse it as the text color — re-assert the muted fg.\n Solid keeps the variant's white fg on the gray fill. */\n.badge[data-tone='neutral']:not([data-variant='solid']) { --badge-fg: var(--wzl-muted, #9ea1a8); }\n\n.badge {\n padding:\n calc(var(--badge-pad-y, 1px) + var(--badge-inset-top, 0px))\n calc(var(--badge-pad-x, 6px) + var(--badge-inset-right, 0px))\n calc(var(--badge-pad-y, 1px) + var(--badge-inset-bottom, 0px))\n calc(var(--badge-pad-x, 6px) + var(--badge-inset-left, 0px));\n}\n\n.badge[data-shape='pill'] {\n display: inline;\n border-radius: 9999px;\n box-sizing: border-box;\n -webkit-box-decoration-break: slice;\n box-decoration-break: slice;\n}\n.badge[data-shape='pill'] .content,\n.badge[data-shape='plain'] .content {\n display: inline;\n}\n.badge[data-shape='pill'][data-variant='solid'],\n.badge[data-shape='pill'][data-variant='subtle'] {\n background: var(--badge-fill);\n}\n/* Always reserve room for the border so variants that drop the visible stroke\n (e.g. subtle, or fragments after a slice) stay the same outer width. */\n.badge[data-shape='pill'] {\n border: var(--badge-stroke-width, 1px) solid transparent;\n}\n.badge[data-shape='pill'][data-variant='outline'],\n.badge[data-shape='pill'][data-variant='solid'] {\n /* Real border instead of inset box-shadow so `box-decoration-break: slice` cleanly removes\n the border-right of fragment 1 / border-left of fragment 2 at the line break. */\n border-color: var(--badge-edge);\n}\n.badge[data-shape='pill'][data-focused='true'] {\n outline: 2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);\n outline-offset: 2px;\n}\n\n.badge[data-shape='plain'] {\n display: inline;\n background: transparent;\n padding: 0;\n letter-spacing: 0.04em;\n text-transform: none;\n color: var(--badge-fg);\n -webkit-box-decoration-break: slice;\n box-decoration-break: slice;\n}\n.badge[data-shape='plain'][data-focused='true'] {\n outline: 2px solid color-mix(in oklab, var(--badge-edge) 60%, transparent);\n outline-offset: 3px;\n border-radius: 2px;\n}\n\n.badge[data-shape='plaque'] .content {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.14), 0 -0.5px 0 rgba(0, 0, 0, 0.5);\n}\n\nbutton.badge,\na.badge {\n cursor: pointer;\n outline: 0;\n /* `border: 0` from the base rule would otherwise zero out the reserved width for buttons.\n Make it transparent + zero-width so the width matches the span form, but visible borders\n from shape-specific rules still apply on top. */\n border: 0 solid transparent;\n}\nbutton.badge:hover,\na.badge:hover {\n --badge-edge: color-mix(in oklab, var(--badge-edge) 88%, white);\n}\n@media (prefers-reduced-motion: reduce) {\n button.badge:hover,\n a.badge:hover { --badge-edge: var(--badge-edge); }\n}\n\n.remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n margin-left: 2px;\n padding: 0;\n background: transparent;\n border: 0;\n border-radius: 50%;\n color: var(--badge-fg);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 1;\n vertical-align: middle;\n}\n.remove:hover { background: color-mix(in oklab, var(--badge-fg) 20%, transparent); }\n.remove > svg { display: block; }\n.badge[data-size='md'] .remove { width: 16px; height: 16px; font-size: 16px; }\n.badge[data-size='md'] .remove > svg { width: 12px; height: 12px; }\n","import type { ShapeModule } from '../types';\n\nconst Pill: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Pill;\n","import type { ShapeModule } from '../types';\n\nconst Plain: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Plain;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface SquareParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill). */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<SquareParams> = { erosion: 0.16 };\n\nconst Square: ShapeModule<SquareParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'rounded-rect', baseParams: { erosion: cfg.erosion } };\n },\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Square;\n","import type { ShapeModule } from '../types';\n\nexport interface NotchedParams {\n /** 0..1 fraction of max corner radius. */\n erosion?: number;\n /** rx/ry eccentricity of the corner arcs. */\n eccentricity?: number;\n}\n\nconst DEFAULTS: Required<NotchedParams> = { erosion: 0.28, eccentricity: 1 };\n\nfunction notchedPath(r: number, ecc: number) {\n const W = 100, H = 100;\n const rx = r * ecc;\n const ry = r / ecc;\n return [\n `M ${rx} 0`,\n `L ${W - rx} 0`,\n `A ${rx} ${ry} 0 0 0 ${W} ${ry}`,\n `L ${W} ${H - ry}`,\n `A ${rx} ${ry} 0 0 0 ${W - rx} ${H}`,\n `L ${rx} ${H}`,\n `A ${rx} ${ry} 0 0 0 0 ${H - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 0 ${rx} 0`,\n 'Z',\n ].join(' ');\n}\n\nconst Notched: ShapeModule<NotchedParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const e = Math.max(0, Math.min(cfg.erosion, 1));\n const r = e * 49;\n const ecc = Math.max(0.2, Math.min(cfg.eccentricity, 5));\n const d = notchedPath(r, ecc);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && (\n <path className=\"badge-fill\" d={d} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <path className=\"badge-stroke\" d={d} />\n )}\n {focused && <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />}\n </>\n );\n },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Notched;\n","import { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport type { ShapeModule } from '../types';\n\nexport interface PerforatedParams {\n holeRadius?: number;\n holePitch?: number;\n}\n\nconst DEFAULTS: Required<PerforatedParams> = { holeRadius: 3.5, holePitch: 11 };\n\nfunction PerforatedComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: PerforatedParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const maskId = useId();\n const ref = useRef<SVGGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const svg = ref.current?.ownerSVGElement;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, []);\n\n // Convert CSS-px hole sizing into viewBox units so holes look circular on either axis.\n const rx = (cfg.holeRadius / box.w) * 100;\n const ry = (cfg.holeRadius / box.h) * 100;\n const nH = Math.max(2, Math.round(box.w / cfg.holePitch));\n const nV = Math.max(2, Math.round(box.h / cfg.holePitch));\n\n const notches: { cx: number; cy: number }[] = [];\n for (let i = 0; i < nH; i++) {\n const t = (i + 0.5) / nH;\n notches.push({ cx: t * 100, cy: 0 });\n notches.push({ cx: t * 100, cy: 100 });\n }\n for (let i = 0; i < nV; i++) {\n const t = (i + 0.5) / nV;\n notches.push({ cx: 0, cy: t * 100 });\n notches.push({ cx: 100, cy: t * 100 });\n }\n\n return (\n <g ref={ref}>\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"-5\" y=\"-5\" width=\"110\" height=\"110\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"white\" />\n {notches.map((n, i) => (\n <ellipse key={i} cx={n.cx} cy={n.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </mask>\n </defs>\n {(variant === 'solid' || variant === 'subtle') && (\n <rect className=\"badge-fill\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <rect className=\"badge-stroke\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {focused && (\n <rect className=\"badge-focus\" x=\"-4\" y=\"-4\" width=\"108\" height=\"108\" mask={`url(#${maskId})`} />\n )}\n </g>\n );\n}\n\n// Avoid unused warning while keeping useEffect imported elsewhere if needed in future.\nvoid useEffect;\n\nconst Perforated: ShapeModule<PerforatedParams> = {\n Component: PerforatedComponent,\n insets: { top: 2, right: 4, bottom: 2, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Perforated;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HexagonParams {\n tipHeight?: number;\n /** Truncate the top and bottom tips, leaving a horizontal flat edge.\n * Measured as a distance from each tip vertically (0 = sharp point, tipHeight = fully flat). */\n tipTruncation?: number;\n}\n\nconst DEFAULTS: Required<HexagonParams> = { tipHeight: 25, tipTruncation: 0 };\n\nfunction hexVerts(tip: number, truncation: number): [number, number][] {\n const t = Math.max(0, Math.min(tip, 49));\n const trunc = Math.max(0, Math.min(truncation, t));\n if (trunc <= 0) {\n return [[50, 0], [100, t], [100, 100 - t], [50, 100], [0, 100 - t], [0, t]];\n }\n const ratio = trunc / t;\n const xL = 50 - 50 * ratio;\n const xR = 50 + 50 * ratio;\n return [\n [xL, trunc], [xR, trunc],\n [100, t], [100, 100 - t],\n [xR, 100 - trunc], [xL, 100 - trunc],\n [0, 100 - t], [0, t],\n ];\n}\n\nconst Hexagon: ShapeModule<HexagonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'polygon', baseParams: { vertices: hexVerts(cfg.tipHeight, cfg.tipTruncation) } };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Hexagon;\n","import type { ShapeModule } from '../types';\n\nexport interface StarburstParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n erosion?: number;\n}\n\nconst DEFAULTS: Required<StarburstParams> = {\n points: 12,\n outerR: 48,\n innerR: 36,\n rotation: -7,\n erosion: 0,\n};\n\nfunction starburstPath(points: number, outerR: number, innerR: number, rotationDeg: number, erosion: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotationDeg * Math.PI) / 180;\n const rnd = Math.max(0, Math.min(erosion, 1));\n const pts: [number, number][] = [];\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n if (rnd <= 0) {\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n d += (i === 0 ? 'M ' : ' L ') + pts[i][0].toFixed(2) + ' ' + pts[i][1].toFixed(2);\n }\n return d + ' Z';\n }\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n const prev = pts[(i + pts.length - 1) % pts.length];\n const curr = pts[i];\n const next = pts[(i + 1) % pts.length];\n const t = rnd * 0.45;\n const enterX = curr[0] + (prev[0] - curr[0]) * t;\n const enterY = curr[1] + (prev[1] - curr[1]) * t;\n const exitX = curr[0] + (next[0] - curr[0]) * t;\n const exitY = curr[1] + (next[1] - curr[1]) * t;\n if (i === 0) d += `M ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n else d += ` L ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n d += ` Q ${curr[0].toFixed(2)} ${curr[1].toFixed(2)} ${exitX.toFixed(2)} ${exitY.toFixed(2)}`;\n }\n return d + ' Z';\n}\n\nconst Starburst: ShapeModule<StarburstParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = starburstPath(cfg.points, cfg.outerR, cfg.innerR, cfg.rotation, cfg.erosion);\n const dFocus = starburstPath(cfg.points, cfg.outerR + 4, cfg.innerR + 3, cfg.rotation, cfg.erosion);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 8, right: 8, bottom: 8, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Starburst;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface ScallopedParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<ScallopedParams> = { scallopRadius: 5, scallopSpacing: 12, irregularity: 0 };\n\nconst Scalloped: ShapeModule<ScallopedParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'scallops',\n params: { scallopRadius: cfg.scallopRadius, scallopSpacing: cfg.scallopSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Scalloped;\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport type { ShapeModule } from '../types';\n\nexport interface ShieldParams {\n pointDepth?: number;\n shoulderY?: number;\n curveTightness?: number;\n /** 0..1 fraction of max top-corner rounding. */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<ShieldParams> = {\n pointDepth: 100,\n shoulderY: 55,\n curveTightness: 0.7,\n erosion: 0.33,\n};\n\nfunction ShieldComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: ShieldParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const ref = useRef<SVGGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const svg = ref.current?.ownerSVGElement;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, []);\n\n const pd = Math.max(60, Math.min(cfg.pointDepth, 110));\n const sh = Math.max(20, Math.min(cfg.shoulderY, pd - 5));\n const cpY = sh + (pd - sh) * Math.max(0.1, Math.min(cfg.curveTightness, 1));\n // Aspect-aware top corner radii (so the rounded corners stay circular in CSS).\n const cornerCss = Math.max(0, Math.min(cfg.erosion, 1)) * 12;\n const rxC = (cornerCss / box.w) * 100;\n const ryC = (cornerCss / box.h) * 100;\n const d = [\n `M ${rxC.toFixed(3)} 0`,\n `L ${(100 - rxC).toFixed(3)} 0`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 100 ${ryC.toFixed(3)}`,\n `L 100 ${sh}`,\n `Q 100 ${cpY} 50 ${pd}`,\n `Q 0 ${cpY} 0 ${sh}`,\n `L 0 ${ryC.toFixed(3)}`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 ${rxC.toFixed(3)} 0`,\n 'Z',\n ].join(' ');\n return (\n <g ref={ref}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </g>\n );\n}\n\nconst Shield: ShapeModule<ShieldParams> = {\n Component: ShieldComponent,\n insets: { top: 2, right: 8, bottom: 14, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Shield;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. The actual pointer width stays fixed regardless\n * of badge width — the underlying base recomputes viewBox vertices at\n * build time using the rendered box dimensions. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\nconst Ribbon: ShapeModule<RibbonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'ribbon', baseParams: cfg };\n },\n // Unused at render time when `compose` is set — the base's insets win — but\n // required by the ShapeModule contract.\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface BeavisParams {\n points?: number;\n cornerRadius?: number;\n spikeLen?: number;\n spikeBaseWidth?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<BeavisParams> = {\n points: 44,\n cornerRadius: 6,\n spikeLen: 12,\n spikeBaseWidth: 3,\n irregularity: 0,\n};\n\nconst Beavis: ShapeModule<BeavisParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n // Nominal badge half-height for cornerRadius → erosion: real badges are ~22px tall\n // so half = 11. Clamp into [0,1].\n const erosion = Math.max(0, Math.min(1, cfg.cornerRadius / 11));\n return {\n base: 'rounded-rect',\n baseParams: { erosion },\n effects: [\n {\n type: 'spikes',\n params: {\n count: cfg.points,\n length: cfg.spikeLen,\n baseWidth: cfg.spikeBaseWidth,\n vertScale: 1,\n horzScale: 1,\n diagonalScale: 1,\n irregularity: cfg.irregularity,\n },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Beavis;\n","import type { ShapeModule } from '../types';\n\nexport interface SparklerParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n}\n\nconst DEFAULTS: Required<SparklerParams> = {\n points: 16,\n outerR: 58,\n innerR: 50,\n rotation: -5,\n};\n\nfunction sparklerPath(points: number, outerR: number, innerR: number, rotation: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotation * Math.PI) / 180;\n let d = '';\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n const x = cx + Math.cos(a) * r;\n const y = cy + Math.sin(a) * r;\n d += (i === 0 ? 'M ' : ' L ') + x.toFixed(2) + ' ' + y.toFixed(2);\n }\n return d + ' Z';\n}\n\nconst Sparkler: ShapeModule<SparklerParams> = {\n Component: ({ variant, focused, params }) => {\n const { points, outerR, innerR, rotation } = { ...DEFAULTS, ...params };\n const d = sparklerPath(points, outerR, innerR, rotation);\n const dFocus = sparklerPath(points, outerR + 4, innerR + 3, rotation);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 4, right: 4, bottom: 4, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Sparkler;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface PostageParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<PostageParams> = { biteRadius: 3, biteSpacing: 8, irregularity: 0 };\n\nconst Postage: ShapeModule<PostageParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'bites',\n params: { biteRadius: cfg.biteRadius, biteSpacing: cfg.biteSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Postage;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CloudParams {\n bumpWidth?: number;\n puffiness?: number;\n /** 0..1 fraction of max body roundness. */\n erosion?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<CloudParams> = {\n bumpWidth: 24,\n puffiness: 14,\n erosion: 0.2,\n irregularity: 0,\n};\n\nconst Cloud: ShapeModule<CloudParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: cfg.erosion },\n effects: [\n {\n type: 'puffs',\n params: { bumpWidth: cfg.bumpWidth, puffiness: cfg.puffiness, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Cloud;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HouseParams {\n eaveY?: number;\n peakHeight?: number;\n roofOverhang?: number;\n}\n\nconst DEFAULTS: Required<HouseParams> = { eaveY: 32, peakHeight: 32, roofOverhang: 0 };\n\nconst House: ShapeModule<HouseParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const ey = Math.max(2, Math.min(cfg.eaveY, 95));\n const peakY = ey - Math.max(0, cfg.peakHeight);\n const ov = Math.max(0, Math.min(cfg.roofOverhang, 12));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [50, peakY],\n [100 + ov, ey],\n [100, ey],\n [100, 100],\n [0, 100],\n [0, ey],\n [-ov, ey],\n ],\n },\n };\n },\n insets: { top: 10, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default House;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type PlaqueCorner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface PlaqueParams {\n bevelWidth?: number;\n lightFrom?: PlaqueCorner;\n rivetRadius?: number;\n rivetInset?: number;\n sheenIntensity?: number;\n}\n\nconst DEFAULTS: Required<PlaqueParams> = {\n bevelWidth: 6,\n lightFrom: 'tl',\n rivetRadius: 2.4,\n rivetInset: 7,\n sheenIntensity: 0.22,\n};\n\nconst Plaque: ShapeModule<PlaqueParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n { type: 'bevel', params: { bevelWidth: cfg.bevelWidth, lightFrom: cfg.lightFrom } },\n { type: 'sheen', params: { lightFrom: cfg.lightFrom, intensity: cfg.sheenIntensity } },\n { type: 'rivets', params: { radius: cfg.rivetRadius, inset: cfg.rivetInset, lightFrom: cfg.lightFrom } },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Plaque;\n","import type { ShapeModule } from '../types';\n\nexport interface CrestParams {\n topInset?: number;\n pointDepth?: number;\n}\n\nconst DEFAULTS: Required<CrestParams> = { topInset: 12, pointDepth: 100 };\n\nfunction crestPath(topInset: number, pointDepth: number) {\n const ti = Math.max(0, Math.min(topInset, 35));\n const pd = Math.max(60, Math.min(pointDepth, 110));\n // 5-sided shield silhouette with rounded shoulders and a bottom point.\n return [\n `M ${ti} 6`,\n `Q ${ti / 2} 0 ${ti + 4} 0`,\n `L ${100 - ti - 4} 0`,\n `Q ${100 - ti / 2} 0 ${100 - ti} 6`,\n `L ${100 - ti * 0.4} ${pd * 0.35}`,\n `Q ${100 - ti} ${pd * 0.7} 50 ${pd}`,\n `Q ${ti} ${pd * 0.7} ${ti * 0.4} ${pd * 0.35}`,\n 'Z',\n ].join(' ');\n}\n\nconst Crest: ShapeModule<CrestParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = crestPath(cfg.topInset, cfg.pointDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: { top: 4, right: 10, bottom: 14, left: 10 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Crest;\n","import type { ShapeModule } from '../types';\n\nconst d = 'M 35 0 L 30 12 Q 15 30 15 55 Q 15 75 30 90 L 30 100 L 70 100 L 70 90 Q 85 75 85 55 Q 85 30 70 12 L 65 0 Z';\n\nconst Urn: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 4, right: 12, bottom: 4, left: 12 },\n stretches: true,\n};\n\nexport default Urn;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CoffinParams {\n headX?: number;\n headHalfHeight?: number;\n shoulderX?: number;\n shoulderHalfHeight?: number;\n footX?: number;\n footHalfHeight?: number;\n}\n\nconst DEFAULTS: Required<CoffinParams> = {\n headX: 6,\n headHalfHeight: 23,\n shoulderX: 33,\n shoulderHalfHeight: 36,\n footX: 100,\n footHalfHeight: 29,\n};\n\nconst Coffin: ShapeModule<CoffinParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const hX = Math.max(0, Math.min(cfg.headX, 40));\n const sX = Math.max(hX + 1, Math.min(cfg.shoulderX, 70));\n const fX = Math.max(sX + 1, Math.min(cfg.footX, 100));\n const hH = Math.max(2, Math.min(cfg.headHalfHeight, 50));\n const sDelta = Math.max(0, Math.min(cfg.shoulderHalfHeight, 50));\n const sH = Math.min(50, hH + sDelta);\n const fH = Math.max(2, Math.min(cfg.footHalfHeight, 50));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [hX, 50 - hH],\n [sX, 50 - sH],\n [fX, 50 - fH],\n [fX, 50 + fH],\n [sX, 50 + sH],\n [hX, 50 + hH],\n ],\n },\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 11 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Coffin;\n","import type { ShapeModule } from '../types';\n\nexport interface ReceiptParams {\n teeth?: number;\n tearDepth?: number;\n sideToTopRatio?: number;\n}\n\nconst DEFAULTS: Required<ReceiptParams> = { teeth: 11, tearDepth: 4, sideToTopRatio: 3 };\n\nfunction receiptPath(teeth: number, depth: number) {\n const N = Math.max(3, Math.floor(teeth));\n const baseDepth = Math.max(1, depth);\n const depthAt = (i: number) => baseDepth * (0.55 + 0.55 * Math.abs(Math.sin(i * 1.73 + 0.5)));\n let d = `M 0 0 L 100 0`;\n for (let i = 0; i < N; i++) {\n const yMid = ((i + 0.5) / N) * 100;\n const yEnd = ((i + 1) / N) * 100;\n d += ` L ${(100 - depthAt(i)).toFixed(3)} ${yMid.toFixed(3)} L 100 ${yEnd.toFixed(3)}`;\n }\n d += ` L 0 100`;\n for (let i = N - 1; i >= 0; i--) {\n const yMid = ((i + 0.5) / N) * 100;\n const yStart = (i / N) * 100;\n d += ` L ${depthAt(i + N).toFixed(3)} ${yMid.toFixed(3)} L 0 ${yStart.toFixed(3)}`;\n }\n return d + ' Z';\n}\n\nconst BASE_TOP = 2;\n\nconst Receipt: ShapeModule<ReceiptParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = receiptPath(cfg.teeth, cfg.tearDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.04) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: (params) => {\n const ratio = Math.max(0.2, Math.min(params.sideToTopRatio ?? DEFAULTS.sideToTopRatio, 10));\n const top = BASE_TOP;\n const side = Math.round(top * ratio);\n return { top, right: side, bottom: top, left: side };\n },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Receipt;\n","import type { ShapeModule } from '../types';\n\nconst body = 'M 8 30 Q 0 50 8 70 L 92 70 Q 100 50 92 30 Z';\n\nconst Wood: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && (\n <>\n {/* Long flowing grain curves */}\n <path className=\"badge-stroke\" d=\"M 12 38 Q 30 35 50 39 T 88 38\" opacity={0.5} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 46 Q 36 49 54 45 T 90 47\" opacity={0.4} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 12 54 Q 28 51 52 56 T 88 54\" opacity={0.55} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 62 Q 40 65 58 61 T 90 62\" opacity={0.4} fill=\"none\" />\n {/* Knots (concentric ellipses around a darker core) */}\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"3.4\" ry=\"2.8\" opacity={0.7} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"1.4\" ry=\"1.1\" opacity={0.85} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"70\" cy=\"42\" rx=\"2.4\" ry=\"2\" opacity={0.6} fill=\"none\" />\n </>\n )}\n {focused && (\n <path className=\"badge-focus\" d={body} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 10, right: 4, bottom: 10, left: 4 },\n stretches: true,\n};\n\nexport default Wood;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface QuatrefoilParams {\n spikeR?: number;\n lobeR?: number;\n valleyR?: number;\n valleyAt?: number;\n spikeCurvature?: number;\n spikeBend?: number;\n spikeTipErosion?: number;\n lobeCurvature?: number;\n lobeBend?: number;\n lobeTipErosion?: number;\n valleySmooth?: number;\n rotation?: number;\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nconst Quatrefoil: ShapeModule<QuatrefoilParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'quatrefoil', baseParams: cfg };\n },\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Quatrefoil;\n","import type { BadgeShape, ShapeModule } from '../types';\nimport Pill from './Pill';\nimport Plain from './Plain';\nimport Square, { type SquareParams } from './Square';\nimport Notched, { type NotchedParams } from './Notched';\nimport Perforated, { type PerforatedParams } from './Perforated';\nimport Hexagon, { type HexagonParams } from './Hexagon';\nimport Starburst, { type StarburstParams } from './Starburst';\nimport Scalloped, { type ScallopedParams } from './Scalloped';\nimport Shield, { type ShieldParams } from './Shield';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Beavis, { type BeavisParams } from './Beavis';\nimport Sparkler, { type SparklerParams } from './Sparkler';\nimport Postage, { type PostageParams } from './Postage';\nimport Cloud, { type CloudParams } from './Cloud';\nimport House, { type HouseParams } from './House';\nimport Plaque, { type PlaqueParams } from './Plaque';\nimport Crest, { type CrestParams } from './Crest';\nimport Urn from './Urn';\nimport Coffin, { type CoffinParams } from './Coffin';\nimport Receipt, { type ReceiptParams } from './Receipt';\nimport Wood from './Wood';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\n\nexport interface BadgeShapeParams {\n pill: Record<string, never>;\n plain: Record<string, never>;\n square: SquareParams;\n notched: NotchedParams;\n perforated: PerforatedParams;\n hexagon: HexagonParams;\n starburst: StarburstParams;\n scalloped: ScallopedParams;\n shield: ShieldParams;\n ribbon: RibbonParams;\n beavis: BeavisParams;\n sparkler: SparklerParams;\n postage: PostageParams;\n cloud: CloudParams;\n house: HouseParams;\n plaque: PlaqueParams;\n crest: CrestParams;\n urn: Record<string, never>;\n coffin: CoffinParams;\n receipt: ReceiptParams;\n wood: Record<string, never>;\n quatrefoil: QuatrefoilParams;\n}\n\nexport const SHAPES: Record<BadgeShape, ShapeModule<any>> = {\n pill: Pill,\n plain: Plain,\n square: Square,\n notched: Notched,\n perforated: Perforated,\n hexagon: Hexagon,\n starburst: Starburst,\n scalloped: Scalloped,\n shield: Shield,\n ribbon: Ribbon,\n beavis: Beavis,\n sparkler: Sparkler,\n postage: Postage,\n cloud: Cloud,\n house: House,\n plaque: Plaque,\n crest: Crest,\n urn: Urn,\n coffin: Coffin,\n receipt: Receipt,\n wood: Wood,\n quatrefoil: Quatrefoil,\n};\n\nexport const ALL_SHAPES: BadgeShape[] = [\n 'pill', 'plain', 'square', 'notched', 'perforated',\n 'hexagon',\n 'starburst', 'scalloped', 'shield', 'ribbon', 'beavis',\n 'sparkler', 'postage', 'cloud', 'house', 'plaque',\n 'crest', 'urn', 'coffin', 'receipt', 'wood', 'quatrefoil',\n];\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface ChamferedRectParams {\n /** CSS px length of each 45° corner chamfer. */\n chamfer?: number;\n}\n\nconst DEFAULTS: Required<ChamferedRectParams> = { chamfer: 6 };\n\nconst ChamferedRect: BaseModule<ChamferedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n // Chamfer per axis (CSS px → viewBox per-axis).\n const cx = cfg.chamfer * sx;\n const cy = cfg.chamfer * sy;\n // 8 vertices traced clockwise from top-left chamfer start.\n const verts: [number, number][] = [\n [cx, 0],\n [100 - cx, 0],\n [100, cy],\n [100, 100 - cy],\n [100 - cx, 100],\n [cx, 100],\n [0, 100 - cy],\n [0, cy],\n ];\n // Pre-compute CSS lengths of each segment and cumulative sums.\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n // Outward normal: edge direction in CSS rotated 90° clockwise.\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n // Going clockwise around the body, outward = (-tangent_y, tangent_x)... actually\n // for clockwise traversal in SVG (y-down), outward is to the LEFT of direction,\n // which is (ey, -ex) normalised.\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default ChamferedRect;\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface RoundedRectParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill / ellipse). */\n erosion?: number;\n /** Stretch the corner arcs horizontally vs vertically. 1 = circular at the badge's\n * native aspect; >1 wider corner arcs; <1 taller corner arcs. */\n eccentricity?: number;\n /** 0..1 vertical squeeze applied to the left and right ends, linearly tapering toward\n * the middle. 1 = ends fully collapsed to the centerline (lemon/lens silhouette). */\n pinch?: number;\n}\n\nconst DEFAULTS: Required<RoundedRectParams> = { erosion: 0.16, eccentricity: 1, pinch: 0 };\n\nconst RoundedRect: BaseModule<RoundedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const erosion = Math.max(0, Math.min(cfg.erosion, 1));\n const ecc = Math.max(0.1, Math.min(cfg.eccentricity, 10));\n // Max corner radius in CSS = half of the shorter axis (so erosion=1 gives a full pill/ellipse).\n const cornerCss = erosion * (Math.min(boxW, boxH) / 2);\n const rxC = cornerCss * sx * ecc;\n const ryC = cornerCss * sy / ecc;\n const rx = Math.max(0, Math.min(rxC, 50));\n const ry = Math.max(0, Math.min(ryC, 50));\n\n const topCss = (100 - 2 * rx) / sx;\n const sideCss = (100 - 2 * ry) / sy;\n const denom = cornerCss + cornerCss || 1;\n const hh = 0;\n const arcCss = (Math.PI * denom * (1 + 3 * hh / (10 + Math.sqrt(4 - 3 * hh)))) / 4;\n\n const segments = [\n { kind: 'h-edge', cssLen: topCss },\n { kind: 'tr-arc', cssLen: arcCss },\n { kind: 'v-edge', cssLen: sideCss },\n { kind: 'br-arc', cssLen: arcCss },\n { kind: 'h-edge-b', cssLen: topCss },\n { kind: 'bl-arc', cssLen: arcCss },\n { kind: 'v-edge-l', cssLen: sideCss },\n { kind: 'tl-arc', cssLen: arcCss },\n ];\n const cum: number[] = [0];\n for (const s of segments) cum.push(cum[cum.length - 1] + s.cssLen);\n const totalCss = cum[cum.length - 1];\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n let segIdx = 0;\n while (segIdx < segments.length - 1 && sm > cum[segIdx + 1]) segIdx++;\n const local = sm - cum[segIdx];\n const seg = segments[segIdx];\n const t = seg.cssLen > 0 ? local / seg.cssLen : 0;\n switch (seg.kind) {\n case 'h-edge':\n return { x: rx + (100 - 2 * rx) * t, y: 0, nx: 0, ny: -1 };\n case 'tr-arc': {\n const ang = -Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge':\n return { x: 100, y: ry + (100 - 2 * ry) * t, nx: 1, ny: 0 };\n case 'br-arc': {\n const ang = t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'h-edge-b':\n return { x: (100 - rx) - (100 - 2 * rx) * t, y: 100, nx: 0, ny: 1 };\n case 'bl-arc': {\n const ang = Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge-l':\n return { x: 0, y: (100 - ry) - (100 - 2 * ry) * t, nx: -1, ny: 0 };\n case 'tl-arc': {\n const ang = Math.PI + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n }\n return { x: 0, y: 0, nx: 0, ny: -1 };\n };\n\n // Vertical pinch toward the centerline, parameterised by horizontal distance from x=50.\n // pinch=0 → identity; pinch=1 → collapses the left/right ends to y=50.\n // Erosion supersedes pinch: as the corners round into a full ellipse there's nothing\n // structurally left to pinch (the ends already taper to the centerline). Scale by\n // (1 - erosion) so a fully pilled badge ignores the slider.\n const pinch = Math.max(0, Math.min(cfg.pinch, 1)) * (1 - erosion);\n const pinchY = (x: number, y: number): number => {\n if (pinch === 0) return y;\n const d = Math.abs(x - 50) / 50;\n return 50 + (y - 50) * (1 - d * pinch);\n };\n\n let bodyPath: string;\n let perimeterAtFinal = perimeterAt;\n if (pinch === 0) {\n bodyPath = [\n `M ${rx} 0`,\n `L ${100 - rx} 0`,\n `A ${rx} ${ry} 0 0 1 100 ${ry}`,\n `L 100 ${100 - ry}`,\n `A ${rx} ${ry} 0 0 1 ${100 - rx} 100`,\n `L ${rx} 100`,\n `A ${rx} ${ry} 0 0 1 0 ${100 - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 1 ${rx} 0`,\n 'Z',\n ].join(' ');\n } else {\n // Sample the unpinched perimeter densely and apply the y-pinch to each point.\n const N = 240;\n const samplePts: { x: number; y: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i / N) * totalCss;\n const pt = perimeterAt(sCss);\n samplePts.push({ x: pt.x, y: pinchY(pt.x, pt.y) });\n }\n bodyPath = samplePts.reduce((acc, p, i) =>\n acc + (i === 0 ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}` : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n '') + ' Z';\n\n // Warped perimeterAt: pinched point + normal recomputed from local warped tangent.\n perimeterAtFinal = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = perimeterAt(sm);\n const x = pt.x;\n const y = pinchY(pt.x, pt.y);\n const eps = totalCss / 480;\n const a = perimeterAt(sm - eps);\n const b = perimeterAt(sm + eps);\n const ax = a.x, ay = pinchY(a.x, a.y);\n const bx = b.x, by = pinchY(b.x, b.y);\n const tx = (bx - ax) / sx;\n const ty = (by - ay) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n return { x, y, nx: ty / tl, ny: -tx / tl };\n };\n }\n\n const sampler: BaseSampler = { bodyPath, perimeterAt: perimeterAtFinal, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default RoundedRect;\n","import type { BaseSampler, PerimeterPoint } from './types';\n\n/** Build a BaseSampler from a clockwise polygon's vertex list (viewBox 0..100). */\nexport function polygonSampler(verts: [number, number][], boxW: number, boxH: number): BaseSampler {\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n return { bodyPath, perimeterAt, totalCss };\n}\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport interface PolygonParams {\n /** Vertices in viewBox 0..100 coordinates, traced clockwise. */\n vertices?: [number, number][];\n}\n\nconst DEFAULT_VERTS: [number, number][] = [\n [0, 0], [100, 0], [100, 100], [0, 100],\n];\n\nconst Polygon: BaseModule<PolygonParams> = {\n build: (params, boxW, boxH) => {\n const verts = (params?.vertices && params.vertices.length >= 3) ? params.vertices : DEFAULT_VERTS;\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: { vertices: DEFAULT_VERTS },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default Polygon;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type PuzzleEdge = 'flat' | 'out' | 'in';\n\nexport interface PuzzleParams {\n top?: PuzzleEdge;\n right?: PuzzleEdge;\n bottom?: PuzzleEdge;\n left?: PuzzleEdge;\n /** Tab radius in viewBox units (0..50). */\n tabSize?: number;\n /** Sample density per tab arc. */\n arcSamples?: number;\n}\n\nconst DEFAULTS: Required<PuzzleParams> = {\n top: 'out',\n right: 'in',\n bottom: 'out',\n left: 'in',\n tabSize: 12,\n arcSamples: 18,\n};\n\n// Fraction of the tab radius the tab center sits beyond the body edge. A center offset of\n// `OFFSET_RATIO * r` gives a tab whose chord (intersection with the edge) has half-length\n// √(1 − OFFSET_RATIO²) · r. Smaller offset → wider neck.\nconst OFFSET_RATIO = 0.62;\n\n/** Sample a side's vertices walking clockwise from `start` to `end` along the edge, possibly\n * detouring around a tab. The starting vertex `start` is NOT included; the ending vertex `end`\n * IS included so successive edge calls chain cleanly. */\nfunction edgeVertices(\n start: [number, number],\n end: [number, number],\n outwardX: number,\n outwardY: number,\n type: PuzzleEdge,\n tabR: number,\n arcSamples: number,\n): [number, number][] {\n if (type === 'flat') return [end];\n const sign = type === 'out' ? 1 : -1;\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const len = Math.hypot(dx, dy) || 1;\n const tx = dx / len;\n const ty = dy / len;\n const mx = (start[0] + end[0]) / 2;\n const my = (start[1] + end[1]) / 2;\n const cx = mx + outwardX * sign * tabR * OFFSET_RATIO;\n const cy = my + outwardY * sign * tabR * OFFSET_RATIO;\n const half = tabR * Math.sqrt(Math.max(0, 1 - OFFSET_RATIO * OFFSET_RATIO));\n const p1: [number, number] = [mx - tx * half, my - ty * half];\n const p2: [number, number] = [mx + tx * half, my + ty * half];\n const apex: [number, number] = [\n mx + outwardX * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n my + outwardY * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n ];\n const r = Math.hypot(p1[0] - cx, p1[1] - cy);\n const θ1 = Math.atan2(p1[1] - cy, p1[0] - cx);\n const θ2 = Math.atan2(p2[1] - cy, p2[0] - cx);\n const θApex = Math.atan2(apex[1] - cy, apex[0] - cx);\n // Choose the arc direction that sweeps through θApex.\n const TAU = Math.PI * 2;\n const apexFromStart = ((θApex - θ1) % TAU + TAU) % TAU;\n const endFromStart = ((θ2 - θ1) % TAU + TAU) % TAU;\n // If the CCW sweep covers apex before reaching θ2, use CCW; otherwise CW.\n const sweep = apexFromStart < endFromStart ? endFromStart : endFromStart - TAU;\n\n const out: [number, number][] = [];\n out.push(p1);\n for (let i = 1; i <= arcSamples; i++) {\n const t = i / arcSamples;\n const θ = θ1 + sweep * t;\n out.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n out.push(end);\n return out;\n}\n\nconst Puzzle: BaseModule<PuzzleParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const r = Math.max(2, Math.min(cfg.tabSize, 40));\n const N = Math.max(6, Math.floor(cfg.arcSamples));\n // Clockwise traversal of the unit rect: TL → TR → BR → BL → TL.\n const TL: [number, number] = [0, 0];\n const TR: [number, number] = [100, 0];\n const BR: [number, number] = [100, 100];\n const BL: [number, number] = [0, 100];\n const verts: [number, number][] = [TL];\n verts.push(...edgeVertices(TL, TR, 0, -1, cfg.top, r, N));\n verts.push(...edgeVertices(TR, BR, 1, 0, cfg.right, r, N));\n verts.push(...edgeVertices(BR, BL, 0, 1, cfg.bottom, r, N));\n verts.push(...edgeVertices(BL, TL, -1, 0, cfg.left, r, N));\n // Drop the trailing duplicate of TL.\n if (verts.length > 1 && verts[verts.length - 1][0] === TL[0] && verts[verts.length - 1][1] === TL[1]) {\n verts.pop();\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 12, right: 16, bottom: 12, left: 16 },\n};\n\nexport default Puzzle;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * 8-fold-symmetric polar shape. The whole silhouette is defined by a single curve r(s)\n * over s ∈ [0, 1], where s=0 is the cardinal direction and s=1 is the diagonal. The full\n * shape comes from reflecting that octant curve eight times around the center. The curve\n * itself is two superellipse segments meeting at a valley:\n *\n * s ∈ [0, valleyAt] → spike segment, from `spikeR` down to `valleyR`\n * s ∈ [valleyAt, 1] → lobe segment, from `valleyR` up to `lobeR`\n *\n * Each segment has its own curvature, bend bias, and tip-erosion controls.\n */\nexport interface QuatrefoilParams {\n /** Radius at s=0 (cardinal direction). */\n spikeR?: number;\n /** Radius at s=1 (diagonal direction). */\n lobeR?: number;\n /** Radius at the junction between spike and lobe segments. */\n valleyR?: number;\n /** Position of the junction in [0, 1]. 0.5 = symmetric octant; <0.5 narrows the spike side. */\n valleyAt?: number;\n /** Spike-segment curvature (superellipse exponent). 1 = flat diagonal sides; <1 caves\n * inward (concave/star); >1 bulges outward (convex/square-shouldered). */\n spikeCurvature?: number;\n /** Spike-segment bend bias. Positive shifts the curve's bend toward the tip; negative\n * toward the base. */\n spikeBend?: number;\n /** Flat-top truncation of the cardinal tip (0..1). */\n spikeTipErosion?: number;\n /** Lobe-segment curvature, same semantics as spike. */\n lobeCurvature?: number;\n /** Lobe-segment bend bias. */\n lobeBend?: number;\n /** Flat-top truncation of the diagonal lobe peak (0..1). */\n lobeTipErosion?: number;\n /** Smooth the corner at the valley junction. 0 = sharp, higher = puffier crossover. */\n valleySmooth?: number;\n /** Rotate the pattern in degrees. */\n rotation?: number;\n /** Polygon sample count. */\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nfunction smoothMax(a: number, b: number, g: number): number {\n const d = a - b;\n return (a + b + Math.sqrt(d * d + g * g)) / 2;\n}\n\n/** Generalised superellipse-style profile from (0, 0) to (1, 1) with asymmetric exponents\n * controlled by curvature and bend. erosion truncates the top of the curve. */\nfunction curveSegment(t: number, curvature: number, bend: number, erosion: number): number {\n if (t <= 0) return 0;\n if (t >= 1) return 1 - erosion;\n const expA = Math.max(0.1, curvature * (1 + bend));\n const expB = Math.max(0.1, curvature * (1 - bend));\n const v = Math.pow(1 - Math.pow(1 - t, expA), 1 / expB);\n return Math.min(v, 1 - erosion);\n}\n\nexport function quatrefoilVertices(params: QuatrefoilParams = {}): [number, number][] {\n const cfg = { ...DEFAULTS, ...params };\n const spike = Math.max(5, Math.min(cfg.spikeR, 50));\n const lobe = Math.max(5, Math.min(cfg.lobeR, 50 * Math.SQRT2));\n const valley = Math.max(0, Math.min(cfg.valleyR, Math.min(spike, lobe)));\n const vAt = Math.max(0.05, Math.min(cfg.valleyAt, 0.95));\n const sCurv = Math.max(0.2, cfg.spikeCurvature);\n const sBend = Math.max(-0.95, Math.min(cfg.spikeBend, 0.95));\n const sErode = Math.max(0, Math.min(cfg.spikeTipErosion, 1));\n const lCurv = Math.max(0.2, cfg.lobeCurvature);\n const lBend = Math.max(-0.95, Math.min(cfg.lobeBend, 0.95));\n const lErode = Math.max(0, Math.min(cfg.lobeTipErosion, 1));\n const smooth = Math.max(0, cfg.valleySmooth);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(24, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const s = Math.abs(Math.sin(2 * (θ - rot))); // 0..1 across each octant\n // t1: spike-side parameter, 1 at cardinal (s=0), 0 at valley (s=vAt). Clamped to ≥ 0.\n const t1 = (vAt - s) / vAt;\n // t2: lobe-side parameter, 0 at valley (s=vAt), 1 at diagonal (s=1). Clamped to ≥ 0.\n const t2 = (s - vAt) / (1 - vAt);\n const rSpike = valley + (spike - valley) * curveSegment(Math.max(0, t1), sCurv, sBend, sErode);\n const rLobe = valley + (lobe - valley) * curveSegment(Math.max(0, t2), lCurv, lBend, lErode);\n // Smooth corner at the valley: outside the smoothing band both rSpike and rLobe equal\n // `valley` on the inactive side, so smoothMax just picks the active one. Near the join\n // both are close to valley and smoothMax lifts the corner.\n const r = smoothMax(rSpike, rLobe, smooth);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return verts;\n}\n\nconst Quatrefoil: BaseModule<QuatrefoilParams> = {\n build: (params, boxW, boxH) => polygonSampler(quatrefoilVertices(params), boxW, boxH),\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default Quatrefoil;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar-spline base. The silhouette comes from a single curve r(s) over\n * s ∈ [0, 1] that gets reflected/rotated to fill the full circle:\n *\n * - `mode: 'octant'`: 1/8 of the perimeter (cardinal → diagonal), mirrored within each\n * quadrant and rotated to fill the rest. 8-fold symmetric.\n * - `mode: 'quadrant'`: 1/4 of the perimeter (cardinal → next cardinal), rotated 4 times\n * with no internal mirror. 4-fold rotational symmetry; endpoints share radius.\n *\n * The interpolant is a **clamped natural cubic spline** with zero slope at both endpoints\n * (so the reflected/rotated full curve has no kink crossing the symmetry axes). C² across\n * the whole octant — continuous curvature, not just slope — which removes the \"lumpy\" feel\n * that local Hermite splines have when anchors are uneven.\n */\nexport interface OctantSplineParams {\n mode?: 'octant' | 'quadrant';\n /** Number of active anchors (3..12). */\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n /** Per-anchor weight (0..3). The spline is constructed to pass through every anchor exactly;\n * the weight biases how strongly that anchor influences the rest of the curve. Implementation\n * detail: blends the C² interpolant with a polynomial fit weighted by w. Default 1 = pure\n * C² interpolation; <1 lets the curve sweep past the anchor (anchor still passed through);\n * >1 makes the curve hug the anchor more tightly (sharper local bend). */\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_SPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_SPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Solve the clamped natural cubic spline with zero end-slopes. Returns the second-derivative\n * vector M[0..n] which feeds the standard cubic-spline evaluation formula. Solves a\n * tridiagonal system in O(n).\n */\nfunction solveCubicSpline(anchors: Anchor[]): number[] {\n const n = anchors.length - 1;\n const h: number[] = new Array(n);\n for (let i = 0; i < n; i++) h[i] = Math.max(1e-9, anchors[i + 1].s - anchors[i].s);\n // Build tridiagonal system for M[0..n] with clamped zero-slope BCs.\n // row 0: (h0/3) M0 + (h0/6) M1 = (r1-r0)/h0\n // row i (1..n-1): (h_{i-1}/6) M_{i-1} + ((h_{i-1}+h_i)/3) M_i + (h_i/6) M_{i+1}\n // = (r_{i+1}-r_i)/h_i - (r_i-r_{i-1})/h_{i-1}\n // row n: (h_{n-1}/6) M_{n-1} + (h_{n-1}/3) M_n = -(r_n-r_{n-1})/h_{n-1}\n const a: number[] = new Array(n + 1); // subdiagonal\n const b: number[] = new Array(n + 1); // diagonal\n const c: number[] = new Array(n + 1); // superdiagonal\n const d: number[] = new Array(n + 1); // rhs\n a[0] = 0;\n b[0] = h[0] / 3;\n c[0] = h[0] / 6;\n d[0] = (anchors[1].r - anchors[0].r) / h[0];\n for (let i = 1; i < n; i++) {\n a[i] = h[i - 1] / 6;\n b[i] = (h[i - 1] + h[i]) / 3;\n c[i] = h[i] / 6;\n d[i] = (anchors[i + 1].r - anchors[i].r) / h[i] - (anchors[i].r - anchors[i - 1].r) / h[i - 1];\n }\n a[n] = h[n - 1] / 6;\n b[n] = h[n - 1] / 3;\n c[n] = 0;\n d[n] = -(anchors[n].r - anchors[n - 1].r) / h[n - 1];\n // Thomas algorithm: forward sweep, then back-substitution.\n for (let i = 1; i <= n; i++) {\n const w = a[i] / b[i - 1];\n b[i] -= w * c[i - 1];\n d[i] -= w * d[i - 1];\n }\n const M: number[] = new Array(n + 1);\n M[n] = d[n] / b[n];\n for (let i = n - 1; i >= 0; i--) M[i] = (d[i] - c[i] * M[i + 1]) / b[i];\n return M;\n}\n\ninterface CompiledSpline {\n anchors: Anchor[];\n M: number[];\n}\n\nexport function compileSpline(anchors: Anchor[]): CompiledSpline {\n return { anchors, M: solveCubicSpline(anchors) };\n}\n\nexport function evalCompiled(s: number, spline: CompiledSpline): number {\n const { anchors, M } = spline;\n const N = anchors.length;\n if (N === 0) return 0;\n if (N === 1) return anchors[0].r;\n if (s <= anchors[0].s) return anchors[0].r;\n if (s >= anchors[N - 1].s) return anchors[N - 1].r;\n let i = 0;\n while (i < N - 1 && anchors[i + 1].s <= s) i++;\n const p0 = anchors[i];\n const p1 = anchors[i + 1];\n const h = p1.s - p0.s;\n if (h <= 0) return p0.r;\n const A = (p1.s - s) / h;\n const B = (s - p0.s) / h;\n // Apply per-anchor weight as a local sharpening factor on the C² interpolant. With both\n // weights = 1 this is pure natural cubic spline. Weights > 1 add a centered \"lift\" toward\n // the anchor (sharpens), < 1 subtracts (smooths past). The lift kernel is the standard\n // cubic-spline second-derivative term, scaled per-side by (w - 1).\n const liftA = ((A * A * A - A) * h * h) / 6;\n const liftB = ((B * B * B - B) * h * h) / 6;\n const baseLine = A * p0.r + B * p1.r;\n const curvatureTerm = liftA * M[i] * p0.w + liftB * M[i + 1] * p1.w;\n return baseLine + curvatureTerm;\n}\n\nconst OctantSpline: BaseModule<OctantSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const spline = compileSpline(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalCompiled(s, spline);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar NURBS base. Same anchor concept as `octant-spline` but the curve is an\n * **approximating** cubic NURBS — the control points pull the curve without sitting on it.\n * Each anchor's weight increases the local pull toward that control point.\n *\n * Endpoint behaviour: the curve uses mirror-phantom control points just outside [0, 1]\n * derived from the second-from-end anchors, which enforces zero slope at s=0 and s=1 so\n * the reflected/rotated full silhouette closes cleanly across the symmetry axes.\n */\nexport interface OctantBSplineParams {\n mode?: 'octant' | 'quadrant';\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_BSPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantBSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantBSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_BSPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantBSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantBSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantBSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0.01, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Cubic NURBS evaluation. Returns r at parameter u ∈ [0, 1].\n *\n * Implementation uses (s_i, r_i, w_i) as control points and treats `u` as the underlying\n * curve parameter, with the knot vector clamped at both ends. Because the control points'\n * `s` coordinates are themselves part of the curve, we need a parametric formulation:\n * S(u) = Σ w_i N_i(u) s_i / Σ w_i N_i(u)\n * R(u) = Σ w_i N_i(u) r_i / Σ w_i N_i(u)\n * Then we invert S(u) = s to get u and read out R(u).\n *\n * Two phantom control points are inserted at each end (mirror reflections of the second-\n * from-end anchors across the cardinal/diagonal axes), forcing zero slope at the endpoints\n * for clean symmetric closure.\n */\nfunction buildExtendedControls(anchors: Anchor[]): Anchor[] {\n const N = anchors.length;\n // Phantom controls outside [0, 1]. They are mirrored versions of the second-from-end\n // visible anchors. Symmetric reflection gives zero slope at the cardinal/diagonal endpoints.\n const phantomLeft1: Anchor = { s: -anchors[1].s, r: anchors[1].r, w: anchors[1].w };\n const phantomLeft2: Anchor = { s: -anchors[Math.min(2, N - 1)].s, r: anchors[Math.min(2, N - 1)].r, w: anchors[Math.min(2, N - 1)].w };\n const phantomRight1: Anchor = { s: 2 - anchors[N - 2].s, r: anchors[N - 2].r, w: anchors[N - 2].w };\n const phantomRight2: Anchor = { s: 2 - anchors[Math.max(N - 3, 0)].s, r: anchors[Math.max(N - 3, 0)].r, w: anchors[Math.max(N - 3, 0)].w };\n return [phantomLeft2, phantomLeft1, ...anchors, phantomRight1, phantomRight2];\n}\n\nfunction buildKnots(numCtrl: number, degree: number): number[] {\n // Clamped uniform knot vector of length numCtrl + degree + 1.\n const m = numCtrl + degree + 1;\n const knots: number[] = new Array(m);\n for (let i = 0; i <= degree; i++) knots[i] = 0;\n const interior = numCtrl - degree - 1;\n for (let i = 1; i <= interior; i++) knots[degree + i] = i / (interior + 1);\n for (let i = m - degree - 1; i < m; i++) knots[i] = 1;\n return knots;\n}\n\nfunction findSpan(u: number, knots: number[], degree: number, numCtrl: number): number {\n if (u >= knots[numCtrl]) return numCtrl - 1;\n if (u <= knots[degree]) return degree;\n let low = degree;\n let high = numCtrl;\n let mid = (low + high) >>> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) high = mid;\n else low = mid;\n mid = (low + high) >>> 1;\n }\n return mid;\n}\n\nfunction basisFns(span: number, u: number, knots: number[], degree: number): number[] {\n const N: number[] = new Array(degree + 1).fill(0);\n const left: number[] = new Array(degree + 1);\n const right: number[] = new Array(degree + 1);\n N[0] = 1;\n for (let j = 1; j <= degree; j++) {\n left[j] = u - knots[span + 1 - j];\n right[j] = knots[span + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const denom = right[r + 1] + left[j - r];\n const temp = denom === 0 ? 0 : N[r] / denom;\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\ninterface CompiledNurbs {\n extended: Anchor[];\n knots: number[];\n degree: number;\n}\n\nexport function compileNurbs(anchors: Anchor[]): CompiledNurbs {\n const extended = buildExtendedControls(anchors);\n const degree = 3;\n const knots = buildKnots(extended.length, degree);\n return { extended, knots, degree };\n}\n\nfunction evalNurbsAtU(u: number, nurbs: CompiledNurbs): { s: number; r: number } {\n const { extended, knots, degree } = nurbs;\n const numCtrl = extended.length;\n const uClamped = Math.max(0, Math.min(1, u));\n const span = findSpan(uClamped, knots, degree, numCtrl);\n const N = basisFns(span, uClamped, knots, degree);\n let sNum = 0;\n let rNum = 0;\n let wSum = 0;\n for (let i = 0; i <= degree; i++) {\n const ctrl = extended[span - degree + i];\n const wn = ctrl.w * N[i];\n sNum += wn * ctrl.s;\n rNum += wn * ctrl.r;\n wSum += wn;\n }\n return wSum > 0 ? { s: sNum / wSum, r: rNum / wSum } : { s: 0, r: 0 };\n}\n\n/** Invert S(u) = s by bisection. The NURBS is monotonic in s because the underlying knot\n * vector and control sequence are monotonic, so bisection converges quickly. */\nexport function evalNurbsAtS(s: number, nurbs: CompiledNurbs): number {\n if (s <= 0) return evalNurbsAtU(0, nurbs).r;\n if (s >= 1) return evalNurbsAtU(1, nurbs).r;\n let lo = 0, hi = 1;\n for (let iter = 0; iter < 30; iter++) {\n const mid = (lo + hi) * 0.5;\n const { s: sMid } = evalNurbsAtU(mid, nurbs);\n if (sMid < s) lo = mid; else hi = mid;\n if (hi - lo < 1e-5) break;\n }\n return evalNurbsAtU((lo + hi) * 0.5, nurbs).r;\n}\n\nconst OctantBSpline: BaseModule<OctantBSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const nurbs = compileNurbs(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalNurbsAtS(s, nurbs);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantBSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. Stays fixed regardless of badge width — viewBox\n * vertices are computed at build time using `boxW`. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\ninterface SidePoints {\n top: [number, number];\n mid: [number, number] | null;\n bottom: [number, number];\n}\n\nfunction sidePoints(mode: RibbonEnd, xBaseVb: number, signVb: number, taperVb: number): SidePoints {\n switch (mode) {\n case 'flat':\n return { top: [xBaseVb, 0], mid: null, bottom: [xBaseVb, 100] };\n case 'outward':\n return {\n top: [xBaseVb + signVb * taperVb, 0],\n mid: [xBaseVb, 50],\n bottom: [xBaseVb + signVb * taperVb, 100],\n };\n case 'inward':\n return {\n top: [xBaseVb, 0],\n mid: [xBaseVb + signVb * taperVb, 50],\n bottom: [xBaseVb, 100],\n };\n }\n}\n\nfunction sideInsetCss(mode: RibbonEnd, taperCss: number): number {\n const t = Math.max(0, taperCss);\n switch (mode) {\n case 'flat': return 4;\n case 'outward': return Math.round(t * 0.7);\n case 'inward': return Math.round(t * 0.8);\n }\n}\n\nconst Ribbon: BaseModule<RibbonParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const taperCss = Math.max(0, cfg.taperWidth);\n // Convert CSS px taper into viewBox-x units so the rendered pointer\n // is the same CSS-px depth regardless of badge width.\n const taperVb = boxW > 0 ? (taperCss / boxW) * 100 : 0;\n const l = sidePoints(cfg.left, 0, 1, taperVb);\n const r = sidePoints(cfg.right, 100, -1, taperVb);\n const verts: [number, number][] = [l.top];\n verts.push(r.top);\n if (r.mid) verts.push(r.mid);\n verts.push(r.bottom);\n verts.push(l.bottom);\n if (l.mid) verts.push(l.mid);\n return polygonSampler(verts, boxW, boxH);\n },\n insets: (params) => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n top: 0,\n right: sideInsetCss(cfg.right, cfg.taperWidth),\n bottom: 0,\n left: sideInsetCss(cfg.left, cfg.taperWidth),\n };\n },\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","export type EdgeProfile = (t: number, depth: number) => number;\n\nexport type BuiltInEdgeName =\n | 'flat'\n | 'chevron'\n | 'slant'\n | 'slant-up'\n | 'round'\n | 'scallop'\n | 'concave-chevron';\n\nexport type EdgeCap = BuiltInEdgeName | EdgeProfile;\n\nexport const EDGE_PROFILES: Record<BuiltInEdgeName, EdgeProfile> = {\n flat: (_t, _d) => 0,\n chevron: (t, d) => (1 - Math.abs(t - 0.5) * 2) * d,\n slant: (t, d) => t * d,\n 'slant-up': (t, d) => (1 - t) * d,\n round: (t, d) => Math.sin(t * Math.PI) * d,\n scallop: (t, d) => Math.sin(t * Math.PI * 3) * 0.4 * d,\n 'concave-chevron': (t, d) => -(1 - Math.abs(t - 0.5) * 2) * d,\n};\n\nexport function resolveEdge(cap: EdgeCap): EdgeProfile {\n if (typeof cap === 'function') return cap;\n return EDGE_PROFILES[cap] ?? EDGE_PROFILES.flat;\n}\n","import { resolveEdge, type EdgeCap } from './edgeProfiles';\nimport type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface PowerlineParams {\n /** Profile for the left edge (the cap segment N inherits from segment N-1). */\n leftEdge?: EdgeCap;\n /** Profile for the right edge (this segment's own end cap). */\n rightEdge?: EdgeCap;\n /** Protrusion depth in CSS px (positive values stick out beyond the rect). */\n depth?: number;\n}\n\nconst DEFAULTS: Required<PowerlineParams> = {\n leftEdge: 'flat',\n rightEdge: 'flat',\n depth: 6,\n};\n\n// Samples per vertical edge. 64 is smooth enough for chevron/round caps and\n// cheap to evaluate; the perimeter is sampled once per `build` call.\nconst EDGE_SAMPLES = 64;\n\nconst Powerline: BaseModule<PowerlineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const left = resolveEdge(cfg.leftEdge);\n const right = resolveEdge(cfg.rightEdge);\n const depth = cfg.depth;\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n\n const pts: { x: number; y: number; nx: number; ny: number }[] = [];\n\n // Top corners follow the same edge profiles as the rest of the verticals,\n // so a profile that protrudes/cuts at t=0 (e.g. slant-up) doesn't introduce\n // a corner kink between the flat top and the first vertical sample.\n pts.push({ x: left(0, depth) * sx, y: 0, nx: 0, ny: -1 });\n pts.push({ x: (boxW + right(0, depth)) * sx, y: 0, nx: 0, ny: -1 });\n\n for (let i = 1; i < EDGE_SAMPLES; i++) {\n const t = i / EDGE_SAMPLES;\n const xCss = boxW + right(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: 1, ny: 0 });\n }\n\n pts.push({ x: (boxW + right(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n pts.push({ x: (0 + left(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n\n for (let i = EDGE_SAMPLES - 1; i >= 1; i--) {\n const t = i / EDGE_SAMPLES;\n const xCss = 0 + left(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: -1, ny: 0 });\n }\n\n const cum: number[] = [0];\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1];\n const b = pts[i];\n const dxCss = (b.x - a.x) / sx;\n const dyCss = (b.y - a.y) / sy;\n cum.push(cum[i - 1] + Math.hypot(dxCss, dyCss));\n }\n const last = pts[pts.length - 1];\n const first = pts[0];\n const closeLen = Math.hypot((first.x - last.x) / sx, (first.y - last.y) / sy);\n const totalCss = cum[cum.length - 1] + closeLen;\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 1; i < pts.length; i++) {\n if (sm <= cum[i]) {\n const segLen = cum[i] - cum[i - 1];\n const t = segLen > 0 ? (sm - cum[i - 1]) / segLen : 0;\n const a = pts[i - 1];\n const b = pts[i];\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n nx: b.nx,\n ny: b.ny,\n };\n }\n }\n const lastIdx = pts.length - 1;\n const segLen = closeLen;\n const t = segLen > 0 ? (sm - cum[lastIdx]) / segLen : 0;\n return {\n x: pts[lastIdx].x + (first.x - pts[lastIdx].x) * t,\n y: pts[lastIdx].y + (first.y - pts[lastIdx].y) * t,\n nx: 0,\n ny: 1,\n };\n };\n\n const bodyPath = pts.reduce(\n (acc, p, i) =>\n acc + (i === 0\n ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}`\n : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n ''\n ) + ' Z';\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: (params) => {\n const depth = params?.depth ?? DEFAULTS.depth;\n const leftCap = params?.leftEdge ?? DEFAULTS.leftEdge;\n const rightCap = params?.rightEdge ?? DEFAULTS.rightEdge;\n const left = resolveEdge(leftCap);\n const right = resolveEdge(rightCap);\n // Sample the profiles to compute (a) each side's average offset, used to\n // shift padding so text reads centered in the visible silhouette (not the\n // bounding rect), and (b) each side's deepest inward cut, the floor below\n // which padding mustn't drop or text would crash into the cap.\n // Trapezoid integration over [0, 1] — exact for piecewise-linear profiles\n // (chevron, slant, slant-up) and accurate enough for the curved ones.\n const N = 32;\n let avgLeft = 0;\n let avgRight = 0;\n let maxLeftInward = 0;\n let maxRightInward = 0;\n for (let i = 0; i <= N; i++) {\n const t = i / N;\n const l = left(t, depth);\n const r = right(t, depth);\n const w = i === 0 || i === N ? 0.5 : 1;\n avgLeft += (w * l) / N;\n avgRight += (w * r) / N;\n if (l > maxLeftInward) maxLeftInward = l;\n if (-r > maxRightInward) maxRightInward = -r;\n }\n // Desired asymmetry: padLeft - padRight = avgLeft + avgRight (so the text\n // centroid sits at the silhouette's centroid). Hold padLeft + padRight = 2 * depth.\n const shift = (avgLeft + avgRight) / 2;\n const leftPad = Math.max(maxLeftInward, depth + shift);\n const rightPad = Math.max(maxRightInward, depth - shift);\n return { top: 0, right: rightPad, bottom: 0, left: leftPad };\n },\n};\n\nexport default Powerline;\n","import type { BaseModule } from './types';\nimport ChamferedRect, { type ChamferedRectParams } from './ChamferedRect';\nimport RoundedRect, { type RoundedRectParams } from './RoundedRect';\nimport Polygon, { type PolygonParams } from './Polygon';\nimport Puzzle, { type PuzzleParams } from './Puzzle';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\nimport OctantSpline, { type OctantSplineParams } from './OctantSpline';\nimport OctantBSpline, { type OctantBSplineParams } from './OctantBSpline';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Powerline, { type PowerlineParams } from './Powerline';\n\nexport type BadgeBase =\n | 'chamfered-rect'\n | 'rounded-rect'\n | 'polygon'\n | 'puzzle'\n | 'quatrefoil'\n | 'octant-spline'\n | 'octant-bspline'\n | 'ribbon'\n | 'powerline';\n\nexport interface BadgeBaseParams {\n 'chamfered-rect': ChamferedRectParams;\n 'rounded-rect': RoundedRectParams;\n 'polygon': PolygonParams;\n 'puzzle': PuzzleParams;\n 'quatrefoil': QuatrefoilParams;\n 'octant-spline': OctantSplineParams;\n 'octant-bspline': OctantBSplineParams;\n 'ribbon': RibbonParams;\n 'powerline': PowerlineParams;\n}\n\nexport const BASES: Record<BadgeBase, BaseModule<any>> = {\n 'chamfered-rect': ChamferedRect,\n 'rounded-rect': RoundedRect,\n 'polygon': Polygon,\n 'puzzle': Puzzle,\n 'quatrefoil': Quatrefoil,\n 'octant-spline': OctantSpline,\n 'octant-bspline': OctantBSpline,\n 'ribbon': Ribbon,\n 'powerline': Powerline,\n};\n","/**\n * Common range filter used by offsetAt-style effects. `range` is `[start, end]` as\n * fractions of `totalCss` in `[0, 1]`, where `end > start` includes a single contiguous\n * segment and `end < start` wraps around the closing point of the perimeter. Returns\n * the multiplier 1 inside the range and 0 outside (no feather yet — kept simple).\n */\nexport function rangeMask(s: number, totalCss: number, range?: [number, number]): number {\n if (!range) return 1;\n const [a, b] = range;\n if (a === b) return 0;\n const u = (((s % totalCss) + totalCss) % totalCss) / totalCss;\n if (a < b) return u >= a && u <= b ? 1 : 0;\n // Wrapping range like [0.9, 0.1].\n return u >= a || u <= b ? 1 : 0;\n}\n\nexport interface RangeMaskParams {\n /** Optional `[start, end]` as fractions of totalCss (0..1). Restricts the effect to a\n * contiguous slice of the perimeter; `end < start` wraps around. */\n range?: [number, number];\n}\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface SpikesEffectParams extends RangeMaskParams {\n count?: number;\n length?: number;\n baseWidth?: number;\n vertScale?: number;\n horzScale?: number;\n diagonalScale?: number;\n irregularity?: number;\n /**\n * 0..1 strength of curvature-based shortening on corners. At 1 we fully cancel the tip-arc\n * expansion `(1 + κL)` so neighbouring spike tips stay roughly evenly spaced even on tight\n * corner arcs; at 0 spikes are constant length and visibly fan outward around corners.\n */\n cornerCompensation?: number;\n}\n\nconst DEFAULTS: Required<Omit<SpikesEffectParams, 'range'>> = {\n count: 44,\n length: 8,\n baseWidth: 3,\n vertScale: 1.4,\n horzScale: 1,\n diagonalScale: 0.5,\n irregularity: 0,\n cornerCompensation: 1,\n};\n\nconst Spikes: EffectModule<SpikesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(3, Math.floor(cfg.count));\n const step = totalCss / N;\n const halfBase = Math.max(0.1, Math.min(step / 2 - 0.05, cfg.baseWidth / 2));\n const phaseOffset = phase * step;\n // Find the nearest spike center on the unwrapped axis, then wrap.\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n // Use shortest-distance metric on a closed perimeter.\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n if (Math.abs(ds) > halfBase) return { dx: 0, dy: 0 };\n // Triangular: peak at ds=0, zero at the base edges.\n const t = 1 - Math.abs(ds) / halfBase;\n const pCenter = perimeterAt(sc);\n // Use the actual perimeter normal — no 45° quantization, so spike angles\n // sweep smoothly through corner arcs.\n const dirX = pCenter.nx;\n const dirY = pCenter.ny;\n // Smoothly blend axis (vert/horz) and diagonal scales by how diagonal the\n // normal points. d = |sin(2θ)| ∈ [0,1]: 0 on the cardinal axes, 1 at 45°.\n const nxAbs = Math.abs(pCenter.nx);\n const nyAbs = Math.abs(pCenter.ny);\n const d = Math.min(1, 2 * nxAbs * nyAbs);\n const axisScale = nyAbs > nxAbs ? cfg.vertScale : cfg.horzScale;\n const scale = axisScale * (1 - d) + cfg.diagonalScale * d;\n const irrMult = 1 + cfg.irregularity * 0.5 * Math.sin(i * 1.73 + 0.7);\n // Numerical curvature κ ≈ |dn/ds| in CSS units. We average over a window roughly the\n // size of a spike footprint so the corner's influence smoothly bleeds onto adjacent\n // flat-edge samples instead of switching off at the arc boundary.\n const eps = Math.max(step * 0.5, halfBase);\n const SAMPLES = 5;\n let kappa = 0;\n for (let k = 0; k < SAMPLES; k++) {\n const u = (k + 0.5) / SAMPLES; // 0..1 across the window\n const sA = sc - eps + u * 2 * eps - eps / SAMPLES;\n const sB = sc - eps + u * 2 * eps + eps / SAMPLES;\n const pA = perimeterAt(sA);\n const pB = perimeterAt(sB);\n kappa += Math.hypot(pB.nx - pA.nx, pB.ny - pA.ny) / (sB - sA);\n }\n kappa /= SAMPLES;\n const baseLen = cfg.length * scale * irrMult * t;\n const comp = Math.max(0, Math.min(cfg.cornerCompensation, 1));\n const lenCss = Math.max(0, baseLen / (1 + comp * kappa * baseLen)) * mask;\n return { dx: dirX * lenCss, dy: dirY * lenCss };\n },\n defaults: DEFAULTS,\n};\n\nexport default Spikes;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PuffsEffectParams extends RangeMaskParams {\n bumpWidth?: number;\n puffiness?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<PuffsEffectParams, 'range'>> = {\n bumpWidth: 18,\n puffiness: 10,\n irregularity: 0,\n};\n\nconst Puffs: EffectModule<PuffsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(2, Math.round(totalCss / Math.max(6, cfg.bumpWidth)));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.floor((sm - phaseOffset) / step);\n const puffStart = i * step + phaseOffset;\n let t = (sm - puffStart) / step;\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localPy = Math.max(0.5, cfg.puffiness) * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n const disp = localPy * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Puffs;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface BitesEffectParams extends RangeMaskParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<BitesEffectParams, 'range'>> = {\n biteRadius: 3,\n biteSpacing: 8,\n irregularity: 0,\n};\n\nconst Bites: EffectModule<BitesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const br = Math.max(0.5, cfg.biteRadius);\n const bs = Math.max(2 * br + 0.5, cfg.biteSpacing);\n const N = Math.max(2, Math.floor(totalCss / bs));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = br * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Triangular inward dent: deepest at ds=0 (peak −localR), zero at ds=±localR.\n const t = 1 - Math.abs(ds) / localR;\n const inward = -localR * t;\n const pt = perimeterAt(s);\n return { dx: pt.nx * inward * mask, dy: pt.ny * inward * mask };\n },\n defaults: DEFAULTS,\n};\n\nexport default Bites;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface ScallopsEffectParams extends RangeMaskParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<ScallopsEffectParams, 'range'>> = {\n scallopRadius: 4,\n scallopSpacing: 10,\n irregularity: 0,\n};\n\nconst Scallops: EffectModule<ScallopsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const sr = Math.max(0.5, cfg.scallopRadius);\n const ss = Math.max(2 * sr + 0.5, cfg.scallopSpacing);\n const N = Math.max(2, Math.floor(totalCss / ss));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = sr * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Half-circle outward: peak at ds=0 = localR; zero at ±localR.\n const t = (ds + localR) / (2 * localR);\n const disp = localR * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Scallops;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface BevelEffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Which corner the light originates from (drives the highlight/shadow distribution across edges). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<BevelEffectParams> = { bevelWidth: 6, lightFrom: 'tl' };\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nfunction sideForNormal(nx: number, ny: number): Side {\n return Math.abs(ny) > Math.abs(nx)\n ? (ny < 0 ? 'top' : 'bottom')\n : (nx < 0 ? 'left' : 'right');\n}\n\nfunction bevelClasses(lightFrom: Corner): Record<Side, string> {\n const isTop = lightFrom[0] === 't';\n const isLeft = lightFrom[1] === 'l';\n return {\n top: isTop ? 'badge-bevel-light' : 'badge-bevel-dark',\n bottom: isTop ? 'badge-bevel-dark' : 'badge-bevel-light',\n left: isLeft ? 'badge-bevel-medium-light' : 'badge-bevel-medium-dark',\n right: isLeft ? 'badge-bevel-medium-dark' : 'badge-bevel-medium-light',\n };\n}\n\nconst SAMPLES = 240;\n\nconst Bevel: EffectModule<BevelEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cls = bevelClasses(cfg.lightFrom);\n const total = sampler.totalCss;\n\n // Sample outer + inset rings; tag each sample with the side it belongs to.\n const outer: { x: number; y: number; side: Side }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n outer.push({ x: pt.x, y: pt.y, side: sideForNormal(pt.nx, pt.ny) });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n // Group consecutive samples sharing a side into runs (wrap-aware).\n interface Run { side: Side; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const side = outer[i].side;\n if (!cur || cur.side !== side) {\n cur = { side, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n // Merge first and last runs if they wrap and share a side.\n if (runs.length > 1 && runs[0].side === runs[runs.length - 1].side) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n const outerPts = run.idxs.map((i) => outer[i]);\n const innerPts = run.idxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n if (pts.length === 0) return '';\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={cls[run.side]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface SheenEffectParams {\n lightFrom?: Corner;\n /** Peak gradient opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<SheenEffectParams> = { lightFrom: 'tl', intensity: 0.22 };\n\n// Gradient runs from the shadow corner (0%) to the lit corner (100%).\nconst FACE_COORDS: Record<Corner, { x1: string; y1: string; x2: string; y2: string }> = {\n tl: { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n tr: { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n bl: { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n br: { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n};\n\nconst Sheen: EffectModule<SheenEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const gradId = useId();\n const clipId = useId();\n const peak = Math.max(0, Math.min(cfg.intensity, 1));\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} {...FACE_COORDS[cfg.lightFrom]}>\n <stop offset=\"0%\" stopColor=\"black\" stopOpacity={peak} />\n <stop offset=\"45%\" stopColor=\"black\" stopOpacity=\"0.04\" />\n <stop offset=\"58%\" stopColor=\"white\" stopOpacity=\"0.04\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity={peak} />\n </linearGradient>\n </defs>\n <rect clipPath={`url(#${clipId})`} x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} style={{ pointerEvents: 'none' }} />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sheen;\n","import type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface RivetsEffectParams {\n /** Rivet radius in CSS px. */\n radius?: number;\n /** Inset from each corner in CSS px. */\n inset?: number;\n /** Light origin (drives which side of each rivet gets the highlight). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<RivetsEffectParams> = { radius: 2.4, inset: 7, lightFrom: 'tl' };\n\nconst Rivets: EffectModule<RivetsEffectParams> = {\n Component: ({ boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const rx = cfg.radius * sx;\n const ry = cfg.radius * sy;\n const ix = cfg.inset * sx;\n const iy = cfg.inset * sy;\n const litDx = cfg.lightFrom[1] === 'l' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const litDy = cfg.lightFrom[0] === 't' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const positions: [number, number][] = [\n [ix, iy],\n [100 - ix, iy],\n [ix, 100 - iy],\n [100 - ix, 100 - iy],\n ];\n return (\n <>\n {positions.map(([cx, cy], i) => (\n <g key={i}>\n <ellipse className=\"badge-bevel-dark\" cx={cx} cy={cy} rx={rx} ry={ry} />\n <ellipse className=\"badge-bevel-medium-dark\" cx={cx - litDx * 0.6 * sx} cy={cy - litDy * 0.6 * sy} rx={rx * 0.75} ry={ry * 0.75} />\n <ellipse className=\"badge-bevel-light\" cx={cx + litDx * sx} cy={cy + litDy * sy} rx={rx * 0.45} ry={ry * 0.45} />\n </g>\n ))}\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Rivets;\n","import type { EffectModule } from '../bases/types';\n\nexport interface ShadowEffectParams {\n /** Offset in CSS px. */\n dx?: number;\n dy?: number;\n /** Alpha 0..1. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<ShadowEffectParams> = { dx: 1, dy: 2, opacity: 0.28 };\n\nconst Shadow: EffectModule<ShadowEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const dxVb = cfg.dx * sx;\n const dyVb = cfg.dy * sy;\n return (\n <path\n d={sampler.bodyPath}\n transform={`translate(${dxVb.toFixed(3)} ${dyVb.toFixed(3)})`}\n fill={`rgba(0, 0, 0, ${Math.max(0, Math.min(cfg.opacity, 1))})`}\n stroke=\"none\"\n style={{ pointerEvents: 'none' }}\n />\n );\n },\n zone: 'background',\n defaults: DEFAULTS,\n};\n\nexport default Shadow;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface WoodgrainEffectParams {\n /** Number of grain curves. */\n lines?: number;\n /** Number of knot circles. */\n knots?: number;\n /** Overall grain opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<WoodgrainEffectParams> = { lines: 4, knots: 2, intensity: 0.55 };\n\n// Deterministic per-line/knot wobble.\nfunction osc(seed: number) {\n return Math.sin(seed * 1.73 + 0.5);\n}\n\nconst Woodgrain: EffectModule<WoodgrainEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const lines: string[] = [];\n for (let i = 0; i < cfg.lines; i++) {\n const y = ((i + 1) / (cfg.lines + 1)) * 100;\n // Two control points, slight vertical wobble.\n const dy1 = osc(i * 2 + 1) * 4;\n const dy2 = osc(i * 2 + 2) * 4;\n lines.push(`M -5 ${y.toFixed(2)} Q 35 ${(y + dy1).toFixed(2)} 60 ${y.toFixed(2)} T 105 ${(y + dy2).toFixed(2)}`);\n }\n const knotPositions: [number, number][] = [];\n for (let i = 0; i < cfg.knots; i++) {\n const cx = 30 + osc(i * 3 + 0.7) * 30 + 20;\n const cy = 50 + osc(i * 3 + 1.3) * 30;\n knotPositions.push([cx, cy]);\n }\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`} opacity={Math.max(0, Math.min(cfg.intensity, 1))} style={{ pointerEvents: 'none' }}>\n {lines.map((d, i) => (\n <path key={`l${i}`} className=\"badge-stroke\" d={d} fill=\"none\" />\n ))}\n {knotPositions.map(([cx, cy], i) => (\n <g key={`k${i}`}>\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={3} ry={2.4} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={1.2} ry={1} fill=\"none\" />\n </g>\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Woodgrain;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PerforationsEffectParams extends RangeMaskParams {\n /** Hole radius in CSS px. */\n holeRadius?: number;\n /** Spacing between hole centers along the perimeter, in CSS px. */\n holeSpacing?: number;\n}\n\nconst DEFAULTS: Required<Omit<PerforationsEffectParams, 'range'>> = {\n holeRadius: 3,\n holeSpacing: 11,\n};\n\nconst Perforations: EffectModule<PerforationsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const N = Math.max(2, Math.round(total / Math.max(2 * cfg.holeRadius, cfg.holeSpacing)));\n const step = total / N;\n const holes: { cx: number; cy: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i + 0.5) * step;\n if (rangeMask(sCss, total, params?.range) === 0) continue;\n const pt = sampler.perimeterAt(sCss);\n holes.push({ cx: pt.x, cy: pt.y });\n }\n const rx = cfg.holeRadius * sx;\n const ry = cfg.holeRadius * sy;\n return (\n <>\n {holes.map((h, i) => (\n <ellipse key={i} cx={h.cx} cy={h.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </>\n );\n },\n zone: 'mask',\n defaults: DEFAULTS as PerforationsEffectParams,\n};\n\nexport default Perforations;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface Bevel2EffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Compass angle the light originates from, in degrees. 0° = top, 90° =\n * right, 180° = bottom, 270° = left (CSS `linear-gradient` convention). */\n lightFrom?: number;\n}\n\nconst DEFAULTS: Required<Bevel2EffectParams> = { bevelWidth: 6, lightFrom: 315 };\n\nconst SAMPLES = 240;\n\n// Six shade buckets from brightest to darkest. Each maps to a CSS class.\nconst SHADE_CLASSES = [\n 'badge-bevel-light', // brightest (normal points straight at light)\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-dark',\n 'badge-bevel-medium-dark',\n 'badge-bevel-dark', // darkest (normal points away from light)\n];\n\nfunction lightDirFor(angleDeg: number): { lx: number; ly: number } {\n // Compass convention (0° = up, clockwise). Returns the unit vector pointing\n // outward from the badge toward the light source.\n const rad = (angleDeg * Math.PI) / 180;\n return { lx: Math.sin(rad), ly: -Math.cos(rad) };\n}\n\nconst Bevel2: EffectModule<Bevel2EffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const { lx, ly } = lightDirFor(cfg.lightFrom);\n\n const outer: { x: number; y: number; bucket: number }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n // dot(n, lightDir) where light points FROM the corner OUTWARD: surfaces whose\n // outward normal aligns with -light (facing the light source) are brightest.\n const d = -(pt.nx * lx + pt.ny * ly);\n // d ∈ [-1, 1]. Map to [0, SHADE_CLASSES.length).\n const t = Math.max(0, Math.min((d + 1) / 2, 0.9999));\n const bucket = Math.floor(t * SHADE_CLASSES.length);\n outer.push({ x: pt.x, y: pt.y, bucket });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n interface Run { bucket: number; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const bucket = outer[i].bucket;\n if (!cur || cur.bucket !== bucket) {\n cur = { bucket, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n if (runs.length > 1 && runs[0].bucket === runs[runs.length - 1].bucket) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n // Each band overlaps its neighbours by one sample on each side so the seams between\n // shade buckets render without gaps.\n const first = run.idxs[0];\n const last = run.idxs[run.idxs.length - 1];\n const prev = (first - 1 + SAMPLES) % SAMPLES;\n const next = (last + 1) % SAMPLES;\n const expandedIdxs = [prev, ...run.idxs, next];\n const outerPts = expandedIdxs.map((i) => outer[i]);\n const innerPts = expandedIdxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={SHADE_CLASSES[run.bucket]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel2;\n","import type { EffectModule } from '../bases/types';\n\nexport interface OutlineEffectParams {\n /** Stroke width in CSS px. */\n width?: number;\n /** Stroke color. */\n color?: string;\n /** Optional SVG dasharray (e.g. \"4 2\"). */\n dash?: string;\n /** CSS mix-blend-mode: 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten',\n * 'difference', etc. Useful when the outline color should react to whatever's behind it. */\n blendMode?: string;\n /** 0..1 stroke opacity. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<OutlineEffectParams> = {\n width: 1,\n color: 'var(--badge-edge)',\n dash: '',\n blendMode: 'normal',\n opacity: 1,\n};\n\nconst Outline: EffectModule<OutlineEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthVb = cfg.width * Math.max(sx, sy);\n return (\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke={cfg.color}\n strokeWidth={widthVb}\n strokeDasharray={cfg.dash || undefined}\n strokeOpacity={cfg.opacity}\n vectorEffect=\"non-scaling-stroke\"\n style={{ mixBlendMode: cfg.blendMode as never }}\n />\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Outline;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface SunbeamsEffectParams {\n /** Number of beams (parallelograms) cast across the body. */\n count?: number;\n /** Beam width in CSS px (measured horizontally before the skew). */\n width?: number;\n /** Gap between adjacent beams in CSS px. */\n gap?: number;\n /** Skew angle in degrees. 0 = vertical bars; positive = leaning right. */\n angle?: number;\n /** 0..1 lightness opacity. */\n opacity?: number;\n /** Beam color. Defaults to white. */\n color?: string;\n /** Drift the beam pattern left/right by N CSS px (lets you slide the \"window\" over the body). */\n offset?: number;\n /** 0..1 perturbs each beam's width, opacity, and angle slightly with a deterministic\n * per-beam noise; 0 = perfectly regular. */\n irregularity?: number;\n /** Gradient mask angle in degrees. 0 = left→right, 90 = top→bottom. */\n gradientAngle?: number;\n /** Position along the gradient axis (0..1) where the mask is fully opaque (beams visible). */\n gradientStart?: number;\n /** Position along the gradient axis (0..1) where the mask is fully transparent (beams faded out). */\n gradientEnd?: number;\n}\n\nconst DEFAULTS: Required<SunbeamsEffectParams> = {\n count: 3,\n width: 18,\n gap: 8,\n angle: 28,\n opacity: 0.18,\n color: '#ffffff',\n offset: 0,\n irregularity: 0,\n gradientAngle: 90,\n gradientStart: 0,\n gradientEnd: 1,\n};\n\nconst Sunbeams: EffectModule<SunbeamsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const maskId = useId();\n const gradId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n\n // Per-beam pseudo-random multipliers (deterministic by index).\n const widthMult = (i: number) => 1 + irr * 0.45 * Math.sin(i * 1.73 + 0.7);\n const opacityMult = (i: number) => 1 + irr * 0.5 * Math.sin(i * 2.31 + 1.3);\n const angleJitter = (i: number) => irr * 8 * Math.sin(i * 3.07 + 0.4); // degrees\n\n // Total horizontal span (centered on x=50). We compute using nominal widths so the\n // pattern's centering is stable as irregularity moves individual beam widths.\n const nominalWidthVb = cfg.width * sx;\n const gapVb = cfg.gap * sx;\n const offsetVb = cfg.offset * sx;\n const totalWidth = cfg.count * nominalWidthVb + (cfg.count - 1) * gapVb;\n let cursorX = 50 - totalWidth / 2 + offsetVb;\n const yTop = -50;\n const yBot = 150;\n\n const beams: { points: string; opacity: number }[] = [];\n for (let i = 0; i < cfg.count; i++) {\n const beamWidthVb = nominalWidthVb * widthMult(i);\n const x1 = cursorX;\n const x2 = cursorX + beamWidthVb;\n const tan = Math.tan(((cfg.angle + angleJitter(i)) * Math.PI) / 180);\n const horizPerVb = tan * (sx / sy);\n const halfShear = horizPerVb * (yBot - yTop) / 2;\n const pts = [\n [x1 + halfShear, yTop],\n [x2 + halfShear, yTop],\n [x2 - halfShear, yBot],\n [x1 - halfShear, yBot],\n ];\n beams.push({\n points: pts.map(([px, py]) => `${px.toFixed(3)},${py.toFixed(3)}`).join(' '),\n opacity: Math.max(0, Math.min(cfg.opacity * opacityMult(i), 1)),\n });\n cursorX += nominalWidthVb + gapVb;\n }\n\n // Gradient mask geometry: define a linear gradient from one edge of the viewBox to the\n // other along `gradientAngle`. Position the start/end stops along that 0..1 axis.\n const ga = (cfg.gradientAngle * Math.PI) / 180;\n const cosA = Math.cos(ga), sinA = Math.sin(ga);\n // Vector from centre to edge along the axis. Pick a long-enough span so 0..1 covers\n // the badge fully.\n const span = 100; // viewBox units along the axis from (50-50cos, 50-50sin) to (50+50cos, 50+50sin)\n const x1g = 50 - cosA * span / 2;\n const y1g = 50 - sinA * span / 2;\n const x2g = 50 + cosA * span / 2;\n const y2g = 50 + sinA * span / 2;\n\n const gs = Math.max(0, Math.min(cfg.gradientStart, 1));\n const ge = Math.max(0, Math.min(cfg.gradientEnd, 1));\n // Build stops so the gradient is white (opaque) at `gs` and black (transparent) at `ge`,\n // working whether gs < ge or vice versa.\n const stops = gs <= ge\n ? [\n { offset: 0, color: '#fff' },\n { offset: gs, color: '#fff' },\n { offset: ge, color: '#000' },\n { offset: 1, color: '#000' },\n ]\n : [\n { offset: 0, color: '#000' },\n { offset: ge, color: '#000' },\n { offset: gs, color: '#fff' },\n { offset: 1, color: '#fff' },\n ];\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} x1={x1g} y1={y1g} x2={x2g} y2={y2g} gradientUnits=\"userSpaceOnUse\">\n {stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.color} />)}\n </linearGradient>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} />\n </mask>\n </defs>\n <g clipPath={`url(#${clipId})`} mask={`url(#${maskId})`}>\n {beams.map((b, i) => (\n <polygon key={i} points={b.points} fill={cfg.color} opacity={b.opacity} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sunbeams;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Aqua-glass treatment — composes onto any badge silhouette by walking the\n * sampler's perimeter and painting four layered sub-effects in one pass:\n *\n * 1. Body gradient — vertical tint that runs translucent-top through a\n * bright equator band into a dark base.\n * 2. Specular gloss — upper-hemisphere white-fade clipped to the body.\n * 3. Bezel highlight — bright stroke along perimeter segments whose\n * outward normal points up (`ny < 0`). On a pill that's\n * the upper half; on a hex it's the three top edges;\n * on a starburst it's the upward tips. Normal-aware,\n * not bbox-aligned, which is what makes it work on\n * arbitrary silhouettes.\n * 4. Rim outline — faint dark stroke along the full perimeter.\n *\n * For the *truly* translucent look (with backdrop-filter blur reading the\n * surface behind the badge), use this with `variant=\"outline\"` so the badge's\n * own flat fill doesn't paint behind the gradient, and set\n * `backdrop-filter: blur(...)` on the host element via CSS.\n */\nexport interface AquaEffectParams {\n /** Body tint. Defaults to `var(--badge-edge)` so the badge's tone drives it. */\n accent?: string;\n /** Stop opacities along the body gradient (0..1). */\n topAlpha?: number;\n upperAlpha?: number;\n /** Equator Y position in viewBox units (0..100). */\n equator?: number;\n /** Half-width of the transition band around the equator (viewBox units). */\n equatorSpread?: number;\n /** Mix ratios for the bright equator and dark base stops (0..100, % accent). */\n equatorTint?: number;\n baseTint?: number;\n /** Specular gloss params. */\n glossTopAlpha?: number;\n glossMidAlpha?: number;\n /** Y extent the gloss covers, in viewBox units. 50 = upper hemisphere. */\n glossExtent?: number;\n /** Normal-aware bezel highlight. */\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n /** Full-perimeter rim. */\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<AquaEffectParams> = {\n accent: 'var(--badge-edge)',\n topAlpha: 0.45,\n upperAlpha: 0.7,\n equator: 52,\n equatorSpread: 12,\n equatorTint: 95,\n baseTint: 70,\n glossTopAlpha: 0.7,\n glossMidAlpha: 0.18,\n glossExtent: 50,\n bezelAlpha: 0.7,\n bezelWidth: 1,\n rimAlpha: 0.22,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Aqua: EffectModule<AquaEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n\n // Walk the perimeter and collect contiguous runs where the outward normal\n // points up (ny < 0) — those segments will get the bezel highlight.\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n // Wraparound: if first sample and last sample are both \"up\", merge the\n // tail into the head so the bezel renders as one stroke across s=0.\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n // Stroke widths in CSS px → viewBox units. The badge SVG is 100×100 with\n // preserveAspectRatio=\"none\", so use the larger inverse-scale to keep\n // the stroke from getting too thin in either axis.\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread * 1.6);\n const equatorBrightColor = `color-mix(in srgb, ${cfg.accent} ${cfg.equatorTint}%, white)`;\n const baseColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseTint}%, black)`;\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: cfg.accent, stopOpacity: cfg.topAlpha }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: cfg.accent, stopOpacity: cfg.upperAlpha }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorBrightColor, stopOpacity: 1 }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: cfg.accent, stopOpacity: 1 }} />\n <stop offset=\"100%\" style={{ stopColor: baseColor, stopOpacity: 1 }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: cfg.glossTopAlpha }} />\n <stop offset=\"60%\" style={{ stopColor: 'white', stopOpacity: cfg.glossMidAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n {/* 1. Body — vertical gradient over the silhouette */}\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {/* 2. Gloss — upper region, clipped to silhouette */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n\n {/* 3. Bezel — stroke segments where normal points up */}\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={cfg.bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n {/* 4. Rim — full perimeter at low opacity */}\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={cfg.rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Aqua;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Metal — opaque cousin of the Aqua treatment. Same four sub-passes (body\n * gradient, specular gloss, normal-aware bezel, perimeter rim), but tuned\n * for an opaque metallic surface with a single tunable `specularity`\n * parameter that drives how sharp / contrasty the highlights read.\n *\n * Low specularity → matte aluminum / brushed pewter feel: muted contrast,\n * soft gloss, faint bezel.\n * High specularity → chrome / polished steel: sharp specular peak at the\n * equator, bright bezel and rim, hard transitions in the body gradient.\n *\n * The same `specularity` knob multiplies the equator brightness, gloss\n * alpha, bezel alpha, and rim alpha — so one slider moves the whole\n * surface along a coherent matte-to-mirror axis.\n */\nexport interface MetalEffectParams {\n /** Base metal color. Defaults to a neutral steel; pass e.g. `'#c8a657'` for brass. */\n accent?: string;\n /** 0 = matte, 1 = mirror. Multiplies the brightness of the equator, gloss,\n * bezel, and rim simultaneously. */\n specularity?: number;\n /** Equator Y position (viewBox units, 0..100). */\n equator?: number;\n /** Half-width of the bright equator band. Smaller = sharper specular. */\n equatorSpread?: number;\n /** How dark the upper and lower extremes are (% accent vs black, 0..100). */\n topDarkness?: number;\n baseDarkness?: number;\n /** Gloss params. */\n glossExtent?: number;\n /** Per-zone alpha *baselines* — scaled by `specularity`. */\n glossAlphaTop?: number;\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<MetalEffectParams> = {\n accent: '#aab3bd', // neutral steel\n specularity: 0.6,\n equator: 50,\n equatorSpread: 8,\n topDarkness: 55,\n baseDarkness: 35,\n glossExtent: 50,\n glossAlphaTop: 0.55,\n bezelAlpha: 0.85,\n bezelWidth: 1,\n rimAlpha: 0.35,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Metal: EffectModule<MetalEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const spec = Math.max(0, Math.min(cfg.specularity, 1));\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n\n // --- Bezel sample walk (same as Aqua: runs where ny < 0). ---\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n // Gradient construction. Specularity sharpens by:\n // 1. Driving the equator peak from neutral accent toward pure white.\n // 2. Boosting gloss/bezel/rim alpha (applied below).\n // 3. Increasing the contrast between dark stops and the equator stop.\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread);\n // At spec=0 the equator is just the accent; at spec=1 it's almost white.\n const equatorWhiteMix = 100 - Math.round(spec * 85);\n const equatorColor = `color-mix(in srgb, ${cfg.accent} ${equatorWhiteMix}%, white)`;\n const topDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.topDarkness}%, black)`;\n const baseDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseDarkness}%, black)`;\n // Bright stops on either side of the peak collapse toward the peak as\n // specularity rises, sharpening the highlight.\n const upperBrightMix = 100 - Math.round(spec * 50);\n const lowerBrightMix = 100 - Math.round(spec * 30);\n const upperBrightColor = `color-mix(in srgb, ${cfg.accent} ${upperBrightMix}%, white)`;\n const lowerBrightColor = `color-mix(in srgb, ${cfg.accent} ${lowerBrightMix}%, white)`;\n\n const glossAlpha = cfg.glossAlphaTop * spec;\n const bezelAlpha = cfg.bezelAlpha * (0.4 + 0.6 * spec);\n const rimAlpha = cfg.rimAlpha * (0.6 + 0.4 * spec);\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: topDarkColor }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: upperBrightColor }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorColor }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: lowerBrightColor }} />\n <stop offset=\"100%\" style={{ stopColor: baseDarkColor }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: glossAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {glossAlpha > 0 && (\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Metal;\n","import type { EffectModule } from '../bases/types';\nimport Spikes, { type SpikesEffectParams } from './Spikes';\nimport Puffs, { type PuffsEffectParams } from './Puffs';\nimport Bites, { type BitesEffectParams } from './Bites';\nimport Scallops, { type ScallopsEffectParams } from './Scallops';\nimport Bevel, { type BevelEffectParams } from './Bevel';\nimport Sheen, { type SheenEffectParams } from './Sheen';\nimport Rivets, { type RivetsEffectParams } from './Rivets';\nimport Shadow, { type ShadowEffectParams } from './Shadow';\nimport Woodgrain, { type WoodgrainEffectParams } from './Woodgrain';\nimport Perforations, { type PerforationsEffectParams } from './Perforations';\nimport Bevel2, { type Bevel2EffectParams } from './Bevel2';\nimport Outline, { type OutlineEffectParams } from './Outline';\nimport Sunbeams, { type SunbeamsEffectParams } from './Sunbeams';\nimport Aqua, { type AquaEffectParams } from './Aqua';\nimport Metal, { type MetalEffectParams } from './Metal';\n\nexport type BadgeEffect =\n | 'spikes' | 'puffs' | 'bites' | 'scallops'\n | 'bevel' | 'bevel2' | 'sheen' | 'sunbeams' | 'rivets' | 'shadow' | 'woodgrain' | 'perforations' | 'outline'\n | 'aqua' | 'metal';\n\nexport interface BadgeEffectParams {\n spikes: SpikesEffectParams;\n puffs: PuffsEffectParams;\n bites: BitesEffectParams;\n scallops: ScallopsEffectParams;\n bevel: BevelEffectParams;\n bevel2: Bevel2EffectParams;\n sheen: SheenEffectParams;\n rivets: RivetsEffectParams;\n shadow: ShadowEffectParams;\n woodgrain: WoodgrainEffectParams;\n perforations: PerforationsEffectParams;\n outline: OutlineEffectParams;\n sunbeams: SunbeamsEffectParams;\n aqua: AquaEffectParams;\n metal: MetalEffectParams;\n}\n\nexport const EFFECTS: Record<BadgeEffect, EffectModule<any>> = {\n spikes: Spikes,\n puffs: Puffs,\n bites: Bites,\n scallops: Scallops,\n bevel: Bevel,\n bevel2: Bevel2,\n sheen: Sheen,\n rivets: Rivets,\n shadow: Shadow,\n woodgrain: Woodgrain,\n perforations: Perforations,\n outline: Outline,\n sunbeams: Sunbeams,\n aqua: Aqua,\n metal: Metal,\n};\n\nexport interface EffectSpec<E extends BadgeEffect = BadgeEffect> {\n type: E;\n params?: BadgeEffectParams[E];\n}\n","import { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode, type CSSProperties } from 'react';\nimport s from './Badge.module.css';\nimport { SHAPES, type BadgeShapeParams } from './shapes';\nimport { BASES, type BadgeBase, type BadgeBaseParams } from './bases';\nimport { EFFECTS, type EffectSpec, type BadgeEffect } from './effects';\nimport type { BadgeShape, BadgeTone, BadgeVariant, BadgeSize } from './types';\n\ninterface BadgeBaseProps {\n tone?: BadgeTone;\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** \"Edge bloat\": offset every base perimeter sample outward by N CSS px along the normal\n * before any compose effects run. Negative values shrink the silhouette. Photoshop-style\n * expand-selection on the body. */\n bloat?: number;\n padding?: number | string;\n /**\n * For CSS-rendered shapes (pill, plain) that fragment across line wraps, controls how the\n * background/border behaves at each break.\n * - `'slice'` (default): decoration is severed at the break (looks like one continuous badge cut by the line).\n * - `'clone'`: each fragment paints its own complete decoration (looks like two separate badges).\n */\n breakStyle?: 'slice' | 'clone';\n /** When set, perimeter-pattern shapes (beavis, cloud, postage, scalloped) continuously shift their pattern. */\n crawl?: boolean | number;\n /** Compose-mode: base shape underneath the badge content. When set, overrides the `shape` prop. */\n base?: BadgeBase;\n baseParams?: BadgeBaseParams[BadgeBase];\n /** Compose-mode: layered effects applied around / over the base. */\n effects?: EffectSpec[];\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n href?: string;\n as?: 'span' | 'button' | 'a';\n children: ReactNode;\n className?: string;\n /** Optional style overrides merged with the badge's own style. Useful for setting CSS\n * custom properties (e.g. `--badge-edge` to inject a custom tone color). */\n style?: CSSProperties;\n 'aria-label'?: string;\n}\n\ntype BadgePropsByShape = {\n [S in BadgeShape]: BadgeBaseProps & { shape?: S; shapeParams?: BadgeShapeParams[S] };\n}[BadgeShape];\n\nexport type BadgeProps = BadgePropsByShape;\n\nfunction chooseElement(props: BadgeProps): 'span' | 'button' | 'a' {\n if (props.as) return props.as;\n if (props.href) return 'a';\n if (props.onClick) return 'button';\n return 'span';\n}\n\nexport function Badge(props: BadgeProps) {\n const {\n shape = 'pill',\n tone = 'neutral',\n variant = 'outline',\n size = 'sm',\n onClick,\n onRemove,\n removeLabel,\n href,\n children,\n className,\n shapeParams,\n bloat,\n padding,\n style: styleOverride,\n breakStyle,\n crawl,\n base,\n baseParams,\n effects,\n } = props;\n const ariaLabel = props['aria-label'];\n const element = chooseElement(props);\n const [focused, setFocused] = useState(false);\n const [phase, setPhase] = useState(0);\n const shapeModule = SHAPES[shape] ?? SHAPES.pill;\n const resolvedShape = SHAPES[shape] ? shape : 'pill';\n const ShapeBody = shapeModule.Component;\n const params = { ...(shapeModule.defaults ?? {}), ...(shapeParams ?? {}) };\n\n useEffect(() => {\n if (!crawl) { setPhase(0); return; }\n const speed = typeof crawl === 'number' ? crawl : 0.2;\n let raf = 0;\n let last = performance.now();\n const tick = (now: number) => {\n const dt = (now - last) / 1000;\n last = now;\n setPhase((p) => (p + speed * dt) % 1);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [crawl]);\n const cls = [s.badge, className].filter(Boolean).join(' ');\n\n // Compose-mode: explicit `base` prop wins; otherwise the shape may declare its own\n // `compose()` spec to migrate legacy shapes through the new pipeline.\n const shapeComposeSpec = !base && shapeModule.compose ? shapeModule.compose(params) : null;\n const resolvedBaseKey = base ?? (shapeComposeSpec?.base as BadgeBase | undefined);\n const composeBase = resolvedBaseKey ? BASES[resolvedBaseKey] : null;\n const resolvedBaseParams = base\n ? baseParams\n : (shapeComposeSpec?.baseParams as BadgeBaseParams[BadgeBase] | undefined);\n const resolvedEffects: EffectSpec[] | undefined = base\n ? effects\n : (shapeComposeSpec?.effects as EffectSpec[] | undefined) ?? effects;\n const composeBaseParams = composeBase ? { ...(composeBase.defaults ?? {}), ...(resolvedBaseParams ?? {}) } : null;\n const decoRef = useRef<SVGSVGElement>(null);\n const [box, setBox] = useState({ w: 100, h: 100 });\n useLayoutEffect(() => {\n if (!composeBase) return;\n const svg = decoRef.current;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [composeBase]);\n\n const sampler = composeBase ? composeBase.build(composeBaseParams, box.w, box.h) : null;\n\n const insetsSource = composeBase\n ? (typeof composeBase.insets === 'function' ? composeBase.insets(composeBaseParams) : composeBase.insets) ?? { top: 0, right: 0, bottom: 0, left: 0 }\n : (typeof shapeModule.insets === 'function' ? shapeModule.insets(params) : shapeModule.insets);\n const insets = insetsSource;\n const style: CSSProperties = {\n ['--badge-inset-top' as never]: `${insets.top}px`,\n ['--badge-inset-right' as never]: `${insets.right}px`,\n ['--badge-inset-bottom' as never]: `${insets.bottom}px`,\n ['--badge-inset-left' as never]: `${insets.left}px`,\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(breakStyle !== undefined && {\n boxDecorationBreak: breakStyle,\n WebkitBoxDecorationBreak: breakStyle,\n }),\n ...styleOverride,\n };\n\n const commonProps = {\n className: cls,\n style,\n 'data-shape': composeBase ? 'compose' : resolvedShape,\n 'data-tone': tone,\n 'data-variant': variant,\n 'data-size': size,\n 'data-focused': focused ? 'true' : undefined,\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n 'aria-label': ariaLabel,\n };\n\n // Honest chaining: sample the base perimeter at COMPOSE_SAMPLES points and sum every\n // offset-style effect's contribution at each sample. Stacked transforms therefore compose\n // additively — `[bites, spikes]` produces a bitten outline with spikes radiating from\n // wherever bites haven't dented inward.\n const COMPOSE_SAMPLES = 600;\n const composedSampler = (() => {\n if (!composeBase || !sampler) return null;\n const offsetMods = (resolvedEffects ?? [])\n .map((eff) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n if (!mod?.offsetAt) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return { offsetAt: mod.offsetAt, params: effParams };\n })\n .filter(Boolean) as { offsetAt: NonNullable<typeof EFFECTS[BadgeEffect]['offsetAt']>; params: Record<string, unknown> }[];\n const bloatCss = bloat ?? 0;\n if (offsetMods.length === 0 && bloatCss === 0) return sampler;\n const sx = 100 / box.w;\n const sy = 100 / box.h;\n const totalCss = sampler.totalCss;\n // Compute the warped sample point at any CSS arc length s — base perimeter sample\n // bloated outward by a constant CSS distance plus the sum of every offset effect's\n // contribution at that sample.\n const warpedXY = (sCss: number) => {\n const sm = ((sCss % totalCss) + totalCss) % totalCss;\n const pt = sampler.perimeterAt(sm);\n let dx = pt.nx * bloatCss;\n let dy = pt.ny * bloatCss;\n for (const m of offsetMods) {\n const o = m.offsetAt(sm, {\n params: m.params as never,\n phase,\n totalCss,\n perimeterAt: sampler.perimeterAt,\n });\n dx += o.dx;\n dy += o.dy;\n }\n return { x: pt.x + dx * sx, y: pt.y + dy * sy };\n };\n let d = '';\n for (let i = 0; i < COMPOSE_SAMPLES; i++) {\n const sCss = (i / COMPOSE_SAMPLES) * totalCss;\n const w = warpedXY(sCss);\n d += (i === 0 ? `M ${w.x.toFixed(3)} ${w.y.toFixed(3)}` : ` L ${w.x.toFixed(3)} ${w.y.toFixed(3)}`);\n }\n d += ' Z';\n // Replace perimeterAt with a warped version: warped point + normal recomputed from\n // the warped tangent (clockwise rotation of unit tangent). This is what decorations\n // like Bevel and Perforations need to follow the actual bumpy outline.\n const warpedPerimeterAt = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = warpedXY(sm);\n const eps = totalCss / (COMPOSE_SAMPLES * 2);\n const wA = warpedXY(sm - eps);\n const wB = warpedXY(sm + eps);\n // Convert finite-difference tangent back to \"CSS px\" by un-scaling per-axis.\n const tx = (wB.x - wA.x) / sx;\n const ty = (wB.y - wA.y) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n // Outward normal: clockwise rotation of tangent (in CSS space), then renormalize\n // for unit length in viewBox terms when returned.\n const nxC = ty / tl;\n const nyC = -tx / tl;\n // Convert that CSS-space normal back to a viewBox-space unit-ish normal: the\n // existing PerimeterPoint contract has nx/ny used multiplicatively with sx/sy in\n // call sites, matching the convention base perimeters use.\n return { x: pt.x, y: pt.y, nx: nxC, ny: nyC };\n };\n return { bodyPath: d, perimeterAt: warpedPerimeterAt, totalCss };\n })();\n\n const decoEffects = (resolvedEffects ?? []).filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS]?.Component);\n const backgroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'background');\n const foregroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'foreground');\n const maskDecorations = decoEffects.filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS].zone === 'mask');\n const bodyMaskId = `badge-mask-${useId().replace(/:/g, '')}`;\n\n const renderDecoration = (eff: EffectSpec, i: number) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n const EffComponent = mod?.Component;\n if (!EffComponent || !composedSampler) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return <EffComponent key={`${eff.type as string}-${i}`} sampler={composedSampler} boxW={box.w} boxH={box.h} variant={variant} params={effParams} phase={phase} />;\n };\n\n const decoSvg = composeBase && composedSampler ? (\n <svg ref={decoRef} className={s.deco} viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {maskDecorations.length > 0 && (\n <defs>\n <mask id={bodyMaskId} maskUnits=\"userSpaceOnUse\" x=\"-10\" y=\"-10\" width=\"120\" height=\"120\">\n <rect x=\"-10\" y=\"-10\" width=\"120\" height=\"120\" fill=\"white\" />\n {maskDecorations.map(renderDecoration)}\n </mask>\n </defs>\n )}\n {backgroundDecorations.map(renderDecoration)}\n <g {...(maskDecorations.length > 0 ? { mask: `url(#${bodyMaskId})` } : {})}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={composedSampler.bodyPath} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={composedSampler.bodyPath} />}\n </g>\n {foregroundDecorations.map(renderDecoration)}\n </svg>\n ) : shapeModule.renderMode !== 'css' && ShapeBody ? (\n <svg\n className={s.deco}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio={shapeModule.stretches === false ? 'xMidYMid meet' : 'none'}\n aria-hidden=\"true\"\n >\n <ShapeBody variant={variant} focused={focused} params={params} phase={phase} />\n </svg>\n ) : null;\n\n const inner = (\n <>\n {decoSvg}\n <span className={s.content}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={s.remove}\n aria-label={removeLabel ?? 'Remove'}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M 2 2 L 8 8 M 8 2 L 2 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" fill=\"none\" />\n </svg>\n </button>\n )}\n </span>\n </>\n );\n\n if (element === 'button') {\n return (\n <button type=\"button\" {...commonProps} onClick={onClick}>\n {inner}\n </button>\n );\n }\n if (element === 'a') {\n return (\n <a href={href} {...commonProps} onClick={onClick}>\n {inner}\n </a>\n );\n }\n return <span {...commonProps}>{inner}</span>;\n}\n"],"mappings":"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"}
|