dingbatch 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boomerang-s5naDBuf.d.ts +39 -0
- package/dist/chunk-5A7FSZ3T.js +1626 -0
- package/dist/chunk-5A7FSZ3T.js.map +1 -0
- package/dist/index.d.ts +229 -29
- package/dist/index.js +65 -3
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-IAFZ3FNR.js +0 -531
- package/dist/chunk-IAFZ3FNR.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/generators/utils/svg.ts","../src/presets/boomerang.ts","../src/generators/curved/boomerang.ts","../src/generators/curved/blob.ts","../src/generators/utils/path.ts","../src/generators/curved/circle.ts","../src/generators/curved/kidney.ts","../src/generators/curved/moon.ts","../src/generators/curved/oval.ts","../src/generators/curved/semicircle.ts","../src/generators/angular/arrow.ts","../src/generators/angular/bowtie.ts","../src/generators/angular/chevron.ts","../src/generators/angular/cross.ts","../src/generators/angular/cursor.ts","../src/generators/angular/diamond.ts","../src/generators/angular/polygon.ts","../src/generators/angular/rectangle.ts","../src/generators/angular/swallowtail.ts","../src/generators/angular/triangle.ts","../src/generators/radial/atomic.ts","../src/generators/radial/flower.ts","../src/generators/radial/spiral.ts","../src/generators/radial/star.ts","../src/generators/radial/starburst.ts","../src/generators/radial/sun.ts","../src/generators/silhouettes/bird.ts","../src/generators/silhouettes/cat.ts","../src/generators/silhouettes/dog.ts","../src/generators/silhouettes/fish.ts","../src/generators/silhouettes/leaf.ts","../src/generators/silhouettes/rocket.ts"],"sourcesContent":["// src/generators/utils/svg.ts\n\ninterface BaseResult {\n path: string;\n width: number;\n height: number;\n centerX: number;\n centerY: number;\n}\n\nexport function wrapPath(path: string, width: number, height: number): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\"><path d=\"${path}\" fill=\"currentColor\"/></svg>`;\n}\n\nexport function addSvgFields<T extends BaseResult>(result: T): T & { viewBox: string; svg: string } {\n const viewBox = `0 0 ${result.width} ${result.height}`;\n const svg = wrapPath(result.path, result.width, result.height);\n return { ...result, viewBox, svg };\n}\n","import type { BoomerangParams } from '../generators/curved/boomerang';\n\nexport const crescent: BoomerangParams = {\n style: 'crescent',\n armLength: 50,\n bendAngle: 160,\n thickness: 35,\n taper: 0.5,\n tipRoundness: 0.2,\n armCurvature: 0,\n bendSharpness: 0,\n};\n\nexport const fatMoon: BoomerangParams = {\n style: 'crescent',\n armLength: 45,\n bendAngle: 180,\n thickness: 50,\n taper: 0.3,\n tipRoundness: 0.6,\n armCurvature: 0,\n bendSharpness: 0,\n};\n\nexport const sharpChevron: BoomerangParams = {\n style: 'chevron',\n armLength: 55,\n bendAngle: 60,\n thickness: 40,\n taper: 1,\n tipRoundness: 0,\n armCurvature: 0,\n bendSharpness: 0,\n};\n\nexport const thinArc: BoomerangParams = {\n style: 'crescent',\n armLength: 60,\n bendAngle: 140,\n thickness: 20,\n taper: 0.7,\n tipRoundness: 0.1,\n armCurvature: 0,\n bendSharpness: 0,\n};\n\nexport const horseshoe: BoomerangParams = {\n style: 'horseshoe',\n armLength: 80,\n bendAngle: 50,\n thickness: 18,\n taper: 0.2,\n tipRoundness: 0.3,\n armCurvature: 0.4,\n bendSharpness: 0,\n};\n","import { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\nimport * as presets from '../../presets/boomerang';\n\nexport type BoomerangStyle = 'classic' | 'crescent' | 'horseshoe' | 'chevron';\n\nexport interface BoomerangParams {\n // Style selection\n style?: BoomerangStyle; // 'classic' (outline V), 'crescent' (arc), 'horseshoe' (U), 'chevron' (solid V)\n\n // Core shape - interpreted based on style\n armLength: number; // Length of arms (classic/horseshoe) or arc radius (crescent)\n bendAngle: number; // Angle between arms (classic), arc span (crescent), arm spacing (horseshoe)\n armCurvature: number; // How curved: 0-1 (classic: arm bow, crescent: unused, horseshoe: bottom curve)\n bendSharpness: number; // Bend smoothness: 0-1\n\n // Thickness\n thickness: number; // Max thickness at widest point\n taper: number; // Tip thickness ratio: 0-1 (0 = pointed, 1 = uniform)\n tipRoundness: number; // How rounded the tips are: 0-1\n\n // Asymmetry (optional)\n armBalance?: number; // Ratio of arm1/arm2 length: 0.5-2 (default 1)\n thicknessBalance?: number; // Thickness bias: -1 to 1 (default 0)\n\n // Orientation\n rotation?: number; // Rotation in degrees (default 0)\n}\n\n/**\n * Boomerang function with preset methods attached.\n */\ninterface BoomerangFunction {\n (params: BoomerangParams): GeneratorResult;\n crescent: (overrides?: Partial<BoomerangParams>) => GeneratorResult;\n fatMoon: (overrides?: Partial<BoomerangParams>) => GeneratorResult;\n sharpChevron: (overrides?: Partial<BoomerangParams>) => GeneratorResult;\n thinArc: (overrides?: Partial<BoomerangParams>) => GeneratorResult;\n horseshoe: (overrides?: Partial<BoomerangParams>) => GeneratorResult;\n}\n\n/**\n * Unified boomerang generator with multiple geometry modes:\n * - 'classic': Two arms diverging from a central bend (V-shape, traditional boomerang)\n * - 'crescent': Single curved arc with thickness (moon-like, thick C-curve)\n * - 'horseshoe': Two parallel arms connected by curved bottom (U-shape)\n */\nfunction boomerangBase(params: BoomerangParams): GeneratorResult {\n const style = params.style || 'classic';\n\n switch (style) {\n case 'crescent':\n return generateCrescent(params);\n case 'horseshoe':\n return generateHorseshoe(params);\n case 'chevron':\n return generateChevron(params);\n case 'classic':\n default:\n return generateClassic(params);\n }\n}\n\nexport const boomerang: BoomerangFunction = Object.assign(boomerangBase, {\n crescent: (overrides?: Partial<BoomerangParams>) =>\n boomerangBase({ ...presets.crescent, ...overrides }),\n fatMoon: (overrides?: Partial<BoomerangParams>) =>\n boomerangBase({ ...presets.fatMoon, ...overrides }),\n sharpChevron: (overrides?: Partial<BoomerangParams>) =>\n boomerangBase({ ...presets.sharpChevron, ...overrides }),\n thinArc: (overrides?: Partial<BoomerangParams>) =>\n boomerangBase({ ...presets.thinArc, ...overrides }),\n horseshoe: (overrides?: Partial<BoomerangParams>) =>\n boomerangBase({ ...presets.horseshoe, ...overrides }),\n});\n\n// ============================================================================\n// CLASSIC STYLE - Two arms diverging from bend point (V-shape)\n// ============================================================================\n\nfunction generateClassic(params: BoomerangParams): GeneratorResult {\n const {\n armLength,\n bendAngle,\n armCurvature,\n bendSharpness,\n thickness,\n taper,\n tipRoundness,\n armBalance = 1,\n thicknessBalance = 0,\n rotation = 0,\n } = params;\n\n const clampedBendAngle = Math.max(30, Math.min(180, bendAngle));\n const clampedArmCurvature = Math.max(0, Math.min(1, armCurvature));\n const clampedBendSharpness = Math.max(0, Math.min(1, bendSharpness));\n const clampedTaper = Math.max(0, Math.min(1, taper));\n const clampedTipRoundness = Math.max(0, Math.min(1, tipRoundness));\n const clampedArmBalance = Math.max(0.5, Math.min(2, armBalance));\n const clampedThicknessBalance = Math.max(-1, Math.min(1, thicknessBalance));\n\n const arm1Length = armLength * (2 / (1 + clampedArmBalance));\n const arm2Length = armLength * (2 * clampedArmBalance / (1 + clampedArmBalance));\n\n const halfAngle = (clampedBendAngle / 2) * Math.PI / 180;\n\n const arm1Dir = { x: -Math.sin(halfAngle), y: -Math.cos(halfAngle) };\n const arm2Dir = { x: Math.sin(halfAngle), y: -Math.cos(halfAngle) };\n\n const tip1 = { x: arm1Dir.x * arm1Length, y: arm1Dir.y * arm1Length };\n const tip2 = { x: arm2Dir.x * arm2Length, y: arm2Dir.y * arm2Length };\n const bendPoint = { x: 0, y: 0 };\n\n const numSamples = 20;\n\n const arm1Spine = generateArmSpine(tip1, bendPoint, arm1Dir, arm1Length, clampedArmCurvature, numSamples);\n const arm2Spine = generateArmSpine(bendPoint, tip2, arm2Dir, arm2Length, clampedArmCurvature, numSamples);\n\n const minThickness = thickness * clampedTaper;\n\n function getThicknessAlongArm(t: number, isArm1: boolean): number {\n const tipFade = Math.sin(t * Math.PI / 2);\n const baseThickness = minThickness + (thickness - minThickness) * tipFade;\n const balanceFactor = isArm1\n ? 1 - clampedThicknessBalance * 0.3\n : 1 + clampedThicknessBalance * 0.3;\n return baseThickness * balanceFactor;\n }\n\n const arm1Outer: Point[] = [];\n const arm1Inner: Point[] = [];\n const arm2Outer: Point[] = [];\n const arm2Inner: Point[] = [];\n\n for (let i = 0; i < arm1Spine.length; i++) {\n const t = i / (arm1Spine.length - 1);\n const point = arm1Spine[i];\n const tangent = getSpineTangent(arm1Spine, i);\n const normal = { x: -tangent.y, y: tangent.x };\n const halfThick = getThicknessAlongArm(t, true) / 2;\n\n arm1Outer.push({ x: point.x + normal.x * halfThick, y: point.y + normal.y * halfThick });\n arm1Inner.push({ x: point.x - normal.x * halfThick, y: point.y - normal.y * halfThick });\n }\n\n for (let i = 0; i < arm2Spine.length; i++) {\n const t = 1 - i / (arm2Spine.length - 1);\n const point = arm2Spine[i];\n const tangent = getSpineTangent(arm2Spine, i);\n const normal = { x: -tangent.y, y: tangent.x };\n const halfThick = getThicknessAlongArm(t, false) / 2;\n\n arm2Outer.push({ x: point.x + normal.x * halfThick, y: point.y + normal.y * halfThick });\n arm2Inner.push({ x: point.x - normal.x * halfThick, y: point.y - normal.y * halfThick });\n }\n\n const pathParts: string[] = [];\n\n pathParts.push(`M ${arm1Outer[0].x.toFixed(2)},${arm1Outer[0].y.toFixed(2)}`);\n\n const tip1Curve = clampedTipRoundness * thickness * 0.3;\n pathParts.push(`Q ${(tip1.x + arm1Dir.x * tip1Curve).toFixed(2)},${(tip1.y + arm1Dir.y * tip1Curve).toFixed(2)} ${arm1Inner[0].x.toFixed(2)},${arm1Inner[0].y.toFixed(2)}`);\n\n pathParts.push(smoothCurveThroughPoints(arm1Inner));\n\n const bendInner2 = arm2Inner[0];\n\n if (clampedBendSharpness < 0.3) {\n pathParts.push(`L ${bendInner2.x.toFixed(2)},${bendInner2.y.toFixed(2)}`);\n } else {\n const bendInnerOffset = thickness * 0.2 * clampedBendSharpness;\n const bendInnerCtrl = { x: 0, y: bendInnerOffset };\n pathParts.push(`Q ${bendInnerCtrl.x.toFixed(2)},${bendInnerCtrl.y.toFixed(2)} ${bendInner2.x.toFixed(2)},${bendInner2.y.toFixed(2)}`);\n }\n\n pathParts.push(smoothCurveThroughPoints(arm2Inner));\n\n const tip2Curve = clampedTipRoundness * thickness * 0.3;\n pathParts.push(`Q ${(tip2.x + arm2Dir.x * tip2Curve).toFixed(2)},${(tip2.y + arm2Dir.y * tip2Curve).toFixed(2)} ${arm2Outer[arm2Outer.length - 1].x.toFixed(2)},${arm2Outer[arm2Outer.length - 1].y.toFixed(2)}`);\n\n const arm2OuterReversed = [...arm2Outer].reverse();\n pathParts.push(smoothCurveThroughPoints(arm2OuterReversed));\n\n const bendOuter1 = arm1Outer[arm1Outer.length - 1];\n\n if (clampedBendSharpness < 0.3) {\n pathParts.push(`L ${bendOuter1.x.toFixed(2)},${bendOuter1.y.toFixed(2)}`);\n } else {\n const bendOuterOffset = -thickness * 0.4 * clampedBendSharpness;\n const bendOuterCtrl = { x: 0, y: bendOuterOffset };\n pathParts.push(`Q ${bendOuterCtrl.x.toFixed(2)},${bendOuterCtrl.y.toFixed(2)} ${bendOuter1.x.toFixed(2)},${bendOuter1.y.toFixed(2)}`);\n }\n\n const arm1OuterReversed = [...arm1Outer].reverse();\n pathParts.push(smoothCurveThroughPoints(arm1OuterReversed));\n\n pathParts.push('Z');\n\n let path = pathParts.join(' ');\n\n const allPoints = [...arm1Outer, ...arm1Inner, ...arm2Outer, ...arm2Inner];\n let minX = Math.min(...allPoints.map(p => p.x));\n let maxX = Math.max(...allPoints.map(p => p.x));\n let minY = Math.min(...allPoints.map(p => p.y));\n let maxY = Math.max(...allPoints.map(p => p.y));\n\n const padding = thickness * 0.3 * clampedTipRoundness;\n minX -= padding;\n maxX += padding;\n minY -= padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n path = normalizePath(path, minX, minY);\n\n if (rotation !== 0) {\n path = rotatePath(path, rotation, width, height);\n }\n\n return addSvgFields({ path, width, height, centerX: width / 2, centerY: height / 2 });\n}\n\n// ============================================================================\n// CRESCENT STYLE - Single curved arc with thickness (moon-like shape)\n// ============================================================================\n\nfunction generateCrescent(params: BoomerangParams): GeneratorResult {\n const {\n armLength, // Used as arc radius\n bendAngle, // Used as arc span (degrees, 30-300)\n thickness,\n taper,\n tipRoundness,\n armBalance = 1, // Asymmetric arc thickness along length\n rotation = 0,\n } = params;\n\n const radius = Math.max(20, armLength);\n const arcSpan = Math.max(30, Math.min(300, bendAngle)) * Math.PI / 180;\n const clampedTaper = Math.max(0, Math.min(1, taper));\n const clampedTipRoundness = Math.max(0, Math.min(1, tipRoundness));\n const clampedArmBalance = Math.max(0.5, Math.min(2, armBalance));\n\n const numSamples = 30;\n const startAngle = -arcSpan / 2;\n const endAngle = arcSpan / 2;\n\n // Generate spine points along the arc\n const spine: Point[] = [];\n for (let i = 0; i <= numSamples; i++) {\n const t = i / numSamples;\n const angle = startAngle + (endAngle - startAngle) * t;\n spine.push({\n x: Math.sin(angle) * radius,\n y: -Math.cos(angle) * radius + radius, // Shift so bottom of arc is at y=0\n });\n }\n\n // Calculate thickness at each point\n const minThickness = thickness * clampedTaper;\n\n function getThicknessAtT(t: number): number {\n // Taper at both ends, thickest in middle\n // Apply balance (shift where thickness is max)\n const balanceShift = (t - 0.5) * (clampedArmBalance - 1) * 0.5;\n const adjustedT = Math.max(0, Math.min(1, t + balanceShift));\n const adjustedDist = Math.min(adjustedT, 1 - adjustedT) * 2;\n const adjustedFactor = Math.sin(adjustedDist * Math.PI / 2);\n\n return minThickness + (thickness - minThickness) * adjustedFactor;\n }\n\n // Build inner and outer edges\n const outer: Point[] = [];\n const inner: Point[] = [];\n\n for (let i = 0; i < spine.length; i++) {\n const t = i / (spine.length - 1);\n const point = spine[i];\n const tangent = getSpineTangent(spine, i);\n const normal = { x: -tangent.y, y: tangent.x };\n const halfThick = getThicknessAtT(t) / 2;\n\n outer.push({ x: point.x + normal.x * halfThick, y: point.y + normal.y * halfThick });\n inner.push({ x: point.x - normal.x * halfThick, y: point.y - normal.y * halfThick });\n }\n\n // Build path\n const pathParts: string[] = [];\n\n // Start at first outer point\n pathParts.push(`M ${outer[0].x.toFixed(2)},${outer[0].y.toFixed(2)}`);\n\n // Rounded start tip\n const startTipCurve = clampedTipRoundness * thickness * 0.4;\n const startTangent = getSpineTangent(spine, 0);\n pathParts.push(`Q ${(spine[0].x - startTangent.x * startTipCurve).toFixed(2)},${(spine[0].y - startTangent.y * startTipCurve).toFixed(2)} ${inner[0].x.toFixed(2)},${inner[0].y.toFixed(2)}`);\n\n // Inner edge (start to end)\n pathParts.push(smoothCurveThroughPoints(inner));\n\n // Rounded end tip\n const endTipCurve = clampedTipRoundness * thickness * 0.4;\n const endTangent = getSpineTangent(spine, spine.length - 1);\n pathParts.push(`Q ${(spine[spine.length - 1].x + endTangent.x * endTipCurve).toFixed(2)},${(spine[spine.length - 1].y + endTangent.y * endTipCurve).toFixed(2)} ${outer[outer.length - 1].x.toFixed(2)},${outer[outer.length - 1].y.toFixed(2)}`);\n\n // Outer edge (end back to start)\n const outerReversed = [...outer].reverse();\n pathParts.push(smoothCurveThroughPoints(outerReversed));\n\n pathParts.push('Z');\n\n let path = pathParts.join(' ');\n\n // Calculate bounds\n const allPoints = [...outer, ...inner];\n let minX = Math.min(...allPoints.map(p => p.x));\n let maxX = Math.max(...allPoints.map(p => p.x));\n let minY = Math.min(...allPoints.map(p => p.y));\n let maxY = Math.max(...allPoints.map(p => p.y));\n\n const padding = thickness * 0.3 * clampedTipRoundness;\n minX -= padding;\n maxX += padding;\n minY -= padding;\n maxY += padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n path = normalizePath(path, minX, minY);\n\n if (rotation !== 0) {\n path = rotatePath(path, rotation, width, height);\n }\n\n return addSvgFields({ path, width, height, centerX: width / 2, centerY: height / 2 });\n}\n\n// ============================================================================\n// HORSESHOE STYLE - Two parallel arms connected by curved bottom (U-shape)\n// ============================================================================\n\nfunction generateHorseshoe(params: BoomerangParams): GeneratorResult {\n const {\n armLength, // Length of the vertical arms\n bendAngle, // Spacing between arms (width at top)\n armCurvature, // How curved the bottom connection is\n thickness,\n taper,\n tipRoundness,\n armBalance = 1, // Asymmetric arm lengths\n rotation = 0,\n } = params;\n\n const spacing = Math.max(20, bendAngle);\n const clampedArmCurvature = Math.max(0, Math.min(1, armCurvature));\n const clampedTaper = Math.max(0, Math.min(1, taper));\n const clampedTipRoundness = Math.max(0, Math.min(1, tipRoundness));\n const clampedArmBalance = Math.max(0.5, Math.min(2, armBalance));\n\n const arm1Len = armLength * (2 / (1 + clampedArmBalance));\n const arm2Len = armLength * (2 * clampedArmBalance / (1 + clampedArmBalance));\n\n const halfSpacing = spacing / 2;\n const halfThick = thickness / 2;\n const tipThick = thickness * clampedTaper / 2;\n\n // Use explicit geometry for straight parallel arms\n // Left arm outer/inner x-coordinates\n const leftOuterX = -halfSpacing - halfThick;\n const leftInnerX = -halfSpacing + halfThick;\n // Right arm outer/inner x-coordinates\n const rightInnerX = halfSpacing - halfThick;\n const rightOuterX = halfSpacing + halfThick;\n\n // Arm y-coordinates (with taper at tips)\n const leftTopY = 0;\n const leftBottomY = arm1Len;\n const rightBottomY = arm2Len;\n const rightTopY = 0;\n\n // Bottom curve parameters\n const bottomY = Math.max(arm1Len, arm2Len);\n const curveDepth = halfSpacing * clampedArmCurvature;\n\n // Build path directly with explicit coordinates\n const pathParts: string[] = [];\n\n // Start at left arm outer top (with tip width adjustment)\n const leftTipOuterX = -halfSpacing - tipThick;\n const leftTipInnerX = -halfSpacing + tipThick;\n const rightTipInnerX = halfSpacing - tipThick;\n const rightTipOuterX = halfSpacing + tipThick;\n\n pathParts.push(`M ${leftTipOuterX.toFixed(2)},${leftTopY.toFixed(2)}`);\n\n // Rounded left tip\n if (clampedTipRoundness > 0) {\n const tipCurve = clampedTipRoundness * thickness * 0.3;\n pathParts.push(`Q ${(-halfSpacing).toFixed(2)},${(leftTopY - tipCurve).toFixed(2)} ${leftTipInnerX.toFixed(2)},${leftTopY.toFixed(2)}`);\n } else {\n pathParts.push(`L ${leftTipInnerX.toFixed(2)},${leftTopY.toFixed(2)}`);\n }\n\n // Inner left arm - straight down\n pathParts.push(`L ${leftInnerX.toFixed(2)},${leftBottomY.toFixed(2)}`);\n\n // Inner bottom curve (from left to right)\n if (clampedArmCurvature > 0.1) {\n // Curved bottom using quadratic bezier\n const innerCtrlY = bottomY + curveDepth;\n pathParts.push(`Q ${0},${innerCtrlY.toFixed(2)} ${rightInnerX.toFixed(2)},${rightBottomY.toFixed(2)}`);\n } else {\n // Flat bottom\n pathParts.push(`L ${rightInnerX.toFixed(2)},${rightBottomY.toFixed(2)}`);\n }\n\n // Inner right arm - straight up\n pathParts.push(`L ${rightTipInnerX.toFixed(2)},${rightTopY.toFixed(2)}`);\n\n // Rounded right tip\n if (clampedTipRoundness > 0) {\n const tipCurve = clampedTipRoundness * thickness * 0.3;\n pathParts.push(`Q ${(halfSpacing).toFixed(2)},${(rightTopY - tipCurve).toFixed(2)} ${rightTipOuterX.toFixed(2)},${rightTopY.toFixed(2)}`);\n } else {\n pathParts.push(`L ${rightTipOuterX.toFixed(2)},${rightTopY.toFixed(2)}`);\n }\n\n // Outer right arm - straight down\n pathParts.push(`L ${rightOuterX.toFixed(2)},${rightBottomY.toFixed(2)}`);\n\n // Outer bottom curve (from right to left)\n if (clampedArmCurvature > 0.1) {\n const outerCtrlY = bottomY + curveDepth + thickness;\n pathParts.push(`Q ${0},${outerCtrlY.toFixed(2)} ${leftOuterX.toFixed(2)},${leftBottomY.toFixed(2)}`);\n } else {\n pathParts.push(`L ${leftOuterX.toFixed(2)},${leftBottomY.toFixed(2)}`);\n }\n\n // Outer left arm - straight up back to start\n pathParts.push(`L ${leftTipOuterX.toFixed(2)},${leftTopY.toFixed(2)}`);\n\n pathParts.push('Z');\n\n let path = pathParts.join(' ');\n\n // Calculate bounds from explicit geometry\n const padding = thickness * 0.3;\n let minX = leftOuterX - padding;\n let maxX = rightOuterX + padding;\n let minY = -padding - (clampedTipRoundness * thickness * 0.3);\n let maxY = bottomY + curveDepth + thickness + padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n path = normalizePath(path, minX, minY);\n\n if (rotation !== 0) {\n path = rotatePath(path, rotation, width, height);\n }\n\n return addSvgFields({ path, width, height, centerX: width / 2, centerY: height / 2 });\n}\n\n// ============================================================================\n// CHEVRON STYLE - Solid V-shape with inner cutout (like < or > arrows)\n// ============================================================================\n\nfunction generateChevron(params: BoomerangParams): GeneratorResult {\n const {\n armLength, // Length of the arms\n bendAngle, // Angle of the V (smaller = sharper point)\n thickness, // Controls arm width (proportional)\n taper = 0, // 0 = V with cutout, 1 = solid triangle (no cutout)\n tipRoundness = 0, // Roundness at the tip\n armBalance = 1, // Asymmetric arm lengths\n rotation = 0,\n } = params;\n\n const clampedBendAngle = Math.max(20, Math.min(160, bendAngle));\n const clampedTaper = Math.max(0, Math.min(1, taper));\n const clampedTipRoundness = Math.max(0, Math.min(1, tipRoundness));\n const clampedArmBalance = Math.max(0.5, Math.min(2, armBalance));\n\n // Arm width based on thickness, with minimum for visibility\n const armWidth = Math.max(armLength * 0.15, thickness * 0.5);\n\n // Cutout depth: taper controls this. High taper = no cutout (solid triangle)\n // taper=0: full cutout based on armLength\n // taper=1: no cutout (solid triangle)\n const cutoutDepth = armLength * 0.6 * (1 - clampedTaper);\n\n // Calculate arm lengths\n const arm1Len = armLength * (2 / (1 + clampedArmBalance));\n const arm2Len = armLength * (2 * clampedArmBalance / (1 + clampedArmBalance));\n\n const halfAngle = (clampedBendAngle / 2) * Math.PI / 180;\n\n // Outer points (tip and arm ends)\n const tip = { x: 0, y: 0 };\n const arm1End = { x: -Math.sin(halfAngle) * arm1Len, y: -Math.cos(halfAngle) * arm1Len };\n const arm2End = { x: Math.sin(halfAngle) * arm2Len, y: -Math.cos(halfAngle) * arm2Len };\n\n // Perpendicular directions for arm widths\n const arm1Perp = { x: -Math.cos(halfAngle), y: Math.sin(halfAngle) };\n const arm2Perp = { x: Math.cos(halfAngle), y: Math.sin(halfAngle) };\n\n // Outer corners at arm ends\n const arm1OuterCorner = {\n x: arm1End.x + arm1Perp.x * armWidth / 2,\n y: arm1End.y + arm1Perp.y * armWidth / 2\n };\n const arm1InnerCorner = {\n x: arm1End.x - arm1Perp.x * armWidth / 2,\n y: arm1End.y - arm1Perp.y * armWidth / 2\n };\n const arm2OuterCorner = {\n x: arm2End.x + arm2Perp.x * armWidth / 2,\n y: arm2End.y + arm2Perp.y * armWidth / 2\n };\n const arm2InnerCorner = {\n x: arm2End.x - arm2Perp.x * armWidth / 2,\n y: arm2End.y - arm2Perp.y * armWidth / 2\n };\n\n // Inner cutout point\n const innerTip = {\n x: 0,\n y: -cutoutDepth\n };\n\n // Build path\n const pathParts: string[] = [];\n\n // Start at outer tip\n if (clampedTipRoundness > 0) {\n const roundAmount = clampedTipRoundness * armWidth * 0.3;\n const tipStart = {\n x: tip.x + arm1Perp.x * roundAmount,\n y: tip.y + arm1Perp.y * roundAmount - roundAmount * 0.5\n };\n pathParts.push(`M ${tipStart.x.toFixed(2)},${tipStart.y.toFixed(2)}`);\n const tipEnd = {\n x: tip.x + arm2Perp.x * roundAmount,\n y: tip.y + arm2Perp.y * roundAmount - roundAmount * 0.5\n };\n pathParts.push(`Q ${tip.x.toFixed(2)},${tip.y.toFixed(2)} ${tipEnd.x.toFixed(2)},${tipEnd.y.toFixed(2)}`);\n } else {\n pathParts.push(`M ${tip.x.toFixed(2)},${tip.y.toFixed(2)}`);\n }\n\n // Outer edge to arm2 end\n pathParts.push(`L ${arm2OuterCorner.x.toFixed(2)},${arm2OuterCorner.y.toFixed(2)}`);\n\n // Top of arm2\n pathParts.push(`L ${arm2InnerCorner.x.toFixed(2)},${arm2InnerCorner.y.toFixed(2)}`);\n\n // Inner edge back to center (the cutout) - only if taper < 0.9\n if (cutoutDepth > 5 && clampedTaper < 0.9) {\n pathParts.push(`L ${innerTip.x.toFixed(2)},${innerTip.y.toFixed(2)}`);\n }\n\n // Inner edge to arm1\n pathParts.push(`L ${arm1InnerCorner.x.toFixed(2)},${arm1InnerCorner.y.toFixed(2)}`);\n\n // Top of arm1\n pathParts.push(`L ${arm1OuterCorner.x.toFixed(2)},${arm1OuterCorner.y.toFixed(2)}`);\n\n // Close back to tip\n pathParts.push('Z');\n\n let path = pathParts.join(' ');\n\n // Calculate bounds\n const allPoints = [tip, arm1End, arm2End, arm1OuterCorner, arm1InnerCorner, arm2OuterCorner, arm2InnerCorner];\n if (cutoutDepth > 5 && clampedTaper < 0.9) {\n allPoints.push(innerTip);\n }\n let minX = Math.min(...allPoints.map(p => p.x));\n let maxX = Math.max(...allPoints.map(p => p.x));\n let minY = Math.min(...allPoints.map(p => p.y));\n let maxY = Math.max(...allPoints.map(p => p.y));\n\n const padding = armWidth * 0.2;\n minX -= padding;\n maxX += padding;\n minY -= padding;\n maxY += padding;\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n path = normalizePath(path, minX, minY);\n\n if (rotation !== 0) {\n path = rotatePath(path, rotation, width, height);\n }\n\n return addSvgFields({ path, width, height, centerX: width / 2, centerY: height / 2 });\n}\n\n// ============================================================================\n// Helper types and functions\n// ============================================================================\n\ninterface Point {\n x: number;\n y: number;\n}\n\nfunction generateArmSpine(\n start: Point,\n end: Point,\n direction: Point,\n length: number,\n curvature: number,\n numSamples: number\n): Point[] {\n const points: Point[] = [];\n const perpDir = { x: direction.y, y: -direction.x };\n const bowAmount = length * 0.4 * curvature;\n const midPoint = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\n const controlPoint = {\n x: midPoint.x + perpDir.x * bowAmount,\n y: midPoint.y + perpDir.y * bowAmount\n };\n\n for (let i = 0; i <= numSamples; i++) {\n const t = i / numSamples;\n if (curvature < 0.1) {\n points.push({\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n });\n } else {\n const mt = 1 - t;\n points.push({\n x: mt * mt * start.x + 2 * mt * t * controlPoint.x + t * t * end.x,\n y: mt * mt * start.y + 2 * mt * t * controlPoint.y + t * t * end.y,\n });\n }\n }\n\n return points;\n}\n\nfunction getSpineTangent(spine: Point[], index: number): Point {\n const prev = spine[Math.max(0, index - 1)];\n const next = spine[Math.min(spine.length - 1, index + 1)];\n const dx = next.x - prev.x;\n const dy = next.y - prev.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n return len > 0 ? { x: dx / len, y: dy / len } : { x: 1, y: 0 };\n}\n\nfunction smoothCurveThroughPoints(points: Point[]): string {\n if (points.length < 2) return '';\n\n const parts: string[] = [];\n const tension = 0.3;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n const cp1x = p1.x + (p2.x - p0.x) * tension;\n const cp1y = p1.y + (p2.y - p0.y) * tension;\n const cp2x = p2.x - (p3.x - p1.x) * tension;\n const cp2y = p2.y - (p3.y - p1.y) * tension;\n\n parts.push(`C ${cp1x.toFixed(2)},${cp1y.toFixed(2)} ${cp2x.toFixed(2)},${cp2y.toFixed(2)} ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`);\n }\n\n return parts.join(' ');\n}\n\nfunction normalizePath(path: string, minX: number, minY: number): string {\n return path.replace(\n /([-\\d.]+),([-\\d.]+)/g,\n (_, x, y) => `${(parseFloat(x) - minX).toFixed(2)},${(parseFloat(y) - minY).toFixed(2)}`\n );\n}\n\nfunction rotatePath(path: string, rotation: number, width: number, height: number): string {\n const rad = (rotation * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const cx = width / 2;\n const cy = height / 2;\n\n return path.replace(\n /([-\\d.]+),([-\\d.]+)/g,\n (_, xStr, yStr) => {\n const x = parseFloat(xStr) - cx;\n const y = parseFloat(yStr) - cy;\n const rx = x * cos - y * sin + cx;\n const ry = x * sin + y * cos + cy;\n return `${rx.toFixed(2)},${ry.toFixed(2)}`;\n }\n );\n}\n","// src/generators/curved/blob.ts\n// Irregular organic blob shape using noise-based radius variation\nimport { GeneratorResult, Point } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface BlobParams {\n radius: number; // Base radius\n pointCount: number; // Number of control points (6-24)\n irregularity: number; // How irregular (0 = circle, 1 = very blobby)\n smoothing: number; // Bezier smoothing (0-1)\n seed: number; // Random seed for reproducibility\n}\n\n// Simple seeded random for reproducibility\nfunction seededRandom(seed: number): () => number {\n let s = seed;\n return () => {\n s = (s * 9301 + 49297) % 233280;\n return s / 233280;\n };\n}\n\nexport function blob(params: BlobParams): GeneratorResult {\n const { radius, pointCount, irregularity, smoothing, seed } = params;\n\n const random = seededRandom(seed);\n const points: Point[] = [];\n const angleStep = (Math.PI * 2) / pointCount;\n\n // Generate points with random radius variation\n for (let i = 0; i < pointCount; i++) {\n const angle = i * angleStep;\n const variation = 1 + (random() - 0.5) * irregularity;\n const r = radius * variation;\n\n points.push({\n x: Math.cos(angle) * r + radius,\n y: Math.sin(angle) * r + radius,\n });\n }\n\n // Build smooth bezier path through points\n const path = buildSmoothPath(points, smoothing);\n\n return addSvgFields({\n path,\n width: radius * 2,\n height: radius * 2,\n centerX: radius,\n centerY: radius,\n });\n}\n\nfunction buildSmoothPath(points: Point[], smoothing: number): string {\n if (points.length < 3) return '';\n\n const parts: string[] = [];\n parts.push(`M ${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`);\n\n for (let i = 0; i < points.length; i++) {\n const p0 = points[(i - 1 + points.length) % points.length];\n const p1 = points[i];\n const p2 = points[(i + 1) % points.length];\n const p3 = points[(i + 2) % points.length];\n\n // Calculate control points for smooth curve\n const cp1x = p1.x + (p2.x - p0.x) * smoothing * 0.25;\n const cp1y = p1.y + (p2.y - p0.y) * smoothing * 0.25;\n const cp2x = p2.x - (p3.x - p1.x) * smoothing * 0.25;\n const cp2y = p2.y - (p3.y - p1.y) * smoothing * 0.25;\n\n parts.push(`C ${cp1x.toFixed(2)},${cp1y.toFixed(2)} ${cp2x.toFixed(2)},${cp2y.toFixed(2)} ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`);\n }\n\n parts.push('Z');\n return parts.join(' ');\n}\n","// src/generators/utils/path.ts\nimport { Point } from '../types';\n\nexport function degToRad(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function radToDeg(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n\nexport function polarToCartesian(radius: number, angleDegrees: number): Point {\n const angleRad = degToRad(angleDegrees);\n return {\n x: radius * Math.cos(angleRad),\n y: radius * Math.sin(angleRad),\n };\n}\n\nexport function pointsToPath(points: Point[], closed: boolean = true): string {\n if (points.length === 0) return '';\n\n const [first, ...rest] = points;\n let path = `M ${first.x},${first.y}`;\n\n for (const point of rest) {\n path += ` L ${point.x},${point.y}`;\n }\n\n if (closed) {\n path += ' Z';\n }\n\n return path;\n}\n\nexport function circlePath(cx: number, cy: number, r: number): string {\n return `M ${cx - r},${cy} A ${r},${r} 0 1,0 ${cx + r},${cy} A ${r},${r} 0 1,0 ${cx - r},${cy}`;\n}\n\nexport function ellipsePath(cx: number, cy: number, rx: number, ry: number): string {\n return `M ${cx - rx},${cy} A ${rx},${ry} 0 1,0 ${cx + rx},${cy} A ${rx},${ry} 0 1,0 ${cx - rx},${cy}`;\n}\n\nexport function arcPath(\n cx: number,\n cy: number,\n r: number,\n startAngle: number,\n endAngle: number,\n closed: boolean = false\n): string {\n const start = polarToCartesian(r, startAngle);\n const end = polarToCartesian(r, endAngle);\n\n const largeArc = Math.abs(endAngle - startAngle) > 180 ? 1 : 0;\n const sweep = endAngle > startAngle ? 1 : 0;\n\n let path = `M ${cx + start.x},${cy + start.y} A ${r},${r} 0 ${largeArc},${sweep} ${cx + end.x},${cy + end.y}`;\n\n if (closed) {\n path += ` L ${cx},${cy} Z`;\n }\n\n return path;\n}\n","// src/generators/curved/circle.ts\nimport { GeneratorResult } from '../types';\nimport { circlePath } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface CircleParams {\n radius: number;\n}\n\nexport function circle(params: CircleParams): GeneratorResult {\n const { radius } = params;\n\n return addSvgFields({\n path: circlePath(radius, radius, radius),\n width: radius * 2,\n height: radius * 2,\n centerX: radius,\n centerY: radius,\n });\n}\n","// src/generators/curved/kidney.ts\n// Kidney/bean shape - oval with concave bite on one side\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface KidneyParams {\n width: number; // Overall width\n height: number; // Overall height\n concavityDepth: number; // How deep the bite goes (0-0.5)\n concavityPosition: number; // Where along the side (0-1, 0.5 = center)\n}\n\nexport function kidney(params: KidneyParams): GeneratorResult {\n const { width, height, concavityDepth, concavityPosition } = params;\n\n const hw = width / 2;\n const hh = height / 2;\n\n // Control points for the kidney shape\n // The concavity is on the left side\n const concaveX = width * concavityDepth;\n const concaveY = height * concavityPosition;\n\n // Build with bezier curves\n // Start at top center, go clockwise\n const path = [\n `M ${hw},0`,\n // Top right curve\n `C ${width * 0.8},0 ${width},${height * 0.2} ${width},${hh}`,\n // Bottom right curve\n `C ${width},${height * 0.8} ${width * 0.8},${height} ${hw},${height}`,\n // Bottom left curve (going to concave point)\n `C ${width * 0.2},${height} 0,${height * 0.8} ${concaveX},${concaveY + hh * 0.3}`,\n // The concave bite (curves inward)\n `Q ${concaveX + width * 0.1},${concaveY} ${concaveX},${concaveY - hh * 0.3}`,\n // Top left curve (from concave back to top)\n `C 0,${height * 0.2} ${width * 0.2},0 ${hw},0`,\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: hw,\n centerY: hh,\n });\n}\n","// src/generators/curved/moon.ts\n// Crescent moon shape - outer circle with inner circle cut out (offset)\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface MoonParams {\n outerRadius: number; // Radius of outer circle\n innerRadius: number; // Radius of inner (cutout) circle\n innerOffset: number; // How far the inner circle is offset (0-1, where 0.5 = half offset)\n rotation: number; // Rotation in degrees\n}\n\nexport function moon(params: MoonParams): GeneratorResult {\n const { outerRadius, innerRadius, innerOffset } = params;\n\n const size = outerRadius * 2;\n const center = outerRadius;\n\n // Inner circle is offset to create crescent\n // Offset direction is to the right (positive X)\n const offset = outerRadius * innerOffset;\n\n // For a proper crescent, we need to find where the two circles intersect\n // and draw the outer arc on the left, inner arc on the right\n\n // Calculate intersection points of two circles\n // Circle 1: center at (center, center) with radius outerRadius\n // Circle 2: center at (center + offset, center) with radius innerRadius\n\n // Distance between centers\n const d = offset;\n\n // If circles don't intersect properly, create a simple crescent approximation\n if (d >= outerRadius + innerRadius || d === 0) {\n // Circles don't overlap or are concentric - just draw outer circle\n const path = `M ${center + outerRadius},${center} A ${outerRadius},${outerRadius} 0 1,1 ${center - outerRadius},${center} A ${outerRadius},${outerRadius} 0 1,1 ${center + outerRadius},${center} Z`;\n return addSvgFields({ path, width: size, height: size, centerX: center, centerY: center });\n }\n\n // Calculate intersection Y coordinates\n // Using the formula for circle intersection\n const r1 = outerRadius;\n const r2 = innerRadius;\n\n // x coordinate of intersection line (relative to first circle center)\n const x = (d * d + r1 * r1 - r2 * r2) / (2 * d);\n // y offset from center line\n const y = Math.sqrt(Math.max(0, r1 * r1 - x * x));\n\n // Intersection points\n const ix1 = center + x;\n const iy1 = center - y; // Top intersection\n const iy2 = center + y; // Bottom intersection\n\n // Build crescent path:\n // 1. Start at top intersection\n // 2. Draw outer arc (large arc on left side)\n // 3. Draw inner arc (small arc on right side, reversed)\n const path = [\n `M ${ix1.toFixed(2)},${iy1.toFixed(2)}`,\n // Outer arc from top to bottom (going left/counter-clockwise)\n `A ${r1},${r1} 0 1,0 ${ix1.toFixed(2)},${iy2.toFixed(2)}`,\n // Inner arc from bottom to top (going right/clockwise) - note: arc from inner circle\n `A ${r2},${r2} 0 0,0 ${ix1.toFixed(2)},${iy1.toFixed(2)}`,\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width: size,\n height: size,\n centerX: center,\n centerY: center,\n });\n}\n","// src/generators/curved/oval.ts\nimport { GeneratorResult } from '../types';\nimport { ellipsePath } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface OvalParams {\n width: number;\n height: number;\n}\n\nexport function oval(params: OvalParams): GeneratorResult {\n const { width, height } = params;\n const rx = width / 2;\n const ry = height / 2;\n\n return addSvgFields({\n path: ellipsePath(rx, ry, rx, ry),\n width,\n height,\n centerX: rx,\n centerY: ry,\n });\n}\n","// src/generators/curved/semicircle.ts\n// Arc segment - can be semicircle, quarter circle, or any arc\nimport { GeneratorResult } from '../types';\nimport { degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface SemicircleParams {\n radius: number; // Radius of the arc\n arcAngle: number; // Angle of arc in degrees (180 = semicircle, 90 = quarter)\n rotation: number; // Rotation of the arc\n closed: boolean; // Whether to close back to center (pie slice) or just arc\n}\n\nexport function semicircle(params: SemicircleParams): GeneratorResult {\n const { radius, arcAngle, rotation, closed } = params;\n\n const startAngle = degToRad(rotation - arcAngle / 2);\n const endAngle = degToRad(rotation + arcAngle / 2);\n\n const startX = Math.cos(startAngle) * radius + radius;\n const startY = Math.sin(startAngle) * radius + radius;\n const endX = Math.cos(endAngle) * radius + radius;\n const endY = Math.sin(endAngle) * radius + radius;\n\n // Large arc flag: 1 if arc > 180 degrees\n const largeArc = arcAngle > 180 ? 1 : 0;\n\n let path: string;\n if (closed) {\n // Pie slice: center -> arc start -> arc -> arc end -> center\n path = `M ${radius},${radius} L ${startX},${startY} A ${radius},${radius} 0 ${largeArc},1 ${endX},${endY} Z`;\n } else {\n // Just the arc with straight line closing the chord\n path = `M ${startX},${startY} A ${radius},${radius} 0 ${largeArc},1 ${endX},${endY} Z`;\n }\n\n return addSvgFields({\n path,\n width: radius * 2,\n height: radius * 2,\n centerX: radius,\n centerY: radius,\n });\n}\n","// src/generators/angular/arrow.ts\n// Arrow with head and optional tail\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface ArrowParams {\n length: number; // Total length\n headWidth: number; // Width of arrow head\n headLength: number; // Length of arrow head\n tailWidth: number; // Width of tail (0 = no tail, just triangle)\n direction: 'up' | 'down' | 'left' | 'right';\n}\n\nexport function arrow(params: ArrowParams): GeneratorResult {\n const { length, headWidth, headLength, tailWidth, direction } = params;\n\n // Build arrow pointing right, then we'll describe dimensions based on direction\n let path: string;\n let width: number;\n let height: number;\n\n if (tailWidth <= 0) {\n // Just a triangle (no tail)\n path = buildTriangleArrow(headWidth, headLength, direction);\n if (direction === 'up' || direction === 'down') {\n width = headWidth;\n height = headLength;\n } else {\n width = headLength;\n height = headWidth;\n }\n } else {\n path = buildFullArrow(length, headWidth, headLength, tailWidth, direction);\n if (direction === 'up' || direction === 'down') {\n width = headWidth;\n height = length;\n } else {\n width = length;\n height = headWidth;\n }\n }\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 2,\n centerY: height / 2,\n });\n}\n\nfunction buildTriangleArrow(headW: number, headL: number, dir: string): string {\n const half = headW / 2;\n switch (dir) {\n case 'up':\n return `M ${half},0 L ${headW},${headL} L 0,${headL} Z`;\n case 'down':\n return `M 0,0 L ${headW},0 L ${half},${headL} Z`;\n case 'left':\n return `M 0,${half} L ${headL},0 L ${headL},${headW} Z`;\n case 'right':\n return `M 0,0 L ${headL},${half} L 0,${headW} Z`;\n default:\n return buildTriangleArrow(headW, headL, 'right');\n }\n}\n\nfunction buildFullArrow(len: number, headW: number, headL: number, tailW: number, dir: string): string {\n const halfHead = headW / 2;\n const halfTail = tailW / 2;\n const tailLen = len - headL;\n\n // 7-point arrow shape\n switch (dir) {\n case 'right':\n return `M 0,${halfHead - halfTail} L ${tailLen},${halfHead - halfTail} L ${tailLen},0 L ${len},${halfHead} L ${tailLen},${headW} L ${tailLen},${halfHead + halfTail} L 0,${halfHead + halfTail} Z`;\n case 'left':\n return `M ${len},${halfHead - halfTail} L ${headL},${halfHead - halfTail} L ${headL},0 L 0,${halfHead} L ${headL},${headW} L ${headL},${halfHead + halfTail} L ${len},${halfHead + halfTail} Z`;\n case 'up':\n return `M ${halfHead - halfTail},${len} L ${halfHead - halfTail},${headL} L 0,${headL} L ${halfHead},0 L ${headW},${headL} L ${halfHead + halfTail},${headL} L ${halfHead + halfTail},${len} Z`;\n case 'down':\n return `M ${halfHead - halfTail},0 L ${halfHead + halfTail},0 L ${halfHead + halfTail},${tailLen} L ${headW},${tailLen} L ${halfHead},${len} L 0,${tailLen} L ${halfHead - halfTail},${tailLen} Z`;\n default:\n return buildFullArrow(len, headW, headL, tailW, 'right');\n }\n}\n","// src/generators/angular/bowtie.ts\n// Bowtie shape - two triangles meeting at pinched center\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface BowtieParams {\n width: number; // Overall width\n height: number; // Overall height\n pinchAmount: number; // How pinched the center is (0 = diamond, 1 = hourglass)\n}\n\nexport function bowtie(params: BowtieParams): GeneratorResult {\n const { width, height, pinchAmount } = params;\n\n const halfW = width / 2;\n const halfH = height / 2;\n\n // Center pinch point - how much vertical space at center\n const pinchGap = halfH * (1 - pinchAmount);\n\n // 6 points forming the bowtie\n // Left point, top-center, right-top, right point, bottom-center, right-bottom\n const path = [\n `M 0,${halfH}`, // Left point (middle)\n `L ${halfW},${halfH - pinchGap}`, // Top of pinch\n `L ${width},0`, // Top right corner\n `L ${width},${height}`, // Bottom right corner\n `L ${halfW},${halfH + pinchGap}`, // Bottom of pinch\n `L 0,${halfH}`, // Back to left (close)\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: halfW,\n centerY: halfH,\n });\n}\n","// src/generators/angular/chevron.ts\n// V-shape or caret, can be filled or outline-style\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface ChevronParams {\n width: number; // Overall width\n height: number; // Overall height\n thickness: number; // Arm thickness (0 = hairline/outline style)\n angle: number; // V angle in degrees (60-150, 90 = right angle)\n direction: 'up' | 'down' | 'left' | 'right';\n}\n\nexport function chevron(params: ChevronParams): GeneratorResult {\n const { width, height, thickness, direction } = params;\n\n let path: string;\n\n if (thickness <= 0) {\n // Simple V-line (3 points)\n path = buildSimpleChevron(width, height, direction);\n } else {\n // Thick chevron (6 points forming the outline)\n path = buildThickChevron(width, height, thickness, direction);\n }\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 2,\n centerY: height / 2,\n });\n}\n\nfunction buildSimpleChevron(w: number, h: number, dir: string): string {\n switch (dir) {\n case 'up':\n return `M 0,${h} L ${w / 2},0 L ${w},${h}`;\n case 'down':\n return `M 0,0 L ${w / 2},${h} L ${w},0`;\n case 'left':\n return `M ${w},0 L 0,${h / 2} L ${w},${h}`;\n case 'right':\n return `M 0,0 L ${w},${h / 2} L 0,${h}`;\n default:\n return `M 0,${h} L ${w / 2},0 L ${w},${h}`;\n }\n}\n\nfunction buildThickChevron(w: number, h: number, t: number, dir: string): string {\n // Thick chevron has 6 vertices forming the arrow shape\n const halfW = w / 2;\n\n switch (dir) {\n case 'up':\n return `M 0,${h} L ${halfW},${t} L ${w},${h} L ${w - t},${h} L ${halfW},${t * 2} L ${t},${h} Z`;\n case 'down':\n return `M 0,0 L ${t},0 L ${halfW},${h - t * 2} L ${w - t},0 L ${w},0 L ${halfW},${h} Z`;\n case 'left':\n return `M ${w},0 L ${w},${t} L ${t * 2},${h / 2} L ${w},${h - t} L ${w},${h} L 0,${h / 2} Z`;\n case 'right':\n return `M 0,0 L ${w},${h / 2} L 0,${h} L 0,${h - t} L ${w - t * 2},${h / 2} L 0,${t} Z`;\n default:\n return buildThickChevron(w, h, t, 'up');\n }\n}\n","// src/generators/angular/cross.ts\n// Plus/cross shape\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface CrossParams {\n size: number; // Overall size (width = height)\n armWidth: number; // Width of the arms\n armRatio: number; // Ratio of arm length to total size (0.5 = arms to edge)\n}\n\nexport function cross(params: CrossParams): GeneratorResult {\n const { size, armWidth, armRatio } = params;\n\n const halfSize = size / 2;\n const halfArm = armWidth / 2;\n const armLength = halfSize * armRatio;\n\n // 12 point cross shape (going clockwise from top)\n const path = [\n // Top arm\n `M ${halfSize - halfArm},${halfSize - armLength}`,\n `L ${halfSize + halfArm},${halfSize - armLength}`,\n // Top right corner to right arm\n `L ${halfSize + halfArm},${halfSize - halfArm}`,\n `L ${halfSize + armLength},${halfSize - halfArm}`,\n // Right arm\n `L ${halfSize + armLength},${halfSize + halfArm}`,\n // Bottom right corner\n `L ${halfSize + halfArm},${halfSize + halfArm}`,\n // Bottom arm\n `L ${halfSize + halfArm},${halfSize + armLength}`,\n `L ${halfSize - halfArm},${halfSize + armLength}`,\n // Bottom left corner\n `L ${halfSize - halfArm},${halfSize + halfArm}`,\n // Left arm\n `L ${halfSize - armLength},${halfSize + halfArm}`,\n `L ${halfSize - armLength},${halfSize - halfArm}`,\n // Top left corner back to start\n `L ${halfSize - halfArm},${halfSize - halfArm}`,\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width: size,\n height: size,\n centerX: halfSize,\n centerY: halfSize,\n });\n}\n","// src/generators/angular/cursor.ts\n// Mouse pointer/cursor shape\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface CursorParams {\n width: number; // Overall width\n height: number; // Overall height\n notchDepth: number; // How deep the bottom notch (0 = triangle, 0.5 = typical cursor)\n notchPosition: number; // Where the notch is (0.3 = typical cursor position)\n tilt: number; // Rotation/tilt in degrees\n}\n\nexport function cursor(params: CursorParams): GeneratorResult {\n const { width, height } = params;\n\n // Classic cursor shape: triangle with a notch at bottom\n // Top point, right edge down, notch inward, continue to bottom-left, back to top\n\n // 5 point cursor shape\n const path = [\n `M 0,0`, // Top point\n `L ${width},${height * 0.65}`, // Right side\n `L ${width * 0.5},${height * 0.55}`, // Notch point (inward)\n `L ${width * 0.35},${height}`, // Bottom right of stem\n `L 0,${height * 0.75}`, // Left edge\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 3,\n centerY: height / 2,\n });\n}\n","import { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface DiamondParams {\n width: number;\n height: number;\n /** How convex/bulging the sides are. 0 = straight lines (rhombus), 1 = maximum bulge */\n bulge: number;\n /** Asymmetry factor for organic variation. 0 = symmetric, positive = right side bulges more */\n asymmetry?: number;\n}\n\n/**\n * Generates a curved lens/eye/almond shape - the authentic MCM \"diamond\"\n *\n * Unlike a geometric rhombus, MCM diamonds have:\n * - Pointed ends at top and bottom\n * - Curved sides that bulge outward (convex)\n * - Soft, organic feel\n *\n * Uses cubic bezier curves for all edges.\n */\nexport function diamond(params: DiamondParams): GeneratorResult {\n const { width, height, bulge, asymmetry = 0 } = params;\n\n // Clamp bulge to valid range\n const b = Math.max(0, Math.min(1, bulge));\n const asym = Math.max(-0.5, Math.min(0.5, asymmetry));\n\n const cx = width / 2;\n const cy = height / 2;\n\n // Key points: top, bottom, and the widest points on left/right\n const top = { x: cx, y: 0 };\n const bottom = { x: cx, y: height };\n const left = { x: 0, y: cy };\n const right = { x: width, y: cy };\n\n // Control point offset determines the bulge amount\n // At bulge=0, control points align with straight line (no curve)\n // At bulge=1, control points push out significantly for maximum convexity\n\n // Vertical control offset: how far control points are from endpoints vertically\n // This affects the \"sharpness\" of the points\n const verticalFactor = 0.4 + (b * 0.15); // Range: 0.4 to 0.55 of half-height\n const vOffset = cy * verticalFactor;\n\n // Horizontal control offset: how far control points bulge outward\n // This is the key parameter for the lens shape\n const horizontalBulge = b * 0.35; // Max 35% additional width per side\n\n // Apply asymmetry to left/right bulge\n const leftBulge = horizontalBulge * (1 - asym);\n const rightBulge = horizontalBulge * (1 + asym);\n\n // Calculate control points for each curve\n // Each side has two control points (cubic bezier)\n\n // Right side: top to right to bottom\n // Top-right curve (from top going to right)\n const tr1 = { x: cx + (cx * 0.2), y: vOffset }; // First control: slightly right of center\n const tr2 = { x: width + (width * rightBulge), y: cy - vOffset }; // Second control: bulges right\n\n // Right-bottom curve (from right going to bottom)\n const rb1 = { x: width + (width * rightBulge), y: cy + vOffset }; // First control: bulges right\n const rb2 = { x: cx + (cx * 0.2), y: height - vOffset }; // Second control: slightly right of center\n\n // Left side: bottom to left to top\n // Bottom-left curve (from bottom going to left)\n const bl1 = { x: cx - (cx * 0.2), y: height - vOffset }; // First control: slightly left of center\n const bl2 = { x: -(width * leftBulge), y: cy + vOffset }; // Second control: bulges left\n\n // Left-top curve (from left going to top)\n const lt1 = { x: -(width * leftBulge), y: cy - vOffset }; // First control: bulges left\n const lt2 = { x: cx - (cx * 0.2), y: vOffset }; // Second control: slightly left of center\n\n // Build the path using cubic bezier curves\n // M = move to, C = cubic bezier (control1, control2, endpoint)\n const path = [\n `M ${top.x},${top.y}`,\n // Top to right (upper-right curve)\n `C ${tr1.x},${tr1.y} ${tr2.x},${tr2.y} ${right.x},${right.y}`,\n // Right to bottom (lower-right curve)\n `C ${rb1.x},${rb1.y} ${rb2.x},${rb2.y} ${bottom.x},${bottom.y}`,\n // Bottom to left (lower-left curve)\n `C ${bl1.x},${bl1.y} ${bl2.x},${bl2.y} ${left.x},${left.y}`,\n // Left to top (upper-left curve)\n `C ${lt1.x},${lt1.y} ${lt2.x},${lt2.y} ${top.x},${top.y}`,\n 'Z'\n ].join(' ');\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: cx,\n centerY: cy,\n });\n}\n","// src/generators/angular/polygon.ts\n// Regular polygon generator (covers hexagon, octagon, pentagon, etc.)\nimport { GeneratorResult, Point } from '../types';\nimport { pointsToPath, degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface PolygonParams {\n sides: number; // Number of sides (3-12)\n radius: number; // Distance from center to vertices\n rotation: number; // Rotation in degrees\n}\n\nexport function polygon(params: PolygonParams): GeneratorResult {\n const { sides, radius, rotation } = params;\n\n const vertices: Point[] = [];\n const angleStep = 360 / sides;\n const rotationOffset = rotation - 90; // Start from top\n\n for (let i = 0; i < sides; i++) {\n const angle = degToRad(i * angleStep + rotationOffset);\n vertices.push({\n x: Math.cos(angle) * radius + radius,\n y: Math.sin(angle) * radius + radius,\n });\n }\n\n return addSvgFields({\n path: pointsToPath(vertices, true),\n width: radius * 2,\n height: radius * 2,\n centerX: radius,\n centerY: radius,\n });\n}\n\n// Convenience aliases\nexport function hexagon(params: { radius: number; rotation: number }): GeneratorResult {\n return polygon({ sides: 6, ...params });\n}\n\nexport function pentagon(params: { radius: number; rotation: number }): GeneratorResult {\n return polygon({ sides: 5, ...params });\n}\n\nexport function octagon(params: { radius: number; rotation: number }): GeneratorResult {\n return polygon({ sides: 8, ...params });\n}\n","import { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface RectangleParams {\n width: number;\n height: number;\n cornerRadius: number;\n}\n\nexport function rectangle(params: RectangleParams): GeneratorResult {\n const { width, height, cornerRadius } = params;\n const r = Math.min(cornerRadius, width / 2, height / 2);\n\n let path: string;\n\n if (r === 0) {\n path = `M 0,0 L ${width},0 L ${width},${height} L 0,${height} Z`;\n } else {\n path = `M ${r},0 L ${width - r},0 A ${r},${r} 0 0,1 ${width},${r} L ${width},${height - r} A ${r},${r} 0 0,1 ${width - r},${height} L ${r},${height} A ${r},${r} 0 0,1 0,${height - r} L 0,${r} A ${r},${r} 0 0,1 ${r},0 Z`;\n }\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 2,\n centerY: height / 2,\n });\n}\n","// src/generators/angular/swallowtail.ts\n// Swallowtail flag shape - two points with V notch between\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface SwallowtailParams {\n width: number; // Overall width\n height: number; // Overall height\n notchDepth: number; // How deep the notch goes (0-0.8)\n notchCurvature: number; // 0 = sharp V, 1 = curved notch\n}\n\nexport function swallowtail(params: SwallowtailParams): GeneratorResult {\n const { width, height, notchDepth, notchCurvature } = params;\n\n const notchX = width * (1 - notchDepth);\n const halfHeight = height / 2;\n\n let path: string;\n\n if (notchCurvature < 0.2) {\n // Sharp V notch\n path = `M 0,0 L ${width},0 L ${notchX},${halfHeight} L ${width},${height} L 0,${height} Z`;\n } else {\n // Curved notch using quadratic bezier\n const cpX = notchX + (width - notchX) * notchCurvature * 0.5;\n path = `M 0,0 L ${width},0 Q ${cpX},${halfHeight} ${width},${height} L 0,${height} Z`;\n }\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 2,\n centerY: halfHeight,\n });\n}\n","// src/generators/angular/triangle.ts\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface TriangleParams {\n width: number; // Base width\n height: number; // Height from base to apex\n skew: number; // Apex horizontal offset (-1 to 1, 0 = centered/isoceles)\n}\n\nexport function triangle(params: TriangleParams): GeneratorResult {\n const { width, height, skew } = params;\n\n // Three vertices: bottom-left, bottom-right, apex\n const halfWidth = width / 2;\n const apexX = halfWidth + (skew * halfWidth); // skew moves apex left/right\n\n const path = `M 0,${height} L ${width},${height} L ${apexX},0 Z`;\n\n return addSvgFields({\n path,\n width,\n height,\n centerX: width / 2,\n centerY: height / 2,\n });\n}\n","// src/generators/radial/atomic.ts\n// Atomic/orbit symbol - ellipses passing through center (like atom orbits)\nimport { GeneratorResult } from '../types';\nimport { degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface AtomicParams {\n orbitCount: number; // Number of orbits (1-4)\n orbitRadius: number; // Radius of orbits\n orbitEccentricity: number; // How elliptical (0 = circle, 0.8 = very elliptical)\n nucleusSize: number; // Size of center nucleus (0 = none)\n orbitThickness: number; // Line thickness of orbits (used for filled orbit bands)\n}\n\nexport function atomic(params: AtomicParams): GeneratorResult {\n const { orbitCount, orbitRadius, orbitEccentricity, nucleusSize, orbitThickness } = params;\n\n const size = orbitRadius * 2;\n const center = orbitRadius;\n\n // Semi-major and semi-minor axes\n const a = orbitRadius; // semi-major\n const b = orbitRadius * (1 - orbitEccentricity); // semi-minor\n\n const parts: string[] = [];\n\n // Add nucleus (circle at center) if size > 0\n if (nucleusSize > 0) {\n parts.push(`M ${center + nucleusSize},${center} A ${nucleusSize},${nucleusSize} 0 1,1 ${center - nucleusSize},${center} A ${nucleusSize},${nucleusSize} 0 1,1 ${center + nucleusSize},${center}`);\n }\n\n // Add orbits at different rotations\n // For a classic atomic symbol, orbits are evenly distributed\n const angleStep = 180 / orbitCount;\n\n for (let i = 0; i < orbitCount; i++) {\n const rotation = i * angleStep;\n const rotRad = degToRad(rotation);\n\n // Create ellipse points and rotate them\n // We'll create a filled ellipse band (thick orbit)\n const innerA = Math.max(1, a - orbitThickness);\n const innerB = Math.max(1, b - orbitThickness);\n\n // For a filled orbit band, we need outer ellipse + inner ellipse (reversed)\n // Outer ellipse path\n const outerPath = createRotatedEllipse(center, center, a, b, rotRad);\n\n if (orbitThickness > 0) {\n // Inner ellipse (for hollow orbit band)\n const innerPath = createRotatedEllipse(center, center, innerA, innerB, rotRad, true);\n parts.push(outerPath + ' ' + innerPath);\n } else {\n // Just outer ellipse\n parts.push(outerPath);\n }\n }\n\n return addSvgFields({\n path: parts.join(' '),\n width: size,\n height: size,\n centerX: center,\n centerY: center,\n });\n}\n\n// Create an ellipse path rotated by angle (in radians)\nfunction createRotatedEllipse(cx: number, cy: number, a: number, b: number, rotation: number, reverse: boolean = false): string {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n\n // Sample points around ellipse and rotate\n const points: { x: number; y: number }[] = [];\n const segments = 36;\n\n for (let i = 0; i < segments; i++) {\n const t = (i / segments) * 2 * Math.PI;\n // Ellipse point before rotation\n const ex = a * Math.cos(t);\n const ey = b * Math.sin(t);\n // Rotate point\n const rx = ex * cos - ey * sin;\n const ry = ex * sin + ey * cos;\n points.push({ x: cx + rx, y: cy + ry });\n }\n\n if (reverse) {\n points.reverse();\n }\n\n // Build path\n let path = `M ${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;\n for (let i = 1; i < points.length; i++) {\n path += ` L ${points[i].x.toFixed(2)},${points[i].y.toFixed(2)}`;\n }\n path += ' Z';\n\n return path;\n}\n","// src/generators/radial/flower.ts\n// Flower with petals around a center\nimport { GeneratorResult } from '../types';\nimport { degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface FlowerParams {\n petalCount: number; // Number of petals (3-12)\n petalLength: number; // Length of petals from center\n petalWidth: number; // Width of petals at widest\n centerSize: number; // Size of flower center\n petalPointedness: number; // 0 = rounded, 1 = pointed\n}\n\nexport function flower(params: FlowerParams): GeneratorResult {\n const { petalCount, petalLength, petalWidth, centerSize, petalPointedness } = params;\n\n const size = (centerSize + petalLength) * 2;\n const center = size / 2;\n\n const parts: string[] = [];\n\n // Draw petals\n const angleStep = 360 / petalCount;\n for (let i = 0; i < petalCount; i++) {\n const angle = i * angleStep - 90; // Start from top\n const angleRad = degToRad(angle);\n const halfWidth = petalWidth / 2;\n\n // Petal base points (at center circle edge)\n const baseAngle1 = degToRad(angle - 15);\n const baseAngle2 = degToRad(angle + 15);\n const base1X = center + Math.cos(baseAngle1) * centerSize;\n const base1Y = center + Math.sin(baseAngle1) * centerSize;\n const base2X = center + Math.cos(baseAngle2) * centerSize;\n const base2Y = center + Math.sin(baseAngle2) * centerSize;\n\n // Petal tip\n const tipX = center + Math.cos(angleRad) * (centerSize + petalLength);\n const tipY = center + Math.sin(angleRad) * (centerSize + petalLength);\n\n // Control points for petal curves\n const perpAngle = angleRad + Math.PI / 2;\n const midRadius = centerSize + petalLength * 0.5;\n const cp1X = center + Math.cos(angleRad) * midRadius - Math.cos(perpAngle) * halfWidth;\n const cp1Y = center + Math.sin(angleRad) * midRadius - Math.sin(perpAngle) * halfWidth;\n const cp2X = center + Math.cos(angleRad) * midRadius + Math.cos(perpAngle) * halfWidth;\n const cp2Y = center + Math.sin(angleRad) * midRadius + Math.sin(perpAngle) * halfWidth;\n\n // Draw petal with quadratic curves\n if (petalPointedness > 0.5) {\n // Pointed petal\n parts.push(`M ${base1X.toFixed(2)},${base1Y.toFixed(2)}`);\n parts.push(`Q ${cp1X.toFixed(2)},${cp1Y.toFixed(2)} ${tipX.toFixed(2)},${tipY.toFixed(2)}`);\n parts.push(`Q ${cp2X.toFixed(2)},${cp2Y.toFixed(2)} ${base2X.toFixed(2)},${base2Y.toFixed(2)}`);\n parts.push('Z');\n } else {\n // Rounded petal (ellipse-ish)\n parts.push(`M ${base1X.toFixed(2)},${base1Y.toFixed(2)}`);\n parts.push(`C ${cp1X.toFixed(2)},${cp1Y.toFixed(2)} ${tipX.toFixed(2)},${tipY - halfWidth * 0.5} ${tipX.toFixed(2)},${tipY.toFixed(2)}`);\n parts.push(`C ${tipX.toFixed(2)},${tipY + halfWidth * 0.5} ${cp2X.toFixed(2)},${cp2Y.toFixed(2)} ${base2X.toFixed(2)},${base2Y.toFixed(2)}`);\n parts.push('Z');\n }\n }\n\n // Draw center circle\n if (centerSize > 0) {\n parts.push(`M ${center + centerSize},${center}`);\n parts.push(`A ${centerSize},${centerSize} 0 1,1 ${center - centerSize},${center}`);\n parts.push(`A ${centerSize},${centerSize} 0 1,1 ${center + centerSize},${center}`);\n }\n\n return addSvgFields({\n path: parts.join(' '),\n width: size,\n height: size,\n centerX: center,\n centerY: center,\n });\n}\n","// src/generators/radial/spiral.ts\n// Archimedean spiral\nimport { GeneratorResult } from '../types';\nimport { degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface SpiralParams {\n turns: number; // Number of turns (0.5 - 5)\n startRadius: number; // Starting radius\n expansionRate: number; // How fast it expands per turn\n thickness: number; // Line thickness (0 = hairline)\n direction: 1 | -1; // 1 = clockwise, -1 = counter-clockwise\n}\n\nexport function spiral(params: SpiralParams): GeneratorResult {\n const { turns, startRadius, expansionRate, thickness, direction } = params;\n\n const totalAngle = turns * 360;\n const steps = Math.ceil(totalAngle / 5); // Point every 5 degrees\n const endRadius = startRadius + turns * expansionRate;\n const size = (endRadius + thickness) * 2;\n const center = size / 2;\n\n const points: { x: number; y: number }[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * totalAngle * direction;\n const progress = i / steps;\n const radius = startRadius + progress * turns * expansionRate;\n\n const rad = degToRad(angle - 90);\n points.push({\n x: center + Math.cos(rad) * radius,\n y: center + Math.sin(rad) * radius,\n });\n }\n\n let path: string;\n\n if (thickness <= 0) {\n // Simple line spiral\n path = points.map((p, i) =>\n (i === 0 ? 'M' : 'L') + ` ${p.x.toFixed(2)},${p.y.toFixed(2)}`\n ).join(' ');\n } else {\n // Thick spiral - create inner and outer edges\n const innerPoints: { x: number; y: number }[] = [];\n const outerPoints: { x: number; y: number }[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * totalAngle * direction;\n const progress = i / steps;\n const radius = startRadius + progress * turns * expansionRate;\n const halfThick = thickness / 2;\n\n const rad = degToRad(angle - 90);\n innerPoints.push({\n x: center + Math.cos(rad) * (radius - halfThick),\n y: center + Math.sin(rad) * (radius - halfThick),\n });\n outerPoints.push({\n x: center + Math.cos(rad) * (radius + halfThick),\n y: center + Math.sin(rad) * (radius + halfThick),\n });\n }\n\n // Build path: outer edge forward, inner edge backward\n const outerPath = outerPoints.map((p, i) =>\n (i === 0 ? 'M' : 'L') + ` ${p.x.toFixed(2)},${p.y.toFixed(2)}`\n ).join(' ');\n\n const innerPath = innerPoints.reverse().map((p) =>\n `L ${p.x.toFixed(2)},${p.y.toFixed(2)}`\n ).join(' ');\n\n path = outerPath + ' ' + innerPath + ' Z';\n }\n\n return addSvgFields({\n path,\n width: size,\n height: size,\n centerX: center,\n centerY: center,\n });\n}\n","// src/generators/radial/star.ts\nimport { GeneratorResult, Point } from '../types';\nimport { pointsToPath, degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface StarParams {\n points: number; // Number of star points (3-24)\n innerRadius: number; // Inner radius (distance to valleys)\n outerRadius: number; // Outer radius (distance to tips)\n rotation: number; // Rotation in degrees\n}\n\nexport function star(params: StarParams): GeneratorResult {\n const { points, rotation } = params;\n // Ensure inner < outer to prevent clipping\n const maxRadius = Math.max(params.innerRadius, params.outerRadius);\n const minRadius = Math.min(params.innerRadius, params.outerRadius);\n const outerRadius = maxRadius;\n const innerRadius = minRadius;\n\n const vertices: Point[] = [];\n const totalVertices = points * 2;\n const angleStep = 360 / totalVertices;\n const rotationRad = degToRad(rotation - 90); // Start from top\n\n for (let i = 0; i < totalVertices; i++) {\n const angle = degToRad(i * angleStep) + rotationRad;\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\n\n vertices.push({\n x: Math.cos(angle) * radius,\n y: Math.sin(angle) * radius,\n });\n }\n\n // Offset to center in bounding box\n const offset = outerRadius;\n const offsetVertices = vertices.map((v) => ({\n x: v.x + offset,\n y: v.y + offset,\n }));\n\n return addSvgFields({\n path: pointsToPath(offsetVertices, true),\n width: outerRadius * 2,\n height: outerRadius * 2,\n centerX: offset,\n centerY: offset,\n });\n}\n","// src/generators/radial/starburst.ts\nimport { GeneratorResult, Point } from '../types';\nimport { pointsToPath, degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface StarburstParams {\n rayCount: number; // Number of rays (4-48)\n innerRadius: number; // Where rays start\n outerRadius: number; // Where rays end\n rayThickness: number; // Width of ray at base\n taper: number; // 0 = rectangle, 1 = triangle (pointed)\n}\n\nexport function starburst(params: StarburstParams): GeneratorResult {\n const { rayCount, rayThickness, taper } = params;\n // Ensure inner < outer\n const outerRadius = Math.max(params.innerRadius, params.outerRadius);\n const innerRadius = Math.min(params.innerRadius, params.outerRadius);\n\n let fullPath = '';\n const angleStep = 360 / rayCount;\n // Account for ray thickness in bounding box\n const effectiveRadius = outerRadius + rayThickness / 2;\n const offset = effectiveRadius;\n\n for (let i = 0; i < rayCount; i++) {\n const angle = degToRad(i * angleStep - 90); // Start from top\n const halfThicknessInner = rayThickness / 2;\n const halfThicknessOuter = halfThicknessInner * (1 - taper);\n\n const perpAngle = angle + Math.PI / 2;\n\n // Inner edge points (base of ray)\n const innerLeft: Point = {\n x: Math.cos(angle) * innerRadius + Math.cos(perpAngle) * halfThicknessInner + offset,\n y: Math.sin(angle) * innerRadius + Math.sin(perpAngle) * halfThicknessInner + offset,\n };\n const innerRight: Point = {\n x: Math.cos(angle) * innerRadius - Math.cos(perpAngle) * halfThicknessInner + offset,\n y: Math.sin(angle) * innerRadius - Math.sin(perpAngle) * halfThicknessInner + offset,\n };\n\n // Outer edge points (tip of ray)\n const outerLeft: Point = {\n x: Math.cos(angle) * outerRadius + Math.cos(perpAngle) * halfThicknessOuter + offset,\n y: Math.sin(angle) * outerRadius + Math.sin(perpAngle) * halfThicknessOuter + offset,\n };\n const outerRight: Point = {\n x: Math.cos(angle) * outerRadius - Math.cos(perpAngle) * halfThicknessOuter + offset,\n y: Math.sin(angle) * outerRadius - Math.sin(perpAngle) * halfThicknessOuter + offset,\n };\n\n fullPath += pointsToPath([innerLeft, outerLeft, outerRight, innerRight], true) + ' ';\n }\n\n return addSvgFields({\n path: fullPath.trim(),\n width: effectiveRadius * 2,\n height: effectiveRadius * 2,\n centerX: offset,\n centerY: offset,\n });\n}\n","// src/generators/radial/sun.ts\n// Sun - disc with rays radiating outward\nimport { GeneratorResult } from '../types';\nimport { degToRad } from '../utils/path';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface SunParams {\n discRadius: number; // Radius of center disc\n rayCount: number; // Number of rays (8-32)\n rayLength: number; // Length of rays beyond disc\n rayWidth: number; // Width of rays at base\n rayTaper: number; // How much rays taper (0 = same width, 1 = point)\n}\n\nexport function sun(params: SunParams): GeneratorResult {\n const { discRadius, rayCount, rayLength, rayWidth, rayTaper } = params;\n\n const totalRadius = discRadius + rayLength;\n // Account for ray width extending perpendicular to tip\n const effectiveRadius = totalRadius + rayWidth / 2;\n const size = effectiveRadius * 2;\n const center = size / 2;\n\n const parts: string[] = [];\n\n // Draw rays\n const angleStep = 360 / rayCount;\n for (let i = 0; i < rayCount; i++) {\n const angle = i * angleStep - 90;\n const angleRad = degToRad(angle);\n\n const halfBase = rayWidth / 2;\n const halfTip = halfBase * (1 - rayTaper);\n\n // Perpendicular angle for width offset\n const perpRad = angleRad + Math.PI / 2;\n\n // Base points (at disc edge)\n const baseX = center + Math.cos(angleRad) * discRadius;\n const baseY = center + Math.sin(angleRad) * discRadius;\n\n // Tip point\n const tipX = center + Math.cos(angleRad) * totalRadius;\n const tipY = center + Math.sin(angleRad) * totalRadius;\n\n // Base left/right\n const baseLeftX = baseX + Math.cos(perpRad) * halfBase;\n const baseLeftY = baseY + Math.sin(perpRad) * halfBase;\n const baseRightX = baseX - Math.cos(perpRad) * halfBase;\n const baseRightY = baseY - Math.sin(perpRad) * halfBase;\n\n // Tip left/right (if tapered)\n const tipLeftX = tipX + Math.cos(perpRad) * halfTip;\n const tipLeftY = tipY + Math.sin(perpRad) * halfTip;\n const tipRightX = tipX - Math.cos(perpRad) * halfTip;\n const tipRightY = tipY - Math.sin(perpRad) * halfTip;\n\n if (rayTaper >= 0.95) {\n // Triangle ray (point)\n parts.push(`M ${baseLeftX.toFixed(2)},${baseLeftY.toFixed(2)} L ${tipX.toFixed(2)},${tipY.toFixed(2)} L ${baseRightX.toFixed(2)},${baseRightY.toFixed(2)} Z`);\n } else {\n // Trapezoid ray\n parts.push(`M ${baseLeftX.toFixed(2)},${baseLeftY.toFixed(2)} L ${tipLeftX.toFixed(2)},${tipLeftY.toFixed(2)} L ${tipRightX.toFixed(2)},${tipRightY.toFixed(2)} L ${baseRightX.toFixed(2)},${baseRightY.toFixed(2)} Z`);\n }\n }\n\n // Draw center disc\n parts.push(`M ${center + discRadius},${center} A ${discRadius},${discRadius} 0 1,1 ${center - discRadius},${center} A ${discRadius},${discRadius} 0 1,1 ${center + discRadius},${center}`);\n\n return addSvgFields({\n path: parts.join(' '),\n width: size,\n height: size,\n centerX: center,\n centerY: center,\n });\n}\n","// src/generators/silhouettes/bird.ts\n// Bird silhouettes using VTracer-traced paths from reference images\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface BirdParams {\n size: number;\n style: 'flying' | 'perched' | 'simple';\n}\n\n// Traced paths from reference SVGs - much higher fidelity than hand-coded\n// Source: /output/moodboard_extraction/preliminary/by_category/bird/svgs/\nconst TRACED_PATHS = {\n // From 0022_004.svg - Bird in flight with spread wings (166x104 viewBox)\n flying: {\n path: `M0 0 C3.62 -0.06 7.25 -0.09 10.88 -0.13 C11.89 -0.14 12.9 -0.16 13.95 -0.18 C27.1 -0.26 39.18 2.37 49.25 11.44 C54.47 17.05 57.66 24.18 61 31 C63.61 29.69 63.7 28.62 64.75 25.94 C69.27 15.5 76.68 8 87.25 3.63 C92.1 1.8 96.68 0.88 101.87 0.87 C102.8 0.87 103.74 0.86 104.71 0.86 C106.21 0.86 106.21 0.86 107.73 0.87 C109.29 0.87 109.29 0.87 110.87 0.86 C113.05 0.86 115.22 0.87 117.4 0.87 C120.75 0.88 124.1 0.87 127.45 0.86 C129.57 0.86 131.68 0.87 133.8 0.87 C135.31 0.86 135.31 0.86 136.85 0.86 C138.24 0.87 138.24 0.87 139.65 0.87 C140.88 0.87 140.88 0.87 142.13 0.87 C144 1 144 1 145 2 C145.11 13.16 140.33 22.51 132.81 30.56 C129 34.28 124.75 36.66 120 39 C119.25 39.38 118.5 39.75 117.73 40.14 C117.16 40.42 116.59 40.71 116 41 C118.44 43.87 120.87 45.52 124.19 47.19 C134.06 52.52 140.24 60.7 143.74 71.23 C144.73 74.83 145.34 78.27 145 82 C143.44 83.56 141.94 83.15 139.78 83.18 C138.88 83.19 137.98 83.2 137.05 83.22 C135.58 83.23 135.58 83.23 134.08 83.24 C133.07 83.25 132.06 83.25 131.01 83.26 C128.86 83.28 126.71 83.29 124.56 83.3 C121.31 83.31 118.05 83.36 114.8 83.4 C98.5 83.52 85.63 82.43 73 71 C70.73 68.48 68.83 65.86 67 63 C66.59 62.39 66.18 61.79 65.75 61.16 C64.82 59.79 63.91 58.4 63 57 C62.01 57.5 62.01 57.5 61 58 C61.01 58.72 61.01 59.44 61.02 60.19 C61.04 63.44 61.05 66.69 61.06 69.94 C61.07 71.07 61.08 72.21 61.09 73.38 C61.09 74.46 61.09 75.54 61.1 76.65 C61.1 77.65 61.11 78.65 61.11 79.68 C61 82 61 82 60 83 C49.72 83.86 40.78 79.2 32.94 72.88 C24.73 65.46 20.88 55.86 20 45 C19.95 42.8 19.91 40.61 19.89 38.41 C19.88 37.21 19.86 36.02 19.85 34.78 C19.82 32.31 19.82 29.83 19.83 27.35 C19.69 19.45 18.66 13.79 13 8 C8.7 5.09 3.96 3.49 -1 2 C-0.67 1.34 -0.34 0.68 0 0 Z`,\n viewBox: { width: 166, height: 104 },\n translate: { x: 11, y: 10 }\n },\n // From 0044_006.svg - Bird perched/sitting (165x181 viewBox)\n perched: {\n path: `M0 0 C-1.43 4.39 -3.59 7.07 -6.73 10.42 C-7.22 10.94 -7.7 11.45 -8.19 11.98 C-14.39 18.56 -20.83 24.9 -27.25 31.25 C-37.95 41.82 -37.95 41.82 -48 53 C-49.8 55.01 -51.62 57.01 -53.44 59 C-54.3 59.95 -55.17 60.9 -56.06 61.88 C-56.7 62.58 -57.34 63.28 -58 64 C-57.67 64.66 -57.34 65.32 -57 66 C-53 66.09 -53 66.09 -49 66 C-48.67 65.67 -48.34 65.34 -48 65 C-40.54 64.64 -40.54 64.64 -37 67 C-35.33 66.35 -33.66 65.68 -32 65 C-29.16 64.73 -26.47 64.57 -23.63 64.56 C-22.86 64.56 -22.09 64.55 -21.31 64.55 C-17.21 64.64 -14.31 64.74 -11.06 67.5 C-6.76 71.01 -3.33 70.42 2 70 C5.46 70 7.74 70.83 11 72 C11.97 72.27 11.97 72.27 12.96 72.55 C18.52 74.28 21.97 76.99 25 82 C25.88 85.44 25.88 85.44 26 88 C25.01 88 24.02 88 23 88 C19.17 88.21 16.78 88.36 13.78 90.82 C10.66 96.39 11.84 102.53 12.16 108.75 C12.38 116.09 11.59 122.47 8 129 C6 130.98 3.94 132.66 1.71 134.38 C-0.36 136.07 -0.36 136.07 -1.13 139.75 C-1.28 143.15 -1.28 143.15 1 146 C3.54 147.09 6.02 148.04 8.63 148.94 C14.3 150.97 19.69 153.12 25 156 C23 159 23 159 20.64 159.51 C19.18 159.6 19.18 159.6 17.69 159.69 C16.74 159.75 15.8 159.82 14.82 159.89 C4.07 160.21 -6.42 159.78 -17.13 158.69 C-17.8 158.62 -18.48 158.55 -19.18 158.48 C-50.54 155.31 -92.47 150.85 -115 126 C-119.26 119.07 -120 112.02 -118.42 104.09 C-114.56 89.96 -106.68 77.84 -97 67 C-96.34 66.23 -95.68 65.46 -95 64.67 C-83.8 51.86 -71.76 40 -58 30 C-56.98 29.26 -56.98 29.26 -55.95 28.5 C-11.57 -3.77 -11.57 -3.77 0 0 Z`,\n viewBox: { width: 165, height: 181 },\n translate: { x: 130, y: 11 }\n },\n // From 0044_014.svg - Simple stylized bird (83x83 viewBox)\n simple: {\n path: `M0 0 C4.89 3.46 6.97 7.09 8.56 12.81 C7.9 13.14 7.24 13.47 6.56 13.81 C5.98 13.61 5.41 13.4 4.81 13.19 C1.38 12.61 -0.54 14.05 -3.44 15.81 C-5.72 19.23 -5.65 20.3 -5.53 24.29 C-5.5 25.92 -5.5 25.92 -5.47 27.57 C-5.41 29.84 -5.34 32.1 -5.27 34.37 C-5.11 43.64 -6.53 50.34 -12.44 57.81 C-16.22 61.15 -19.9 61.33 -24.76 61.15 C-35.86 59.74 -44.59 52.73 -51.29 44.11 C-56.17 37.61 -56.17 37.61 -57.44 33.81 C-53.5 33.81 -52.44 35.39 -49.44 37.81 C-47.51 38.96 -47.51 38.96 -45.44 38.81 C-40.21 36.2 -39.13 31.96 -37.39 26.75 C-37.08 25.78 -36.76 24.81 -36.44 23.81 C-33.08 14.3 -29.39 5.9 -20.37 0.69 C-14.06 -2.17 -6.48 -2.24 0 0 Z`,\n viewBox: { width: 83, height: 83 },\n translate: { x: 65.4375, y: 11.1875 }\n }\n};\n\nexport function bird(params: BirdParams): GeneratorResult {\n const { size, style } = params;\n\n const traced = TRACED_PATHS[style];\n\n // Calculate scale to fit the path into the requested size\n const maxDimension = Math.max(traced.viewBox.width, traced.viewBox.height);\n const scale = size / maxDimension;\n\n // Calculate actual dimensions after scaling\n const actualWidth = traced.viewBox.width * scale;\n const actualHeight = traced.viewBox.height * scale;\n\n // Normalize and scale the path\n const normalizedPath = normalizeAndScalePath(traced.path, traced.translate, scale);\n\n return addSvgFields({\n path: normalizedPath,\n width: actualWidth,\n height: actualHeight,\n centerX: actualWidth / 2,\n centerY: actualHeight / 2,\n });\n}\n\n/**\n * Normalize path to start at origin (0,0) and scale it\n */\nfunction normalizeAndScalePath(path: string, translate: { x: number; y: number }, scale: number): string {\n return path.replace(\n /(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)/g,\n (_, x, y) => {\n const newX = (parseFloat(x) + translate.x) * scale;\n const newY = (parseFloat(y) + translate.y) * scale;\n return `${newX.toFixed(2)} ${newY.toFixed(2)}`;\n }\n );\n}\n","// src/generators/silhouettes/cat.ts\n// Cat silhouettes using VTracer-traced paths from reference images\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface CatParams {\n size: number; // Overall size\n style: 'sitting' | 'walking' | 'stretching';\n}\n\n// Traced paths from reference SVGs - much higher fidelity than hand-coded\n// Source: /output/moodboard_extraction/preliminary/by_category/cat/svgs/\nconst TRACED_PATHS = {\n // From 0026_007.svg - Standing cat silhouette (109x216 viewBox)\n sitting: {\n path: `M0 0 C0.99 0.66 1.98 1.32 3 2 C2.88 2.81 2.76 3.62 2.64 4.45 C1.59 11 1.59 11 3.94 16.88 C4.62 17.58 5.3 18.28 6 19 C6.69 21.94 6.69 21.94 6 25 C2.35 29.67 -2.21 31.74 -7.78 33.34 C-10.98 34.29 -13.95 35.64 -17 37 C-16.52 51.05 -13.13 63.42 -8 76.38 C-3.31 88.21 0.25 100.43 0.63 113.25 C0.88 115.42 0.88 115.42 4 117 C5.04 113.88 5.14 111.68 5.16 108.4 C5.17 106.68 5.17 106.68 5.19 104.92 C5.2 103.68 5.2 102.43 5.21 101.15 C5.23 99.19 5.25 97.23 5.27 95.28 C5.33 90.45 5.37 85.62 5.4 80.8 C5.42 78.09 5.44 75.39 5.48 72.68 C5.51 70.14 5.53 67.59 5.53 65.05 C5.65 56.73 6.34 49.12 10.94 42 C13.49 39.52 15.54 38.1 19.15 37.85 C24.98 38.41 28.14 39.47 32 44 C33.01 46.92 33.05 48.81 33 52 C31.81 54.06 31.81 54.06 30 55 C28 55.06 28 55.06 26 54 C24.25 50.94 24.25 50.94 23 48 C19.07 48.57 19.07 48.57 16 51 C15.68 54.01 15.48 56.92 15.38 59.94 C15.34 60.87 15.3 61.8 15.26 62.75 C14.86 73.64 14.92 84.52 14.98 95.41 C15.07 112.58 15.13 129.77 14.79 146.94 C14.76 148.45 14.74 149.97 14.73 151.48 C14.59 164.94 12.21 176.71 3 187 C-3.63 192.93 -14.68 197.14 -23.5 197.5 C-29.91 196.58 -33.61 194.01 -37.56 189.06 C-54.37 165.01 -53.77 127.39 -48.98 99.77 C-47.06 89.86 -43.71 80.61 -39.88 71.31 C-35.96 61.8 -32.76 51.02 -32.94 40.63 C-32.96 39.43 -32.98 38.23 -33 37 C-38.07 34.75 -43.18 32.88 -48.45 31.16 C-52.4 29.36 -54.53 27.24 -56.06 23.19 C-55.99 19.62 -55.64 19.3 -53.44 16.75 C-51.5 14.38 -50.96 13.51 -51.18 10.4 C-51.59 8.63 -52.06 6.88 -52.58 5.14 C-52.79 4.08 -52.79 4.08 -53 3 C-52.34 2.34 -51.68 1.68 -51 1 C-47.62 1.33 -46.03 2.74 -43.61 5.01 C-37.98 9.36 -32.06 8.95 -25.19 8.88 C-23.98 8.91 -22.77 8.95 -21.53 9 C-12.18 8.99 -6.9 6.21 0 0 Z`,\n viewBox: { width: 109, height: 216 },\n translate: { x: 66, y: 9 }\n },\n // From 0042_002.svg - Cat in profile/walking pose (191x425 viewBox)\n walking: {\n path: `M0 0 C10.29 7.63 13.75 19.98 17.54 31.72 C19.71 38.31 19.71 38.31 24.78 42.72 C26.37 43.35 26.37 43.35 28 44 C25.14 63.94 6.86 83.15 -8.39 94.83 C-13.4 98.45 -18.48 101.42 -24.07 104.05 C-25.96 104.85 -25.96 104.85 -27 106 C-27.35 115.76 -23.74 124.93 -20.63 134 C-20.23 135.18 -20.23 135.18 -19.82 136.39 C-15.15 150.18 -9.94 163.69 -4.23 177.1 C-3.07 179.84 -1.92 182.6 -0.78 185.36 C2.18 192.5 5.23 199.58 8.56 206.56 C22.5 236.07 30.23 268.33 30.1 300.98 C30.1 302.4 30.09 303.82 30.09 305.24 C30.09 308.94 30.08 312.65 30.07 316.35 C30.06 320.15 30.05 323.94 30.05 327.74 C30.04 335.16 30.02 342.58 30 350 C30.99 350 31.98 350 33 350 C37.81 337.57 42.15 325.32 44.59 312.2 C44.89 310.6 45.2 309.01 45.53 307.41 C52.34 273.03 40.61 236.94 27.92 205.3 C12.07 165.59 12.07 165.59 15 156 C16.51 153.98 17.47 153.17 19.88 152.42 C31.37 151.17 41.43 154.96 52 159 C52 159.99 52 160.98 52 162 C45.25 162.14 38.69 161.76 31.98 161.02 C28.67 161 26.8 161.2 24 163 C22.32 167.81 23.4 171.25 25.06 175.94 C25.29 176.6 25.53 177.26 25.77 177.94 C27.49 182.79 29.4 187.57 31.35 192.34 C53.2 246.42 67.82 301.72 44 358 C43.59 359.04 43.18 360.07 42.75 361.14 C37.54 374.09 31.19 386.75 18 393 C16.93 393.59 16.93 393.59 15.84 394.2 C-9.5 407.94 -43.12 406.72 -70.25 399.19 C-80.09 395.81 -89.3 389.36 -94.08 379.85 C-95.24 376.26 -95.33 372.91 -95.3 369.19 C-95.3 368.41 -95.29 367.63 -95.29 366.83 C-95.12 357.19 -93.87 347.67 -92.6 138.12 C-92.19 335.01 -91.79 331.89 -91.4 328.77 C-87.11 295.21 -87.11 295.21 -82.44 279.88 C-82.1 278.74 -81.75 277.6 -81.4 276.43 C-72.57 247.97 -58.92 221.89 -40.31 198.61 C-31.53 187.6 -25.93 177.42 -26.77 163 C-27.39 157.55 -29.44 152.37 -31.23 147.23 C-32.64 143.14 -33.92 139.01 -35.19 134.88 C-35.45 134.03 -35.7 133.19 -35.97 132.32 C-37.82 126.06 -38.97 119.96 -39.68 113.46 C-39.74 111.06 -39.74 111.06 -41 110 C-46.91 109.46 -52.68 109.66 -57.69 113.19 C-59.23 115.17 -59.23 115.17 -60.5 118.5 C-62.52 123.21 -62.52 123.21 -65 125 C-65.56 125.08 -66.13 125.17 -66.71 125.25 C-70.15 126.37 -72.56 128.72 -75.25 131.06 C-75.8 131.53 -76.36 132.01 -76.93 132.49 C-78.29 133.66 -79.65 134.83 -81 136 C-81.99 135.01 -81.99 135.01 -83 134 C-81.02 131.69 -79.04 129.38 -77 127 C-77.66 126.01 -78.32 125.02 -79 124 C-74.27 119.62 -69.73 115.98 -64 113 C-64.33 112.34 -64.66 111.68 -65 111 C-67.39 110.59 -69.71 110.29 -72.13 110.06 C-77.9 109.42 -83.61 108.62 -89.31 107.5 C-90.53 107.26 -91.74 107.03 -92.99 106.78 C-96 106 -96 106 -99 104 C-98.77 103.41 -98.55 102.81 -98.32 102.2 C-97.12 98.21 -96.38 95.33 -98.18 91.45 C-99.4 89.66 -100.65 87.88 -101.92 86.11 C-107.93 77.12 -112.45 65.7 -114 55 C-112.43 53.43 -110.91 53.81 -108.73 53.79 C-102.42 53.85 -96.46 55.1 -90.31 56.44 C-86.21 57.3 -82.11 58.16 -78 59 C-77.27 59.16 -76.55 59.32 -75.8 59.49 C-73.05 60.02 -71.49 60.29 -69.02 58.85 C-68.48 58.26 -67.94 57.67 -67.38 57.06 C-56.55 46.69 -41.79 40.39 -27.49 36.28 C-22.82 35.01 -22.82 35.01 -19.27 31.92 C-18.85 30.96 -18.43 29.99 -18 29 C-17.19 27.48 -16.37 25.96 -15.55 24.45 C-14.15 21.86 -12.76 19.26 -11.38 16.66 C-8.11 10.62 -4.37 5.29 0 0 Z`,\n viewBox: { width: 191, height: 425 },\n translate: { x: 124, y: 10 }\n },\n // From 0055_023.svg - Cat stretching/arched (185x253 viewBox)\n stretching: {\n path: `M0 0 C2.13 1.13 2.13 1.13 4 3 C6.45 11.19 4.54 20.53 2.27 28.57 C1.92 31.71 2.76 32.85 4.5 35.44 C6.3 38.45 6.99 39.67 7.06 43.25 C5.86 46.37 4.09 48.42 2 51 C2.33 51.99 2.66 52.98 3 54 C3.93 54.31 4.86 54.62 5.81 54.94 C9 56 9 56 10.94 58.06 C13.76 60.72 16.23 60.64 20 61 C20.33 61.33 20.66 61.66 21 62 C22.83 62.25 24.67 62.47 26.5 62.69 C35.09 64.07 41.4 68.28 46.78 75.09 C51.31 82.18 52.09 90.02 50.31 98.13 C48.09 102.99 45.69 106.78 41.31 109.94 C36.73 111.41 32.75 112.05 28 111 C23.76 108.36 20.76 105.14 18 101 C15.5 100.58 15.5 100.58 13 101 C12.34 101.66 11.68 102.32 11 103 C11.38 108.48 12.54 113.64 13.94 118.94 C14.64 121.62 15.33 124.31 16 127 C16.18 127.72 16.36 128.44 16.55 129.18 C20.51 145.81 20.84 165.17 11.69 180.15 C7.45 186.15 2.1 190.94 -4 195 C-4.85 198.03 -4.85 198.03 -5.38 201.56 C-7.2 210.73 -10.22 217.46 -17.57 223.43 C-32.9 233.32 -55.4 233.2 -72.81 229.81 C-82 227.43 -90.19 223.76 -96 216 C-101.96 205.42 -102.48 193.3 -99.75 181.57 C-95.52 166.1 -88.12 154.19 -80 141.5 C-69.62 125.26 -59.92 108.81 -59.81 88.94 C-59.8 87.75 -59.78 86.56 -59.77 85.34 C-60 82 -60.24 79.85 -62 77 C-64.51 75.88 -64.51 75.88 -67.5 75.44 C-85.46 71.58 -99.68 61.6 -111.38 47.61 C-113.18 44.7 -113.52 43.35 -113 40 C-111.71 37.97 -110.38 35.97 -109 34 C-107.78 31.22 -107.9 30.3 -108.88 27.38 C-111.66 19.03 -112.21 9.22 -109 1 C-103.32 0.46 -99.75 2.23 -94.88 4.81 C-94.17 5.17 -93.47 5.53 -92.75 5.89 C-89.88 7.37 -87.26 8.8 -84.7 10.77 C-82.94 12.31 -82.94 12.31 -79.94 11.88 C-76.76 11.26 -73.67 10.37 -70.56 9.5 C-65.98 8.22 -61.74 7.38 -57 7 C-56.35 6.95 -55.7 6.89 -55.04 6.84 C-46.71 6.48 -37.64 8.28 -29.86 11.16 C-25.74 12.37 -23.36 11.73 -19.64 9.73 C-18.85 9.22 -18.06 8.71 -17.25 8.19 C-11.75 4.77 -6.15 2.05 0 0 Z`,\n viewBox: { width: 185, height: 253 },\n translate: { x: 124, y: 10 }\n }\n};\n\nexport function cat(params: CatParams): GeneratorResult {\n const { size, style } = params;\n\n const traced = TRACED_PATHS[style];\n\n // Calculate scale to fit the path into the requested size\n // Use the larger dimension to maintain aspect ratio\n const maxDimension = Math.max(traced.viewBox.width, traced.viewBox.height);\n const scale = size / maxDimension;\n\n // Calculate actual dimensions after scaling\n const actualWidth = traced.viewBox.width * scale;\n const actualHeight = traced.viewBox.height * scale;\n\n // Normalize and scale the path\n const normalizedPath = normalizeAndScalePath(traced.path, traced.translate, scale);\n\n return addSvgFields({\n path: normalizedPath,\n width: actualWidth,\n height: actualHeight,\n centerX: actualWidth / 2,\n centerY: actualHeight / 2,\n });\n}\n\n/**\n * Normalize path to start at origin (0,0) and scale it\n * The traced paths have a translate offset that needs to be applied first\n */\nfunction normalizeAndScalePath(path: string, translate: { x: number; y: number }, scale: number): string {\n // Parse and transform all coordinate pairs in the path\n // This handles M, L, C, Q, S, T commands with their coordinates\n\n return path.replace(\n /(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)/g,\n (_, x, y) => {\n // Apply translation offset then scale\n const newX = (parseFloat(x) + translate.x) * scale;\n const newY = (parseFloat(y) + translate.y) * scale;\n return `${newX.toFixed(2)} ${newY.toFixed(2)}`;\n }\n );\n}\n","// src/generators/silhouettes/dog.ts\n// Stylized MCM dog silhouette\n// NOTE: No VTracer-traced references available for dogs in the moodboard extraction.\n// Using hand-coded programmatic paths. Consider adding traced references when available.\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface DogParams {\n size: number;\n style: 'standing' | 'sitting' | 'running';\n}\n\nexport function dog(params: DogParams): GeneratorResult {\n const { size, style } = params;\n const scale = size / 100;\n\n let basePath: string;\n\n switch (style) {\n case 'running':\n basePath = `M 10,50 C 5,45 5,35 15,30 L 25,20 C 30,15 35,20 35,25 L 40,30 C 50,25 60,25 70,30 L 80,25 C 85,22 90,28 85,35 L 90,40 C 95,45 95,55 90,60 L 95,75 L 85,75 L 80,60 L 70,65 L 65,80 L 55,80 L 60,65 L 40,65 L 35,80 L 25,80 L 30,65 L 20,60 L 10,75 L 5,70 L 15,55 C 10,55 5,55 10,50 Z M 25,35 C 27,35 28,37 28,39 C 28,41 27,42 25,42 C 23,42 22,41 22,39 C 22,37 23,35 25,35 Z`;\n break;\n case 'sitting':\n basePath = `M 50,15 C 40,15 35,25 40,35 L 35,35 C 30,35 28,40 32,45 L 25,50 C 20,55 20,70 25,80 L 25,95 L 40,95 L 40,85 C 45,82 55,82 60,85 L 60,95 L 75,95 L 75,80 C 80,70 80,55 75,50 L 68,45 C 72,40 70,35 65,35 L 60,35 C 65,25 60,15 50,15 Z M 42,30 C 44,30 45,32 45,34 C 45,36 44,38 42,38 C 40,38 39,36 39,34 C 39,32 40,30 42,30 Z M 58,30 C 60,30 61,32 61,34 C 61,36 60,38 58,38 C 56,38 55,36 55,34 C 55,32 56,30 58,30 Z`;\n break;\n case 'standing':\n default:\n basePath = `M 15,40 C 10,35 10,25 20,20 L 25,10 C 28,5 35,10 33,18 L 40,25 C 55,20 70,25 80,35 L 90,30 C 95,28 98,35 93,40 L 95,50 C 98,60 95,70 90,75 L 90,90 L 80,90 L 80,75 L 70,75 L 70,90 L 60,90 L 60,75 L 40,75 L 40,90 L 30,90 L 30,75 L 20,75 L 20,90 L 10,90 L 10,75 C 5,70 5,55 15,45 Z M 25,30 C 27,30 28,32 28,34 C 28,36 27,38 25,38 C 23,38 22,36 22,34 C 22,32 23,30 25,30 Z`;\n }\n\n const path = scalePath(basePath, scale);\n\n return addSvgFields({\n path,\n width: size,\n height: size,\n centerX: size / 2,\n centerY: size / 2,\n });\n}\n\nfunction scalePath(path: string, scale: number): string {\n return path.replace(/([\\d.]+),([\\d.]+)/g, (_, x, y) => {\n return `${(parseFloat(x) * scale).toFixed(2)},${(parseFloat(y) * scale).toFixed(2)}`;\n });\n}\n","// src/generators/silhouettes/fish.ts\n// Fish silhouettes using VTracer-traced paths from reference images\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface FishParams {\n size: number;\n style: 'tropical' | 'simple' | 'koi';\n}\n\n// Traced paths from reference SVGs - much higher fidelity than hand-coded\n// Source: /output/moodboard_extraction/preliminary/by_category/fish/svgs/\nconst TRACED_PATHS = {\n // From 0057_017.svg - Tropical/detailed fish (169x134 viewBox) - main silhouette shape\n tropical: {\n path: `M0 0 C0.79 -0 1.58 -0.01 2.39 -0.01 C9.57 0.05 16.08 1.05 22.5 4.31 C23.3 4.47 24.11 4.63 24.93 4.79 C36.56 7.15 46.43 17.19 52.89 26.7 C54.87 29.86 56.74 33.03 58.5 36.31 C59.43 38.02 59.43 38.02 60.39 39.75 C63.19 45.43 65.13 51.46 67.13 57.46 C67.82 59.51 68.52 61.55 69.23 63.6 C69.67 64.91 70.11 66.23 70.55 67.54 C70.95 68.72 71.35 69.9 71.76 71.12 C72.51 74.34 72.44 76.18 71.5 79.31 C46.89 86.28 14.65 85.14 -8.13 72.9 C-12.51 70.2 -15.57 67.52 -18.14 63.02 C-19.54 61.06 -19.54 61.06 -22.38 59.59 C-26.31 56.72 -27.74 53.89 -29.75 49.56 C-30.09 48.88 -30.43 48.21 -30.77 47.51 C-35.11 38.53 -37.19 29.37 -34.31 19.63 C-31.37 11.81 -25.78 7.11 -18.5 3.31 C-12.27 0.68 -6.72 -0.14 0 0 Z`,\n viewBox: { width: 129, height: 104 },\n translate: { x: 45.5, y: 9.6875 }\n },\n // From 0005_004.svg - Simple fish shape (115x46 viewBox)\n simple: {\n path: `M0 0 C0.8 0.11 1.6 0.22 2.42 0.34 C4.93 0.69 7.43 1.06 9.94 1.44 C10.71 1.55 11.49 1.66 12.29 1.77 C14.21 2.08 16.11 2.53 18 3 C18.99 4.48 18.99 4.48 20 6 C19 7 19 7 16.23 7.03 C15.04 7 13.85 6.97 12.63 6.94 C6.18 6.88 0.27 7.57 -6 9 C-6 9.99 -6 10.98 -6 12 C-1.16 14.55 3.49 14.23 8.81 14.13 C10.14 14.11 10.14 14.11 11.49 14.1 C13.66 14.07 15.83 14.04 18 14 C18 14.99 18 15.98 18 17 C14.99 18.69 12.45 19.38 9.04 19.82 C8.08 19.94 7.12 20.06 6.13 20.19 C5.12 20.31 4.11 20.44 3.06 20.56 C2.02 20.69 0.97 20.82 -0.11 20.95 C-3.07 21.31 -6.03 21.66 -9 22 C-10.19 22.14 -11.37 22.27 -12.6 22.41 C-34.59 24.49 -58.75 25.32 -77 11 C-75.96 7.84 -74.96 6.98 -72.09 5.18 C-49.24 -6.03 -24.56 -3.65 0 0 Z`,\n viewBox: { width: 115, height: 46 },\n translate: { x: 86, y: 12 }\n },\n // From 0017_003.svg - Koi/curved fish shape (130x77 viewBox)\n koi: {\n path: `M0 0 C0.83 -0.02 1.65 -0.03 2.5 -0.05 C9.21 0.07 14.46 1.87 19.52 6.35 C24.99 13.78 26.51 22.44 25.5 31.56 C24.54 36.47 23.23 39.75 19.88 43.5 C8.35 50.54 -5.42 47.39 -17.98 45.3 C-23.15 44.44 -28.27 43.84 -33.5 43.56 C-34.64 43.47 -35.78 43.39 -36.96 43.3 C-44.03 42.97 -48.8 43.26 -54.46 47.7 C-57.93 50.87 -61.29 54.12 -64.5 57.56 C-65.16 56.9 -65.82 56.24 -66.5 55.56 C-62.54 49.62 -58.58 43.68 -54.5 37.56 C-56.86 32.84 -57.85 32.63 -62.6 30.77 C-63.81 30.28 -65.03 29.8 -66.27 29.3 C-67.56 28.8 -68.84 28.31 -70.13 27.81 C-71.42 27.3 -72.71 26.79 -74 26.28 C-77.16 25.03 -80.33 23.79 -83.5 22.56 C-83.5 21.57 -83.5 20.58 -83.5 19.56 C-82.84 19.58 -82.17 19.59 -81.49 19.61 C-63.01 19.99 -50.8 18.47 -34.48 9.7 C-23.13 3.65 -12.96 0.19 0 0 Z`,\n viewBox: { width: 130, height: 77 },\n translate: { x: 94.5, y: 10.4375 }\n }\n};\n\nexport function fish(params: FishParams): GeneratorResult {\n const { size, style } = params;\n\n const traced = TRACED_PATHS[style];\n\n // Calculate scale to fit the path into the requested size\n const maxDimension = Math.max(traced.viewBox.width, traced.viewBox.height);\n const scale = size / maxDimension;\n\n // Calculate actual dimensions after scaling\n const actualWidth = traced.viewBox.width * scale;\n const actualHeight = traced.viewBox.height * scale;\n\n // Normalize and scale the path\n const normalizedPath = normalizeAndScalePath(traced.path, traced.translate, scale);\n\n return addSvgFields({\n path: normalizedPath,\n width: actualWidth,\n height: actualHeight,\n centerX: actualWidth / 2,\n centerY: actualHeight / 2,\n });\n}\n\n/**\n * Normalize path to start at origin (0,0) and scale it\n */\nfunction normalizeAndScalePath(path: string, translate: { x: number; y: number }, scale: number): string {\n return path.replace(\n /(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)/g,\n (_, x, y) => {\n const newX = (parseFloat(x) + translate.x) * scale;\n const newY = (parseFloat(y) + translate.y) * scale;\n return `${newX.toFixed(2)} ${newY.toFixed(2)}`;\n }\n );\n}\n","// src/generators/silhouettes/leaf.ts\n// Leaf silhouettes using VTracer-traced paths from reference images\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface LeafParams {\n size: number; // Overall size (replaces separate width/height)\n style: 'oval' | 'pointed' | 'broad'; // Different leaf shapes from traced references\n}\n\n// Traced paths from reference SVGs - much higher fidelity than hand-coded\n// Source: /output/moodboard_extraction/preliminary/by_category/leaf/svgs/\nconst TRACED_PATHS = {\n // From 0016_020.svg - Oval/simple leaf shape (61x136 viewBox)\n oval: {\n path: `M0 0 C3.88 3.57 6.56 7.18 9 11.88 C9.34 12.53 9.68 13.18 10.04 13.85 C21.05 35.48 24.35 62.76 17.32 86.18 C13.41 97.84 8.26 108.05 1 118 C-12.5 105.38 -18.61 82.92 -19.28 65.03 C-19.8 41.42 -14.64 21.9 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z`,\n viewBox: { width: 61, height: 136 },\n translate: { x: 30, y: 9 }\n },\n // From 0048_016.svg - Pointed/elongated leaf (92x205 viewBox)\n pointed: {\n path: `M0 0 C3.27 1.35 4.61 2.47 6.15 5.65 C6.51 6.4 6.87 7.14 7.25 7.92 C7.62 8.73 7.99 9.54 8.38 10.38 C8.77 11.22 9.16 12.06 9.56 12.93 C23.31 43.54 25.37 78.11 13.85 109.79 C12.16 114.18 10.33 118.5 8.44 122.81 C8.06 123.68 7.69 124.55 7.3 125.44 C6.93 126.25 6.56 127.06 6.18 127.89 C5.86 128.61 5.54 129.34 5.2 130.08 C3.79 132.34 2.2 133.53 0 135 C-1.98 132.69 -3.96 130.38 -6 128 C-9.51 131.51 -9.69 133.9 -10.31 138.56 C-12.83 154.7 -18.3 172.36 -29 185 C-32 184 -32 184 -33.07 182.43 C-33.39 181.75 -33.72 181.08 -34.05 180.38 C-34.42 179.62 -34.78 178.86 -35.16 178.07 C-35.54 177.24 -35.92 176.42 -36.31 175.56 C-36.71 174.71 -37.1 173.86 -37.51 172.98 C-44.81 156.92 -50.26 139.73 -51 122 C-51.03 121.37 -51.05 120.73 -51.08 120.08 C-52 95.22 -46.67 69.95 -31 50 C-27.17 51.45 -25.88 53.43 -24 57 C-23.01 56.5 -23.01 56.5 -22 56 C-21.43 54.19 -21.43 54.19 -21.11 51.98 C-20.96 51.15 -20.81 50.32 -20.66 49.46 C-20.5 48.57 -20.35 47.67 -20.19 46.75 C-18.02 35.21 -14.15 25.15 -9 14.63 C-8.68 13.97 -8.36 13.32 -8.03 12.64 C-5.73 8.1 -3.04 4.08 0 0 Z`,\n viewBox: { width: 92, height: 205 },\n translate: { x: 61, y: 10 }\n },\n // From 0035_033.svg - Broad/dual leaf shape (82x44 viewBox)\n broad: {\n path: `M0 0 C1.94 2.44 1.94 2.44 2.5 5.81 C1.63 11.44 -0.6 14.31 -5.06 17.75 C-9.66 20.34 -13.36 20.62 -18.63 20.69 C-20.33 20.73 -20.33 20.73 -22.07 20.77 C-25.06 20.44 -25.06 20.44 -26.96 18.92 C-27.33 18.43 -27.69 17.94 -28.06 17.44 C-27.01 15.18 -25.95 12.93 -24.88 10.69 C-24.58 10.05 -24.29 9.42 -23.99 8.77 C-21.7 4.04 -19.19 0.56 -14.03 -1.29 C-8.93 -1.99 -4.68 -2.39 0 0 Z`,\n viewBox: { width: 82, height: 44 },\n translate: { x: 69.0625, y: 12.5625 }\n }\n};\n\nexport function leaf(params: LeafParams): GeneratorResult {\n const { size, style } = params;\n\n const traced = TRACED_PATHS[style];\n\n // Calculate scale to fit the path into the requested size\n const maxDimension = Math.max(traced.viewBox.width, traced.viewBox.height);\n const scale = size / maxDimension;\n\n // Calculate actual dimensions after scaling\n const actualWidth = traced.viewBox.width * scale;\n const actualHeight = traced.viewBox.height * scale;\n\n // Normalize and scale the path\n const normalizedPath = normalizeAndScalePath(traced.path, traced.translate, scale);\n\n return addSvgFields({\n path: normalizedPath,\n width: actualWidth,\n height: actualHeight,\n centerX: actualWidth / 2,\n centerY: actualHeight / 2,\n });\n}\n\n/**\n * Normalize path to start at origin (0,0) and scale it\n */\nfunction normalizeAndScalePath(path: string, translate: { x: number; y: number }, scale: number): string {\n return path.replace(\n /(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)/g,\n (_, x, y) => {\n const newX = (parseFloat(x) + translate.x) * scale;\n const newY = (parseFloat(y) + translate.y) * scale;\n return `${newX.toFixed(2)} ${newY.toFixed(2)}`;\n }\n );\n}\n","// src/generators/silhouettes/rocket.ts\n// Stylized MCM rocket silhouette - retro space age\n// NOTE: No VTracer-traced references available for rockets in the moodboard extraction.\n// Using hand-coded programmatic paths. Consider adding traced references when available.\nimport { GeneratorResult } from '../types';\nimport { addSvgFields } from '../utils/svg';\n\nexport interface RocketParams {\n size: number;\n style: 'classic' | 'streamlined' | 'chunky';\n}\n\nexport function rocket(params: RocketParams): GeneratorResult {\n const { size, style } = params;\n const scale = size / 100;\n\n let basePath: string;\n\n switch (style) {\n case 'streamlined':\n // Sleek 50s style rocket\n basePath = `M 50,5 C 40,10 35,25 35,40 L 20,55 L 25,60 L 35,55 L 35,75 L 40,90 L 45,85 L 50,95 L 55,85 L 60,90 L 65,75 L 65,55 L 75,60 L 80,55 L 65,40 C 65,25 60,10 50,5 Z M 45,30 C 47,30 50,35 50,40 C 50,45 47,50 45,50 C 43,50 40,45 40,40 C 40,35 43,30 45,30 Z`;\n break;\n case 'chunky':\n // Bulky retro rocket\n basePath = `M 50,5 C 35,10 30,30 30,50 L 15,60 L 15,75 L 30,70 L 30,80 L 35,95 L 45,85 L 50,95 L 55,85 L 65,95 L 70,80 L 70,70 L 85,75 L 85,60 L 70,50 C 70,30 65,10 50,5 Z M 40,35 L 60,35 L 60,55 L 40,55 Z`;\n break;\n case 'classic':\n default:\n // Classic rocket ship\n basePath = `M 50,5 C 40,8 38,20 38,35 L 20,50 L 22,60 L 38,52 L 38,75 L 42,95 L 50,80 L 58,95 L 62,75 L 62,52 L 78,60 L 80,50 L 62,35 C 62,20 60,8 50,5 Z M 44,30 C 48,30 52,35 52,42 C 52,49 48,55 44,55 C 40,55 36,49 36,42 C 36,35 40,30 44,30 Z M 50,60 L 45,70 L 50,68 L 55,70 Z`;\n }\n\n const path = scalePath(basePath, scale);\n\n return addSvgFields({\n path,\n width: size,\n height: size,\n centerX: size / 2,\n centerY: size / 2,\n });\n}\n\nfunction scalePath(path: string, scale: number): string {\n return path.replace(/([\\d.]+),([\\d.]+)/g, (_, x, y) => {\n return `${(parseFloat(x) * scale).toFixed(2)},${(parseFloat(y) * scale).toFixed(2)}`;\n });\n}\n"],"mappings":"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","names":["path","TRACED_PATHS","normalizeAndScalePath","TRACED_PATHS","normalizeAndScalePath","TRACED_PATHS","normalizeAndScalePath","scalePath"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,39 +1,239 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { G as GeneratorResult } from './boomerang-s5naDBuf.js';
|
|
2
|
+
export { B as BoomerangParams, a as BoomerangStyle, D as DingbatResult, b as boomerang } from './boomerang-s5naDBuf.js';
|
|
3
|
+
|
|
4
|
+
interface BlobParams {
|
|
5
|
+
radius: number;
|
|
6
|
+
pointCount: number;
|
|
7
|
+
irregularity: number;
|
|
8
|
+
smoothing: number;
|
|
9
|
+
seed: number;
|
|
10
|
+
}
|
|
11
|
+
declare function blob(params: BlobParams): GeneratorResult;
|
|
12
|
+
|
|
13
|
+
interface CircleParams {
|
|
14
|
+
radius: number;
|
|
15
|
+
}
|
|
16
|
+
declare function circle(params: CircleParams): GeneratorResult;
|
|
17
|
+
|
|
18
|
+
interface KidneyParams {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
concavityDepth: number;
|
|
22
|
+
concavityPosition: number;
|
|
23
|
+
}
|
|
24
|
+
declare function kidney(params: KidneyParams): GeneratorResult;
|
|
25
|
+
|
|
26
|
+
interface MoonParams {
|
|
27
|
+
outerRadius: number;
|
|
28
|
+
innerRadius: number;
|
|
29
|
+
innerOffset: number;
|
|
30
|
+
rotation: number;
|
|
31
|
+
}
|
|
32
|
+
declare function moon(params: MoonParams): GeneratorResult;
|
|
33
|
+
|
|
34
|
+
interface OvalParams {
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}
|
|
38
|
+
declare function oval(params: OvalParams): GeneratorResult;
|
|
39
|
+
|
|
40
|
+
interface SemicircleParams {
|
|
41
|
+
radius: number;
|
|
42
|
+
arcAngle: number;
|
|
43
|
+
rotation: number;
|
|
44
|
+
closed: boolean;
|
|
45
|
+
}
|
|
46
|
+
declare function semicircle(params: SemicircleParams): GeneratorResult;
|
|
47
|
+
|
|
48
|
+
interface ArrowParams {
|
|
49
|
+
length: number;
|
|
50
|
+
headWidth: number;
|
|
51
|
+
headLength: number;
|
|
52
|
+
tailWidth: number;
|
|
53
|
+
direction: 'up' | 'down' | 'left' | 'right';
|
|
54
|
+
}
|
|
55
|
+
declare function arrow(params: ArrowParams): GeneratorResult;
|
|
56
|
+
|
|
57
|
+
interface BowtieParams {
|
|
3
58
|
width: number;
|
|
4
59
|
height: number;
|
|
5
|
-
|
|
6
|
-
centerY: number;
|
|
7
|
-
viewBox: string;
|
|
8
|
-
svg: string;
|
|
60
|
+
pinchAmount: number;
|
|
9
61
|
}
|
|
10
|
-
|
|
62
|
+
declare function bowtie(params: BowtieParams): GeneratorResult;
|
|
11
63
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
armLength: number;
|
|
16
|
-
bendAngle: number;
|
|
17
|
-
armCurvature: number;
|
|
18
|
-
bendSharpness: number;
|
|
64
|
+
interface ChevronParams {
|
|
65
|
+
width: number;
|
|
66
|
+
height: number;
|
|
19
67
|
thickness: number;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
68
|
+
angle: number;
|
|
69
|
+
direction: 'up' | 'down' | 'left' | 'right';
|
|
70
|
+
}
|
|
71
|
+
declare function chevron(params: ChevronParams): GeneratorResult;
|
|
72
|
+
|
|
73
|
+
interface CrossParams {
|
|
74
|
+
size: number;
|
|
75
|
+
armWidth: number;
|
|
76
|
+
armRatio: number;
|
|
77
|
+
}
|
|
78
|
+
declare function cross(params: CrossParams): GeneratorResult;
|
|
79
|
+
|
|
80
|
+
interface CursorParams {
|
|
81
|
+
width: number;
|
|
82
|
+
height: number;
|
|
83
|
+
notchDepth: number;
|
|
84
|
+
notchPosition: number;
|
|
85
|
+
tilt: number;
|
|
86
|
+
}
|
|
87
|
+
declare function cursor(params: CursorParams): GeneratorResult;
|
|
88
|
+
|
|
89
|
+
interface DiamondParams {
|
|
90
|
+
width: number;
|
|
91
|
+
height: number;
|
|
92
|
+
/** How convex/bulging the sides are. 0 = straight lines (rhombus), 1 = maximum bulge */
|
|
93
|
+
bulge: number;
|
|
94
|
+
/** Asymmetry factor for organic variation. 0 = symmetric, positive = right side bulges more */
|
|
95
|
+
asymmetry?: number;
|
|
25
96
|
}
|
|
26
97
|
/**
|
|
27
|
-
*
|
|
98
|
+
* Generates a curved lens/eye/almond shape - the authentic MCM "diamond"
|
|
99
|
+
*
|
|
100
|
+
* Unlike a geometric rhombus, MCM diamonds have:
|
|
101
|
+
* - Pointed ends at top and bottom
|
|
102
|
+
* - Curved sides that bulge outward (convex)
|
|
103
|
+
* - Soft, organic feel
|
|
104
|
+
*
|
|
105
|
+
* Uses cubic bezier curves for all edges.
|
|
28
106
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
107
|
+
declare function diamond(params: DiamondParams): GeneratorResult;
|
|
108
|
+
|
|
109
|
+
interface PolygonParams {
|
|
110
|
+
sides: number;
|
|
111
|
+
radius: number;
|
|
112
|
+
rotation: number;
|
|
113
|
+
}
|
|
114
|
+
declare function polygon(params: PolygonParams): GeneratorResult;
|
|
115
|
+
declare function hexagon(params: {
|
|
116
|
+
radius: number;
|
|
117
|
+
rotation: number;
|
|
118
|
+
}): GeneratorResult;
|
|
119
|
+
declare function pentagon(params: {
|
|
120
|
+
radius: number;
|
|
121
|
+
rotation: number;
|
|
122
|
+
}): GeneratorResult;
|
|
123
|
+
declare function octagon(params: {
|
|
124
|
+
radius: number;
|
|
125
|
+
rotation: number;
|
|
126
|
+
}): GeneratorResult;
|
|
127
|
+
|
|
128
|
+
interface RectangleParams {
|
|
129
|
+
width: number;
|
|
130
|
+
height: number;
|
|
131
|
+
cornerRadius: number;
|
|
132
|
+
}
|
|
133
|
+
declare function rectangle(params: RectangleParams): GeneratorResult;
|
|
134
|
+
|
|
135
|
+
interface SwallowtailParams {
|
|
136
|
+
width: number;
|
|
137
|
+
height: number;
|
|
138
|
+
notchDepth: number;
|
|
139
|
+
notchCurvature: number;
|
|
140
|
+
}
|
|
141
|
+
declare function swallowtail(params: SwallowtailParams): GeneratorResult;
|
|
142
|
+
|
|
143
|
+
interface TriangleParams {
|
|
144
|
+
width: number;
|
|
145
|
+
height: number;
|
|
146
|
+
skew: number;
|
|
147
|
+
}
|
|
148
|
+
declare function triangle(params: TriangleParams): GeneratorResult;
|
|
149
|
+
|
|
150
|
+
interface AtomicParams {
|
|
151
|
+
orbitCount: number;
|
|
152
|
+
orbitRadius: number;
|
|
153
|
+
orbitEccentricity: number;
|
|
154
|
+
nucleusSize: number;
|
|
155
|
+
orbitThickness: number;
|
|
156
|
+
}
|
|
157
|
+
declare function atomic(params: AtomicParams): GeneratorResult;
|
|
158
|
+
|
|
159
|
+
interface FlowerParams {
|
|
160
|
+
petalCount: number;
|
|
161
|
+
petalLength: number;
|
|
162
|
+
petalWidth: number;
|
|
163
|
+
centerSize: number;
|
|
164
|
+
petalPointedness: number;
|
|
165
|
+
}
|
|
166
|
+
declare function flower(params: FlowerParams): GeneratorResult;
|
|
167
|
+
|
|
168
|
+
interface SpiralParams {
|
|
169
|
+
turns: number;
|
|
170
|
+
startRadius: number;
|
|
171
|
+
expansionRate: number;
|
|
172
|
+
thickness: number;
|
|
173
|
+
direction: 1 | -1;
|
|
174
|
+
}
|
|
175
|
+
declare function spiral(params: SpiralParams): GeneratorResult;
|
|
176
|
+
|
|
177
|
+
interface StarParams {
|
|
178
|
+
points: number;
|
|
179
|
+
innerRadius: number;
|
|
180
|
+
outerRadius: number;
|
|
181
|
+
rotation: number;
|
|
182
|
+
}
|
|
183
|
+
declare function star(params: StarParams): GeneratorResult;
|
|
184
|
+
|
|
185
|
+
interface StarburstParams {
|
|
186
|
+
rayCount: number;
|
|
187
|
+
innerRadius: number;
|
|
188
|
+
outerRadius: number;
|
|
189
|
+
rayThickness: number;
|
|
190
|
+
taper: number;
|
|
191
|
+
}
|
|
192
|
+
declare function starburst(params: StarburstParams): GeneratorResult;
|
|
193
|
+
|
|
194
|
+
interface SunParams {
|
|
195
|
+
discRadius: number;
|
|
196
|
+
rayCount: number;
|
|
197
|
+
rayLength: number;
|
|
198
|
+
rayWidth: number;
|
|
199
|
+
rayTaper: number;
|
|
200
|
+
}
|
|
201
|
+
declare function sun(params: SunParams): GeneratorResult;
|
|
202
|
+
|
|
203
|
+
interface BirdParams {
|
|
204
|
+
size: number;
|
|
205
|
+
style: 'flying' | 'perched' | 'simple';
|
|
206
|
+
}
|
|
207
|
+
declare function bird(params: BirdParams): GeneratorResult;
|
|
208
|
+
|
|
209
|
+
interface CatParams {
|
|
210
|
+
size: number;
|
|
211
|
+
style: 'sitting' | 'walking' | 'stretching';
|
|
212
|
+
}
|
|
213
|
+
declare function cat(params: CatParams): GeneratorResult;
|
|
214
|
+
|
|
215
|
+
interface DogParams {
|
|
216
|
+
size: number;
|
|
217
|
+
style: 'standing' | 'sitting' | 'running';
|
|
218
|
+
}
|
|
219
|
+
declare function dog(params: DogParams): GeneratorResult;
|
|
220
|
+
|
|
221
|
+
interface FishParams {
|
|
222
|
+
size: number;
|
|
223
|
+
style: 'tropical' | 'simple' | 'koi';
|
|
224
|
+
}
|
|
225
|
+
declare function fish(params: FishParams): GeneratorResult;
|
|
226
|
+
|
|
227
|
+
interface LeafParams {
|
|
228
|
+
size: number;
|
|
229
|
+
style: 'oval' | 'pointed' | 'broad';
|
|
230
|
+
}
|
|
231
|
+
declare function leaf(params: LeafParams): GeneratorResult;
|
|
232
|
+
|
|
233
|
+
interface RocketParams {
|
|
234
|
+
size: number;
|
|
235
|
+
style: 'classic' | 'streamlined' | 'chunky';
|
|
36
236
|
}
|
|
37
|
-
declare
|
|
237
|
+
declare function rocket(params: RocketParams): GeneratorResult;
|
|
38
238
|
|
|
39
|
-
export { type
|
|
239
|
+
export { type ArrowParams, type AtomicParams, type BirdParams, type BlobParams, type BowtieParams, type CatParams, type ChevronParams, type CircleParams, type CrossParams, type CursorParams, type DiamondParams, type DogParams, type FishParams, type FlowerParams, GeneratorResult, type KidneyParams, type LeafParams, type MoonParams, type OvalParams, type PolygonParams, type RectangleParams, type RocketParams, type SemicircleParams, type SpiralParams, type StarParams, type StarburstParams, type SunParams, type SwallowtailParams, type TriangleParams, arrow, atomic, bird, blob, bowtie, cat, chevron, circle, cross, cursor, diamond, dog, fish, flower, hexagon, kidney, leaf, moon, octagon, oval, pentagon, polygon, rectangle, rocket, semicircle, spiral, star, starburst, sun, swallowtail, triangle };
|