@dstackai/sqircle 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -16
- package/dist/SquircleEditor.d.ts +5 -2
- package/dist/assets/ConstructorPage-BZYA63EF.js +2 -0
- package/dist/assets/ConstructorPage-BthtTZhb.css +1 -0
- package/dist/assets/PageShell-CjHSnST7.js +1 -0
- package/dist/assets/demo-C2Ri3G4a.js +1 -0
- package/dist/assets/index-CYKmiCSm.js +1 -0
- package/dist/assets/pages-DQf07DWd.js +9 -0
- package/dist/assets/pages-hENaA-mA.css +1 -0
- package/dist/codeExport.d.ts +4 -2
- package/dist/constructor.html +15 -0
- package/dist/demo.html +15 -0
- package/dist/index.html +15 -0
- package/dist/react.html +15 -0
- package/dist/sqircle.js +763 -310
- package/dist/sqircle.js.map +1 -1
- package/dist/static/styles.css +883 -0
- package/dist/style.css +1 -1
- package/docs/README.md +12 -7
- package/docs/design/colors.md +12 -12
- package/docs/design/geometry.md +14 -13
- package/docs/design/rendering.md +18 -19
- package/docs/design/single-squircle-states.md +47 -109
- package/docs/examples/README.md +33 -0
- package/docs/react/README.md +101 -62
- package/docs/react/editor.md +159 -0
- package/package.json +3 -2
package/dist/sqircle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqircle.js","names":[],"sources":["../src/squircle/geometry.ts","../src/squircle/palettes.ts","../src/squircle/SquircleScene.tsx","../src/squircle/codeExport.ts","../src/squircle/SquircleEditor.tsx"],"sourcesContent":["import type { SquircleGeometryConfig, SquircleLayerConfig, SquirclePoint } from \"./types\";\n\nexport const DEFAULT_GEOMETRY = {\n width: 800,\n viewBoxHeight: 480,\n exponent: 12,\n samples: 160,\n prismHeight: 10,\n angleDegrees: 20,\n inlayScale: 0.6\n} as const;\n\ninterface SampledPoint extends SquirclePoint {\n nx: number;\n ny: number;\n}\n\ninterface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface SquircleGeometry {\n config: Required<Omit<SquircleGeometryConfig, \"halfSize\" | \"center\">> & {\n halfSize: number;\n center: SquirclePoint;\n };\n cosA: number;\n sinA: number;\n topPoints: SquirclePoint[];\n bottomPoints: SquirclePoint[];\n wallPoints: SquirclePoint[];\n hiddenPoints: SquirclePoint[];\n inlayPoints: SquirclePoint[];\n labelTransform: string;\n topBounds: Bounds;\n sideBounds: Bounds;\n viewBox: string;\n}\n\nexport function createSquircleGeometry(input: SquircleGeometryConfig = {}): SquircleGeometry {\n const exponent = input.exponent ?? DEFAULT_GEOMETRY.exponent;\n const samples = input.samples ?? DEFAULT_GEOMETRY.samples;\n const width = input.width ?? DEFAULT_GEOMETRY.width;\n const viewBoxHeight = input.viewBoxHeight ?? DEFAULT_GEOMETRY.viewBoxHeight;\n const prismHeight = input.prismHeight ?? DEFAULT_GEOMETRY.prismHeight;\n const angleDegrees = input.angleDegrees ?? DEFAULT_GEOMETRY.angleDegrees;\n const inlayScale = input.inlayScale ?? DEFAULT_GEOMETRY.inlayScale;\n const angle = (angleDegrees * Math.PI) / 180;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const unit = sampleSuperellipse(1, exponent, samples);\n const unitScreenX = unit.map((point) => (point.x - point.y) * cosA);\n const unitWidth = Math.max(...unitScreenX) - Math.min(...unitScreenX);\n const halfSize = input.halfSize ?? width / unitWidth;\n const rawPoints = sampleSuperellipse(halfSize, exponent, samples);\n const rawScreenX = rawPoints.map((point) => (point.x - point.y) * cosA);\n const rawScreenY = rawPoints.map((point) => (point.x + point.y) * sinA);\n const center = input.center ?? {\n x: -Math.min(...rawScreenX),\n y: prismHeight - Math.min(...rawScreenY)\n };\n\n const topPoints = rawPoints.map((point) => project(point, prismHeight, center, cosA, sinA));\n const bottomPoints = rawPoints.map((point) => project(point, 0, center, cosA, sinA));\n const frontRun = longestCircularRun(rawPoints.map((point) => point.nx + point.ny >= 0));\n const backRun = complementRun(frontRun, samples);\n const wallTop = collectCircular(topPoints, frontRun);\n const wallBottom = collectCircular(bottomPoints, frontRun).reverse();\n const wallPoints = [...wallTop, ...wallBottom];\n const hiddenPoints = collectCircular(bottomPoints, backRun);\n const inlayPoints = sampleSuperellipse(halfSize * inlayScale, exponent, samples).map((point) =>\n project(point, prismHeight, center, cosA, sinA)\n );\n const topBounds = boundsFor(topPoints);\n const sideBounds = boundsFor([...topPoints, ...wallPoints]);\n\n return {\n config: {\n width,\n viewBoxHeight,\n exponent,\n samples,\n prismHeight,\n angleDegrees,\n inlayScale,\n halfSize,\n center\n },\n cosA,\n sinA,\n topPoints,\n bottomPoints,\n wallPoints,\n hiddenPoints,\n inlayPoints,\n labelTransform: `matrix(${round(cosA)},${round(sinA)},${round(-cosA)},${round(sinA)},${round(center.x)},${round(center.y - prismHeight)})`,\n topBounds,\n sideBounds,\n viewBox: `0 0 ${round(width)} ${round(viewBoxHeight)}`\n };\n}\n\nexport function pointsToString(points: SquirclePoint[]): string {\n return points.map((point) => `${round(point.x)},${round(point.y)}`).join(\" \");\n}\n\nexport function createSquircleLayers(\n count: number,\n options: {\n gap?: number;\n paletteId?: string;\n material?: \"solid\" | \"transparent\" | \"wireframe\";\n } = {}\n): SquircleLayerConfig[] {\n const gap = options.gap ?? 88;\n const material = options.material ?? \"wireframe\";\n const paletteId = options.paletteId ?? \"15\";\n\n return Array.from({ length: Math.max(0, count) }, (_, index) => ({\n id: `layer-${index + 1}`,\n visible: true,\n offset: { x: 0, y: (count - index - 1) * gap },\n base: { material, paletteId, text: false, dash: false },\n hover: undefined\n }));\n}\n\nexport function reflowLayerOffsets(layers: SquircleLayerConfig[], gap = 88): SquircleLayerConfig[] {\n const count = layers.length;\n return layers.map((layer, index) => ({\n ...layer,\n offset: { x: layer.offset?.x ?? 0, y: (count - index - 1) * gap }\n }));\n}\n\nfunction sampleSuperellipse(halfSize: number, exponent: number, samples: number): SampledPoint[] {\n return Array.from({ length: samples }, (_, index) => {\n const t = (2 * Math.PI * index) / samples;\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: halfSize * signedPower(c, 2 / exponent),\n y: halfSize * signedPower(s, 2 / exponent),\n nx: signedPower(c, (2 * (exponent - 1)) / exponent),\n ny: signedPower(s, (2 * (exponent - 1)) / exponent)\n };\n });\n}\n\nfunction signedPower(value: number, power: number): number {\n return Math.sign(value) * Math.pow(Math.abs(value), power);\n}\n\nfunction project(point: SquirclePoint, z: number, center: SquirclePoint, cosA: number, sinA: number): SquirclePoint {\n return {\n x: center.x + (point.x - point.y) * cosA,\n y: center.y + (point.x + point.y) * sinA - z\n };\n}\n\nfunction longestCircularRun(flags: boolean[]): { start: number; length: number } {\n const doubled = [...flags, ...flags];\n let best = { start: 0, length: 0 };\n let currentStart = 0;\n let currentLength = 0;\n\n doubled.forEach((flag, index) => {\n if (flag) {\n if (currentLength === 0) currentStart = index;\n currentLength += 1;\n if (currentLength > best.length && currentLength <= flags.length) {\n best = { start: currentStart % flags.length, length: currentLength };\n }\n } else {\n currentLength = 0;\n }\n });\n\n return best.length > 0 ? best : { start: 0, length: flags.length };\n}\n\nfunction complementRun(run: { start: number; length: number }, total: number): { start: number; length: number } {\n return {\n start: (run.start + run.length) % total,\n length: Math.max(0, total - run.length)\n };\n}\n\nfunction collectCircular<T>(items: T[], run: { start: number; length: number }): T[] {\n return Array.from({ length: run.length }, (_, index) => items[(run.start + index) % items.length]);\n}\n\nfunction boundsFor(points: SquirclePoint[]): Bounds {\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n return {\n minX: Math.min(...xs),\n minY: Math.min(...ys),\n maxX: Math.max(...xs),\n maxY: Math.max(...ys)\n };\n}\n\nfunction round(value: number): string {\n return Number(value.toFixed(2)).toString();\n}\n","export interface SquircleGradientStop {\n offset: number;\n color: string;\n}\n\nexport interface SquirclePalette {\n id: string;\n label: string;\n top: SquircleGradientStop[];\n side: SquircleGradientStop[];\n textWire: SquircleGradientStop[];\n labelFill: string;\n topEdge: string;\n sideEdge: string;\n swatch: [string, string];\n}\n\nexport const SQUIRCLE_PALETTES = {\n \"13\": {\n id: \"13\",\n label: \"13 Alpha\",\n top: [\n { offset: 0, color: \"#f5f0ff\" },\n { offset: 0.48, color: \"#b388ff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n side: [\n { offset: 0, color: \"#8250e6\" },\n { offset: 0.5, color: \"#596ce8\" },\n { offset: 1, color: \"#0084e8\" }\n ],\n textWire: [\n { offset: 0, color: \"#b388ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n labelFill: \"#2a1060\",\n topEdge: \"#7c5fd0\",\n sideEdge: \"#2d1466\",\n swatch: [\"#b388ff\", \"#0099ff\"]\n },\n \"14\": {\n id: \"14\",\n label: \"14 Alpha\",\n top: [\n { offset: 0, color: \"#e9fffb\" },\n { offset: 0.44, color: \"#44b9d6\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n side: [\n { offset: 0, color: \"#38acbc\" },\n { offset: 0.52, color: \"#268ccf\" },\n { offset: 1, color: \"#005fc4\" }\n ],\n textWire: [\n { offset: 0, color: \"#44b9d6\" },\n { offset: 0.52, color: \"#2f8fe2\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n labelFill: \"#063f6a\",\n topEdge: \"#237aa8\",\n sideEdge: \"#063f6a\",\n swatch: [\"#44b9d6\", \"#006ce0\"]\n },\n \"15\": {\n id: \"15\",\n label: \"15 Alpha\",\n top: [\n { offset: 0, color: \"#f0fbff\" },\n { offset: 0.34, color: \"#0099ff\" },\n { offset: 0.66, color: \"#5c7fff\" },\n { offset: 1, color: \"#962eff\" }\n ],\n side: [\n { offset: 0, color: \"#008fec\" },\n { offset: 0.34, color: \"#139cff\" },\n { offset: 0.56, color: \"#587fff\" },\n { offset: 0.78, color: \"#7c58f7\" },\n { offset: 1, color: \"#962eff\" }\n ],\n textWire: [\n { offset: 0, color: \"#0099ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#962eff\" }\n ],\n labelFill: \"#f7fbff\",\n topEdge: \"#7c5fd0\",\n sideEdge: \"#2d1466\",\n swatch: [\"#0099ff\", \"#962eff\"]\n },\n \"16\": {\n id: \"16\",\n label: \"16 Alpha\",\n top: [\n { offset: 0, color: \"#e9fbff\" },\n { offset: 0.46, color: \"#75cfff\" },\n { offset: 1, color: \"#2d49d8\" }\n ],\n side: [\n { offset: 0, color: \"#59b7ec\" },\n { offset: 0.54, color: \"#5874e0\" },\n { offset: 1, color: \"#263fb8\" }\n ],\n textWire: [\n { offset: 0, color: \"#75cfff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#2d49d8\" }\n ],\n labelFill: \"#10246a\",\n topEdge: \"#3e65c8\",\n sideEdge: \"#10246a\",\n swatch: [\"#75cfff\", \"#2d49d8\"]\n },\n \"17\": {\n id: \"17\",\n label: \"17 Alpha\",\n top: [\n { offset: 0, color: \"#edf1ff\" },\n { offset: 0.46, color: \"#7f91ff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n side: [\n { offset: 0, color: \"#7081ef\" },\n { offset: 0.5, color: \"#617fee\" },\n { offset: 1, color: \"#0084e1\" }\n ],\n textWire: [\n { offset: 0, color: \"#7f91ff\" },\n { offset: 0.52, color: \"#5c9fff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n labelFill: \"#17245e\",\n topEdge: \"#5f6ed0\",\n sideEdge: \"#17245e\",\n swatch: [\"#7f91ff\", \"#0099ff\"]\n },\n \"18\": {\n id: \"18\",\n label: \"18 Alpha\",\n top: [\n { offset: 0, color: \"#f8fdff\" },\n { offset: 0.42, color: \"#b8e7ff\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n side: [\n { offset: 0, color: \"#86d4f3\" },\n { offset: 0.5, color: \"#5da6dd\" },\n { offset: 1, color: \"#005dbc\" }\n ],\n textWire: [\n { offset: 0, color: \"#b8e7ff\" },\n { offset: 0.52, color: \"#42b4ff\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n labelFill: \"#064272\",\n topEdge: \"#4f94c0\",\n sideEdge: \"#064272\",\n swatch: [\"#b8e7ff\", \"#006ce0\"]\n },\n \"19\": {\n id: \"19\",\n label: \"19 Alpha\",\n top: [\n { offset: 0, color: \"#e6fff9\" },\n { offset: 0.42, color: \"#42b4ff\" },\n { offset: 1, color: \"#8575ff\" }\n ],\n side: [\n { offset: 0, color: \"#1ea9eb\" },\n { offset: 0.5, color: \"#4f8cee\" },\n { offset: 1, color: \"#7866e8\" }\n ],\n textWire: [\n { offset: 0, color: \"#42b4ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#8575ff\" }\n ],\n labelFill: \"#12306f\",\n topEdge: \"#6470d8\",\n sideEdge: \"#12306f\",\n swatch: [\"#42b4ff\", \"#8575ff\"]\n },\n \"20\": {\n id: \"20\",\n label: \"20 Alpha\",\n top: [\n { offset: 0, color: \"#eef3ff\" },\n { offset: 0.38, color: \"#5c7fff\" },\n { offset: 0.7, color: \"#0099ff\" },\n { offset: 1, color: \"#b8e7ff\" }\n ],\n side: [\n { offset: 0, color: \"#536fe8\" },\n { offset: 0.52, color: \"#168fe8\" },\n { offset: 1, color: \"#8fd2ee\" }\n ],\n textWire: [\n { offset: 0, color: \"#5c7fff\" },\n { offset: 0.52, color: \"#0099ff\" },\n { offset: 1, color: \"#b8e7ff\" }\n ],\n labelFill: \"#17245e\",\n topEdge: \"#5a7bd0\",\n sideEdge: \"#17245e\",\n swatch: [\"#5c7fff\", \"#b8e7ff\"]\n }\n} satisfies Record<string, SquirclePalette>;\n\nexport type SquirclePaletteId = keyof typeof SQUIRCLE_PALETTES;\n\nexport const SQUIRCLE_PALETTE_IDS = Object.keys(SQUIRCLE_PALETTES) as SquirclePaletteId[];\nexport const DEFAULT_PALETTE_ID: SquirclePaletteId = \"15\";\n\nexport function getSquirclePalette(paletteId: string | undefined): SquirclePalette {\n return SQUIRCLE_PALETTES[paletteId as SquirclePaletteId] ?? SQUIRCLE_PALETTES[DEFAULT_PALETTE_ID];\n}\n","import { useId, useMemo } from \"react\";\nimport type { CSSProperties, SVGProps } from \"react\";\nimport { createSquircleGeometry, pointsToString } from \"./geometry\";\nimport { getSquirclePalette, SQUIRCLE_PALETTES } from \"./palettes\";\nimport type {\n SquircleAnnotationColor,\n SquircleGeometryConfig,\n SquircleLayerConfig,\n SquircleMaterial,\n SquircleOpacityConfig,\n SquircleSceneProps,\n SquircleStrokeConfig,\n SquircleTextStyle,\n SquircleVariantConfig\n} from \"./types\";\nimport \"./SquircleScene.css\";\n\nconst DEFAULT_STROKES: SquircleStrokeConfig = {\n face: 0.35,\n faceOpacity: 0.72,\n wire: 1.6,\n wireOpacity: 0.88,\n hidden: 1.2,\n hiddenOpacity: 0.28,\n dash: 2.2,\n wireDash: 1.6,\n labelWire: 1.1\n};\n\nconst DEFAULT_OPACITY: SquircleOpacityConfig = {\n transparentFace: 0.38,\n transparentAnnotation: 0.62,\n solidAnnotation: 0.88\n};\n\nconst DEFAULT_TEXT = \"GPU\";\nconst DEFAULT_TEXT_SIZE = 62;\nconst DEFAULT_TEXT_FONT_FAMILY = \"Arial, Helvetica, sans-serif\";\nconst DEFAULT_TEXT_FONT_WEIGHT = 400;\n\ntype ResolvedVariant = {\n material: SquircleMaterial;\n paletteId: string;\n text: string | null;\n dash: boolean;\n textStyle: SquircleTextStyle;\n textColor: Exclude<SquircleAnnotationColor, \"auto\">;\n textSize: number;\n textFontFamily: string;\n textFontWeight: string | number;\n dashColor: Exclude<SquircleAnnotationColor, \"auto\">;\n stroke: SquircleStrokeConfig;\n opacity: SquircleOpacityConfig;\n};\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: SquircleTextStyle | string;\n gpuColor?: SquircleAnnotationColor;\n}\n\nexport function SquircleScene({\n layers,\n geometry,\n selectedLayerId,\n theme = \"light\",\n idPrefix,\n className,\n ariaLabel = \"Squircle scene\",\n fitToLayers = true,\n transitionMs = 220,\n onLayerSelect\n}: SquircleSceneProps) {\n const reactId = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const prefix = idPrefix ?? `sq-${reactId}`;\n const geometryKey = JSON.stringify(geometry ?? {});\n const baseGeometry = useMemo(() => createSquircleGeometry(geometry), [geometryKey]);\n const visibleLayers = layers.filter((layer) => layer.visible !== false);\n const maxLayerY = Math.max(0, ...visibleLayers.map((layer) => layer.offset?.y ?? 0));\n const viewBoxHeight = geometry?.viewBoxHeight ?? (fitToLayers ? Math.max(baseGeometry.config.viewBoxHeight, maxLayerY + baseGeometry.sideBounds.maxY + 18) : baseGeometry.config.viewBoxHeight);\n const sceneGeometry = geometry?.viewBoxHeight === viewBoxHeight\n ? baseGeometry\n : createSquircleGeometry({ ...geometry, viewBoxHeight });\n const svgStyle = { \"--sq-transition-ms\": `${transitionMs}ms` } as CSSProperties;\n\n return (\n <svg\n className={[\"squircle-scene\", `sq-theme-${theme}`, className].filter(Boolean).join(\" \")}\n data-theme={theme}\n viewBox={sceneGeometry.viewBox}\n role=\"img\"\n aria-label={ariaLabel}\n style={svgStyle}\n >\n <SquircleDefinitions prefix={prefix} geometry={sceneGeometry} />\n {visibleLayers.map((layer) => (\n <SquircleLayer\n key={layer.id}\n layer={layer}\n geometry={sceneGeometry}\n prefix={prefix}\n selected={selectedLayerId === layer.id}\n onSelect={onLayerSelect}\n />\n ))}\n </svg>\n );\n}\n\nfunction SquircleDefinitions({ prefix, geometry }: { prefix: string; geometry: ReturnType<typeof createSquircleGeometry> }) {\n return (\n <defs>\n {Object.values(SQUIRCLE_PALETTES).map((palette) => (\n <g key={palette.id}>\n <LinearGradient\n id={`${prefix}-top-${palette.id}`}\n x1={geometry.topBounds.minX}\n y1={geometry.topBounds.minY}\n x2={geometry.topBounds.maxX}\n y2={geometry.topBounds.maxY}\n stops={palette.top}\n />\n <LinearGradient\n id={`${prefix}-side-${palette.id}`}\n x1={geometry.sideBounds.minX}\n y1={geometry.sideBounds.minY}\n x2={geometry.sideBounds.maxX}\n y2={geometry.sideBounds.maxY}\n stops={palette.side}\n />\n <LinearGradient\n id={`${prefix}-text-surface-${palette.id}`}\n x1={-425.63}\n y1={-0.1}\n x2={425.6}\n y2={0.07}\n stops={palette.top}\n />\n <LinearGradient\n id={`${prefix}-text-wire-${palette.id}`}\n x1={-64}\n y1={-24}\n x2={64}\n y2={24}\n stops={palette.textWire}\n />\n </g>\n ))}\n </defs>\n );\n}\n\nfunction LinearGradient({\n id,\n x1,\n y1,\n x2,\n y2,\n stops\n}: {\n id: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stops: { offset: number; color: string }[];\n}) {\n return (\n <linearGradient id={id} x1={x1} y1={y1} x2={x2} y2={y2} gradientUnits=\"userSpaceOnUse\">\n {stops.map((stop) => (\n <stop key={`${stop.offset}-${stop.color}`} offset={stop.offset} stopColor={stop.color} />\n ))}\n </linearGradient>\n );\n}\n\nfunction SquircleLayer({\n layer,\n geometry,\n prefix,\n selected,\n onSelect\n}: {\n layer: SquircleLayerConfig;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n selected: boolean;\n onSelect?: (layerId: string) => void;\n}) {\n const base = resolveVariant(layer.base, layer.stroke, layer.opacity);\n const hover = layer.hover ? resolveVariant({ ...layer.base, ...layer.hover }, layer.stroke, layer.opacity) : null;\n const hasHover = Boolean(hover && variantSignature(hover) !== variantSignature(base));\n const x = layer.offset?.x ?? 0;\n const y = layer.offset?.y ?? 0;\n\n return (\n <g\n className={[\n \"sq-layer\",\n hasHover ? \"sq-has-hover\" : \"\",\n selected ? \"is-selected\" : \"\",\n layer.className\n ].filter(Boolean).join(\" \")}\n data-layer-id={layer.id}\n data-hover-enabled={String(hasHover)}\n transform={`translate(${x} ${y})`}\n onClick={onSelect ? () => onSelect(layer.id) : undefined}\n >\n <SquircleVariant className=\"sq-base\" variant={base} geometry={geometry} prefix={prefix} />\n {hasHover && hover ? <SquircleVariant className=\"sq-hover\" variant={hover} geometry={geometry} prefix={prefix} /> : null}\n </g>\n );\n}\n\nfunction SquircleVariant({\n className,\n variant,\n geometry,\n prefix\n}: {\n className: string;\n variant: ResolvedVariant;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n}) {\n const palette = getSquirclePalette(variant.paletteId);\n const topFill = `url(#${prefix}-top-${palette.id})`;\n const sideFill = `url(#${prefix}-side-${palette.id})`;\n const textSurfaceFill = `url(#${prefix}-text-surface-${palette.id})`;\n const textWireFill = `url(#${prefix}-text-wire-${palette.id})`;\n const wallPoints = pointsToString(geometry.wallPoints);\n const topPoints = pointsToString(geometry.topPoints);\n const hiddenPoints = pointsToString(geometry.hiddenPoints);\n const inlayPoints = pointsToString(geometry.inlayPoints);\n\n return (\n <g className={[\"sq-variant\", className, `sq-material-${variant.material}`].join(\" \")}>\n {variant.material === \"wireframe\" ? (\n <>\n <polyline\n className=\"sq-hidden\"\n points={hiddenPoints}\n stroke={topFill}\n strokeWidth={variant.stroke.hidden}\n opacity={variant.stroke.hiddenOpacity}\n />\n <polygon\n className=\"sq-face sq-wire-side\"\n points={wallPoints}\n fill=\"none\"\n stroke={topFill}\n strokeWidth={variant.stroke.wire}\n strokeOpacity={variant.stroke.wireOpacity}\n />\n <polygon\n className=\"sq-face sq-wire-top\"\n points={topPoints}\n fill=\"none\"\n stroke={topFill}\n strokeWidth={variant.stroke.wire}\n strokeOpacity={variant.stroke.wireOpacity}\n />\n </>\n ) : (\n <>\n <polygon\n className=\"sq-face sq-solid-side\"\n points={wallPoints}\n fill={sideFill}\n fillOpacity={variant.material === \"transparent\" ? variant.opacity.transparentFace : 1}\n stroke={palette.sideEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n <polygon\n className=\"sq-face sq-solid-top\"\n points={topPoints}\n fill={topFill}\n fillOpacity={variant.material === \"transparent\" ? variant.opacity.transparentFace : 1}\n stroke={palette.topEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n </>\n )}\n {variant.dash ? (\n <polygon\n className=\"sq-inlay\"\n points={inlayPoints}\n stroke={dashPaint(variant, palette, topFill)}\n strokeWidth={variant.material === \"wireframe\" ? variant.stroke.wireDash : variant.stroke.dash}\n opacity={annotationOpacity(variant)}\n />\n ) : null}\n {variant.text ? (\n <text\n className=\"sq-label\"\n transform={geometry.labelTransform}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontFamily={variant.textFontFamily}\n fontSize={variant.textSize}\n fontWeight={variant.textFontWeight}\n {...textPaintProps(variant, palette, textSurfaceFill, textWireFill)}\n >\n {variant.text}\n </text>\n ) : null}\n </g>\n );\n}\n\nfunction resolveVariant(\n variant: SquircleVariantConfig,\n layerStroke: Partial<SquircleStrokeConfig> = {},\n layerOpacity: Partial<SquircleOpacityConfig> = {}\n): ResolvedVariant {\n return {\n material: variant.material ?? \"wireframe\",\n paletteId: variant.paletteId ?? \"15\",\n text: normalizeTextValue(variant.text, legacyVariant(variant).gpu),\n dash: variant.dash ?? false,\n textStyle: normalizeTextStyle(variant.textStyle ?? legacyVariant(variant).gpuStyle ?? \"solid\"),\n textColor: normalizeAnnotationColor(variant.textColor ?? legacyVariant(variant).gpuColor ?? \"contrast\"),\n textSize: variant.textSize ?? DEFAULT_TEXT_SIZE,\n textFontFamily: variant.textFontFamily ?? DEFAULT_TEXT_FONT_FAMILY,\n textFontWeight: variant.textFontWeight ?? DEFAULT_TEXT_FONT_WEIGHT,\n dashColor: normalizeAnnotationColor(variant.dashColor ?? \"contrast\"),\n stroke: { ...DEFAULT_STROKES, ...layerStroke, ...variant.stroke },\n opacity: { ...DEFAULT_OPACITY, ...layerOpacity, ...variant.opacity }\n };\n}\n\nfunction legacyVariant(variant: SquircleVariantConfig): LegacyTextVariantConfig {\n return variant as SquircleVariantConfig & LegacyTextVariantConfig;\n}\n\nfunction normalizeTextValue(value: SquircleVariantConfig[\"text\"], legacyGpu: boolean | undefined): string | null {\n if (typeof value === \"string\") return value.trim() ? value : null;\n if (value === true || legacyGpu) return DEFAULT_TEXT;\n return null;\n}\n\nfunction normalizeTextStyle(style: SquircleTextStyle | string): SquircleTextStyle {\n return style === \"wireframe\" ? \"wireframe\" : \"solid\";\n}\n\nfunction normalizeAnnotationColor(color: SquircleAnnotationColor): Exclude<SquircleAnnotationColor, \"auto\"> {\n return color === \"auto\" ? \"contrast\" : color;\n}\n\nfunction annotationPaint(color: SquircleAnnotationColor, labelFill: string): string {\n const normalized = normalizeAnnotationColor(color);\n if (normalized === \"white\") return \"#ffffff\";\n if (normalized === \"black\") return \"#05070a\";\n return labelFill;\n}\n\nfunction dashPaint(variant: ResolvedVariant, palette: ReturnType<typeof getSquirclePalette>, topFill: string): string {\n if (variant.material === \"wireframe\") return topFill;\n return annotationPaint(variant.dashColor, palette.labelFill);\n}\n\nfunction annotationOpacity(variant: ResolvedVariant): number {\n if (variant.material === \"transparent\") return variant.opacity.transparentAnnotation;\n return variant.opacity.solidAnnotation;\n}\n\nfunction textPaintProps(\n variant: ResolvedVariant,\n palette: ReturnType<typeof getSquirclePalette>,\n textSurfaceFill: string,\n textWireFill: string\n): SVGProps<SVGTextElement> {\n const opacity = annotationOpacity(variant);\n\n if (variant.material === \"wireframe\") {\n if (variant.textStyle === \"wireframe\") {\n return {\n fill: \"none\",\n stroke: textWireFill,\n strokeWidth: variant.stroke.labelWire,\n opacity\n };\n }\n return {\n fill: textSurfaceFill,\n stroke: \"none\",\n strokeWidth: 0,\n opacity: 1\n };\n }\n\n if (variant.textStyle === \"wireframe\") {\n return {\n fill: \"none\",\n stroke: annotationPaint(variant.textColor, palette.labelFill),\n strokeWidth: variant.stroke.labelWire,\n opacity\n };\n }\n\n return {\n fill: annotationPaint(variant.textColor, palette.labelFill),\n stroke: \"none\",\n strokeWidth: 0,\n opacity\n };\n}\n\nfunction variantSignature(variant: ResolvedVariant): string {\n return JSON.stringify(variant);\n}\n","import type { SquircleLayerConfig, SquircleTheme, SquircleVariantConfig } from \"./types\";\n\nexport interface SquircleReactCodeOptions {\n layers: SquircleLayerConfig[];\n theme: SquircleTheme;\n componentName?: string;\n importPath?: string;\n ariaLabel?: string;\n}\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: \"solid\" | \"wireframe\";\n gpuColor?: SquircleVariantConfig[\"textColor\"];\n}\n\nexport function createSquircleReactCode({\n layers,\n theme,\n componentName = \"CustomSquircle\",\n importPath = \"./squircle\",\n ariaLabel\n}: SquircleReactCodeOptions): string {\n const normalizedName = toComponentName(componentName);\n const normalizedImportPath = JSON.stringify(importPath);\n const normalizedAriaLabel = JSON.stringify(ariaLabel ?? `${normalizedName} composition`);\n const layersCode = JSON.stringify(layers.map(layerForReactCode), null, 2);\n\n return [\n `import { SquircleScene, type SquircleLayerConfig, type SquircleTheme } from ${normalizedImportPath};`,\n \"\",\n `const theme: SquircleTheme = ${JSON.stringify(theme)};`,\n \"\",\n `const layers: SquircleLayerConfig[] = ${layersCode};`,\n \"\",\n `export function ${normalizedName}() {`,\n \" return (\",\n \" <SquircleScene\",\n \" theme={theme}\",\n \" layers={layers}\",\n ` ariaLabel={${normalizedAriaLabel}}`,\n \" />\",\n \" );\",\n \"}\",\n \"\"\n ].join(\"\\n\");\n}\n\nfunction layerForReactCode(layer: SquircleLayerConfig): SquircleLayerConfig {\n return pruneUndefined({\n ...layer,\n base: variantForReactCode(layer.base),\n hover: layer.hover ? variantForReactCode(layer.hover) : undefined\n });\n}\n\nfunction variantForReactCode(variant: SquircleVariantConfig): SquircleVariantConfig {\n const { gpu, gpuStyle, gpuColor, ...rest } = variant as SquircleVariantConfig & LegacyTextVariantConfig;\n const text = textForExport(rest.text, gpu);\n const textStyle = rest.textStyle ?? gpuStyle;\n const textColor = rest.textColor ?? gpuColor;\n\n return pruneUndefined({\n ...rest,\n text,\n textStyle,\n textColor\n });\n}\n\nfunction textForExport(text: SquircleVariantConfig[\"text\"], legacyGpu: boolean | undefined): SquircleVariantConfig[\"text\"] | undefined {\n if (typeof text === \"string\") return text;\n if (text === true || legacyGpu) return \"GPU\";\n if (text === false) return false;\n return undefined;\n}\n\nfunction pruneUndefined<T extends Record<string, unknown>>(input: T): T {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined)) as T;\n}\n\nexport function toComponentName(input: string): string {\n const words = input\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean);\n const name = words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const candidate = name || \"CustomSquircle\";\n\n return /^[A-Za-z_$]/.test(candidate) ? candidate : `Squircle${candidate}`;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createSquircleReactCode } from \"./codeExport\";\nimport { reflowLayerOffsets } from \"./geometry\";\nimport { SQUIRCLE_PALETTE_IDS, SQUIRCLE_PALETTES } from \"./palettes\";\nimport { SquircleScene } from \"./SquircleScene\";\nimport type { SquircleLayerConfig, SquircleMaterial, SquircleTheme, SquircleVariantConfig } from \"./types\";\nimport \"./SquircleEditor.css\";\n\nconst DEFAULT_LAYER_GAP = 88;\nconst DEFAULT_TEXT = \"GPU\";\nconst MATERIALS: SquircleMaterial[] = [\"wireframe\", \"solid\", \"transparent\"];\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: \"solid\" | \"wireframe\";\n}\n\nexport interface SquircleEditorProps {\n value?: SquircleLayerConfig[];\n initialLayers?: SquircleLayerConfig[];\n onChange?: (layers: SquircleLayerConfig[]) => void;\n title?: string;\n description?: string;\n /** @deprecated The editor now exports React code instead of schema-tagged JSON. */\n schema?: string;\n className?: string;\n layerGap?: number;\n showCode?: boolean;\n /** @deprecated Use showCode. */\n showConfig?: boolean;\n codeComponentName?: string;\n codeImportPath?: string;\n theme?: SquircleTheme;\n defaultTheme?: SquircleTheme;\n onThemeChange?: (theme: SquircleTheme) => void;\n showThemeSwitch?: boolean;\n}\n\nexport function createDefaultSquircleEditorLayers(paletteId = \"15\"): SquircleLayerConfig[] {\n return reflowLayerOffsets([\n {\n id: \"bottom\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n },\n {\n id: \"middle\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n },\n {\n id: \"top\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n }\n ], DEFAULT_LAYER_GAP);\n}\n\nexport function SquircleEditor({\n value,\n initialLayers,\n onChange,\n title = \"Squircle\",\n description = \"React component constructor with 0-N layers and exported code.\",\n className,\n layerGap = DEFAULT_LAYER_GAP,\n showCode,\n showConfig = true,\n codeComponentName,\n codeImportPath = \"./squircle\",\n theme,\n defaultTheme = \"light\",\n onThemeChange,\n showThemeSwitch = true\n}: SquircleEditorProps) {\n const [internalLayers, setInternalLayers] = useState<SquircleLayerConfig[]>(\n () => initialLayers ?? createDefaultSquircleEditorLayers()\n );\n const [internalTheme, setInternalTheme] = useState<SquircleTheme>(defaultTheme);\n const layers = value ?? internalLayers;\n const activeTheme = theme ?? internalTheme;\n const [selectedId, setSelectedId] = useState<string | null>(() => layers.at(-1)?.id ?? null);\n const [copiedCode, setCopiedCode] = useState(false);\n const selectedLayer = layers.find((layer) => layer.id === selectedId) ?? null;\n const shouldShowCode = showCode ?? showConfig;\n const maxOffsetY = Math.max(0, ...layers.map((layer) => layer.offset?.y ?? 0));\n const sceneConfig = useMemo(\n () => ({\n layers,\n geometry: { viewBoxHeight: Math.max(480, maxOffsetY + 320) },\n selectedLayerId: selectedId\n }),\n [layers, maxOffsetY, selectedId]\n );\n const reactCode = useMemo(\n () => createSquircleReactCode({\n layers,\n theme: activeTheme,\n componentName: codeComponentName ?? title,\n importPath: codeImportPath,\n ariaLabel: `${title} composition`\n }),\n [activeTheme, codeComponentName, codeImportPath, layers, title]\n );\n\n useEffect(() => {\n if (selectedId && layers.some((layer) => layer.id === selectedId)) return;\n setSelectedId(layers.at(-1)?.id ?? null);\n }, [layers, selectedId]);\n\n useEffect(() => {\n setCopiedCode(false);\n }, [reactCode]);\n\n function commitLayers(nextLayers: SquircleLayerConfig[], options: { reflow?: boolean } = {}) {\n const finalLayers = options.reflow ? reflowLayerOffsets(nextLayers, layerGap) : nextLayers;\n if (!value) setInternalLayers(finalLayers);\n onChange?.(finalLayers);\n }\n\n function updateLayer(id: string, patcher: (layer: SquircleLayerConfig) => SquircleLayerConfig) {\n commitLayers(layers.map((layer) => (layer.id === id ? patcher(layer) : layer)));\n }\n\n function updateBase(patch: SquircleVariantConfig) {\n if (!selectedLayer) return;\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n base: { ...layer.base, ...patch }\n }));\n }\n\n function updateHover(patch: SquircleVariantConfig) {\n if (!selectedLayer) return;\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n hover: { ...(layer.hover ?? layer.base), ...patch }\n }));\n }\n\n function addLayer() {\n const newLayer: SquircleLayerConfig = {\n id: `layer-${layers.length + 1}`,\n visible: true,\n base: { material: \"wireframe\", paletteId: layers.at(-1)?.base.paletteId ?? \"15\" }\n };\n const next = [...layers, newLayer];\n setSelectedId(newLayer.id);\n commitLayers(next, { reflow: true });\n }\n\n function removeSelectedLayer() {\n if (!selectedLayer) return;\n const next = layers.filter((layer) => layer.id !== selectedLayer.id);\n setSelectedId(next.at(-1)?.id ?? null);\n commitLayers(next, { reflow: true });\n }\n\n function toggleVisibility(id: string) {\n updateLayer(id, (layer) => ({ ...layer, visible: layer.visible === false }));\n }\n\n function commitTheme(nextTheme: SquircleTheme) {\n if (!theme) setInternalTheme(nextTheme);\n onThemeChange?.(nextTheme);\n }\n\n async function copyReactCode() {\n try {\n await navigator.clipboard.writeText(reactCode);\n } catch {\n const copySource = document.createElement(\"textarea\");\n copySource.value = reactCode;\n copySource.setAttribute(\"readonly\", \"\");\n copySource.style.position = \"fixed\";\n copySource.style.top = \"-9999px\";\n document.body.append(copySource);\n copySource.select();\n document.execCommand(\"copy\");\n copySource.remove();\n }\n setCopiedCode(true);\n window.setTimeout(() => setCopiedCode(false), 1400);\n }\n\n return (\n <main className={[\"squircle-editor\", `squircle-editor-${activeTheme}`, className].filter(Boolean).join(\" \")} data-theme={activeTheme} aria-label=\"Squircle editor\">\n <header className=\"squircle-editor-topbar\">\n <div>\n <h1>{title}</h1>\n <p>{description}</p>\n </div>\n <div className=\"topbar-actions\">\n {showThemeSwitch ? (\n <div className=\"theme-switch\" role=\"group\" aria-label=\"Theme\">\n <button\n type=\"button\"\n aria-pressed={activeTheme === \"light\"}\n onClick={() => commitTheme(\"light\")}\n >\n Light\n </button>\n <button\n type=\"button\"\n aria-pressed={activeTheme === \"dark\"}\n onClick={() => commitTheme(\"dark\")}\n >\n Dark\n </button>\n </div>\n ) : null}\n <button type=\"button\" onClick={addLayer}>Add layer</button>\n <button type=\"button\" onClick={() => commitLayers([])}>Clear</button>\n </div>\n </header>\n\n <section className=\"squircle-editor-workspace\">\n <aside className=\"side-panel\">\n <div className=\"panel-heading\">\n <h2>Layers</h2>\n <span>{layers.length}</span>\n </div>\n <div className=\"squircle-editor-layer-list\">\n {[...layers].reverse().map((layer, reverseIndex) => {\n const index = layers.length - reverseIndex;\n return (\n <div className=\"squircle-editor-layer-row\" key={layer.id}>\n <button\n type=\"button\"\n className={layer.id === selectedId ? \"layer-select is-active\" : \"layer-select\"}\n onClick={() => setSelectedId(layer.id)}\n >\n <strong>{index === layers.length ? \"Top\" : index === 1 ? \"Bottom\" : `Layer ${index}`}</strong>\n <span>{summary(layer.base)}</span>\n </button>\n <button\n type=\"button\"\n className=\"icon-text\"\n aria-pressed={layer.visible !== false}\n onClick={() => toggleVisibility(layer.id)}\n >\n {layer.visible === false ? \"Show\" : \"Hide\"}\n </button>\n </div>\n );\n })}\n </div>\n </aside>\n\n <section className=\"squircle-editor-preview\">\n <SquircleScene\n {...sceneConfig}\n theme={activeTheme}\n ariaLabel=\"Editable squircle composition\"\n onLayerSelect={setSelectedId}\n />\n {shouldShowCode ? (\n <section className=\"code-panel\" aria-label=\"Generated React code\">\n <header className=\"code-panel-header\">\n <div>\n <h2>Code</h2>\n <p>Copy a ready-to-use React component.</p>\n </div>\n <button\n type=\"button\"\n className=\"copy-code-button\"\n aria-label=\"Copy React code\"\n title=\"Copy React code\"\n onClick={copyReactCode}\n >\n <CopyIcon />\n <span className=\"copy-status\" aria-live=\"polite\">{copiedCode ? \"Copied\" : \"\"}</span>\n </button>\n </header>\n <pre className=\"code-output\"><code>{reactCode}</code></pre>\n </section>\n ) : null}\n </section>\n\n <aside className={selectedLayer ? \"side-panel inspector-panel\" : \"side-panel inspector-panel is-empty\"}>\n {selectedLayer ? (\n <>\n <div className=\"panel-heading\">\n <h2>{selectedLayer.id}</h2>\n <button type=\"button\" className=\"icon-text danger\" onClick={removeSelectedLayer}>Delete</button>\n </div>\n\n <EditorSection title=\"Base\">\n <SelectField\n label=\"Material\"\n value={selectedLayer.base.material ?? \"wireframe\"}\n options={MATERIALS}\n onChange={(nextValue) => updateBase({ material: nextValue as SquircleMaterial })}\n />\n <PaletteField\n value={selectedLayer.base.paletteId ?? \"15\"}\n onChange={(paletteId) => updateBase({ paletteId })}\n />\n <ToggleField label=\"Text\" checked={variantHasText(selectedLayer.base)} onChange={(enabled) => updateBase({ text: enabled ? variantTextValue(selectedLayer.base) : false })} />\n {variantHasText(selectedLayer.base) ? (\n <TextField\n label=\"Text\"\n value={variantTextValue(selectedLayer.base)}\n onChange={(text) => updateBase({ text })}\n />\n ) : null}\n <ToggleField label=\"Dash\" checked={selectedLayer.base.dash ?? false} onChange={(dash) => updateBase({ dash })} />\n <SelectField\n label=\"Text paint\"\n value={variantTextStyle(selectedLayer.base)}\n options={[\"solid\", \"wireframe\"]}\n onChange={(textStyle) => updateBase({ textStyle: textStyle as \"solid\" | \"wireframe\" })}\n />\n </EditorSection>\n\n <EditorSection title=\"Hover\">\n <ToggleField\n label=\"Enabled\"\n checked={Boolean(selectedLayer.hover)}\n onChange={(enabled) => {\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n hover: enabled ? { ...layer.base, material: layer.base.material === \"wireframe\" ? \"solid\" : \"wireframe\" } : undefined\n }));\n }}\n />\n {selectedLayer.hover ? (\n <>\n <SelectField\n label=\"Material\"\n value={selectedLayer.hover.material ?? selectedLayer.base.material ?? \"wireframe\"}\n options={MATERIALS}\n onChange={(nextValue) => updateHover({ material: nextValue as SquircleMaterial })}\n />\n <PaletteField\n value={selectedLayer.hover.paletteId ?? selectedLayer.base.paletteId ?? \"15\"}\n onChange={(paletteId) => updateHover({ paletteId })}\n />\n </>\n ) : null}\n </EditorSection>\n\n <EditorSection title=\"Stroke Widths\">\n <RangeField\n label=\"Face\"\n value={selectedLayer.stroke?.face ?? 0.35}\n min={0}\n max={1.5}\n step={0.05}\n onChange={(face) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, face } }))}\n />\n <RangeField\n label=\"Wire\"\n value={selectedLayer.stroke?.wire ?? 1.6}\n min={0.4}\n max={4}\n step={0.1}\n onChange={(wire) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, wire } }))}\n />\n <RangeField\n label=\"Dash\"\n value={selectedLayer.stroke?.dash ?? 2.2}\n min={0.6}\n max={5}\n step={0.1}\n onChange={(dash) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, dash } }))}\n />\n <RangeField\n label=\"Text outline\"\n value={selectedLayer.stroke?.labelWire ?? 1.1}\n min={0.4}\n max={2}\n step={0.05}\n onChange={(labelWire) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, labelWire } }))}\n />\n </EditorSection>\n </>\n ) : (\n <p className=\"empty-note\">Select a layer in the list or preview.</p>\n )}\n </aside>\n </section>\n </main>\n );\n}\n\nfunction EditorSection({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"editor-section\">\n <h3>{title}</h3>\n {children}\n </section>\n );\n}\n\nfunction SelectField({\n label,\n value,\n options,\n onChange\n}: {\n label: string;\n value: string;\n options: string[];\n onChange: (value: string) => void;\n}) {\n return (\n <label className=\"field\">\n <span>{label}</span>\n <select value={value} onChange={(event) => onChange(event.target.value)}>\n {options.map((option) => (\n <option key={option} value={option}>{option}</option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction PaletteField({ value, onChange }: { value: string; onChange: (value: string) => void }) {\n return (\n <label className=\"field\">\n <span>Palette</span>\n <select value={value} onChange={(event) => onChange(event.target.value)}>\n {SQUIRCLE_PALETTE_IDS.map((id) => (\n <option key={id} value={id}>{SQUIRCLE_PALETTES[id].label}</option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction ToggleField({ label, checked, onChange }: { label: string; checked: boolean; onChange: (value: boolean) => void }) {\n return (\n <label className=\"toggle-field\">\n <input type=\"checkbox\" checked={checked} onChange={(event) => onChange(event.target.checked)} />\n <span>{label}</span>\n </label>\n );\n}\n\nfunction TextField({\n label,\n value,\n onChange\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <label className=\"field\">\n <span>{label}</span>\n <input type=\"text\" value={value} onChange={(event) => onChange(event.target.value)} />\n </label>\n );\n}\n\nfunction RangeField({\n label,\n value,\n min,\n max,\n step,\n onChange\n}: {\n label: string;\n value: number;\n min: number;\n max: number;\n step: number;\n onChange: (value: number) => void;\n}) {\n return (\n <label className=\"field\">\n <span>{label}: {value.toFixed(2)}</span>\n <input type=\"range\" min={min} max={max} step={step} value={value} onChange={(event) => onChange(Number(event.target.value))} />\n </label>\n );\n}\n\nfunction CopyIcon() {\n return (\n <svg className=\"copy-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V6.8C5 5.8 5.8 5 6.8 5H15\" />\n </svg>\n );\n}\n\nfunction summary(variant: SquircleVariantConfig): string {\n const parts = [variant.material ?? \"wireframe\", variant.paletteId ?? \"15\"];\n if (variantHasText(variant)) parts.push(`text: ${variantTextValue(variant)}`);\n if (variant.dash) parts.push(\"dash\");\n return parts.join(\" / \");\n}\n\nfunction variantHasText(variant: SquircleVariantConfig): boolean {\n if (typeof variant.text === \"string\") return variant.text.trim().length > 0;\n return variant.text === true || legacyVariant(variant).gpu === true;\n}\n\nfunction variantTextValue(variant: SquircleVariantConfig): string {\n if (typeof variant.text === \"string\") return variant.text;\n if (variant.text === true || legacyVariant(variant).gpu) return DEFAULT_TEXT;\n return DEFAULT_TEXT;\n}\n\nfunction variantTextStyle(variant: SquircleVariantConfig): \"solid\" | \"wireframe\" {\n return variant.textStyle ?? legacyVariant(variant).gpuStyle ?? \"solid\";\n}\n\nfunction legacyVariant(variant: SquircleVariantConfig): LegacyTextVariantConfig {\n return variant as SquircleVariantConfig & LegacyTextVariantConfig;\n}\n"],"mappings":";;;AAEA,IAAa,IAAmB;CAC9B,OAAO;CACP,eAAe;CACf,UAAU;CACV,SAAS;CACT,aAAa;CACb,cAAc;CACd,YAAY;AACd;AAgCA,SAAgB,EAAuB,IAAgC,CAAC,GAAqB;CAC3F,IAAM,IAAW,EAAM,YAAY,EAAiB,UAC9C,IAAU,EAAM,WAAW,EAAiB,SAC5C,IAAQ,EAAM,SAAS,EAAiB,OACxC,IAAgB,EAAM,iBAAiB,EAAiB,eACxD,IAAc,EAAM,eAAe,EAAiB,aACpD,IAAe,EAAM,gBAAgB,EAAiB,cACtD,IAAa,EAAM,cAAc,EAAiB,YAClD,IAAS,IAAe,KAAK,KAAM,KACnC,IAAO,KAAK,IAAI,CAAK,GACrB,IAAO,KAAK,IAAI,CAAK,GAGrB,IADO,EAAmB,GAAG,GAAU,CACzB,CAAA,CAAK,KAAK,OAAW,EAAM,IAAI,EAAM,KAAK,CAAI,GAC5D,IAAY,KAAK,IAAI,GAAG,CAAW,IAAI,KAAK,IAAI,GAAG,CAAW,GAC9D,IAAW,EAAM,YAAY,IAAQ,GACrC,IAAY,EAAmB,GAAU,GAAU,CAAO,GAC1D,IAAa,EAAU,KAAK,OAAW,EAAM,IAAI,EAAM,KAAK,CAAI,GAChE,IAAa,EAAU,KAAK,OAAW,EAAM,IAAI,EAAM,KAAK,CAAI,GAChE,IAAS,EAAM,UAAU;EAC7B,GAAG,CAAC,KAAK,IAAI,GAAG,CAAU;EAC1B,GAAG,IAAc,KAAK,IAAI,GAAG,CAAU;CACzC,GAEM,IAAY,EAAU,KAAK,MAAU,EAAQ,GAAO,GAAa,GAAQ,GAAM,CAAI,CAAC,GACpF,IAAe,EAAU,KAAK,MAAU,EAAQ,GAAO,GAAG,GAAQ,GAAM,CAAI,CAAC,GAC7E,IAAW,EAAmB,EAAU,KAAK,MAAU,EAAM,KAAK,EAAM,MAAM,CAAC,CAAC,GAChF,IAAU,EAAc,GAAU,CAAO,GACzC,IAAU,EAAgB,GAAW,CAAQ,GAC7C,IAAa,EAAgB,GAAc,CAAQ,CAAC,CAAC,QAAQ,GAC7D,IAAa,CAAC,GAAG,GAAS,GAAG,CAAU,GACvC,IAAe,EAAgB,GAAc,CAAO,GACpD,IAAc,EAAmB,IAAW,GAAY,GAAU,CAAO,CAAC,CAAC,KAAK,MACpF,EAAQ,GAAO,GAAa,GAAQ,GAAM,CAAI,CAChD,GACM,IAAY,EAAU,CAAS,GAC/B,IAAa,EAAU,CAAC,GAAG,GAAW,GAAG,CAAU,CAAC;CAE1D,OAAO;EACL,QAAQ;GACN;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAgB,UAAU,EAAM,CAAI,EAAE,GAAG,EAAM,CAAI,EAAE,GAAG,EAAM,CAAC,CAAI,EAAE,GAAG,EAAM,CAAI,EAAE,GAAG,EAAM,EAAO,CAAC,EAAE,GAAG,EAAM,EAAO,IAAI,CAAW,EAAE;EACxI;EACA;EACA,SAAS,OAAO,EAAM,CAAK,EAAE,GAAG,EAAM,CAAa;CACrD;AACF;AAEA,SAAgB,EAAe,GAAiC;CAC9D,OAAO,EAAO,KAAK,MAAU,GAAG,EAAM,EAAM,CAAC,EAAE,GAAG,EAAM,EAAM,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;AAC9E;AAEA,SAAgB,EACd,GACA,IAII,CAAC,GACkB;CACvB,IAAM,IAAM,EAAQ,OAAO,IACrB,IAAW,EAAQ,YAAY,aAC/B,IAAY,EAAQ,aAAa;CAEvC,OAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,CAAK,EAAE,IAAI,GAAG,OAAW;EAC/D,IAAI,SAAS,IAAQ;EACrB,SAAS;EACT,QAAQ;GAAE,GAAG;GAAG,IAAI,IAAQ,IAAQ,KAAK;EAAI;EAC7C,MAAM;GAAE;GAAU;GAAW,MAAM;GAAO,MAAM;EAAM;EACtD,OAAO,KAAA;CACT,EAAE;AACJ;AAEA,SAAgB,EAAmB,GAA+B,IAAM,IAA2B;CACjG,IAAM,IAAQ,EAAO;CACrB,OAAO,EAAO,KAAK,GAAO,OAAW;EACnC,GAAG;EACH,QAAQ;GAAE,GAAG,EAAM,QAAQ,KAAK;GAAG,IAAI,IAAQ,IAAQ,KAAK;EAAI;CAClE,EAAE;AACJ;AAEA,SAAS,EAAmB,GAAkB,GAAkB,GAAiC;CAC/F,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAQ,IAAI,GAAG,MAAU;EACnD,IAAM,IAAK,IAAI,KAAK,KAAK,IAAS,GAC5B,IAAI,KAAK,IAAI,CAAC,GACd,IAAI,KAAK,IAAI,CAAC;EACpB,OAAO;GACL,GAAG,IAAW,EAAY,GAAG,IAAI,CAAQ;GACzC,GAAG,IAAW,EAAY,GAAG,IAAI,CAAQ;GACzC,IAAI,EAAY,GAAI,KAAK,IAAW,KAAM,CAAQ;GAClD,IAAI,EAAY,GAAI,KAAK,IAAW,KAAM,CAAQ;EACpD;CACF,CAAC;AACH;AAEA,SAAS,EAAY,GAAe,GAAuB;CACzD,OAAO,KAAK,KAAK,CAAK,IAAa,KAAK,IAAI,CAAK,MAAG;AACtD;AAEA,SAAS,EAAQ,GAAsB,GAAW,GAAuB,GAAc,GAA6B;CAClH,OAAO;EACL,GAAG,EAAO,KAAK,EAAM,IAAI,EAAM,KAAK;EACpC,GAAG,EAAO,KAAK,EAAM,IAAI,EAAM,KAAK,IAAO;CAC7C;AACF;AAEA,SAAS,EAAmB,GAAqD;CAC/E,IAAM,IAAU,CAAC,GAAG,GAAO,GAAG,CAAK,GAC/B,IAAO;EAAE,OAAO;EAAG,QAAQ;CAAE,GAC7B,IAAe,GACf,IAAgB;CAcpB,OAZA,EAAQ,SAAS,GAAM,MAAU;EAC/B,AAAI,KACE,MAAkB,MAAG,IAAe,IACxC,KAAiB,GACb,IAAgB,EAAK,UAAU,KAAiB,EAAM,WACxD,IAAO;GAAE,OAAO,IAAe,EAAM;GAAQ,QAAQ;EAAc,MAGrE,IAAgB;CAEpB,CAAC,GAEM,EAAK,SAAS,IAAI,IAAO;EAAE,OAAO;EAAG,QAAQ,EAAM;CAAO;AACnE;AAEA,SAAS,EAAc,GAAwC,GAAkD;CAC/G,OAAO;EACL,QAAQ,EAAI,QAAQ,EAAI,UAAU;EAClC,QAAQ,KAAK,IAAI,GAAG,IAAQ,EAAI,MAAM;CACxC;AACF;AAEA,SAAS,EAAmB,GAAY,GAA6C;CACnF,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAI,OAAO,IAAI,GAAG,MAAU,GAAO,EAAI,QAAQ,KAAS,EAAM,OAAO;AACnG;AAEA,SAAS,EAAU,GAAiC;CAClD,IAAM,IAAK,EAAO,KAAK,MAAU,EAAM,CAAC,GAClC,IAAK,EAAO,KAAK,MAAU,EAAM,CAAC;CACxC,OAAO;EACL,MAAM,KAAK,IAAI,GAAG,CAAE;EACpB,MAAM,KAAK,IAAI,GAAG,CAAE;EACpB,MAAM,KAAK,IAAI,GAAG,CAAE;EACpB,MAAM,KAAK,IAAI,GAAG,CAAE;CACtB;AACF;AAEA,SAAS,EAAM,GAAuB;CACpC,OAAO,OAAO,EAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;AAC3C;;;AChMA,IAAa,IAAoB;CAC/B,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAK,OAAO;GAAU;GAChC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAK,OAAO;GAAU;GAChC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAK,OAAO;GAAU;GAChC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAK,OAAO;GAAU;GAChC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;CACA,IAAM;EACJ,IAAI;EACJ,OAAO;EACP,KAAK;GACH;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAK,OAAO;GAAU;GAChC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,MAAM;GACJ;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,UAAU;GACR;IAAE,QAAQ;IAAG,OAAO;GAAU;GAC9B;IAAE,QAAQ;IAAM,OAAO;GAAU;GACjC;IAAE,QAAQ;IAAG,OAAO;GAAU;EAChC;EACA,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ,CAAC,WAAW,SAAS;CAC/B;AACF,GAIa,IAAuB,OAAO,KAAK,CAAiB,GACpD,IAAwC;AAErD,SAAgB,EAAmB,GAAgD;CACjF,OAAO,EAAkB,MAAmC,EAAA;AAC9D;;;ACtMA,IAAM,IAAwC;CAC5C,MAAM;CACN,aAAa;CACb,MAAM;CACN,aAAa;CACb,QAAQ;CACR,eAAe;CACf,MAAM;CACN,UAAU;CACV,WAAW;AACb,GAEM,IAAyC;CAC7C,iBAAiB;CACjB,uBAAuB;CACvB,iBAAiB;AACnB,GAEM,IAAe,OACf,IAAoB,IACpB,IAA2B,gCAC3B,IAA2B;AAuBjC,SAAgB,EAAc,EAC5B,WACA,aACA,oBACA,WAAQ,SACR,aACA,cACA,eAAY,kBACZ,iBAAc,IACd,kBAAe,KACf,oBACqB;CACrB,IAAM,IAAU,EAAM,CAAC,CAAC,QAAQ,mBAAmB,EAAE,GAC/C,IAAS,KAAY,MAAM,KAE3B,IAAe,QAAc,EAAuB,CAAQ,GAAG,CADjD,KAAK,UAAU,KAAY,CAAC,CACsB,CAAW,CAAC,GAC5E,IAAgB,EAAO,QAAQ,MAAU,EAAM,YAAY,EAAK,GAChE,IAAY,KAAK,IAAI,GAAG,GAAG,EAAc,KAAK,MAAU,EAAM,QAAQ,KAAK,CAAC,CAAC,GAC7E,IAAgB,GAAU,kBAAkB,IAAc,KAAK,IAAI,EAAa,OAAO,eAAe,IAAY,EAAa,WAAW,OAAO,EAAE,IAAI,EAAa,OAAO,gBAC3K,IAAgB,GAAU,kBAAkB,IAC9C,IACA,EAAuB;EAAE,GAAG;EAAU;CAAc,CAAC,GACnD,IAAW,EAAE,sBAAsB,GAAG,EAAa,IAAI;CAE7D,OACE,kBAAC,OAAD;EACE,WAAW;GAAC;GAAkB,YAAY;GAAS;EAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACtF,cAAY;EACZ,SAAS,EAAc;EACvB,MAAK;EACL,cAAY;EACZ,OAAO;YANT,CAQE,kBAAC,GAAD;GAA6B;GAAQ,UAAU;EAAgB,CAAA,GAC9D,EAAc,KAAK,MAClB,kBAAC,GAAD;GAES;GACP,UAAU;GACF;GACR,UAAU,MAAoB,EAAM;GACpC,UAAU;EACX,GANM,EAAM,EAMZ,CACF,CACE;;AAET;AAEA,SAAS,EAAoB,EAAE,WAAQ,eAAqF;CAC1H,OACE,kBAAC,QAAD,EAAA,UACG,OAAO,OAAO,CAAiB,CAAC,CAAC,KAAK,MACrC,kBAAC,KAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,IAAI,GAAG,EAAO,OAAO,EAAQ;GAC7B,IAAI,EAAS,UAAU;GACvB,IAAI,EAAS,UAAU;GACvB,IAAI,EAAS,UAAU;GACvB,IAAI,EAAS,UAAU;GACvB,OAAO,EAAQ;EAChB,CAAA;EACD,kBAAC,GAAD;GACE,IAAI,GAAG,EAAO,QAAQ,EAAQ;GAC9B,IAAI,EAAS,WAAW;GACxB,IAAI,EAAS,WAAW;GACxB,IAAI,EAAS,WAAW;GACxB,IAAI,EAAS,WAAW;GACxB,OAAO,EAAQ;EAChB,CAAA;EACD,kBAAC,GAAD;GACE,IAAI,GAAG,EAAO,gBAAgB,EAAQ;GACtC,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,OAAO,EAAQ;EAChB,CAAA;EACD,kBAAC,GAAD;GACE,IAAI,GAAG,EAAO,aAAa,EAAQ;GACnC,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,OAAO,EAAQ;EAChB,CAAA;CACA,EAAA,GAjCK,EAAQ,EAiCb,CACJ,EACG,CAAA;AAEV;AAEA,SAAS,EAAe,EACtB,OACA,OACA,OACA,OACA,OACA,YAQC;CACD,OACE,kBAAC,kBAAD;EAAoB;EAAQ;EAAQ;EAAQ;EAAQ;EAAI,eAAc;YACnE,EAAM,KAAK,MACV,kBAAC,QAAD;GAA2C,QAAQ,EAAK;GAAQ,WAAW,EAAK;EAAQ,GAA7E,GAAG,EAAK,OAAO,GAAG,EAAK,OAAsD,CACzF;CACa,CAAA;AAEpB;AAEA,SAAS,EAAc,EACrB,UACA,aACA,WACA,aACA,eAOC;CACD,IAAM,IAAO,EAAe,EAAM,MAAM,EAAM,QAAQ,EAAM,OAAO,GAC7D,IAAQ,EAAM,QAAQ,EAAe;EAAE,GAAG,EAAM;EAAM,GAAG,EAAM;CAAM,GAAG,EAAM,QAAQ,EAAM,OAAO,IAAI,MACvG,IAAW,GAAQ,KAAS,EAAiB,CAAK,MAAM,EAAiB,CAAI,IAC7E,IAAI,EAAM,QAAQ,KAAK,GACvB,IAAI,EAAM,QAAQ,KAAK;CAE7B,OACE,kBAAC,KAAD;EACE,WAAW;GACT;GACA,IAAW,iBAAiB;GAC5B,IAAW,gBAAgB;GAC3B,EAAM;EACR,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAC1B,iBAAe,EAAM;EACrB,sBAAoB,OAAO,CAAQ;EACnC,WAAW,aAAa,EAAE,GAAG,EAAE;EAC/B,SAAS,UAAiB,EAAS,EAAM,EAAE,IAAI,KAAA;YAVjD,CAYE,kBAAC,GAAD;GAAiB,WAAU;GAAU,SAAS;GAAgB;GAAkB;EAAS,CAAA,GACxF,KAAY,IAAQ,kBAAC,GAAD;GAAiB,WAAU;GAAW,SAAS;GAAiB;GAAkB;EAAS,CAAA,IAAI,IACnH;;AAEP;AAEA,SAAS,EAAgB,EACvB,cACA,YACA,aACA,aAMC;CACD,IAAM,IAAU,EAAmB,EAAQ,SAAS,GAC9C,IAAU,QAAQ,EAAO,OAAO,EAAQ,GAAG,IAC3C,IAAW,QAAQ,EAAO,QAAQ,EAAQ,GAAG,IAC7C,IAAkB,QAAQ,EAAO,gBAAgB,EAAQ,GAAG,IAC5D,IAAe,QAAQ,EAAO,aAAa,EAAQ,GAAG,IACtD,IAAa,EAAe,EAAS,UAAU,GAC/C,IAAY,EAAe,EAAS,SAAS,GAC7C,IAAe,EAAe,EAAS,YAAY,GACnD,IAAc,EAAe,EAAS,WAAW;CAEvD,OACE,kBAAC,KAAD;EAAG,WAAW;GAAC;GAAc;GAAW,eAAe,EAAQ;EAAU,CAAC,CAAC,KAAK,GAAG;YAAnF;GACG,EAAQ,aAAa,cACpB,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,YAAD;KACE,WAAU;KACV,QAAQ;KACR,QAAQ;KACR,aAAa,EAAQ,OAAO;KAC5B,SAAS,EAAQ,OAAO;IACzB,CAAA;IACD,kBAAC,WAAD;KACE,WAAU;KACV,QAAQ;KACR,MAAK;KACL,QAAQ;KACR,aAAa,EAAQ,OAAO;KAC5B,eAAe,EAAQ,OAAO;IAC/B,CAAA;IACD,kBAAC,WAAD;KACE,WAAU;KACV,QAAQ;KACR,MAAK;KACL,QAAQ;KACR,aAAa,EAAQ,OAAO;KAC5B,eAAe,EAAQ,OAAO;IAC/B,CAAA;GACD,EAAA,CAAA,IAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,WAAD;IACE,WAAU;IACV,QAAQ;IACR,MAAM;IACN,aAAa,EAAQ,aAAa,gBAAgB,EAAQ,QAAQ,kBAAkB;IACpF,QAAQ,EAAQ;IAChB,aAAa,EAAQ,OAAO;IAC5B,eAAe,EAAQ,OAAO;GAC/B,CAAA,GACD,kBAAC,WAAD;IACE,WAAU;IACV,QAAQ;IACR,MAAM;IACN,aAAa,EAAQ,aAAa,gBAAgB,EAAQ,QAAQ,kBAAkB;IACpF,QAAQ,EAAQ;IAChB,aAAa,EAAQ,OAAO;IAC5B,eAAe,EAAQ,OAAO;GAC/B,CAAA,CACD,EAAA,CAAA;GAEH,EAAQ,OACP,kBAAC,WAAD;IACE,WAAU;IACV,QAAQ;IACR,QAAQ,EAAU,GAAS,GAAS,CAAO;IAC3C,aAAa,EAAQ,aAAa,cAAc,EAAQ,OAAO,WAAW,EAAQ,OAAO;IACzF,SAAS,EAAkB,CAAO;GACnC,CAAA,IACC;GACH,EAAQ,OACP,kBAAC,QAAD;IACE,WAAU;IACV,WAAW,EAAS;IACpB,YAAW;IACX,kBAAiB;IACjB,YAAY,EAAQ;IACpB,UAAU,EAAQ;IAClB,YAAY,EAAQ;IACpB,GAAI,EAAe,GAAS,GAAS,GAAiB,CAAY;cAEjE,EAAQ;GACL,CAAA,IACJ;EACH;;AAEP;AAEA,SAAS,EACP,GACA,IAA6C,CAAC,GAC9C,IAA+C,CAAC,GAC/B;CACjB,OAAO;EACL,UAAU,EAAQ,YAAY;EAC9B,WAAW,EAAQ,aAAa;EAChC,MAAM,EAAmB,EAAQ,MAAM,EAAc,CAAO,CAAC,CAAC,GAAG;EACjE,MAAM,EAAQ,QAAQ;EACtB,WAAW,EAAmB,EAAQ,aAAa,EAAc,CAAO,CAAC,CAAC,YAAY,OAAO;EAC7F,WAAW,EAAyB,EAAQ,aAAa,EAAc,CAAO,CAAC,CAAC,YAAY,UAAU;EACtG,UAAU,EAAQ,YAAY;EAC9B,gBAAgB,EAAQ,kBAAkB;EAC1C,gBAAgB,EAAQ,kBAAkB;EAC1C,WAAW,EAAyB,EAAQ,aAAa,UAAU;EACnE,QAAQ;GAAE,GAAG;GAAiB,GAAG;GAAa,GAAG,EAAQ;EAAO;EAChE,SAAS;GAAE,GAAG;GAAiB,GAAG;GAAc,GAAG,EAAQ;EAAQ;CACrE;AACF;AAEA,SAAS,EAAc,GAAyD;CAC9E,OAAO;AACT;AAEA,SAAS,EAAmB,GAAsC,GAA+C;CAG/G,OAFI,OAAO,KAAU,WAAiB,EAAM,KAAK,IAAI,IAAQ,OACzD,MAAU,MAAQ,IAAkB,IACjC;AACT;AAEA,SAAS,EAAmB,GAAsD;CAChF,OAAO,MAAU,cAAc,cAAc;AAC/C;AAEA,SAAS,EAAyB,GAA0E;CAC1G,OAAO,MAAU,SAAS,aAAa;AACzC;AAEA,SAAS,EAAgB,GAAgC,GAA2B;CAClF,IAAM,IAAa,EAAyB,CAAK;CAGjD,OAFI,MAAe,UAAgB,YAC/B,MAAe,UAAgB,YAC5B;AACT;AAEA,SAAS,EAAU,GAA0B,GAAgD,GAAyB;CAEpH,OADI,EAAQ,aAAa,cAAoB,IACtC,EAAgB,EAAQ,WAAW,EAAQ,SAAS;AAC7D;AAEA,SAAS,EAAkB,GAAkC;CAE3D,OADI,EAAQ,aAAa,gBAAsB,EAAQ,QAAQ,wBACxD,EAAQ,QAAQ;AACzB;AAEA,SAAS,EACP,GACA,GACA,GACA,GAC0B;CAC1B,IAAM,IAAU,EAAkB,CAAO;CA4BzC,OA1BI,EAAQ,aAAa,cACnB,EAAQ,cAAc,cACjB;EACL,MAAM;EACN,QAAQ;EACR,aAAa,EAAQ,OAAO;EAC5B;CACF,IAEK;EACL,MAAM;EACN,QAAQ;EACR,aAAa;EACb,SAAS;CACX,IAGE,EAAQ,cAAc,cACjB;EACL,MAAM;EACN,QAAQ,EAAgB,EAAQ,WAAW,EAAQ,SAAS;EAC5D,aAAa,EAAQ,OAAO;EAC5B;CACF,IAGK;EACL,MAAM,EAAgB,EAAQ,WAAW,EAAQ,SAAS;EAC1D,QAAQ;EACR,aAAa;EACb;CACF;AACF;AAEA,SAAS,EAAiB,GAAkC;CAC1D,OAAO,KAAK,UAAU,CAAO;AAC/B;;;AC5YA,SAAgB,GAAwB,EACtC,WACA,UACA,mBAAgB,kBAChB,gBAAa,cACb,gBACmC;CACnC,IAAM,IAAiB,GAAgB,CAAa,GAC9C,IAAuB,KAAK,UAAU,CAAU,GAChD,IAAsB,KAAK,UAAU,KAAa,GAAG,EAAe,aAAa,GACjF,IAAa,KAAK,UAAU,EAAO,IAAI,CAAiB,GAAG,MAAM,CAAC;CAExE,OAAO;EACL,+EAA+E,EAAqB;EACpG;EACA,gCAAgC,KAAK,UAAU,CAAK,EAAE;EACtD;EACA,yCAAyC,EAAW;EACpD;EACA,mBAAmB,EAAe;EAClC;EACA;EACA;EACA;EACA,oBAAoB,EAAoB;EACxC;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,IAAI;AACb;AAEA,SAAS,EAAkB,GAAiD;CAC1E,OAAO,GAAe;EACpB,GAAG;EACH,MAAM,EAAoB,EAAM,IAAI;EACpC,OAAO,EAAM,QAAQ,EAAoB,EAAM,KAAK,IAAI,KAAA;CAC1D,CAAC;AACH;AAEA,SAAS,EAAoB,GAAuD;CAClF,IAAM,EAAE,QAAK,aAAU,aAAU,GAAG,MAAS,GACvC,IAAO,GAAc,EAAK,MAAM,CAAG,GACnC,IAAY,EAAK,aAAa,GAC9B,IAAY,EAAK,aAAa;CAEpC,OAAO,GAAe;EACpB,GAAG;EACH;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAS,GAAc,GAAqC,GAA2E;CACrI,IAAI,OAAO,KAAS,UAAU,OAAO;CACrC,IAAI,MAAS,MAAQ,GAAW,OAAO;CACvC,IAAI,MAAS,IAAO,OAAO;AAE7B;AAEA,SAAS,GAAkD,GAAa;CACtE,OAAO,OAAO,YAAY,OAAO,QAAQ,CAAK,CAAC,CAAC,QAAQ,GAAG,OAAW,MAAU,KAAA,CAAS,CAAC;AAC5F;AAEA,SAAgB,GAAgB,GAAuB;CAQrD,IAAM,IAPQ,EACX,KAAK,CAAC,CACN,MAAM,eAAe,CAAC,CACtB,OAAO,OACG,CAAA,CACV,KAAK,MAAS,EAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAK,MAAM,CAAC,CAAC,CAAC,CAC3D,KAAK,EACU,KAAQ;CAE1B,OAAO,cAAc,KAAK,CAAS,IAAI,IAAY,WAAW;AAChE;;;ACnFA,IAAM,KAAoB,IACpB,KAAe,OACf,KAAgC;CAAC;CAAa;CAAS;AAAa;AA4B1E,SAAgB,GAAkC,IAAY,MAA6B;CACzF,OAAO,EAAmB;EACxB;GACE,IAAI;GACJ,SAAS;GACT,MAAM;IAAE,UAAU;IAAa;GAAU;EAC3C;EACA;GACE,IAAI;GACJ,SAAS;GACT,MAAM;IAAE,UAAU;IAAa;GAAU;EAC3C;EACA;GACE,IAAI;GACJ,SAAS;GACT,MAAM;IAAE,UAAU;IAAa;GAAU;EAC3C;CACF,GAAG,EAAiB;AACtB;AAEA,SAAgB,GAAe,EAC7B,UACA,kBACA,aACA,WAAQ,YACR,iBAAc,kEACd,cACA,cAAW,IACX,aACA,gBAAa,IACb,sBACA,oBAAiB,cACjB,UACA,kBAAe,SACf,kBACA,qBAAkB,MACI;CACtB,IAAM,CAAC,GAAgB,KAAqB,QACpC,KAAiB,GAAkC,CAC3D,GACM,CAAC,GAAe,KAAoB,EAAwB,CAAY,GACxE,IAAS,KAAS,GAClB,IAAc,KAAS,GACvB,CAAC,GAAY,KAAiB,QAA8B,EAAO,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI,GACrF,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,IAAgB,EAAO,MAAM,MAAU,EAAM,OAAO,CAAU,KAAK,MACnE,IAAiB,KAAY,GAC7B,IAAa,KAAK,IAAI,GAAG,GAAG,EAAO,KAAK,MAAU,EAAM,QAAQ,KAAK,CAAC,CAAC,GACvE,IAAc,SACX;EACL;EACA,UAAU,EAAE,eAAe,KAAK,IAAI,KAAK,IAAa,GAAG,EAAE;EAC3D,iBAAiB;CACnB,IACA;EAAC;EAAQ;EAAY;CAAU,CACjC,GACM,IAAY,QACV,GAAwB;EAC5B;EACA,OAAO;EACP,eAAe,KAAqB;EACpC,YAAY;EACZ,WAAW,GAAG,EAAM;CACtB,CAAC,GACD;EAAC;EAAa;EAAmB;EAAgB;EAAQ;CAAK,CAChE;CAOA,AALA,QAAgB;EACV,KAAc,EAAO,MAAM,MAAU,EAAM,OAAO,CAAU,KAChE,EAAc,EAAO,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI;CACzC,GAAG,CAAC,GAAQ,CAAU,CAAC,GAEvB,QAAgB;EACd,EAAc,EAAK;CACrB,GAAG,CAAC,CAAS,CAAC;CAEd,SAAS,EAAa,GAAmC,IAAgC,CAAC,GAAG;EAC3F,IAAM,IAAc,EAAQ,SAAS,EAAmB,GAAY,CAAQ,IAAI;EAEhF,AADK,KAAO,EAAkB,CAAW,GACzC,IAAW,CAAW;CACxB;CAEA,SAAS,EAAY,GAAY,GAA8D;EAC7F,EAAa,EAAO,KAAK,MAAW,EAAM,OAAO,IAAK,EAAQ,CAAK,IAAI,CAAM,CAAC;CAChF;CAEA,SAAS,EAAW,GAA8B;EAC3C,KACL,EAAY,EAAc,KAAK,OAAW;GACxC,GAAG;GACH,MAAM;IAAE,GAAG,EAAM;IAAM,GAAG;GAAM;EAClC,EAAE;CACJ;CAEA,SAAS,EAAY,GAA8B;EAC5C,KACL,EAAY,EAAc,KAAK,OAAW;GACxC,GAAG;GACH,OAAO;IAAE,GAAI,EAAM,SAAS,EAAM;IAAO,GAAG;GAAM;EACpD,EAAE;CACJ;CAEA,SAAS,IAAW;EAClB,IAAM,IAAgC;GACpC,IAAI,SAAS,EAAO,SAAS;GAC7B,SAAS;GACT,MAAM;IAAE,UAAU;IAAa,WAAW,EAAO,GAAG,EAAE,CAAC,EAAE,KAAK,aAAa;GAAK;EAClF,GACM,IAAO,CAAC,GAAG,GAAQ,CAAQ;EAEjC,AADA,EAAc,EAAS,EAAE,GACzB,EAAa,GAAM,EAAE,QAAQ,GAAK,CAAC;CACrC;CAEA,SAAS,IAAsB;EAC7B,IAAI,CAAC,GAAe;EACpB,IAAM,IAAO,EAAO,QAAQ,MAAU,EAAM,OAAO,EAAc,EAAE;EAEnE,AADA,EAAc,EAAK,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI,GACrC,EAAa,GAAM,EAAE,QAAQ,GAAK,CAAC;CACrC;CAEA,SAAS,EAAiB,GAAY;EACpC,EAAY,IAAK,OAAW;GAAE,GAAG;GAAO,SAAS,EAAM,YAAY;EAAM,EAAE;CAC7E;CAEA,SAAS,EAAY,GAA0B;EAE7C,AADK,KAAO,EAAiB,CAAS,GACtC,IAAgB,CAAS;CAC3B;CAEA,eAAe,IAAgB;EAC7B,IAAI;GACF,MAAM,UAAU,UAAU,UAAU,CAAS;EAC/C,QAAQ;GACN,IAAM,IAAa,SAAS,cAAc,UAAU;GAQpD,AAPA,EAAW,QAAQ,GACnB,EAAW,aAAa,YAAY,EAAE,GACtC,EAAW,MAAM,WAAW,SAC5B,EAAW,MAAM,MAAM,WACvB,SAAS,KAAK,OAAO,CAAU,GAC/B,EAAW,OAAO,GAClB,SAAS,YAAY,MAAM,GAC3B,EAAW,OAAO;EACpB;EAEA,AADA,EAAc,EAAI,GAClB,OAAO,iBAAiB,EAAc,EAAK,GAAG,IAAI;CACpD;CAEA,OACE,kBAAC,QAAD;EAAM,WAAW;GAAC;GAAmB,mBAAmB;GAAe;EAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAAG,cAAY;EAAa,cAAW;YAAjJ,CACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD,EAAA,UAAK,EAAU,CAAA,GACf,kBAAC,KAAD,EAAA,UAAI,EAAe,CAAA,CAChB,EAAA,CAAA,GACL,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,IACC,kBAAC,OAAD;MAAK,WAAU;MAAe,MAAK;MAAQ,cAAW;gBAAtD,CACE,kBAAC,UAAD;OACE,MAAK;OACL,gBAAc,MAAgB;OAC9B,eAAe,EAAY,OAAO;iBACnC;MAEO,CAAA,GACR,kBAAC,UAAD;OACE,MAAK;OACL,gBAAc,MAAgB;OAC9B,eAAe,EAAY,MAAM;iBAClC;MAEO,CAAA,CACL;UACH;KACJ,kBAAC,UAAD;MAAQ,MAAK;MAAS,SAAS;gBAAU;KAAiB,CAAA;KAC1D,kBAAC,UAAD;MAAQ,MAAK;MAAS,eAAe,EAAa,CAAC,CAAC;gBAAG;KAAa,CAAA;IACjE;KACC;MAER,kBAAC,WAAD;GAAS,WAAU;aAAnB;IACE,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD,EAAA,UAAI,SAAU,CAAA,GACd,kBAAC,QAAD,EAAA,UAAO,EAAO,OAAa,CAAA,CACxB;SACL,kBAAC,OAAD;MAAK,WAAU;gBACZ,CAAC,GAAG,CAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAO,MAAiB;OAClD,IAAM,IAAQ,EAAO,SAAS;OAC9B,OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,UAAD;SACE,MAAK;SACL,WAAW,EAAM,OAAO,IAAa,2BAA2B;SAChE,eAAe,EAAc,EAAM,EAAE;mBAHvC,CAKE,kBAAC,UAAD,EAAA,UAAS,MAAU,EAAO,SAAS,QAAQ,MAAU,IAAI,WAAW,SAAS,IAAgB,CAAA,GAC7F,kBAAC,QAAD,EAAA,UAAO,GAAQ,EAAM,IAAI,EAAQ,CAAA,CAC3B;YACR,kBAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,gBAAc,EAAM,YAAY;SAChC,eAAe,EAAiB,EAAM,EAAE;mBAEvC,EAAM,YAAY,KAAQ,SAAS;QAC9B,CAAA,CACL;UAjB2C,EAAM,EAiBjD;MAET,CAAC;KACE,CAAA,CACA;;IAEP,kBAAC,WAAD;KAAS,WAAU;eAAnB,CACE,kBAAC,GAAD;MACE,GAAI;MACJ,OAAO;MACP,WAAU;MACV,eAAe;KAChB,CAAA,GACA,IACC,kBAAC,WAAD;MAAS,WAAU;MAAa,cAAW;gBAA3C,CACE,kBAAC,UAAD;OAAQ,WAAU;iBAAlB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD,EAAA,UAAI,OAAQ,CAAA,GACZ,kBAAC,KAAD,EAAA,UAAG,uCAAuC,CAAA,CACvC,EAAA,CAAA,GACL,kBAAC,UAAD;QACE,MAAK;QACL,WAAU;QACV,cAAW;QACX,OAAM;QACN,SAAS;kBALX,CAOE,kBAAC,IAAD,CAAW,CAAA,GACX,kBAAC,QAAD;SAAM,WAAU;SAAc,aAAU;mBAAU,IAAa,WAAW;QAAS,CAAA,CAC7E;SACF;UACR,kBAAC,OAAD;OAAK,WAAU;iBAAc,kBAAC,QAAD,EAAA,UAAO,EAAgB,CAAA;MAAM,CAAA,CACnD;UACP,IACG;;IAET,kBAAC,SAAD;KAAO,WAAW,IAAgB,+BAA+B;eAC9D,IACC,kBAAA,GAAA,EAAA,UAAA;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD,EAAA,UAAK,EAAc,GAAO,CAAA,GAC1B,kBAAC,UAAD;QAAQ,MAAK;QAAS,WAAU;QAAmB,SAAS;kBAAqB;OAAc,CAAA,CAC5F;;MAEL,kBAAC,GAAD;OAAe,OAAM;iBAArB;QACE,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,EAAc,KAAK,YAAY;SACtC,SAAS;SACT,WAAW,MAAc,EAAW,EAAE,UAAU,EAA8B,CAAC;QAChF,CAAA;QACD,kBAAC,IAAD;SACE,OAAO,EAAc,KAAK,aAAa;SACvC,WAAW,MAAc,EAAW,EAAE,aAAU,CAAC;QAClD,CAAA;QACD,kBAAC,GAAD;SAAa,OAAM;SAAO,SAAS,EAAe,EAAc,IAAI;SAAG,WAAW,MAAY,EAAW,EAAE,MAAM,IAAU,EAAiB,EAAc,IAAI,IAAI,GAAM,CAAC;QAAI,CAAA;QAC5K,EAAe,EAAc,IAAI,IAChC,kBAAC,IAAD;SACE,OAAM;SACN,OAAO,EAAiB,EAAc,IAAI;SAC1C,WAAW,MAAS,EAAW,EAAE,QAAK,CAAC;QACxC,CAAA,IACC;QACJ,kBAAC,GAAD;SAAa,OAAM;SAAO,SAAS,EAAc,KAAK,QAAQ;SAAO,WAAW,MAAS,EAAW,EAAE,QAAK,CAAC;QAAI,CAAA;QAChH,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,GAAiB,EAAc,IAAI;SAC1C,SAAS,CAAC,SAAS,WAAW;SAC9B,WAAW,MAAc,EAAW,EAAa,aAAmC,CAAC;QACtF,CAAA;OACY;;MAEf,kBAAC,GAAD;OAAe,OAAM;iBAArB,CACE,kBAAC,GAAD;QACE,OAAM;QACN,SAAS,EAAQ,EAAc;QAC/B,WAAW,MAAY;SACrB,EAAY,EAAc,KAAK,OAAW;UACxC,GAAG;UACH,OAAO,IAAU;WAAE,GAAG,EAAM;WAAM,UAAU,EAAM,KAAK,aAAa,cAAc,UAAU;UAAY,IAAI,KAAA;SAC9G,EAAE;QACJ;OACD,CAAA,GACA,EAAc,QACb,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;QACE,OAAM;QACN,OAAO,EAAc,MAAM,YAAY,EAAc,KAAK,YAAY;QACtE,SAAS;QACT,WAAW,MAAc,EAAY,EAAE,UAAU,EAA8B,CAAC;OACjF,CAAA,GACD,kBAAC,IAAD;QACE,OAAO,EAAc,MAAM,aAAa,EAAc,KAAK,aAAa;QACxE,WAAW,MAAc,EAAY,EAAE,aAAU,CAAC;OACnD,CAAA,CACD,EAAA,CAAA,IACA,IACS;;MAEf,kBAAC,GAAD;OAAe,OAAM;iBAArB;QACE,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,EAAc,QAAQ,QAAQ;SACrC,KAAK;SACL,KAAK;SACL,MAAM;SACN,WAAW,MAAS,EAAY,EAAc,KAAK,OAAW;UAAE,GAAG;UAAO,QAAQ;WAAE,GAAG,EAAM;WAAQ;UAAK;SAAE,EAAE;QAC/G,CAAA;QACD,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,EAAc,QAAQ,QAAQ;SACrC,KAAK;SACL,KAAK;SACL,MAAM;SACN,WAAW,MAAS,EAAY,EAAc,KAAK,OAAW;UAAE,GAAG;UAAO,QAAQ;WAAE,GAAG,EAAM;WAAQ;UAAK;SAAE,EAAE;QAC/G,CAAA;QACD,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,EAAc,QAAQ,QAAQ;SACrC,KAAK;SACL,KAAK;SACL,MAAM;SACN,WAAW,MAAS,EAAY,EAAc,KAAK,OAAW;UAAE,GAAG;UAAO,QAAQ;WAAE,GAAG,EAAM;WAAQ;UAAK;SAAE,EAAE;QAC/G,CAAA;QACD,kBAAC,GAAD;SACE,OAAM;SACN,OAAO,EAAc,QAAQ,aAAa;SAC1C,KAAK;SACL,KAAK;SACL,MAAM;SACN,WAAW,MAAc,EAAY,EAAc,KAAK,OAAW;UAAE,GAAG;UAAO,QAAQ;WAAE,GAAG,EAAM;WAAQ;UAAU;SAAE,EAAE;QACzH,CAAA;OACY;;KACf,EAAA,CAAA,IAEF,kBAAC,KAAD;MAAG,WAAU;gBAAa;KAAyC,CAAA;IAEhE,CAAA;GACA;IACL;;AAEV;AAEA,SAAS,EAAc,EAAE,UAAO,eAAoD;CAClF,OACE,kBAAC,WAAD;EAAS,WAAU;YAAnB,CACE,kBAAC,MAAD,EAAA,UAAK,EAAU,CAAA,GACd,CACM;;AAEb;AAEA,SAAS,EAAY,EACnB,UACA,UACA,YACA,eAMC;CACD,OACE,kBAAC,SAAD;EAAO,WAAU;YAAjB,CACE,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,GACnB,kBAAC,UAAD;GAAe;GAAO,WAAW,MAAU,EAAS,EAAM,OAAO,KAAK;aACnE,EAAQ,KAAK,MACZ,kBAAC,UAAD;IAAqB,OAAO;cAAS;GAAe,GAAvC,CAAuC,CACrD;EACK,CAAA,CACH;;AAEX;AAEA,SAAS,GAAa,EAAE,UAAO,eAAkE;CAC/F,OACE,kBAAC,SAAD;EAAO,WAAU;YAAjB,CACE,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA,GACnB,kBAAC,UAAD;GAAe;GAAO,WAAW,MAAU,EAAS,EAAM,OAAO,KAAK;aACnE,EAAqB,KAAK,MACzB,kBAAC,UAAD;IAAiB,OAAO;cAAK,EAAkB,EAAG,CAAC;GAAc,GAApD,CAAoD,CAClE;EACK,CAAA,CACH;;AAEX;AAEA,SAAS,EAAY,EAAE,UAAO,YAAS,eAAqF;CAC1H,OACE,kBAAC,SAAD;EAAO,WAAU;YAAjB,CACE,kBAAC,SAAD;GAAO,MAAK;GAAoB;GAAS,WAAW,MAAU,EAAS,EAAM,OAAO,OAAO;EAAI,CAAA,GAC/F,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,CACd;;AAEX;AAEA,SAAS,GAAU,EACjB,UACA,UACA,eAKC;CACD,OACE,kBAAC,SAAD;EAAO,WAAU;YAAjB,CACE,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,GACnB,kBAAC,SAAD;GAAO,MAAK;GAAc;GAAO,WAAW,MAAU,EAAS,EAAM,OAAO,KAAK;EAAI,CAAA,CAChF;;AAEX;AAEA,SAAS,EAAW,EAClB,UACA,UACA,QACA,QACA,SACA,eAQC;CACD,OACE,kBAAC,SAAD;EAAO,WAAU;YAAjB,CACE,kBAAC,QAAD,EAAA,UAAA;GAAO;GAAM;GAAG,EAAM,QAAQ,CAAC;EAAQ,EAAA,CAAA,GACvC,kBAAC,SAAD;GAAO,MAAK;GAAa;GAAU;GAAW;GAAa;GAAO,WAAW,MAAU,EAAS,OAAO,EAAM,OAAO,KAAK,CAAC;EAAI,CAAA,CACzH;;AAEX;AAEA,SAAS,KAAW;CAClB,OACE,kBAAC,OAAD;EAAK,WAAU;EAAY,SAAQ;EAAY,eAAY;EAAO,WAAU;YAA5E,CACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;EAAK,CAAA,GACjD,kBAAC,QAAD,EAAM,GAAE,iCAAkC,CAAA,CACvC;;AAET;AAEA,SAAS,GAAQ,GAAwC;CACvD,IAAM,IAAQ,CAAC,EAAQ,YAAY,aAAa,EAAQ,aAAa,IAAI;CAGzE,OAFI,EAAe,CAAO,KAAG,EAAM,KAAK,SAAS,EAAiB,CAAO,GAAG,GACxE,EAAQ,QAAM,EAAM,KAAK,MAAM,GAC5B,EAAM,KAAK,KAAK;AACzB;AAEA,SAAS,EAAe,GAAyC;CAE/D,OADI,OAAO,EAAQ,QAAS,WAAiB,EAAQ,KAAK,KAAK,CAAC,CAAC,SAAS,IACnE,EAAQ,SAAS,MAAQ,EAAc,CAAO,CAAC,CAAC,QAAQ;AACjE;AAEA,SAAS,EAAiB,GAAwC;CAGhE,OAFI,OAAO,EAAQ,QAAS,WAAiB,EAAQ,QACjD,EAAQ,SAAS,MAAQ,EAAc,CAAO,CAAC,CAAC,KAAY;AAElE;AAEA,SAAS,GAAiB,GAAuD;CAC/E,OAAO,EAAQ,aAAa,EAAc,CAAO,CAAC,CAAC,YAAY;AACjE;AAEA,SAAS,EAAc,GAAyD;CAC9E,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"sqircle.js","names":[],"sources":["../src/squircle/geometry.ts","../src/squircle/palettes.ts","../src/squircle/SquircleScene.tsx","../src/squircle/codeExport.ts","../src/squircle/SquircleEditor.tsx"],"sourcesContent":["import type { SquircleGeometryConfig, SquircleLayerConfig, SquirclePoint } from \"./types\";\n\nexport const DEFAULT_GEOMETRY = {\n width: 800,\n viewBoxHeight: 480,\n exponent: 12,\n samples: 160,\n prismHeight: 10,\n angleDegrees: 20,\n inlayScale: 0.6\n} as const;\n\ninterface SampledPoint extends SquirclePoint {\n nx: number;\n ny: number;\n}\n\ninterface Bounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface SquircleGeometry {\n config: Required<Omit<SquircleGeometryConfig, \"halfSize\" | \"center\">> & {\n halfSize: number;\n center: SquirclePoint;\n };\n cosA: number;\n sinA: number;\n topPoints: SquirclePoint[];\n bottomPoints: SquirclePoint[];\n wallPoints: SquirclePoint[];\n hiddenPoints: SquirclePoint[];\n inlayPoints: SquirclePoint[];\n labelTransform: string;\n topBounds: Bounds;\n sideBounds: Bounds;\n viewBox: string;\n}\n\nexport function createSquircleGeometry(input: SquircleGeometryConfig = {}): SquircleGeometry {\n const exponent = input.exponent ?? DEFAULT_GEOMETRY.exponent;\n const samples = input.samples ?? DEFAULT_GEOMETRY.samples;\n const width = input.width ?? DEFAULT_GEOMETRY.width;\n const viewBoxHeight = input.viewBoxHeight ?? DEFAULT_GEOMETRY.viewBoxHeight;\n const prismHeight = input.prismHeight ?? DEFAULT_GEOMETRY.prismHeight;\n const angleDegrees = input.angleDegrees ?? DEFAULT_GEOMETRY.angleDegrees;\n const inlayScale = input.inlayScale ?? DEFAULT_GEOMETRY.inlayScale;\n const angle = (angleDegrees * Math.PI) / 180;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const unit = sampleSuperellipse(1, exponent, samples);\n const unitScreenX = unit.map((point) => (point.x - point.y) * cosA);\n const unitWidth = Math.max(...unitScreenX) - Math.min(...unitScreenX);\n const halfSize = input.halfSize ?? width / unitWidth;\n const rawPoints = sampleSuperellipse(halfSize, exponent, samples);\n const rawScreenX = rawPoints.map((point) => (point.x - point.y) * cosA);\n const rawScreenY = rawPoints.map((point) => (point.x + point.y) * sinA);\n const center = input.center ?? {\n x: -Math.min(...rawScreenX),\n y: prismHeight - Math.min(...rawScreenY)\n };\n\n const topPoints = rawPoints.map((point) => project(point, prismHeight, center, cosA, sinA));\n const bottomPoints = rawPoints.map((point) => project(point, 0, center, cosA, sinA));\n const frontRun = longestCircularRun(rawPoints.map((point) => point.nx + point.ny >= 0));\n const backRun = complementRun(frontRun, samples);\n const wallTop = collectCircular(topPoints, frontRun);\n const wallBottom = collectCircular(bottomPoints, frontRun).reverse();\n const wallPoints = [...wallTop, ...wallBottom];\n const hiddenPoints = collectCircular(bottomPoints, backRun);\n const inlayPoints = sampleSuperellipse(halfSize * inlayScale, exponent, samples).map((point) =>\n project(point, prismHeight, center, cosA, sinA)\n );\n const topBounds = boundsFor(topPoints);\n const sideBounds = boundsFor([...topPoints, ...wallPoints]);\n\n return {\n config: {\n width,\n viewBoxHeight,\n exponent,\n samples,\n prismHeight,\n angleDegrees,\n inlayScale,\n halfSize,\n center\n },\n cosA,\n sinA,\n topPoints,\n bottomPoints,\n wallPoints,\n hiddenPoints,\n inlayPoints,\n labelTransform: `matrix(${round(cosA)},${round(sinA)},${round(-cosA)},${round(sinA)},${round(center.x)},${round(center.y - prismHeight)})`,\n topBounds,\n sideBounds,\n viewBox: `0 0 ${round(width)} ${round(viewBoxHeight)}`\n };\n}\n\nexport function pointsToString(points: SquirclePoint[]): string {\n return points.map((point) => `${round(point.x)},${round(point.y)}`).join(\" \");\n}\n\nexport function createSquircleLayers(\n count: number,\n options: {\n gap?: number;\n paletteId?: string;\n material?: \"solid\" | \"transparent\" | \"wireframe\";\n } = {}\n): SquircleLayerConfig[] {\n const gap = options.gap ?? 88;\n const material = options.material ?? \"wireframe\";\n const paletteId = options.paletteId ?? \"15\";\n\n return Array.from({ length: Math.max(0, count) }, (_, index) => ({\n id: `layer-${index + 1}`,\n visible: true,\n offset: { x: 0, y: (count - index - 1) * gap },\n base: { material, paletteId, text: false, dash: false },\n hover: undefined\n }));\n}\n\nexport function reflowLayerOffsets(layers: SquircleLayerConfig[], gap = 88): SquircleLayerConfig[] {\n const count = layers.length;\n return layers.map((layer, index) => ({\n ...layer,\n offset: { x: layer.offset?.x ?? 0, y: (count - index - 1) * gap }\n }));\n}\n\nfunction sampleSuperellipse(halfSize: number, exponent: number, samples: number): SampledPoint[] {\n return Array.from({ length: samples }, (_, index) => {\n const t = (2 * Math.PI * index) / samples;\n const c = Math.cos(t);\n const s = Math.sin(t);\n return {\n x: halfSize * signedPower(c, 2 / exponent),\n y: halfSize * signedPower(s, 2 / exponent),\n nx: signedPower(c, (2 * (exponent - 1)) / exponent),\n ny: signedPower(s, (2 * (exponent - 1)) / exponent)\n };\n });\n}\n\nfunction signedPower(value: number, power: number): number {\n return Math.sign(value) * Math.pow(Math.abs(value), power);\n}\n\nfunction project(point: SquirclePoint, z: number, center: SquirclePoint, cosA: number, sinA: number): SquirclePoint {\n return {\n x: center.x + (point.x - point.y) * cosA,\n y: center.y + (point.x + point.y) * sinA - z\n };\n}\n\nfunction longestCircularRun(flags: boolean[]): { start: number; length: number } {\n const doubled = [...flags, ...flags];\n let best = { start: 0, length: 0 };\n let currentStart = 0;\n let currentLength = 0;\n\n doubled.forEach((flag, index) => {\n if (flag) {\n if (currentLength === 0) currentStart = index;\n currentLength += 1;\n if (currentLength > best.length && currentLength <= flags.length) {\n best = { start: currentStart % flags.length, length: currentLength };\n }\n } else {\n currentLength = 0;\n }\n });\n\n return best.length > 0 ? best : { start: 0, length: flags.length };\n}\n\nfunction complementRun(run: { start: number; length: number }, total: number): { start: number; length: number } {\n return {\n start: (run.start + run.length) % total,\n length: Math.max(0, total - run.length)\n };\n}\n\nfunction collectCircular<T>(items: T[], run: { start: number; length: number }): T[] {\n return Array.from({ length: run.length }, (_, index) => items[(run.start + index) % items.length]);\n}\n\nfunction boundsFor(points: SquirclePoint[]): Bounds {\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n return {\n minX: Math.min(...xs),\n minY: Math.min(...ys),\n maxX: Math.max(...xs),\n maxY: Math.max(...ys)\n };\n}\n\nfunction round(value: number): string {\n return Number(value.toFixed(2)).toString();\n}\n","export interface SquircleGradientStop {\n offset: number;\n color: string;\n}\n\nexport interface SquirclePalette {\n id: string;\n label: string;\n top: SquircleGradientStop[];\n side: SquircleGradientStop[];\n textWire: SquircleGradientStop[];\n labelFill: string;\n topEdge: string;\n sideEdge: string;\n swatch: [string, string];\n}\n\nexport const SQUIRCLE_PALETTES = {\n \"13\": {\n id: \"13\",\n label: \"13 Alpha\",\n top: [\n { offset: 0, color: \"#f5f0ff\" },\n { offset: 0.48, color: \"#b388ff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n side: [\n { offset: 0, color: \"#8250e6\" },\n { offset: 0.5, color: \"#596ce8\" },\n { offset: 1, color: \"#0084e8\" }\n ],\n textWire: [\n { offset: 0, color: \"#b388ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n labelFill: \"#2a1060\",\n topEdge: \"#7c5fd0\",\n sideEdge: \"#2d1466\",\n swatch: [\"#b388ff\", \"#0099ff\"]\n },\n \"14\": {\n id: \"14\",\n label: \"14 Alpha\",\n top: [\n { offset: 0, color: \"#e9fffb\" },\n { offset: 0.44, color: \"#44b9d6\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n side: [\n { offset: 0, color: \"#38acbc\" },\n { offset: 0.52, color: \"#268ccf\" },\n { offset: 1, color: \"#005fc4\" }\n ],\n textWire: [\n { offset: 0, color: \"#44b9d6\" },\n { offset: 0.52, color: \"#2f8fe2\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n labelFill: \"#063f6a\",\n topEdge: \"#237aa8\",\n sideEdge: \"#063f6a\",\n swatch: [\"#44b9d6\", \"#006ce0\"]\n },\n \"15\": {\n id: \"15\",\n label: \"15 Alpha\",\n top: [\n { offset: 0, color: \"#f0fbff\" },\n { offset: 0.34, color: \"#0099ff\" },\n { offset: 0.66, color: \"#5c7fff\" },\n { offset: 1, color: \"#962eff\" }\n ],\n side: [\n { offset: 0, color: \"#008fec\" },\n { offset: 0.34, color: \"#139cff\" },\n { offset: 0.56, color: \"#587fff\" },\n { offset: 0.78, color: \"#7c58f7\" },\n { offset: 1, color: \"#962eff\" }\n ],\n textWire: [\n { offset: 0, color: \"#0099ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#962eff\" }\n ],\n labelFill: \"#f7fbff\",\n topEdge: \"#7c5fd0\",\n sideEdge: \"#2d1466\",\n swatch: [\"#0099ff\", \"#962eff\"]\n },\n \"16\": {\n id: \"16\",\n label: \"16 Alpha\",\n top: [\n { offset: 0, color: \"#e9fbff\" },\n { offset: 0.46, color: \"#75cfff\" },\n { offset: 1, color: \"#2d49d8\" }\n ],\n side: [\n { offset: 0, color: \"#59b7ec\" },\n { offset: 0.54, color: \"#5874e0\" },\n { offset: 1, color: \"#263fb8\" }\n ],\n textWire: [\n { offset: 0, color: \"#75cfff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#2d49d8\" }\n ],\n labelFill: \"#10246a\",\n topEdge: \"#3e65c8\",\n sideEdge: \"#10246a\",\n swatch: [\"#75cfff\", \"#2d49d8\"]\n },\n \"17\": {\n id: \"17\",\n label: \"17 Alpha\",\n top: [\n { offset: 0, color: \"#edf1ff\" },\n { offset: 0.46, color: \"#7f91ff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n side: [\n { offset: 0, color: \"#7081ef\" },\n { offset: 0.5, color: \"#617fee\" },\n { offset: 1, color: \"#0084e1\" }\n ],\n textWire: [\n { offset: 0, color: \"#7f91ff\" },\n { offset: 0.52, color: \"#5c9fff\" },\n { offset: 1, color: \"#0099ff\" }\n ],\n labelFill: \"#17245e\",\n topEdge: \"#5f6ed0\",\n sideEdge: \"#17245e\",\n swatch: [\"#7f91ff\", \"#0099ff\"]\n },\n \"18\": {\n id: \"18\",\n label: \"18 Alpha\",\n top: [\n { offset: 0, color: \"#f8fdff\" },\n { offset: 0.42, color: \"#b8e7ff\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n side: [\n { offset: 0, color: \"#86d4f3\" },\n { offset: 0.5, color: \"#5da6dd\" },\n { offset: 1, color: \"#005dbc\" }\n ],\n textWire: [\n { offset: 0, color: \"#b8e7ff\" },\n { offset: 0.52, color: \"#42b4ff\" },\n { offset: 1, color: \"#006ce0\" }\n ],\n labelFill: \"#064272\",\n topEdge: \"#4f94c0\",\n sideEdge: \"#064272\",\n swatch: [\"#b8e7ff\", \"#006ce0\"]\n },\n \"19\": {\n id: \"19\",\n label: \"19 Alpha\",\n top: [\n { offset: 0, color: \"#e6fff9\" },\n { offset: 0.42, color: \"#42b4ff\" },\n { offset: 1, color: \"#8575ff\" }\n ],\n side: [\n { offset: 0, color: \"#1ea9eb\" },\n { offset: 0.5, color: \"#4f8cee\" },\n { offset: 1, color: \"#7866e8\" }\n ],\n textWire: [\n { offset: 0, color: \"#42b4ff\" },\n { offset: 0.52, color: \"#5c7fff\" },\n { offset: 1, color: \"#8575ff\" }\n ],\n labelFill: \"#12306f\",\n topEdge: \"#6470d8\",\n sideEdge: \"#12306f\",\n swatch: [\"#42b4ff\", \"#8575ff\"]\n },\n \"20\": {\n id: \"20\",\n label: \"20 Alpha\",\n top: [\n { offset: 0, color: \"#eef3ff\" },\n { offset: 0.38, color: \"#5c7fff\" },\n { offset: 0.7, color: \"#0099ff\" },\n { offset: 1, color: \"#b8e7ff\" }\n ],\n side: [\n { offset: 0, color: \"#536fe8\" },\n { offset: 0.52, color: \"#168fe8\" },\n { offset: 1, color: \"#8fd2ee\" }\n ],\n textWire: [\n { offset: 0, color: \"#5c7fff\" },\n { offset: 0.52, color: \"#0099ff\" },\n { offset: 1, color: \"#b8e7ff\" }\n ],\n labelFill: \"#17245e\",\n topEdge: \"#5a7bd0\",\n sideEdge: \"#17245e\",\n swatch: [\"#5c7fff\", \"#b8e7ff\"]\n }\n} satisfies Record<string, SquirclePalette>;\n\nexport type SquirclePaletteId = keyof typeof SQUIRCLE_PALETTES;\n\nexport const SQUIRCLE_PALETTE_IDS = Object.keys(SQUIRCLE_PALETTES) as SquirclePaletteId[];\nexport const DEFAULT_PALETTE_ID: SquirclePaletteId = \"15\";\n\nexport function getSquirclePalette(paletteId: string | undefined): SquirclePalette {\n return SQUIRCLE_PALETTES[paletteId as SquirclePaletteId] ?? SQUIRCLE_PALETTES[DEFAULT_PALETTE_ID];\n}\n","import { useId, useMemo } from \"react\";\nimport type { CSSProperties, SVGProps } from \"react\";\nimport { createSquircleGeometry, pointsToString } from \"./geometry\";\nimport { getSquirclePalette, SQUIRCLE_PALETTES } from \"./palettes\";\nimport type {\n SquircleAnnotationColor,\n SquircleGeometryConfig,\n SquircleLayerConfig,\n SquircleMaterial,\n SquircleOpacityConfig,\n SquircleSceneProps,\n SquircleStrokeConfig,\n SquircleTextStyle,\n SquircleVariantConfig\n} from \"./types\";\nimport \"./SquircleScene.css\";\n\nconst DEFAULT_STROKES: SquircleStrokeConfig = {\n face: 0.35,\n faceOpacity: 0.72,\n wire: 1.6,\n wireOpacity: 0.88,\n hidden: 1.2,\n hiddenOpacity: 0.28,\n dash: 2.2,\n wireDash: 1.6,\n labelWire: 1.1\n};\n\nconst DEFAULT_OPACITY: SquircleOpacityConfig = {\n transparentFace: 0.38,\n transparentAnnotation: 0.62,\n solidAnnotation: 0.88\n};\n\nconst DEFAULT_TEXT = \"GPU\";\nconst DEFAULT_TEXT_SIZE = 62;\nconst DEFAULT_TEXT_FONT_FAMILY = \"Arial, Helvetica, sans-serif\";\nconst DEFAULT_TEXT_FONT_WEIGHT = 400;\n\ntype ResolvedVariant = {\n material: SquircleMaterial;\n paletteId: string;\n text: string | null;\n dash: boolean;\n textStyle: SquircleTextStyle;\n textColor: Exclude<SquircleAnnotationColor, \"auto\">;\n textSize: number;\n textFontFamily: string;\n textFontWeight: string | number;\n dashColor: Exclude<SquircleAnnotationColor, \"auto\">;\n stroke: SquircleStrokeConfig;\n opacity: SquircleOpacityConfig;\n};\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: SquircleTextStyle | string;\n gpuColor?: SquircleAnnotationColor;\n}\n\nexport function SquircleScene({\n layers,\n geometry,\n selectedLayerId,\n theme = \"light\",\n idPrefix,\n className,\n ariaLabel = \"Squircle scene\",\n fitToLayers = true,\n transitionMs = 220,\n onLayerSelect\n}: SquircleSceneProps) {\n const reactId = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const prefix = idPrefix ?? `sq-${reactId}`;\n const geometryKey = JSON.stringify(geometry ?? {});\n const baseGeometry = useMemo(() => createSquircleGeometry(geometry), [geometryKey]);\n const visibleLayers = layers.filter((layer) => layer.visible !== false);\n const maxLayerY = Math.max(0, ...visibleLayers.map((layer) => layer.offset?.y ?? 0));\n const viewBoxHeight = geometry?.viewBoxHeight ?? (fitToLayers ? Math.max(baseGeometry.config.viewBoxHeight, maxLayerY + baseGeometry.sideBounds.maxY + 18) : baseGeometry.config.viewBoxHeight);\n const sceneGeometry = geometry?.viewBoxHeight === viewBoxHeight\n ? baseGeometry\n : createSquircleGeometry({ ...geometry, viewBoxHeight });\n const svgStyle = { \"--sq-transition-ms\": `${transitionMs}ms` } as CSSProperties;\n\n return (\n <svg\n className={[\"squircle-scene\", `sq-theme-${theme}`, className].filter(Boolean).join(\" \")}\n data-theme={theme}\n viewBox={sceneGeometry.viewBox}\n role=\"img\"\n aria-label={ariaLabel}\n style={svgStyle}\n >\n <SquircleDefinitions prefix={prefix} geometry={sceneGeometry} />\n {visibleLayers.map((layer) => (\n <SquircleLayer\n key={layer.id}\n layer={layer}\n geometry={sceneGeometry}\n prefix={prefix}\n selected={selectedLayerId === layer.id}\n onSelect={onLayerSelect}\n />\n ))}\n </svg>\n );\n}\n\nfunction SquircleDefinitions({ prefix, geometry }: { prefix: string; geometry: ReturnType<typeof createSquircleGeometry> }) {\n return (\n <defs>\n {Object.values(SQUIRCLE_PALETTES).map((palette) => (\n <g key={palette.id}>\n <LinearGradient\n id={`${prefix}-top-${palette.id}`}\n x1={geometry.topBounds.minX}\n y1={geometry.topBounds.minY}\n x2={geometry.topBounds.maxX}\n y2={geometry.topBounds.maxY}\n stops={palette.top}\n />\n <LinearGradient\n id={`${prefix}-side-${palette.id}`}\n x1={geometry.sideBounds.minX}\n y1={geometry.sideBounds.minY}\n x2={geometry.sideBounds.maxX}\n y2={geometry.sideBounds.maxY}\n stops={palette.side}\n />\n <LinearGradient\n id={`${prefix}-text-surface-${palette.id}`}\n x1={-425.63}\n y1={-0.1}\n x2={425.6}\n y2={0.07}\n stops={palette.top}\n />\n <LinearGradient\n id={`${prefix}-text-wire-${palette.id}`}\n x1={-64}\n y1={-24}\n x2={64}\n y2={24}\n stops={palette.textWire}\n />\n </g>\n ))}\n </defs>\n );\n}\n\nfunction LinearGradient({\n id,\n x1,\n y1,\n x2,\n y2,\n stops\n}: {\n id: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stops: { offset: number; color: string }[];\n}) {\n return (\n <linearGradient id={id} x1={x1} y1={y1} x2={x2} y2={y2} gradientUnits=\"userSpaceOnUse\">\n {stops.map((stop) => (\n <stop key={`${stop.offset}-${stop.color}`} offset={stop.offset} stopColor={stop.color} />\n ))}\n </linearGradient>\n );\n}\n\nfunction SquircleLayer({\n layer,\n geometry,\n prefix,\n selected,\n onSelect\n}: {\n layer: SquircleLayerConfig;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n selected: boolean;\n onSelect?: (layerId: string) => void;\n}) {\n const base = resolveVariant(layer.base, layer.stroke, layer.opacity);\n const hover = layer.hover ? resolveVariant({ ...layer.base, ...layer.hover }, layer.stroke, layer.opacity) : null;\n const hasHover = Boolean(hover && variantSignature(hover) !== variantSignature(base));\n const x = layer.offset?.x ?? 0;\n const y = layer.offset?.y ?? 0;\n\n return (\n <g\n className={[\n \"sq-layer\",\n hasHover ? \"sq-has-hover\" : \"\",\n selected ? \"is-selected\" : \"\",\n layer.className\n ].filter(Boolean).join(\" \")}\n data-layer-id={layer.id}\n data-hover-enabled={String(hasHover)}\n transform={`translate(${x} ${y})`}\n onClick={onSelect ? () => onSelect(layer.id) : undefined}\n >\n <SquircleVariant className=\"sq-base\" variant={base} geometry={geometry} prefix={prefix} />\n {hasHover && hover ? <SquircleVariant className=\"sq-hover\" variant={hover} geometry={geometry} prefix={prefix} /> : null}\n </g>\n );\n}\n\nfunction SquircleVariant({\n className,\n variant,\n geometry,\n prefix\n}: {\n className: string;\n variant: ResolvedVariant;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n}) {\n const palette = getSquirclePalette(variant.paletteId);\n const topFill = `url(#${prefix}-top-${palette.id})`;\n const sideFill = `url(#${prefix}-side-${palette.id})`;\n const textSurfaceFill = `url(#${prefix}-text-surface-${palette.id})`;\n const textWireFill = `url(#${prefix}-text-wire-${palette.id})`;\n const wallPoints = pointsToString(geometry.wallPoints);\n const topPoints = pointsToString(geometry.topPoints);\n const hiddenPoints = pointsToString(geometry.hiddenPoints);\n const inlayPoints = pointsToString(geometry.inlayPoints);\n\n return (\n <g className={[\"sq-variant\", className, `sq-material-${variant.material}`].join(\" \")}>\n {variant.material === \"wireframe\" ? (\n <>\n <polyline\n className=\"sq-hidden\"\n points={hiddenPoints}\n stroke={topFill}\n strokeWidth={variant.stroke.hidden}\n opacity={variant.stroke.hiddenOpacity}\n />\n <polygon\n className=\"sq-face sq-wire-side\"\n points={wallPoints}\n fill=\"none\"\n stroke={topFill}\n strokeWidth={variant.stroke.wire}\n strokeOpacity={variant.stroke.wireOpacity}\n />\n <polygon\n className=\"sq-face sq-wire-top\"\n points={topPoints}\n fill=\"none\"\n stroke={topFill}\n strokeWidth={variant.stroke.wire}\n strokeOpacity={variant.stroke.wireOpacity}\n />\n </>\n ) : (\n <>\n <polygon\n className=\"sq-face sq-solid-side\"\n points={wallPoints}\n fill={sideFill}\n fillOpacity={variant.material === \"transparent\" ? variant.opacity.transparentFace : 1}\n stroke={palette.sideEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n <polygon\n className=\"sq-face sq-solid-top\"\n points={topPoints}\n fill={topFill}\n fillOpacity={variant.material === \"transparent\" ? variant.opacity.transparentFace : 1}\n stroke={palette.topEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n </>\n )}\n {variant.dash ? (\n <polygon\n className=\"sq-inlay\"\n points={inlayPoints}\n stroke={dashPaint(variant, palette, topFill)}\n strokeWidth={variant.material === \"wireframe\" ? variant.stroke.wireDash : variant.stroke.dash}\n opacity={annotationOpacity(variant)}\n />\n ) : null}\n {variant.text ? (\n <text\n className=\"sq-label\"\n transform={geometry.labelTransform}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontFamily={variant.textFontFamily}\n fontSize={variant.textSize}\n fontWeight={variant.textFontWeight}\n {...textPaintProps(variant, palette, textSurfaceFill, textWireFill)}\n >\n {variant.text}\n </text>\n ) : null}\n </g>\n );\n}\n\nfunction resolveVariant(\n variant: SquircleVariantConfig,\n layerStroke: Partial<SquircleStrokeConfig> = {},\n layerOpacity: Partial<SquircleOpacityConfig> = {}\n): ResolvedVariant {\n return {\n material: variant.material ?? \"wireframe\",\n paletteId: variant.paletteId ?? \"15\",\n text: normalizeTextValue(variant.text, legacyVariant(variant).gpu),\n dash: variant.dash ?? false,\n textStyle: normalizeTextStyle(variant.textStyle ?? legacyVariant(variant).gpuStyle ?? \"solid\"),\n textColor: normalizeAnnotationColor(variant.textColor ?? legacyVariant(variant).gpuColor ?? \"contrast\"),\n textSize: variant.textSize ?? DEFAULT_TEXT_SIZE,\n textFontFamily: variant.textFontFamily ?? DEFAULT_TEXT_FONT_FAMILY,\n textFontWeight: variant.textFontWeight ?? DEFAULT_TEXT_FONT_WEIGHT,\n dashColor: normalizeAnnotationColor(variant.dashColor ?? \"contrast\"),\n stroke: { ...DEFAULT_STROKES, ...layerStroke, ...variant.stroke },\n opacity: { ...DEFAULT_OPACITY, ...layerOpacity, ...variant.opacity }\n };\n}\n\nfunction legacyVariant(variant: SquircleVariantConfig): LegacyTextVariantConfig {\n return variant as SquircleVariantConfig & LegacyTextVariantConfig;\n}\n\nfunction normalizeTextValue(value: SquircleVariantConfig[\"text\"], legacyGpu: boolean | undefined): string | null {\n if (typeof value === \"string\") return value.trim() ? value : null;\n if (value === true || legacyGpu) return DEFAULT_TEXT;\n return null;\n}\n\nfunction normalizeTextStyle(style: SquircleTextStyle | string): SquircleTextStyle {\n return style === \"wireframe\" ? \"wireframe\" : \"solid\";\n}\n\nfunction normalizeAnnotationColor(color: SquircleAnnotationColor): Exclude<SquircleAnnotationColor, \"auto\"> {\n return color === \"auto\" ? \"contrast\" : color;\n}\n\nfunction annotationPaint(color: SquircleAnnotationColor, labelFill: string): string {\n const normalized = normalizeAnnotationColor(color);\n if (normalized === \"white\") return \"#ffffff\";\n if (normalized === \"black\") return \"#05070a\";\n return labelFill;\n}\n\nfunction dashPaint(variant: ResolvedVariant, palette: ReturnType<typeof getSquirclePalette>, topFill: string): string {\n if (variant.material === \"wireframe\") return topFill;\n return annotationPaint(variant.dashColor, palette.labelFill);\n}\n\nfunction annotationOpacity(variant: ResolvedVariant): number {\n if (variant.material === \"transparent\") return variant.opacity.transparentAnnotation;\n return variant.opacity.solidAnnotation;\n}\n\nfunction textPaintProps(\n variant: ResolvedVariant,\n palette: ReturnType<typeof getSquirclePalette>,\n textSurfaceFill: string,\n textWireFill: string\n): SVGProps<SVGTextElement> {\n const opacity = annotationOpacity(variant);\n\n if (variant.material === \"wireframe\") {\n if (variant.textStyle === \"wireframe\") {\n return {\n fill: \"none\",\n stroke: textWireFill,\n strokeWidth: variant.stroke.labelWire,\n opacity\n };\n }\n return {\n fill: textSurfaceFill,\n stroke: \"none\",\n strokeWidth: 0,\n opacity: 1\n };\n }\n\n if (variant.textStyle === \"wireframe\") {\n return {\n fill: \"none\",\n stroke: annotationPaint(variant.textColor, palette.labelFill),\n strokeWidth: variant.stroke.labelWire,\n opacity\n };\n }\n\n return {\n fill: annotationPaint(variant.textColor, palette.labelFill),\n stroke: \"none\",\n strokeWidth: 0,\n opacity\n };\n}\n\nfunction variantSignature(variant: ResolvedVariant): string {\n return JSON.stringify(variant);\n}\n","import type { SquircleGeometryConfig, SquircleLayerConfig, SquircleTheme, SquircleVariantConfig } from \"./types\";\n\nexport interface SquircleReactCodeOptions {\n layers: SquircleLayerConfig[];\n theme: SquircleTheme;\n geometry?: SquircleGeometryConfig;\n componentName?: string;\n importPath?: string;\n styleImportPath?: string | false;\n ariaLabel?: string;\n}\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: \"solid\" | \"wireframe\";\n gpuColor?: SquircleVariantConfig[\"textColor\"];\n}\n\nexport function createSquircleReactCode({\n layers,\n theme,\n geometry,\n componentName = \"CustomSquircle\",\n importPath = \"./squircle\",\n styleImportPath,\n ariaLabel\n}: SquircleReactCodeOptions): string {\n const normalizedName = toComponentName(componentName);\n const normalizedImportPath = JSON.stringify(importPath);\n const normalizedStyleImportPath = styleImportPathFor(importPath, styleImportPath);\n const normalizedAriaLabel = JSON.stringify(ariaLabel ?? `${normalizedName} composition`);\n const layersCode = JSON.stringify(layers.map(layerForReactCode), null, 2);\n const geometryCode = geometry ? JSON.stringify(pruneUndefined(geometry), null, 2) : null;\n const typeImports = geometryCode\n ? \"type SquircleGeometryConfig, type SquircleLayerConfig, type SquircleTheme\"\n : \"type SquircleLayerConfig, type SquircleTheme\";\n\n return [\n `import { SquircleScene, ${typeImports} } from ${normalizedImportPath};`,\n ...(normalizedStyleImportPath ? [`import ${JSON.stringify(normalizedStyleImportPath)};`] : []),\n \"\",\n `const theme: SquircleTheme = ${JSON.stringify(theme)};`,\n ...(geometryCode ? [\"\", `const geometry: SquircleGeometryConfig = ${geometryCode};`] : []),\n \"\",\n `const layers: SquircleLayerConfig[] = ${layersCode};`,\n \"\",\n `export function ${normalizedName}() {`,\n \" return (\",\n \" <SquircleScene\",\n \" theme={theme}\",\n \" layers={layers}\",\n ...(geometryCode ? [\" geometry={geometry}\"] : []),\n ` ariaLabel={${normalizedAriaLabel}}`,\n \" />\",\n \" );\",\n \"}\",\n \"\"\n ].join(\"\\n\");\n}\n\nfunction styleImportPathFor(importPath: string, styleImportPath: string | false | undefined): string | null {\n if (styleImportPath === false) return null;\n if (typeof styleImportPath === \"string\") return styleImportPath;\n if (importPath === \"@dstackai/sqircle\") return \"@dstackai/sqircle/style.css\";\n return null;\n}\n\nfunction layerForReactCode(layer: SquircleLayerConfig): SquircleLayerConfig {\n return pruneUndefined({\n ...layer,\n base: variantForReactCode(layer.base),\n hover: layer.hover ? variantForReactCode(layer.hover) : undefined\n });\n}\n\nfunction variantForReactCode(variant: SquircleVariantConfig): SquircleVariantConfig {\n const { gpu, gpuStyle, gpuColor, ...rest } = variant as SquircleVariantConfig & LegacyTextVariantConfig;\n const text = textForExport(rest.text, gpu);\n const textStyle = rest.textStyle ?? gpuStyle;\n const textColor = rest.textColor ?? gpuColor;\n\n return pruneUndefined({\n ...rest,\n text,\n textStyle,\n textColor\n });\n}\n\nfunction textForExport(text: SquircleVariantConfig[\"text\"], legacyGpu: boolean | undefined): SquircleVariantConfig[\"text\"] | undefined {\n if (typeof text === \"string\") return text;\n if (text === true || legacyGpu) return \"GPU\";\n if (text === false) return false;\n return undefined;\n}\n\nfunction pruneUndefined<T extends object>(input: T): T {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined)) as T;\n}\n\nexport function toComponentName(input: string): string {\n const words = input\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean);\n const name = words\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const candidate = name || \"CustomSquircle\";\n\n return /^[A-Za-z_$]/.test(candidate) ? candidate : `Squircle${candidate}`;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createSquircleReactCode } from \"./codeExport\";\nimport { DEFAULT_GEOMETRY, reflowLayerOffsets } from \"./geometry\";\nimport { SQUIRCLE_PALETTE_IDS, SQUIRCLE_PALETTES } from \"./palettes\";\nimport { SquircleScene } from \"./SquircleScene\";\nimport type { SquircleAnnotationColor, SquircleGeometryConfig, SquircleLayerConfig, SquircleMaterial, SquircleTheme, SquircleVariantConfig } from \"./types\";\nimport \"./SquircleEditor.css\";\n\nconst DEFAULT_LAYER_GAP = 88;\nconst DEFAULT_TEXT = \"GPU\";\nconst DEFAULT_EDITOR_GEOMETRY: SquircleGeometryConfig = {\n exponent: DEFAULT_GEOMETRY.exponent,\n prismHeight: DEFAULT_GEOMETRY.prismHeight,\n inlayScale: DEFAULT_GEOMETRY.inlayScale\n};\nconst MIN_RADIUS = 0;\nconst MAX_RADIUS = 100;\nconst MIN_EXPONENT = 4;\nconst MAX_EXPONENT = 24;\nconst MIN_PRISM_HEIGHT = 4;\nconst MAX_PRISM_HEIGHT = 36;\nconst MIN_INLAY_SCALE = 0.35;\nconst MAX_INLAY_SCALE = 0.82;\nconst MIN_TEXT_SIZE = 34;\nconst MAX_TEXT_SIZE = 92;\nconst DEFAULT_TEXT_SIZE = 62;\nconst DEFAULT_TEXT_FONT_WEIGHT = 400;\ntype EditorAnnotationColor = Extract<SquircleAnnotationColor, \"auto\" | \"white\" | \"black\">;\n\nconst MATERIAL_OPTIONS = [\n { value: \"wireframe\", label: \"Wire\", title: \"Gradient outline with transparent faces\" },\n { value: \"solid\", label: \"Solid\", title: \"Filled prism with top and side gradients\" },\n { value: \"transparent\", label: \"Glass\", title: \"Translucent filled prism\" }\n] satisfies { value: SquircleMaterial; label: string; title: string }[];\nconst TEXT_STYLE_OPTIONS = [\n { value: \"solid\", label: \"Filled\", title: \"Filled top-plane text\" },\n { value: \"wireframe\", label: \"Outline\", title: \"Outlined top-plane text\" }\n] satisfies { value: \"solid\" | \"wireframe\"; label: string; title: string }[];\nconst ANNOTATION_COLOR_OPTIONS = [\n { value: \"auto\", label: \"Auto\", title: \"Use the palette contrast color\" },\n { value: \"white\", label: \"White\", title: \"Use fixed white annotation paint\" },\n { value: \"black\", label: \"Black\", title: \"Use fixed black annotation paint\" }\n] satisfies { value: EditorAnnotationColor; label: string; title: string }[];\nconst FONT_WEIGHT_OPTIONS = [\n { value: \"300\", label: \"Light\", title: \"Thin top-plane label\" },\n { value: \"400\", label: \"Regular\", title: \"Default top-plane label weight\" },\n { value: \"500\", label: \"Medium\", title: \"Slightly stronger top-plane label\" },\n { value: \"600\", label: \"Semi\", title: \"Bold but still clean on wireframe outlines\" },\n { value: \"700\", label: \"Bold\", title: \"Strongest top-plane label\" }\n] satisfies { value: string; label: string; title: string }[];\n\ninterface LegacyTextVariantConfig {\n gpu?: boolean;\n gpuStyle?: \"solid\" | \"wireframe\";\n gpuColor?: SquircleAnnotationColor;\n}\n\nexport interface SquircleEditorProps {\n value?: SquircleLayerConfig[];\n initialLayers?: SquircleLayerConfig[];\n onChange?: (layers: SquircleLayerConfig[]) => void;\n geometry?: SquircleGeometryConfig;\n initialGeometry?: SquircleGeometryConfig;\n onGeometryChange?: (geometry: SquircleGeometryConfig) => void;\n title?: string;\n description?: string;\n /** @deprecated The editor now exports React code instead of schema-tagged JSON. */\n schema?: string;\n className?: string;\n layerGap?: number;\n showCode?: boolean;\n /** @deprecated Use showCode. */\n showConfig?: boolean;\n codeComponentName?: string;\n codeImportPath?: string;\n theme?: SquircleTheme;\n defaultTheme?: SquircleTheme;\n onThemeChange?: (theme: SquircleTheme) => void;\n showThemeSwitch?: boolean;\n}\n\nexport function createDefaultSquircleEditorLayers(paletteId = \"15\"): SquircleLayerConfig[] {\n return reflowLayerOffsets([\n {\n id: \"layer-1\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n },\n {\n id: \"layer-2\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n },\n {\n id: \"layer-3\",\n visible: true,\n base: { material: \"wireframe\", paletteId }\n }\n ], DEFAULT_LAYER_GAP);\n}\n\nexport function SquircleEditor({\n value,\n initialLayers,\n onChange,\n geometry,\n initialGeometry,\n onGeometryChange,\n title = \"Squircle\",\n description = \"React component constructor with 0-N layers and exported code.\",\n className,\n layerGap = DEFAULT_LAYER_GAP,\n showCode,\n showConfig = true,\n codeComponentName,\n codeImportPath = \"./squircle\",\n theme,\n defaultTheme = \"light\",\n onThemeChange,\n showThemeSwitch = true\n}: SquircleEditorProps) {\n const [internalLayers, setInternalLayers] = useState<SquircleLayerConfig[]>(\n () => initialLayers ?? createDefaultSquircleEditorLayers()\n );\n const [internalGeometry, setInternalGeometry] = useState<SquircleGeometryConfig>(\n () => ({ ...DEFAULT_EDITOR_GEOMETRY, ...initialGeometry })\n );\n const [internalTheme, setInternalTheme] = useState<SquircleTheme>(defaultTheme);\n const layers = value ?? internalLayers;\n const activeGeometry = geometry ?? internalGeometry;\n const activeTheme = theme ?? internalTheme;\n const [selectedId, setSelectedId] = useState<string | null>(() => layers.at(-1)?.id ?? null);\n const [editingState, setEditingState] = useState<\"base\" | \"hover\">(\"base\");\n const [codeOpen, setCodeOpen] = useState(false);\n const [copiedCode, setCopiedCode] = useState(false);\n const selectedLayer = layers.find((layer) => layer.id === selectedId) ?? null;\n const selectedIndex = selectedLayer ? layers.findIndex((layer) => layer.id === selectedLayer.id) + 1 : null;\n const visibleLayerCount = layers.filter((layer) => layer.visible !== false).length;\n const shouldShowCode = showCode ?? showConfig;\n const maxOffsetY = Math.max(0, ...layers.map((layer) => layer.offset?.y ?? 0));\n const sceneConfig = useMemo(\n () => ({\n layers,\n geometry: {\n ...activeGeometry,\n viewBoxHeight: Math.max(activeGeometry.viewBoxHeight ?? DEFAULT_GEOMETRY.viewBoxHeight, maxOffsetY + 320)\n },\n selectedLayerId: selectedId\n }),\n [activeGeometry, layers, maxOffsetY, selectedId]\n );\n const reactCode = useMemo(\n () => createSquircleReactCode({\n layers,\n theme: activeTheme,\n geometry: editorGeometryForCode(activeGeometry),\n componentName: codeComponentName ?? title,\n importPath: codeImportPath,\n ariaLabel: `${title} composition`\n }),\n [activeGeometry, activeTheme, codeComponentName, codeImportPath, layers, title]\n );\n\n useEffect(() => {\n if (selectedId && layers.some((layer) => layer.id === selectedId)) return;\n setSelectedId(layers.at(-1)?.id ?? null);\n }, [layers, selectedId]);\n\n useEffect(() => {\n setCopiedCode(false);\n }, [reactCode]);\n\n function commitLayers(nextLayers: SquircleLayerConfig[], options: { reflow?: boolean } = {}) {\n const finalLayers = options.reflow ? reflowLayerOffsets(nextLayers, layerGap) : nextLayers;\n if (!value) setInternalLayers(finalLayers);\n onChange?.(finalLayers);\n }\n\n function commitGeometry(patch: SquircleGeometryConfig) {\n const nextGeometry = { ...activeGeometry, ...patch };\n if (!geometry) setInternalGeometry(nextGeometry);\n onGeometryChange?.(nextGeometry);\n }\n\n function updateLayer(id: string, patcher: (layer: SquircleLayerConfig) => SquircleLayerConfig) {\n commitLayers(layers.map((layer) => (layer.id === id ? patcher(layer) : layer)));\n }\n\n function updateBase(patch: SquircleVariantConfig) {\n if (!selectedLayer) return;\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n base: { ...layer.base, ...patch }\n }));\n }\n\n function updateHover(patch: SquircleVariantConfig) {\n if (!selectedLayer) return;\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n hover: { ...(layer.hover ?? {}), ...patch }\n }));\n }\n\n function addLayer() {\n const newLayer: SquircleLayerConfig = {\n id: nextLayerId(layers),\n visible: true,\n base: { material: \"wireframe\", paletteId: layers.at(-1)?.base.paletteId ?? \"15\" }\n };\n const next = [...layers, newLayer];\n setSelectedId(newLayer.id);\n setEditingState(\"base\");\n commitLayers(next, { reflow: true });\n }\n\n function removeSelectedLayer() {\n if (!selectedLayer) return;\n const next = layers.filter((layer) => layer.id !== selectedLayer.id);\n setSelectedId(next.at(-1)?.id ?? null);\n setEditingState(\"base\");\n commitLayers(next, { reflow: true });\n }\n\n function toggleVisibility(id: string) {\n updateLayer(id, (layer) => ({ ...layer, visible: layer.visible === false }));\n }\n\n function commitTheme(nextTheme: SquircleTheme) {\n if (!theme) setInternalTheme(nextTheme);\n onThemeChange?.(nextTheme);\n }\n\n async function copyReactCode() {\n try {\n await navigator.clipboard.writeText(reactCode);\n } catch {\n const copySource = document.createElement(\"textarea\");\n copySource.value = reactCode;\n copySource.setAttribute(\"readonly\", \"\");\n copySource.style.position = \"fixed\";\n copySource.style.top = \"-9999px\";\n document.body.append(copySource);\n copySource.select();\n document.execCommand(\"copy\");\n copySource.remove();\n }\n setCopiedCode(true);\n window.setTimeout(() => setCopiedCode(false), 1400);\n }\n\n return (\n <main className={[\"squircle-editor\", `squircle-editor-${activeTheme}`, className].filter(Boolean).join(\" \")} data-theme={activeTheme} aria-label=\"Squircle editor\">\n <header className=\"squircle-editor-topbar\">\n <div className=\"topbar-title\">\n <h1>{title}</h1>\n <p>{description}</p>\n </div>\n <div className=\"topbar-actions\">\n {showThemeSwitch ? (\n <div className=\"theme-switch\" role=\"group\" aria-label=\"Theme\">\n <button\n type=\"button\"\n aria-pressed={activeTheme === \"light\"}\n onClick={() => commitTheme(\"light\")}\n >\n Light\n </button>\n <button\n type=\"button\"\n aria-pressed={activeTheme === \"dark\"}\n onClick={() => commitTheme(\"dark\")}\n >\n Dark\n </button>\n </div>\n ) : null}\n </div>\n </header>\n\n <section className=\"squircle-editor-workspace\">\n <aside className=\"side-panel layers-panel\">\n <div className=\"panel-heading\">\n <div>\n <h2>Layers</h2>\n <span>{visibleLayerCount}/{layers.length} visible</span>\n </div>\n <div className=\"panel-actions\">\n <button type=\"button\" className=\"icon-button primary-action\" aria-label=\"Add layer\" title=\"Add layer\" onClick={addLayer}>\n <PlusIcon />\n </button>\n <button type=\"button\" className=\"icon-button\" aria-label=\"Clear layers\" title=\"Clear layers\" onClick={() => commitLayers([])}>\n <TrashIcon />\n </button>\n </div>\n </div>\n <div className=\"squircle-editor-layer-list\">\n {[...layers].reverse().map((layer, reverseIndex) => {\n const index = layers.length - reverseIndex;\n const palette = getPalette(layer.base.paletteId);\n const material = layer.base.material ?? \"wireframe\";\n return (\n <article className={layer.id === selectedId ? \"squircle-editor-layer-row is-active\" : \"squircle-editor-layer-row\"} key={layer.id}>\n <button\n type=\"button\"\n className=\"layer-select\"\n onClick={() => setSelectedId(layer.id)}\n title={`Edit ${layerLabel(layer.id, index, layers.length)}`}\n >\n <span className=\"layer-card-topline\">\n <span className=\"layer-number\">{String(index).padStart(2, \"0\")}</span>\n <strong>{layerLabel(layer.id, index, layers.length)}</strong>\n <span className={`material-pill material-pill-${material}`}>{materialLabel(material)}</span>\n </span>\n <span className=\"layer-card-meta\">\n <span className=\"layer-palette-chip\">\n <span\n className=\"palette-swatch\"\n style={{ background: `linear-gradient(135deg, ${palette.swatch[0]}, ${palette.swatch[1]})` }}\n />\n {palette.label}\n </span>\n <span className=\"layer-feature-tags\">\n {variantHasText(layer.base) ? <span>Text</span> : null}\n {layer.base.dash ? <span>Dash</span> : null}\n {layer.hover ? <span>Hover</span> : null}\n {!variantHasText(layer.base) && !layer.base.dash && !layer.hover ? <span>Clean</span> : null}\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n className=\"icon-button layer-visibility\"\n aria-label={layer.visible === false ? \"Show layer\" : \"Hide layer\"}\n aria-pressed={layer.visible !== false}\n title={layer.visible === false ? \"Show layer\" : \"Hide layer\"}\n onClick={() => toggleVisibility(layer.id)}\n >\n {layer.visible === false ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n </article>\n );\n })}\n </div>\n <EditorSection title=\"Shape\">\n <RangeField\n label=\"Radius\"\n value={radiusForExponent(activeGeometry.exponent ?? DEFAULT_GEOMETRY.exponent)}\n min={MIN_RADIUS}\n max={MAX_RADIUS}\n step={1}\n formatValue={(value) => `${Math.round(value)}%`}\n onChange={(radius) => commitGeometry({ exponent: exponentForRadius(radius) })}\n />\n <RangeField\n label=\"Height\"\n value={activeGeometry.prismHeight ?? DEFAULT_GEOMETRY.prismHeight}\n min={MIN_PRISM_HEIGHT}\n max={MAX_PRISM_HEIGHT}\n step={1}\n formatValue={(value) => `${Math.round(value)}px`}\n onChange={(prismHeight) => commitGeometry({ prismHeight })}\n />\n <RangeField\n label=\"Dash size\"\n value={(activeGeometry.inlayScale ?? DEFAULT_GEOMETRY.inlayScale) * 100}\n min={MIN_INLAY_SCALE * 100}\n max={MAX_INLAY_SCALE * 100}\n step={1}\n formatValue={(value) => `${Math.round(value)}%`}\n onChange={(inlayScale) => commitGeometry({ inlayScale: roundTo(inlayScale / 100, 2) })}\n />\n </EditorSection>\n </aside>\n\n <section className=\"squircle-editor-preview\">\n <div className=\"preview-toolbar\">\n <div>\n <h2>Preview</h2>\n <span>{selectedIndex ? `Editing Layer ${selectedIndex}` : `${visibleLayerCount} visible layers`}</span>\n </div>\n {shouldShowCode ? (\n <div className=\"preview-actions\">\n <button\n type=\"button\"\n className=\"code-toggle-button\"\n aria-pressed={codeOpen}\n onClick={() => setCodeOpen((open) => !open)}\n >\n <CodeIcon />\n Code\n </button>\n <button\n type=\"button\"\n className=\"copy-code-button\"\n aria-label=\"Copy React code\"\n title=\"Copy React code\"\n onClick={copyReactCode}\n >\n <CopyIcon />\n <span className=\"copy-status\" aria-live=\"polite\">{copiedCode ? \"Copied\" : \"\"}</span>\n </button>\n </div>\n ) : null}\n </div>\n <div className=\"preview-stage\">\n <SquircleScene\n {...sceneConfig}\n theme={activeTheme}\n ariaLabel=\"Editable squircle composition\"\n onLayerSelect={(id) => {\n setSelectedId(id);\n setEditingState(\"base\");\n }}\n />\n </div>\n {shouldShowCode ? (\n <section className={codeOpen ? \"code-panel is-open\" : \"code-panel\"} aria-label=\"Generated React code\">\n <header className=\"code-panel-header\">\n <div>\n <h2>Code</h2>\n <p>Ready-to-use React component.</p>\n </div>\n <button\n type=\"button\"\n className=\"copy-code-button\"\n aria-label=\"Copy React code\"\n title=\"Copy React code\"\n onClick={copyReactCode}\n >\n <CopyIcon />\n <span className=\"copy-status\" aria-live=\"polite\">{copiedCode ? \"Copied\" : \"\"}</span>\n </button>\n </header>\n {codeOpen ? <pre className=\"code-output\"><code>{reactCode}</code></pre> : null}\n </section>\n ) : null}\n </section>\n\n <aside className={selectedLayer ? \"side-panel inspector-panel\" : \"side-panel inspector-panel is-empty\"}>\n {selectedLayer ? (\n <>\n <div className=\"inspector-heading\">\n <div>\n <span className=\"inspector-kicker\">Selected</span>\n <h2>{selectedIndex ? layerLabel(selectedLayer.id, selectedIndex, layers.length) : selectedLayer.id}</h2>\n <p>{summary(selectedLayer.base)}</p>\n </div>\n <div className=\"panel-actions\">\n <button type=\"button\" className=\"icon-button\" aria-label=\"Close inspector\" title=\"Close inspector\" onClick={() => setSelectedId(null)}>\n <CloseIcon />\n </button>\n <button type=\"button\" className=\"icon-button danger\" aria-label=\"Delete layer\" title=\"Delete layer\" onClick={removeSelectedLayer}>\n <TrashIcon />\n </button>\n </div>\n </div>\n\n <div className=\"state-switch\" role=\"group\" aria-label=\"Layer state\">\n <button type=\"button\" aria-pressed={editingState === \"base\"} onClick={() => setEditingState(\"base\")}>\n Base\n </button>\n <button type=\"button\" aria-pressed={editingState === \"hover\"} onClick={() => setEditingState(\"hover\")}>\n Hover\n {selectedLayer.hover ? <span className=\"state-dot\" aria-hidden=\"true\" /> : null}\n </button>\n </div>\n\n {editingState === \"base\" ? (\n <VariantEditor\n title=\"Base State\"\n variant={selectedLayer.base}\n onChange={updateBase}\n />\n ) : (\n <EditorSection title=\"Hover State\">\n <FeatureSwitch\n label=\"Hover variant\"\n checked={Boolean(selectedLayer.hover)}\n title=\"Swap this layer to another variant on hover.\"\n onChange={(enabled) => {\n updateLayer(selectedLayer.id, (layer) => ({\n ...layer,\n hover: enabled\n ? {\n ...layer.base,\n material: layer.base.material === \"wireframe\" ? \"solid\" : \"wireframe\"\n }\n : undefined\n }));\n }}\n />\n {selectedLayer.hover ? (\n <VariantControls\n variant={{ ...selectedLayer.base, ...selectedLayer.hover }}\n onChange={updateHover}\n />\n ) : null}\n </EditorSection>\n )}\n\n <EditorSection title=\"Stroke Widths\" collapsible defaultOpen={false}>\n <RangeField\n label=\"Face\"\n value={selectedLayer.stroke?.face ?? 0.35}\n min={0}\n max={1.5}\n step={0.05}\n onChange={(face) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, face } }))}\n />\n <RangeField\n label=\"Wire\"\n value={selectedLayer.stroke?.wire ?? 1.6}\n min={0.4}\n max={4}\n step={0.1}\n onChange={(wire) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, wire } }))}\n />\n <RangeField\n label=\"Dash\"\n value={selectedLayer.stroke?.dash ?? 2.2}\n min={0.6}\n max={5}\n step={0.1}\n onChange={(dash) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, dash } }))}\n />\n <RangeField\n label=\"Text outline\"\n value={selectedLayer.stroke?.labelWire ?? 1.1}\n min={0.4}\n max={2}\n step={0.05}\n onChange={(labelWire) => updateLayer(selectedLayer.id, (layer) => ({ ...layer, stroke: { ...layer.stroke, labelWire } }))}\n />\n </EditorSection>\n </>\n ) : (\n <div className=\"empty-note\">\n <h2>No layer selected</h2>\n <button type=\"button\" className=\"primary-action\" onClick={addLayer}>Add layer</button>\n </div>\n )}\n </aside>\n </section>\n </main>\n );\n}\n\nfunction EditorSection({\n title,\n children,\n collapsible = false,\n defaultOpen = true\n}: {\n title: string;\n children: ReactNode;\n collapsible?: boolean;\n defaultOpen?: boolean;\n}) {\n if (collapsible) {\n return (\n <details className=\"editor-section editor-section-details\" open={defaultOpen}>\n <summary>\n <h3>{title}</h3>\n </summary>\n <div className=\"editor-section-body\">\n {children}\n </div>\n </details>\n );\n }\n\n return (\n <section className=\"editor-section\">\n <h3>{title}</h3>\n {children}\n </section>\n );\n}\n\nfunction VariantEditor({\n title,\n variant,\n onChange\n}: {\n title: string;\n variant: SquircleVariantConfig;\n onChange: (patch: SquircleVariantConfig) => void;\n}) {\n return (\n <EditorSection title={title}>\n <VariantControls variant={variant} onChange={onChange} />\n </EditorSection>\n );\n}\n\nfunction VariantControls({\n variant,\n onChange\n}: {\n variant: SquircleVariantConfig;\n onChange: (patch: SquircleVariantConfig) => void;\n}) {\n return (\n <div className=\"variant-controls\">\n <SegmentedField\n label=\"Material\"\n value={variant.material ?? \"wireframe\"}\n options={MATERIAL_OPTIONS}\n onChange={(material) => onChange({ material })}\n />\n <PaletteField\n value={variant.paletteId ?? \"15\"}\n onChange={(paletteId) => onChange({ paletteId })}\n />\n\n <div className=\"feature-grid\" aria-label=\"Top details\">\n <FeatureSwitch\n label=\"Text\"\n checked={variantHasText(variant)}\n title=\"Toggle top-plane text for this state.\"\n onChange={(enabled) => onChange(enabled\n ? { text: variantTextValue(variant), textColor: variantTextColor(variant) }\n : { text: false, textColor: undefined }\n )}\n />\n <FeatureSwitch\n label=\"Dash\"\n checked={variant.dash ?? false}\n title=\"Toggle the dashed inlay for this state.\"\n onChange={(enabled) => onChange(enabled\n ? { dash: true, dashColor: variantDashColor(variant) }\n : { dash: false, dashColor: undefined }\n )}\n />\n </div>\n\n {variantHasText(variant) ? (\n <div className=\"nested-fields\">\n <TextField\n label=\"Text\"\n value={variantTextValue(variant)}\n onChange={(text) => onChange({ text })}\n />\n <SegmentedField\n label=\"Text paint\"\n value={variantTextStyle(variant)}\n options={TEXT_STYLE_OPTIONS}\n onChange={(textStyle) => onChange({ textStyle })}\n />\n <AnnotationColorField\n label=\"Text color\"\n value={variantTextColor(variant)}\n forcedValue={forcedTextColor(variant)}\n onChange={(textColor) => onChange({ textColor })}\n />\n <RangeField\n label=\"Text size\"\n value={variant.textSize ?? DEFAULT_TEXT_SIZE}\n min={MIN_TEXT_SIZE}\n max={MAX_TEXT_SIZE}\n step={1}\n formatValue={(value) => `${Math.round(value)}px`}\n onChange={(textSize) => onChange({ textSize })}\n />\n <SegmentedField\n label=\"Font weight\"\n value={String(variant.textFontWeight ?? DEFAULT_TEXT_FONT_WEIGHT)}\n options={FONT_WEIGHT_OPTIONS}\n onChange={(textFontWeight) => onChange({ textFontWeight: Number(textFontWeight) })}\n />\n </div>\n ) : null}\n\n {variant.dash ? (\n <div className=\"nested-fields\">\n <AnnotationColorField\n label=\"Dash color\"\n value={variantDashColor(variant)}\n forcedValue={forcedDashColor(variant)}\n onChange={(dashColor) => onChange({ dashColor })}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction FeatureSwitch({\n label,\n checked,\n title,\n onChange\n}: {\n label: string;\n checked: boolean;\n title?: string;\n onChange: (value: boolean) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"feature-switch\"\n aria-pressed={checked}\n title={title}\n onClick={() => onChange(!checked)}\n >\n <span className=\"feature-switch-label\">{label}</span>\n <span className=\"feature-switch-state\">{checked ? \"On\" : \"Off\"}</span>\n </button>\n );\n}\n\nfunction AnnotationColorField({\n label,\n value,\n forcedValue,\n onChange\n}: {\n label: string;\n value: EditorAnnotationColor;\n forcedValue: string | null;\n onChange: (value: EditorAnnotationColor) => void;\n}) {\n if (forcedValue) {\n return (\n <div className=\"field\">\n <span>{label}</span>\n <div className=\"forced-token\" title=\"This material controls annotation paint from the wireframe palette.\">\n {forcedValue}\n </div>\n </div>\n );\n }\n\n return (\n <SegmentedField\n label={label}\n value={value}\n options={ANNOTATION_COLOR_OPTIONS}\n onChange={onChange}\n />\n );\n}\n\nfunction SegmentedField<T extends string>({\n label,\n value,\n options,\n onChange\n}: {\n label: string;\n value: T;\n options: readonly { value: T; label: string; title?: string }[];\n onChange: (value: T) => void;\n}) {\n return (\n <div className=\"field\">\n <span>{label}</span>\n <div className=\"segmented-field\" role=\"group\" aria-label={label}>\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n title={option.title}\n aria-pressed={option.value === value}\n onClick={() => onChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction PaletteField({ value, onChange }: { value: string; onChange: (value: string) => void }) {\n return (\n <div className=\"field palette-field\">\n <span>Palette</span>\n <div className=\"palette-grid\" role=\"group\" aria-label=\"Palette\">\n {SQUIRCLE_PALETTE_IDS.map((id) => (\n <button\n key={id}\n type=\"button\"\n title={SQUIRCLE_PALETTES[id].label}\n aria-pressed={value === id}\n onClick={() => onChange(id)}\n >\n <span\n className=\"palette-swatch\"\n style={{\n background: `linear-gradient(135deg, ${SQUIRCLE_PALETTES[id].swatch[0]}, ${SQUIRCLE_PALETTES[id].swatch[1]})`\n }}\n />\n <span>{id}</span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction TextField({\n label,\n value,\n onChange\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <label className=\"field\">\n <span>{label}</span>\n <input type=\"text\" value={value} onChange={(event) => onChange(event.target.value)} />\n </label>\n );\n}\n\nfunction RangeField({\n label,\n value,\n min,\n max,\n step,\n formatValue,\n onChange\n}: {\n label: string;\n value: number;\n min: number;\n max: number;\n step: number;\n formatValue?: (value: number) => string;\n onChange: (value: number) => void;\n}) {\n return (\n <label className=\"field\">\n <span>{label}: {formatValue ? formatValue(value) : value.toFixed(2)}</span>\n <input type=\"range\" min={min} max={max} step={step} value={value} onChange={(event) => onChange(Number(event.target.value))} />\n </label>\n );\n}\n\nfunction CopyIcon() {\n return (\n <svg className=\"copy-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n <path d=\"M5 15V6.8C5 5.8 5.8 5 6.8 5H15\" />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nfunction TrashIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3\" />\n </svg>\n );\n}\n\nfunction EyeIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M2.5 12s3.4-6 9.5-6 9.5 6 9.5 6-3.4 6-9.5 6-9.5-6-9.5-6Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"2.8\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 3l18 18M9.4 5.5A10.9 10.9 0 0 1 12 5c6.1 0 9.5 7 9.5 7a15.2 15.2 0 0 1-3 4M6.7 6.9A15.5 15.5 0 0 0 2.5 12s3.4 7 9.5 7c1.1 0 2.2-.2 3.1-.6\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n );\n}\n\nfunction CodeIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M9 18 3 12l6-6M15 6l6 6-6 6\" />\n </svg>\n );\n}\n\nfunction summary(variant: SquircleVariantConfig): string {\n const parts = [materialLabel(variant.material ?? \"wireframe\"), getPalette(variant.paletteId).label];\n if (variantHasText(variant)) parts.push(`text: ${variantTextValue(variant)}`);\n if (variant.dash) parts.push(\"dash\");\n return parts.join(\" / \");\n}\n\nfunction getPalette(paletteId: string | undefined) {\n return SQUIRCLE_PALETTES[paletteId as keyof typeof SQUIRCLE_PALETTES] ?? SQUIRCLE_PALETTES[\"15\"];\n}\n\nfunction materialLabel(material: SquircleMaterial): string {\n if (material === \"transparent\") return \"Glass\";\n if (material === \"solid\") return \"Solid\";\n return \"Wire\";\n}\n\nfunction layerLabel(_id: string, index: number, _total: number): string {\n return `Layer ${index}`;\n}\n\nfunction nextLayerId(layers: SquircleLayerConfig[]): string {\n const usedIds = new Set(layers.map((layer) => layer.id));\n let index = layers.length + 1;\n while (usedIds.has(`layer-${index}`)) index += 1;\n return `layer-${index}`;\n}\n\nfunction radiusForExponent(exponent: number): number {\n const normalized = (MAX_EXPONENT - exponent) / (MAX_EXPONENT - MIN_EXPONENT);\n return clamp(Math.round(normalized * 100), MIN_RADIUS, MAX_RADIUS);\n}\n\nfunction exponentForRadius(radius: number): number {\n const normalized = clamp(radius, MIN_RADIUS, MAX_RADIUS) / 100;\n return roundTo(MAX_EXPONENT - normalized * (MAX_EXPONENT - MIN_EXPONENT), 1);\n}\n\nfunction editorGeometryForCode(geometry: SquircleGeometryConfig): SquircleGeometryConfig {\n return {\n exponent: geometry.exponent ?? DEFAULT_GEOMETRY.exponent,\n prismHeight: geometry.prismHeight ?? DEFAULT_GEOMETRY.prismHeight,\n inlayScale: geometry.inlayScale ?? DEFAULT_GEOMETRY.inlayScale\n };\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction roundTo(value: number, precision: number): number {\n const scale = 10 ** precision;\n return Math.round(value * scale) / scale;\n}\n\nfunction variantHasText(variant: SquircleVariantConfig): boolean {\n if (typeof variant.text === \"string\") return variant.text.trim().length > 0;\n return variant.text === true || legacyVariant(variant).gpu === true;\n}\n\nfunction variantTextValue(variant: SquircleVariantConfig): string {\n if (typeof variant.text === \"string\") return variant.text;\n if (variant.text === true || legacyVariant(variant).gpu) return DEFAULT_TEXT;\n return DEFAULT_TEXT;\n}\n\nfunction variantTextStyle(variant: SquircleVariantConfig): \"solid\" | \"wireframe\" {\n return variant.textStyle ?? legacyVariant(variant).gpuStyle ?? \"solid\";\n}\n\nfunction variantTextColor(variant: SquircleVariantConfig): EditorAnnotationColor {\n return normalizeAnnotationColor(variant.textColor ?? legacyVariant(variant).gpuColor ?? \"contrast\");\n}\n\nfunction variantDashColor(variant: SquircleVariantConfig): EditorAnnotationColor {\n return normalizeAnnotationColor(variant.dashColor ?? \"contrast\");\n}\n\nfunction normalizeAnnotationColor(color: SquircleAnnotationColor): EditorAnnotationColor {\n return color === \"contrast\" ? \"auto\" : color;\n}\n\nfunction forcedTextColor(variant: SquircleVariantConfig): string | null {\n if ((variant.material ?? \"wireframe\") !== \"wireframe\") return null;\n return variantTextStyle(variant) === \"wireframe\" ? \"Wire gradient\" : \"Surface gradient\";\n}\n\nfunction forcedDashColor(variant: SquircleVariantConfig): string | null {\n return (variant.material ?? \"wireframe\") === \"wireframe\" ? \"Wire gradient\" : null;\n}\n\nfunction legacyVariant(variant: SquircleVariantConfig): LegacyTextVariantConfig {\n return variant as SquircleVariantConfig & LegacyTextVariantConfig;\n}\n"],"mappings":"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"}
|