@dstackai/sqircle 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 { 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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"}
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\nexport function isSquirclePaletteId(paletteId: string | undefined): paletteId is SquirclePaletteId {\n return Boolean(paletteId && paletteId in SQUIRCLE_PALETTES);\n}\n","import { useEffect, useId, useMemo, useState } from \"react\";\nimport type { CSSProperties, SVGProps } from \"react\";\nimport { createSquircleGeometry, pointsToString } from \"./geometry\";\nimport {\n DEFAULT_PALETTE_ID,\n getSquirclePalette,\n isSquirclePaletteId,\n SQUIRCLE_PALETTES\n} from \"./palettes\";\nimport type { SquircleGradientStop } from \"./palettes\";\nimport type {\n SquircleAnnotationColor,\n SquircleGeometryConfig,\n SquircleLayerConfig,\n SquircleMaterial,\n SquircleOpacityConfig,\n SquircleSceneProps,\n SquircleStrokeConfig,\n SquircleEffect,\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;\nconst DEFAULT_EFFECT: SquircleEffect = \"off\";\n\nconst FLUID_BASE_BLOBS = [\n { x: -1.12, y: -1.04, r: 0.48, slot: 0, i: 0, sp: 0.95, ax: 0.23, ay: 0.21, ar: 0.018 },\n { x: -0.58, y: -0.7, r: 0.49, slot: 1, i: 1, sp: 1.1, ax: 0.24, ay: 0.2, ar: 0.018 },\n { x: -0.1, y: -0.16, r: 0.47, slot: 2, i: 2, sp: 0.9, ax: 0.22, ay: 0.23, ar: 0.016 },\n { x: 0.46, y: -0.72, r: 0.48, slot: 3, i: 3, sp: 1.2, ax: 0.23, ay: 0.21, ar: 0.018 },\n { x: 1.02, y: -0.18, r: 0.46, slot: 4, i: 4, sp: 1.05, ax: 0.22, ay: 0.23, ar: 0.016 },\n { x: 1.18, y: 0.58, r: 0.48, slot: 2, i: 5, sp: 0.85, ax: 0.24, ay: 0.21, ar: 0.018 },\n { x: 0.42, y: 1.08, r: 0.47, slot: 1, i: 6, sp: 1.3, ax: 0.23, ay: 0.24, ar: 0.016 },\n { x: -0.54, y: 1.14, r: 0.48, slot: 3, i: 7, sp: 1.0, ax: 0.24, ay: 0.22, ar: 0.018 }\n];\n\nconst FLUID_LIGHT_BLOBS = [\n { x: -0.82, y: -0.44, r: 0.48, slot: 0, i: 8, sp: 1.7, ax: 0.25, ay: 0.23, ar: 0.016 },\n { x: -0.2, y: -1.08, r: 0.47, slot: 1, i: 9, sp: 1.45, ax: 0.24, ay: 0.22, ar: 0.016 },\n { x: 0.66, y: 0.0, r: 0.49, slot: 0, i: 10, sp: 2.0, ax: 0.23, ay: 0.25, ar: 0.016 },\n { x: 1.12, y: 0.94, r: 0.47, slot: 1, i: 11, sp: 1.6, ax: 0.25, ay: 0.23, ar: 0.016 }\n];\n\nconst FROSTED_BLOBS = [\n { x: -1.08, y: -0.96, r: 0.47, slot: 0, i: 12, sp: 0.75, ax: 0.2, ay: 0.19, ar: 0.016 },\n { x: -0.56, y: -0.46, r: 0.49, slot: 1, i: 13, sp: 0.9, ax: 0.21, ay: 0.2, ar: 0.016 },\n { x: 0.02, y: 0.02, r: 0.47, slot: 2, i: 14, sp: 0.8, ax: 0.2, ay: 0.21, ar: 0.016 },\n { x: 0.64, y: -0.6, r: 0.48, slot: 3, i: 15, sp: 1.0, ax: 0.21, ay: 0.19, ar: 0.016 },\n { x: 1.12, y: 0.2, r: 0.46, slot: 1, i: 16, sp: 0.85, ax: 0.2, ay: 0.21, ar: 0.016 },\n { x: 0.74, y: 1.08, r: 0.49, slot: 2, i: 17, sp: 0.95, ax: 0.21, ay: 0.2, ar: 0.016 },\n { x: -0.14, y: 1.16, r: 0.47, slot: 0, i: 18, sp: 0.82, ax: 0.2, ay: 0.21, ar: 0.016 },\n { x: -1.04, y: 0.58, r: 0.48, slot: 3, i: 19, sp: 1.05, ax: 0.21, ay: 0.2, ar: 0.016 }\n];\n\ntype ResolvedVariant = {\n material: SquircleMaterial;\n paletteId: string;\n effect: SquircleEffect;\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\ntype EffectColorSet = readonly [string, string, string, string, string, string, string];\n\ntype RenderPalette = {\n id: string;\n labelFill: string;\n topEdge: string;\n sideEdge: string;\n top: SquircleGradientStop[];\n side: SquircleGradientStop[];\n textWire: SquircleGradientStop[];\n effectColors: EffectColorSet;\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 const motionEnabled = visibleLayers.some(layerHasAnimatedSurface);\n const motionTime = useMotionTime(motionEnabled);\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 motionTime={motionTime}\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 const topPoints = pointsToString(geometry.topPoints);\n const planeWidth = geometry.config.halfSize * 2;\n const planeBlur = roundNumber(planeWidth * 0.13);\n const filterExtent = roundNumber(geometry.config.halfSize * 3.6);\n const filterSize = filterExtent * 2;\n\n return (\n <defs>\n <clipPath id={`${prefix}-top-clip`} clipPathUnits=\"userSpaceOnUse\">\n <polygon points={topPoints} />\n </clipPath>\n <filter\n id={`${prefix}-fluid-main-blur`}\n filterUnits=\"userSpaceOnUse\"\n primitiveUnits=\"userSpaceOnUse\"\n x={-filterExtent}\n y={-filterExtent}\n width={filterSize}\n height={filterSize}\n >\n <feGaussianBlur stdDeviation={planeBlur} />\n </filter>\n <filter\n id={`${prefix}-fluid-light-blur`}\n filterUnits=\"userSpaceOnUse\"\n primitiveUnits=\"userSpaceOnUse\"\n x={-filterExtent}\n y={-filterExtent}\n width={filterSize}\n height={filterSize}\n >\n <feGaussianBlur stdDeviation={planeBlur} />\n </filter>\n <filter\n id={`${prefix}-frosted-blur`}\n filterUnits=\"userSpaceOnUse\"\n primitiveUnits=\"userSpaceOnUse\"\n x={-filterExtent}\n y={-filterExtent}\n width={filterSize}\n height={filterSize}\n >\n <feGaussianBlur stdDeviation={planeBlur} />\n </filter>\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 motionTime,\n selected,\n onSelect\n}: {\n layer: SquircleLayerConfig;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n motionTime: number;\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} motionTime={motionTime} />\n {hasHover && hover ? <SquircleVariant className=\"sq-hover\" variant={hover} geometry={geometry} prefix={prefix} motionTime={motionTime} /> : null}\n </g>\n );\n}\n\nfunction SquircleVariant({\n className,\n variant,\n geometry,\n prefix,\n motionTime\n}: {\n className: string;\n variant: ResolvedVariant;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n motionTime: number;\n}) {\n const palette = getRenderPalette(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 const topClipId = `${prefix}-top-clip`;\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 <SolidTopFace\n variant={variant}\n palette={palette}\n geometry={geometry}\n prefix={prefix}\n topClipId={topClipId}\n topFill={topFill}\n topPoints={topPoints}\n motionTime={motionTime}\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 SolidTopFace({\n variant,\n palette,\n geometry,\n prefix,\n topClipId,\n topFill,\n topPoints,\n motionTime\n}: {\n variant: ResolvedVariant;\n palette: RenderPalette;\n geometry: ReturnType<typeof createSquircleGeometry>;\n prefix: string;\n topClipId: string;\n topFill: string;\n topPoints: string;\n motionTime: number;\n}) {\n const fillOpacity = variant.material === \"transparent\" ? variant.opacity.transparentFace : 1;\n const effect = variant.material === \"solid\" ? variant.effect : \"off\";\n const halfSize = geometry.config.halfSize;\n const baseRect = {\n x: -halfSize * 1.3,\n y: -halfSize * 1.3,\n size: halfSize * 2.6\n };\n\n if (effect === \"fluid\") {\n return (\n <>\n <g className=\"sq-top-effect sq-top-effect-fluid\" clipPath={`url(#${topClipId})`}>\n <g transform={geometry.labelTransform}>\n <rect\n x={baseRect.x}\n y={baseRect.y}\n width={baseRect.size}\n height={baseRect.size}\n fill={palette.effectColors[3]}\n />\n <g filter={`url(#${prefix}-fluid-main-blur)`}>\n {FLUID_BASE_BLOBS.map((blob) => (\n <MotionBlob key={blob.i} blob={blob} palette={palette} geometry={geometry} motionTime={motionTime} />\n ))}\n </g>\n <g filter={`url(#${prefix}-fluid-light-blur)`} opacity={0.6} style={{ mixBlendMode: \"screen\" }}>\n {FLUID_LIGHT_BLOBS.map((blob) => (\n <MotionBlob key={blob.i} blob={blob} palette={palette} geometry={geometry} motionTime={motionTime} />\n ))}\n </g>\n </g>\n </g>\n <polygon\n className=\"sq-face sq-solid-top sq-effect-outline\"\n points={topPoints}\n fill=\"none\"\n stroke={palette.topEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n </>\n );\n }\n\n if (effect === \"frosted\") {\n return (\n <>\n <g className=\"sq-top-effect sq-top-effect-frosted\" clipPath={`url(#${topClipId})`}>\n <g transform={geometry.labelTransform}>\n <rect\n x={baseRect.x}\n y={baseRect.y}\n width={baseRect.size}\n height={baseRect.size}\n fill={palette.effectColors[6]}\n />\n <g filter={`url(#${prefix}-frosted-blur)`}>\n {FROSTED_BLOBS.map((blob) => (\n <MotionBlob key={blob.i} blob={blob} palette={palette} geometry={geometry} motionTime={motionTime} />\n ))}\n </g>\n </g>\n <polygon points={topPoints} fill=\"#eef2ff\" opacity={0.16} />\n </g>\n <polygon\n className=\"sq-face sq-solid-top sq-effect-outline\"\n points={topPoints}\n fill=\"none\"\n stroke={palette.topEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n <polygon\n className=\"sq-face sq-frosted-rim\"\n points={topPoints}\n fill=\"none\"\n stroke=\"#ffffff\"\n strokeWidth={Math.max(0.7, variant.stroke.face * 1.8)}\n strokeOpacity={0.52}\n />\n </>\n );\n }\n\n return (\n <polygon\n className=\"sq-face sq-solid-top\"\n points={topPoints}\n fill={topFill}\n fillOpacity={fillOpacity}\n stroke={palette.topEdge}\n strokeWidth={variant.stroke.face}\n strokeOpacity={variant.stroke.faceOpacity}\n />\n );\n}\n\nfunction MotionBlob({\n blob,\n palette,\n geometry,\n motionTime\n}: {\n blob: {\n x: number;\n y: number;\n r: number;\n slot: number;\n i: number;\n sp: number;\n ax: number;\n ay: number;\n ar: number;\n };\n palette: RenderPalette;\n geometry: ReturnType<typeof createSquircleGeometry>;\n motionTime: number;\n}) {\n const halfSize = geometry.config.halfSize;\n const planeWidth = halfSize * 2;\n const x = halfSize * blob.x;\n const y = halfSize * blob.y;\n const radius = planeWidth * blob.r;\n const ax = planeWidth * blob.ax;\n const ay = planeWidth * blob.ay;\n const ar = planeWidth * blob.ar;\n const cx = x + ax * Math.sin(motionTime * 0.62 * blob.sp + blob.i * 1.7) + 0.5 * ax * Math.cos(motionTime * 0.4 * blob.sp + blob.i * 0.6);\n const cy = y + ay * Math.cos(motionTime * 0.55 * blob.sp + blob.i * 2.1) + 0.55 * ay * Math.sin(motionTime * 0.34 * blob.sp + blob.i);\n const r = Math.max(4, radius + ar * Math.sin(motionTime * 0.8 + blob.i * 1.2));\n\n return (\n <circle\n cx={roundNumber(cx)}\n cy={roundNumber(cy)}\n r={roundNumber(r)}\n fill={palette.effectColors[blob.slot] ?? palette.effectColors[3]}\n />\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: resolvePaletteId(variant.paletteId),\n effect: normalizeEffect(variant.effect ?? DEFAULT_EFFECT),\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 normalizeEffect(effect: SquircleEffect | string): SquircleEffect {\n if (effect === \"fluid\" || effect === \"frosted\") return effect;\n return \"off\";\n}\n\nfunction resolvePaletteId(paletteId: string | undefined): string {\n return isSquirclePaletteId(paletteId) ? paletteId : DEFAULT_PALETTE_ID;\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: RenderPalette, 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: RenderPalette,\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\nfunction useMotionTime(enabled: boolean): number {\n const [time, setTime] = useState(0);\n\n useEffect(() => {\n if (!enabled) {\n setTime(0);\n return undefined;\n }\n\n const update = () => setTime(performance.now() / 1000);\n update();\n const interval = window.setInterval(update, 33);\n\n return () => window.clearInterval(interval);\n }, [enabled]);\n\n return enabled ? time : 0;\n}\n\nfunction layerHasAnimatedSurface(layer: SquircleLayerConfig): boolean {\n const base = resolveVariant(layer.base, layer.stroke, layer.opacity);\n if (variantHasAnimatedSurface(base)) return true;\n if (!layer.hover) return false;\n const hover = resolveVariant({ ...layer.base, ...layer.hover }, layer.stroke, layer.opacity);\n return variantHasAnimatedSurface(hover);\n}\n\nfunction variantHasAnimatedSurface(variant: ResolvedVariant): boolean {\n return variant.material === \"solid\" && variant.effect !== \"off\";\n}\n\nfunction getRenderPalette(paletteId: string): RenderPalette {\n const palette = getSquirclePalette(paletteId);\n\n return {\n id: palette.id,\n labelFill: palette.labelFill,\n topEdge: palette.topEdge,\n sideEdge: palette.sideEdge,\n top: palette.top,\n side: palette.side,\n textWire: palette.textWire,\n effectColors: alphaPaletteEffectColors(palette)\n };\n}\n\nfunction alphaPaletteEffectColors(palette: ReturnType<typeof getSquirclePalette>): EffectColorSet {\n const topStart = palette.top[0]?.color ?? \"#f5f0ff\";\n const topMid = palette.top[Math.floor(palette.top.length / 2)]?.color ?? topStart;\n const topEnd = palette.top.at(-1)?.color ?? topMid;\n const sideStart = palette.side[0]?.color ?? topMid;\n const sideMid = palette.side[Math.floor(palette.side.length / 2)]?.color ?? sideStart;\n const sideEnd = palette.side.at(-1)?.color ?? palette.sideEdge;\n\n return [topStart, topStart, topMid, topEnd, sideStart, sideMid, sideEnd];\n}\n\nfunction roundNumber(value: number): number {\n return Number(value.toFixed(1));\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 {\n DEFAULT_PALETTE_ID,\n SQUIRCLE_PALETTE_IDS,\n SQUIRCLE_PALETTES\n} from \"./palettes\";\nimport { SquircleScene } from \"./SquircleScene\";\nimport type {\n SquircleAnnotationColor,\n SquircleGeometryConfig,\n SquircleLayerConfig,\n SquircleMaterial,\n SquircleEffect,\n SquircleTheme,\n SquircleVariantConfig\n} 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 EFFECT_OPTIONS = [\n { value: \"off\", label: \"Off\", title: \"Use the static top-face gradient\" },\n { value: \"fluid\", label: \"Fluid\", title: \"Animated clipped gradient blobs on the top face\" },\n { value: \"frosted\", label: \"Frosted\", title: \"Muted animated blobs with a pale glass veil and rim\" }\n] satisfies { value: SquircleEffect; 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 const effect = variantEffect(layer.base);\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 {material === \"solid\" && effect !== \"off\" ? <span>{effect}</span> : null}\n {layer.hover ? <span>Hover</span> : null}\n {!variantHasText(layer.base) && !layer.base.dash && !layer.hover && effect === \"off\" ? <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 const material = variant.material ?? \"wireframe\";\n\n return (\n <div className=\"variant-controls\">\n <SegmentedField\n label=\"Material\"\n value={material}\n options={MATERIAL_OPTIONS}\n onChange={(material) => onChange({ material })}\n />\n <PaletteField\n value={paletteIdForEditor(variant.paletteId)}\n onChange={(paletteId) => onChange({ paletteId })}\n />\n {material === \"solid\" ? (\n <SegmentedField\n label=\"Effect\"\n value={variantEffect(variant)}\n options={EFFECT_OPTIONS}\n onChange={(effect) => onChange({ effect })}\n />\n ) : null}\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 const palette = getPalette(id);\n\n return (\n <button\n key={id}\n type=\"button\"\n title={palette.label}\n aria-pressed={value === id}\n onClick={() => onChange(id)}\n >\n <span\n className=\"palette-swatch\"\n style={{\n background: `linear-gradient(135deg, ${palette.swatch[0]}, ${palette.swatch[1]})`\n }}\n />\n <span>{id}</span>\n </button>\n );\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 const effect = variantEffect(variant);\n if ((variant.material ?? \"wireframe\") === \"solid\" && effect !== \"off\") parts.push(effect);\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[DEFAULT_PALETTE_ID];\n}\n\nfunction paletteIdForEditor(paletteId: string | undefined): string {\n return paletteId && paletteId in SQUIRCLE_PALETTES ? paletteId : DEFAULT_PALETTE_ID;\n}\n\nfunction variantEffect(variant: SquircleVariantConfig): SquircleEffect {\n if (variant.effect === \"fluid\" || variant.effect === \"frosted\") return variant.effect;\n return \"off\";\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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"}