shape-morph 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils.ts","../src/core/cubic.ts","../src/core/polygon.ts","../src/core/material-shapes.ts","../src/core/morph.ts","../src/output/clip-path.ts","../src/output/svg-path.ts"],"names":["square"],"mappings":"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","file":"index.cjs","sourcesContent":["// Ported from AOSP androidx.graphics.shapes\n\nexport const distanceEpsilon = 1e-4;\nexport const angleEpsilon = 1e-6;\nexport const relaxedDistanceEpsilon = 5e-3;\nexport const floatPi = Math.PI;\nexport const twoPi = 2 * Math.PI;\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport function pt(x: number, y: number): Point {\n return { x, y };\n}\n\nexport function ptDistance(p: Point): number {\n return Math.sqrt(p.x * p.x + p.y * p.y);\n}\n\nexport function ptDistanceSquared(p: Point): number {\n return p.x * p.x + p.y * p.y;\n}\n\nexport function ptDirection(p: Point): Point {\n const d = ptDistance(p);\n return { x: p.x / d, y: p.y / d };\n}\n\nexport function ptDot(a: Point, b: Point): number {\n return a.x * b.x + a.y * b.y;\n}\n\nexport function ptClockwise(a: Point, b: Point): boolean {\n return a.x * b.y - a.y * b.x > 0;\n}\n\nexport function ptRotate90(p: Point): Point {\n return { x: -p.y, y: p.x };\n}\n\nexport function ptSub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\nexport function ptAdd(a: Point, b: Point): Point {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function ptMul(p: Point, s: number): Point {\n return { x: p.x * s, y: p.y * s };\n}\n\nexport function ptDiv(p: Point, s: number): Point {\n return { x: p.x / s, y: p.y / s };\n}\n\nexport function distance(x: number, y: number): number {\n return Math.sqrt(x * x + y * y);\n}\n\nexport function distanceSquared(x: number, y: number): number {\n return x * x + y * y;\n}\n\nexport function directionVector(x: number, y: number): Point {\n const d = distance(x, y);\n return { x: x / d, y: y / d };\n}\n\nexport function directionVectorAngle(angleRadians: number): Point {\n return { x: Math.cos(angleRadians), y: Math.sin(angleRadians) };\n}\n\nexport function radialToCartesian(\n radius: number,\n angleRadians: number,\n center: Point = { x: 0, y: 0 }\n): Point {\n const d = directionVectorAngle(angleRadians);\n return { x: d.x * radius + center.x, y: d.y * radius + center.y };\n}\n\nexport function interpolate(\n start: number,\n stop: number,\n fraction: number\n): number {\n return (1 - fraction) * start + fraction * stop;\n}\n\nexport function interpolatePoint(\n start: Point,\n stop: Point,\n fraction: number\n): Point {\n return {\n x: interpolate(start.x, stop.x, fraction),\n y: interpolate(start.y, stop.y, fraction),\n };\n}\n\nexport function positiveModulo(num: number, mod: number): number {\n return ((num % mod) + mod) % mod;\n}\n\nexport function collinearIsh(\n aX: number,\n aY: number,\n bX: number,\n bY: number,\n cX: number,\n cY: number,\n tolerance: number = distanceEpsilon\n): boolean {\n const ab = ptRotate90({ x: bX - aX, y: bY - aY });\n const ac: Point = { x: cX - aX, y: cY - aY };\n const dotProduct = Math.abs(ptDot(ab, ac));\n const relativeTolerance = tolerance * ptDistance(ab) * ptDistance(ac);\n return dotProduct < tolerance || dotProduct < relativeTolerance;\n}\n\nexport function convex(previous: Point, current: Point, next: Point): boolean {\n return ptClockwise(ptSub(current, previous), ptSub(next, current));\n}\n\nexport function square(x: number): number {\n return x * x;\n}\n\nexport function findMinimum(\n v0: number,\n v1: number,\n tolerance: number,\n f: (value: number) => number\n): number {\n let a = v0;\n let b = v1;\n while (b - a > tolerance) {\n const c1 = (2 * a + b) / 3;\n const c2 = (2 * b + a) / 3;\n if (f(c1) < f(c2)) {\n b = c2;\n } else {\n a = c1;\n }\n }\n return (a + b) / 2;\n}\n","// Ported from AOSP androidx.graphics.shapes.Cubic\n\nimport {\n collinearIsh,\n directionVector,\n distance,\n distanceEpsilon,\n interpolate,\n convex as isConvex,\n type Point,\n pt,\n ptRotate90,\n relaxedDistanceEpsilon,\n} from \"./utils\";\n\n// find t-values where the cubic derivative is zero for one axis\nfunction axisExtremaTs(a: number, b: number, c: number): number[] {\n const zeroIsh = Math.abs(a) < distanceEpsilon;\n if (zeroIsh) {\n if (b !== 0) {\n const t = (2 * c) / (-2 * b);\n if (t >= 0 && t <= 1) {\n return [t];\n }\n }\n return [];\n }\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return [];\n }\n const sqrtD = Math.sqrt(discriminant);\n const results: number[] = [];\n for (const t of [(-b + sqrtD) / (2 * a), (-b - sqrtD) / (2 * a)]) {\n if (t >= 0 && t <= 1) {\n results.push(t);\n }\n }\n return results;\n}\n\nexport class Cubic {\n readonly points: Float64Array;\n\n constructor(points: Float64Array);\n constructor(\n ax0: number,\n ay0: number,\n cx0: number,\n cy0: number,\n cx1: number,\n cy1: number,\n ax1: number,\n ay1: number\n );\n constructor(\n a: Float64Array | number,\n b?: number,\n c?: number,\n d?: number,\n e?: number,\n f?: number,\n g?: number,\n h?: number\n ) {\n if (a instanceof Float64Array) {\n this.points = a;\n } else {\n this.points = new Float64Array([\n a,\n b as number,\n c as number,\n d as number,\n e as number,\n f as number,\n g as number,\n h as number,\n ]);\n }\n }\n\n get anchor0X(): number {\n return this.points[0];\n }\n get anchor0Y(): number {\n return this.points[1];\n }\n get control0X(): number {\n return this.points[2];\n }\n get control0Y(): number {\n return this.points[3];\n }\n get control1X(): number {\n return this.points[4];\n }\n get control1Y(): number {\n return this.points[5];\n }\n get anchor1X(): number {\n return this.points[6];\n }\n get anchor1Y(): number {\n return this.points[7];\n }\n\n pointOnCurve(t: number): Point {\n const u = 1 - t;\n return pt(\n this.anchor0X * (u * u * u) +\n this.control0X * (3 * t * u * u) +\n this.control1X * (3 * t * t * u) +\n this.anchor1X * (t * t * t),\n this.anchor0Y * (u * u * u) +\n this.control0Y * (3 * t * u * u) +\n this.control1Y * (3 * t * t * u) +\n this.anchor1Y * (t * t * t)\n );\n }\n\n zeroLength(): boolean {\n return (\n Math.abs(this.anchor0X - this.anchor1X) < distanceEpsilon &&\n Math.abs(this.anchor0Y - this.anchor1Y) < distanceEpsilon\n );\n }\n\n convexTo(next: Cubic): boolean {\n const prevVertex = pt(this.anchor0X, this.anchor0Y);\n const currVertex = pt(this.anchor1X, this.anchor1Y);\n const nextVertex = pt(next.anchor1X, next.anchor1Y);\n return isConvex(prevVertex, currVertex, nextVertex);\n }\n\n split(t: number): [Cubic, Cubic] {\n const u = 1 - t;\n const poc = this.pointOnCurve(t);\n return [\n new Cubic(\n this.anchor0X,\n this.anchor0Y,\n this.anchor0X * u + this.control0X * t,\n this.anchor0Y * u + this.control0Y * t,\n this.anchor0X * (u * u) +\n this.control0X * (2 * u * t) +\n this.control1X * (t * t),\n this.anchor0Y * (u * u) +\n this.control0Y * (2 * u * t) +\n this.control1Y * (t * t),\n poc.x,\n poc.y\n ),\n new Cubic(\n poc.x,\n poc.y,\n this.control0X * (u * u) +\n this.control1X * (2 * u * t) +\n this.anchor1X * (t * t),\n this.control0Y * (u * u) +\n this.control1Y * (2 * u * t) +\n this.anchor1Y * (t * t),\n this.control1X * u + this.anchor1X * t,\n this.control1Y * u + this.anchor1Y * t,\n this.anchor1X,\n this.anchor1Y\n ),\n ];\n }\n\n reverse(): Cubic {\n return new Cubic(\n this.anchor1X,\n this.anchor1Y,\n this.control1X,\n this.control1Y,\n this.control0X,\n this.control0Y,\n this.anchor0X,\n this.anchor0Y\n );\n }\n\n transformed(f: (x: number, y: number) => Point): Cubic {\n const newPoints = new Float64Array(8);\n for (let i = 0; i < 8; i += 2) {\n const r = f(this.points[i], this.points[i + 1]);\n newPoints[i] = r.x;\n newPoints[i + 1] = r.y;\n }\n return new Cubic(newPoints);\n }\n\n calculateBounds(approximate = true): [number, number, number, number] {\n if (this.zeroLength()) {\n return [this.anchor0X, this.anchor0Y, this.anchor0X, this.anchor0Y];\n }\n\n let minX = Math.min(this.anchor0X, this.anchor1X);\n let minY = Math.min(this.anchor0Y, this.anchor1Y);\n let maxX = Math.max(this.anchor0X, this.anchor1X);\n let maxY = Math.max(this.anchor0Y, this.anchor1Y);\n\n if (approximate) {\n return [\n Math.min(minX, Math.min(this.control0X, this.control1X)),\n Math.min(minY, Math.min(this.control0Y, this.control1Y)),\n Math.max(maxX, Math.max(this.control0X, this.control1X)),\n Math.max(maxY, Math.max(this.control0Y, this.control1Y)),\n ];\n }\n\n const xCoeffs = [\n -this.anchor0X + 3 * this.control0X - 3 * this.control1X + this.anchor1X,\n 2 * this.anchor0X - 4 * this.control0X + 2 * this.control1X,\n -this.anchor0X + this.control0X,\n ] as const;\n\n for (const t of axisExtremaTs(...xCoeffs)) {\n const v = this.pointOnCurve(t).x;\n minX = Math.min(minX, v);\n maxX = Math.max(maxX, v);\n }\n\n const yCoeffs = [\n -this.anchor0Y + 3 * this.control0Y - 3 * this.control1Y + this.anchor1Y,\n 2 * this.anchor0Y - 4 * this.control0Y + 2 * this.control1Y,\n -this.anchor0Y + this.control0Y,\n ] as const;\n\n for (const t of axisExtremaTs(...yCoeffs)) {\n const v = this.pointOnCurve(t).y;\n minY = Math.min(minY, v);\n maxY = Math.max(maxY, v);\n }\n\n return [minX, minY, maxX, maxY];\n }\n\n static straightLine(x0: number, y0: number, x1: number, y1: number): Cubic {\n return new Cubic(\n x0,\n y0,\n interpolate(x0, x1, 1 / 3),\n interpolate(y0, y1, 1 / 3),\n interpolate(x0, x1, 2 / 3),\n interpolate(y0, y1, 2 / 3),\n x1,\n y1\n );\n }\n\n static circularArc(\n centerX: number,\n centerY: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number\n ): Cubic {\n const p0d = directionVector(x0 - centerX, y0 - centerY);\n const p1d = directionVector(x1 - centerX, y1 - centerY);\n const rotatedP0 = ptRotate90(p0d);\n const rotatedP1 = ptRotate90(p1d);\n const clockwise =\n rotatedP0.x * (x1 - centerX) + rotatedP0.y * (y1 - centerY) >= 0;\n const cosa = p0d.x * p1d.x + p0d.y * p1d.y;\n if (cosa > 0.999) {\n return Cubic.straightLine(x0, y0, x1, y1);\n }\n const k =\n ((distance(x0 - centerX, y0 - centerY) *\n 4 *\n (Math.sqrt(2 * (1 - cosa)) - Math.sqrt(1 - cosa * cosa))) /\n (3 * (1 - cosa))) *\n (clockwise ? 1 : -1);\n return new Cubic(\n x0,\n y0,\n x0 + rotatedP0.x * k,\n y0 + rotatedP0.y * k,\n x1 - rotatedP1.x * k,\n y1 - rotatedP1.y * k,\n x1,\n y1\n );\n }\n\n static empty(x0: number, y0: number): Cubic {\n return new Cubic(x0, y0, x0, y0, x0, y0, x0, y0);\n }\n}\n\n// feature detection helpers ported from FeatureDetector.kt\n\nexport function straightIsh(c: Cubic): boolean {\n return (\n !c.zeroLength() &&\n collinearIsh(\n c.anchor0X,\n c.anchor0Y,\n c.anchor1X,\n c.anchor1Y,\n c.control0X,\n c.control0Y,\n relaxedDistanceEpsilon\n ) &&\n collinearIsh(\n c.anchor0X,\n c.anchor0Y,\n c.anchor1X,\n c.anchor1Y,\n c.control1X,\n c.control1Y,\n relaxedDistanceEpsilon\n )\n );\n}\n\nexport function smoothesIntoIsh(c: Cubic, next: Cubic): boolean {\n return collinearIsh(\n c.control1X,\n c.control1Y,\n next.control0X,\n next.control0Y,\n c.anchor1X,\n c.anchor1Y,\n relaxedDistanceEpsilon\n );\n}\n\nexport function alignsIshWith(c: Cubic, next: Cubic): boolean {\n return (\n (straightIsh(c) && straightIsh(next) && smoothesIntoIsh(c, next)) ||\n c.zeroLength() ||\n next.zeroLength()\n );\n}\n\nfunction extendCubic(a: Cubic, b: Cubic): Cubic {\n if (a.zeroLength()) {\n return new Cubic(\n a.anchor0X,\n a.anchor0Y,\n b.control0X,\n b.control0Y,\n b.control1X,\n b.control1Y,\n b.anchor1X,\n b.anchor1Y\n );\n }\n return new Cubic(\n a.anchor0X,\n a.anchor0Y,\n a.control0X,\n a.control0Y,\n a.control1X,\n a.control1Y,\n b.anchor1X,\n b.anchor1Y\n );\n}\n\nexport function cubicAsFeature(c: Cubic, next: Cubic): Feature {\n if (straightIsh(c)) {\n return { type: \"edge\", cubics: [c] };\n }\n return { type: \"corner\", cubics: [c], convex: c.convexTo(next) };\n}\n\nexport function detectFeatures(cubics: Cubic[]): Feature[] {\n if (cubics.length === 0) {\n return [];\n }\n const result: Feature[] = [];\n let current = cubics[0];\n\n for (let i = 0; i < cubics.length; i++) {\n const next = cubics[(i + 1) % cubics.length];\n if (i < cubics.length - 1 && alignsIshWith(current, next)) {\n current = extendCubic(current, next);\n continue;\n }\n result.push(cubicAsFeature(current, next));\n if (!smoothesIntoIsh(current, next)) {\n result.push(\n cubicAsFeature(Cubic.empty(current.anchor1X, current.anchor1Y), next)\n );\n }\n current = next;\n }\n return result;\n}\n\n// feature types\n\nexport type Feature =\n | { type: \"edge\"; cubics: Cubic[] }\n | { type: \"corner\"; cubics: Cubic[]; convex: boolean };\n\nexport function featureTransformed(\n f: Feature,\n transform: (x: number, y: number) => Point\n): Feature {\n const newCubics = f.cubics.map((c) => c.transformed(transform));\n if (f.type === \"edge\") {\n return { type: \"edge\", cubics: newCubics };\n }\n return { type: \"corner\", cubics: newCubics, convex: f.convex };\n}\n\nexport function featureReversed(f: Feature): Feature {\n const reversedCubics = [...f.cubics].reverse().map((c) => c.reverse());\n if (f.type === \"edge\") {\n return { type: \"edge\", cubics: reversedCubics };\n }\n return { type: \"corner\", cubics: reversedCubics, convex: !f.convex };\n}\n","// Ported from AOSP androidx.graphics.shapes.RoundedPolygon\n\nimport { Cubic, type Feature, featureTransformed } from \"./cubic\";\nimport {\n directionVector,\n distance,\n distanceEpsilon,\n distanceSquared,\n floatPi,\n interpolatePoint,\n type Point,\n pt,\n ptAdd,\n ptDirection,\n ptDistance,\n ptDiv,\n ptDot,\n ptMul,\n ptRotate90,\n ptSub,\n radialToCartesian,\n square,\n} from \"./utils\";\n\nexport interface CornerRounding {\n radius: number;\n smoothing: number;\n}\n\nexport const unrounded: CornerRounding = { radius: 0, smoothing: 0 };\n\nexport function cornerRounding(radius: number, smoothing = 0): CornerRounding {\n return { radius, smoothing };\n}\n\nexport class RoundedPolygon {\n readonly features: Feature[];\n readonly center: Point;\n readonly cubics: Cubic[];\n\n constructor(features: Feature[], center: Point) {\n this.features = features;\n this.center = center;\n this.cubics = buildCubicList(features, center);\n }\n\n get centerX(): number {\n return this.center.x;\n }\n get centerY(): number {\n return this.center.y;\n }\n\n transformed(f: (x: number, y: number) => Point): RoundedPolygon {\n const newCenter = f(this.center.x, this.center.y);\n const newFeatures = this.features.map((feat) =>\n featureTransformed(feat, f)\n );\n return new RoundedPolygon(newFeatures, newCenter);\n }\n\n normalized(): RoundedPolygon {\n const bounds = this.calculateBounds();\n const width = bounds[2] - bounds[0];\n const height = bounds[3] - bounds[1];\n const side = Math.max(width, height);\n const offsetX = (side - width) / 2 - bounds[0];\n const offsetY = (side - height) / 2 - bounds[1];\n return this.transformed((x, y) =>\n pt((x + offsetX) / side, (y + offsetY) / side)\n );\n }\n\n calculateBounds(approximate = true): [number, number, number, number] {\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const cubic of this.cubics) {\n const b = cubic.calculateBounds(approximate);\n minX = Math.min(minX, b[0]);\n minY = Math.min(minY, b[1]);\n maxX = Math.max(maxX, b[2]);\n maxY = Math.max(maxY, b[3]);\n }\n return [minX, minY, maxX, maxY];\n }\n\n calculateMaxBounds(): [number, number, number, number] {\n let maxDistSq = 0;\n for (const cubic of this.cubics) {\n const anchorDist = distanceSquared(\n cubic.anchor0X - this.centerX,\n cubic.anchor0Y - this.centerY\n );\n const mid = cubic.pointOnCurve(0.5);\n const midDist = distanceSquared(\n mid.x - this.centerX,\n mid.y - this.centerY\n );\n maxDistSq = Math.max(maxDistSq, Math.max(anchorDist, midDist));\n }\n const d = Math.sqrt(maxDistSq);\n return [\n this.centerX - d,\n this.centerY - d,\n this.centerX + d,\n this.centerY + d,\n ];\n }\n}\n\n// resolve which cubics to process for a given iteration index\nfunction resolveFeatureCubics(\n features: Feature[],\n index: number,\n splitStart: Cubic[] | null,\n splitEnd: Cubic[] | null\n): Cubic[] | null {\n if (index === 0 && splitEnd) {\n return splitEnd;\n }\n if (index === features.length) {\n return splitStart;\n }\n return features[index].cubics;\n}\n\nfunction processCubic(\n cubic: Cubic,\n state: { first: Cubic | null; last: Cubic | null; result: Cubic[] }\n): void {\n if (cubic.zeroLength()) {\n if (state.last) {\n const newPoints: Float64Array = new Float64Array(state.last.points);\n newPoints[6] = cubic.anchor1X;\n newPoints[7] = cubic.anchor1Y;\n state.last = new Cubic(newPoints);\n }\n return;\n }\n if (state.last) {\n state.result.push(state.last);\n }\n state.last = cubic;\n if (!state.first) {\n state.first = cubic;\n }\n}\n\nfunction buildCubicList(features: Feature[], center: Point): Cubic[] {\n let splitStart: Cubic[] | null = null;\n let splitEnd: Cubic[] | null = null;\n\n if (features.length > 0 && features[0].cubics.length === 3) {\n const centerCubic = features[0].cubics[1];\n const [start, end] = centerCubic.split(0.5);\n splitStart = [features[0].cubics[0], start];\n splitEnd = [end, features[0].cubics[2]];\n }\n\n const state = {\n first: null as Cubic | null,\n last: null as Cubic | null,\n result: [] as Cubic[],\n };\n\n for (let i = 0; i <= features.length; i++) {\n const featureCubics = resolveFeatureCubics(\n features,\n i,\n splitStart,\n splitEnd\n );\n if (!featureCubics) {\n break;\n }\n for (const cubic of featureCubics) {\n processCubic(cubic, state);\n }\n }\n\n if (state.last && state.first) {\n state.result.push(\n new Cubic(\n state.last.anchor0X,\n state.last.anchor0Y,\n state.last.control0X,\n state.last.control0Y,\n state.last.control1X,\n state.last.control1Y,\n state.first.anchor0X,\n state.first.anchor0Y\n )\n );\n } else {\n state.result.push(Cubic.empty(center.x, center.y));\n }\n\n return state.result;\n}\n\nclass RoundedCorner {\n d1: Point;\n d2: Point;\n cornerRadius: number;\n smoothing: number;\n cosAngle: number;\n sinAngle: number;\n expectedRoundCut: number;\n center: Point = pt(0, 0);\n p0: Point;\n p1: Point;\n p2: Point;\n\n constructor(p0: Point, p1: Point, p2: Point, rounding: CornerRounding) {\n this.p0 = p0;\n this.p1 = p1;\n this.p2 = p2;\n const v01 = ptSub(p0, p1);\n const v21 = ptSub(p2, p1);\n const d01 = ptDistance(v01);\n const d21 = ptDistance(v21);\n\n if (d01 > 0 && d21 > 0) {\n this.d1 = ptDiv(v01, d01);\n this.d2 = ptDiv(v21, d21);\n this.cornerRadius = rounding.radius;\n this.smoothing = rounding.smoothing;\n this.cosAngle = ptDot(this.d1, this.d2);\n this.sinAngle = Math.sqrt(1 - square(this.cosAngle));\n this.expectedRoundCut =\n this.sinAngle > 1e-3\n ? (this.cornerRadius * (this.cosAngle + 1)) / this.sinAngle\n : 0;\n } else {\n this.d1 = pt(0, 0);\n this.d2 = pt(0, 0);\n this.cornerRadius = 0;\n this.smoothing = 0;\n this.cosAngle = 0;\n this.sinAngle = 0;\n this.expectedRoundCut = 0;\n }\n }\n\n get expectedCut(): number {\n return (1 + this.smoothing) * this.expectedRoundCut;\n }\n\n private calculateActualSmoothingValue(allowedCut: number): number {\n if (allowedCut > this.expectedCut) {\n return this.smoothing;\n }\n if (allowedCut > this.expectedRoundCut) {\n return (\n (this.smoothing * (allowedCut - this.expectedRoundCut)) /\n (this.expectedCut - this.expectedRoundCut)\n );\n }\n return 0;\n }\n\n private lineIntersection(\n p0: Point,\n d0: Point,\n p1: Point,\n d1: Point\n ): Point | null {\n const rotatedD1 = ptRotate90(d1);\n const den = ptDot(d0, rotatedD1);\n if (Math.abs(den) < distanceEpsilon) {\n return null;\n }\n const diff = ptSub(p1, p0);\n const num = ptDot(diff, rotatedD1);\n if (Math.abs(den) < distanceEpsilon * Math.abs(num)) {\n return null;\n }\n const k = num / den;\n return ptAdd(p0, ptMul(d0, k));\n }\n\n private computeFlankingCurve(\n actualRoundCut: number,\n actualSmoothingValues: number,\n corner: Point,\n sideStart: Point,\n circleSegmentIntersection: Point,\n otherCircleSegmentIntersection: Point,\n circleCenter: Point,\n actualR: number\n ): Cubic {\n const sideDirection = ptDirection(ptSub(sideStart, corner));\n const curveStart = ptAdd(\n corner,\n ptMul(sideDirection, actualRoundCut * (1 + actualSmoothingValues))\n );\n const p = interpolatePoint(\n circleSegmentIntersection,\n ptDiv(\n ptAdd(circleSegmentIntersection, otherCircleSegmentIntersection),\n 2\n ),\n actualSmoothingValues\n );\n const curveEnd = ptAdd(\n circleCenter,\n ptMul(\n directionVector(p.x - circleCenter.x, p.y - circleCenter.y),\n actualR\n )\n );\n const circleTangent = ptRotate90(ptSub(curveEnd, circleCenter));\n const anchorEnd =\n this.lineIntersection(\n sideStart,\n sideDirection,\n curveEnd,\n circleTangent\n ) ?? circleSegmentIntersection;\n const anchorStart = ptDiv(ptAdd(curveStart, ptMul(anchorEnd, 2)), 3);\n return new Cubic(\n curveStart.x,\n curveStart.y,\n anchorStart.x,\n anchorStart.y,\n anchorEnd.x,\n anchorEnd.y,\n curveEnd.x,\n curveEnd.y\n );\n }\n\n getCubics(allowedCut0: number, allowedCut1: number = allowedCut0): Cubic[] {\n const allowedCut = Math.min(allowedCut0, allowedCut1);\n if (\n this.expectedRoundCut < distanceEpsilon ||\n allowedCut < distanceEpsilon ||\n this.cornerRadius < distanceEpsilon\n ) {\n this.center = this.p1;\n return [Cubic.straightLine(this.p1.x, this.p1.y, this.p1.x, this.p1.y)];\n }\n\n const actualRoundCut = Math.min(allowedCut, this.expectedRoundCut);\n const actualSmoothing0 = this.calculateActualSmoothingValue(allowedCut0);\n const actualSmoothing1 = this.calculateActualSmoothingValue(allowedCut1);\n const actualR =\n this.cornerRadius * (actualRoundCut / this.expectedRoundCut);\n const centerDistance = Math.sqrt(square(actualR) + square(actualRoundCut));\n const halfDir = ptDiv(ptAdd(this.d1, this.d2), 2);\n const halfDirNorm = ptDirection(halfDir);\n this.center = ptAdd(this.p1, ptMul(halfDirNorm, centerDistance));\n const circleIntersection0 = ptAdd(this.p1, ptMul(this.d1, actualRoundCut));\n const circleIntersection2 = ptAdd(this.p1, ptMul(this.d2, actualRoundCut));\n\n const flanking0 = this.computeFlankingCurve(\n actualRoundCut,\n actualSmoothing0,\n this.p1,\n this.p0,\n circleIntersection0,\n circleIntersection2,\n this.center,\n actualR\n );\n const flanking2 = this.computeFlankingCurve(\n actualRoundCut,\n actualSmoothing1,\n this.p1,\n this.p2,\n circleIntersection2,\n circleIntersection0,\n this.center,\n actualR\n ).reverse();\n\n return [\n flanking0,\n Cubic.circularArc(\n this.center.x,\n this.center.y,\n flanking0.anchor1X,\n flanking0.anchor1Y,\n flanking2.anchor0X,\n flanking2.anchor0Y\n ),\n flanking2,\n ];\n }\n}\n\nfunction calculateCenter(vertices: number[]): Point {\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < vertices.length; i += 2) {\n cx += vertices[i];\n cy += vertices[i + 1];\n }\n const n = vertices.length / 2;\n return pt(cx / n, cy / n);\n}\n\nfunction verticesFromNumVerts(\n numVertices: number,\n radius: number,\n centerX: number,\n centerY: number\n): number[] {\n const result: number[] = [];\n for (let i = 0; i < numVertices; i++) {\n const v = radialToCartesian(\n radius,\n (floatPi / numVertices) * 2 * i,\n pt(centerX, centerY)\n );\n result.push(v.x, v.y);\n }\n return result;\n}\n\nexport function createPolygonFromVertices(\n vertices: number[],\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null,\n centerX: number = Number.MIN_VALUE,\n centerY: number = Number.MIN_VALUE\n): RoundedPolygon {\n const n = vertices.length / 2;\n const roundedCorners: RoundedCorner[] = [];\n\n for (let i = 0; i < n; i++) {\n const vtxRounding = perVertexRounding?.[i] ?? rounding;\n const prevIndex = ((i + n - 1) % n) * 2;\n const nextIndex = ((i + 1) % n) * 2;\n roundedCorners.push(\n new RoundedCorner(\n pt(vertices[prevIndex], vertices[prevIndex + 1]),\n pt(vertices[i * 2], vertices[i * 2 + 1]),\n pt(vertices[nextIndex], vertices[nextIndex + 1]),\n vtxRounding\n )\n );\n }\n\n // calc cut adjustments\n const cutAdjusts: [number, number][] = [];\n for (let ix = 0; ix < n; ix++) {\n const expectedRoundCut =\n roundedCorners[ix].expectedRoundCut +\n roundedCorners[(ix + 1) % n].expectedRoundCut;\n const expectedCut =\n roundedCorners[ix].expectedCut + roundedCorners[(ix + 1) % n].expectedCut;\n const vtxX = vertices[ix * 2];\n const vtxY = vertices[ix * 2 + 1];\n const nextVtxX = vertices[((ix + 1) % n) * 2];\n const nextVtxY = vertices[((ix + 1) % n) * 2 + 1];\n const sideSize = distance(vtxX - nextVtxX, vtxY - nextVtxY);\n\n if (expectedRoundCut > sideSize) {\n cutAdjusts.push([sideSize / expectedRoundCut, 0]);\n } else if (expectedCut > sideSize) {\n cutAdjusts.push([\n 1,\n (sideSize - expectedRoundCut) / (expectedCut - expectedRoundCut),\n ]);\n } else {\n cutAdjusts.push([1, 1]);\n }\n }\n\n const corners: Cubic[][] = [];\n for (let i = 0; i < n; i++) {\n const allowedCuts: number[] = [];\n for (let delta = 0; delta <= 1; delta++) {\n const [roundCutRatio, cutRatio] = cutAdjusts[(i + n - 1 + delta) % n];\n allowedCuts.push(\n roundedCorners[i].expectedRoundCut * roundCutRatio +\n (roundedCorners[i].expectedCut - roundedCorners[i].expectedRoundCut) *\n cutRatio\n );\n }\n corners.push(roundedCorners[i].getCubics(allowedCuts[0], allowedCuts[1]));\n }\n\n const tempFeatures: Feature[] = [];\n for (let i = 0; i < n; i++) {\n const prevVtxIndex = (i + n - 1) % n;\n const nextVtxIndex = (i + 1) % n;\n const currVertex = pt(vertices[i * 2], vertices[i * 2 + 1]);\n const prevVertex = pt(\n vertices[prevVtxIndex * 2],\n vertices[prevVtxIndex * 2 + 1]\n );\n const nextVertex = pt(\n vertices[nextVtxIndex * 2],\n vertices[nextVtxIndex * 2 + 1]\n );\n const isConvex = convexFn(prevVertex, currVertex, nextVertex);\n tempFeatures.push({ type: \"corner\", cubics: corners[i], convex: isConvex });\n tempFeatures.push({\n type: \"edge\",\n cubics: [\n Cubic.straightLine(\n corners[i][corners[i].length - 1].anchor1X,\n corners[i][corners[i].length - 1].anchor1Y,\n corners[(i + 1) % n][0].anchor0X,\n corners[(i + 1) % n][0].anchor0Y\n ),\n ],\n });\n }\n\n const center =\n centerX === Number.MIN_VALUE || centerY === Number.MIN_VALUE\n ? calculateCenter(vertices)\n : pt(centerX, centerY);\n\n return new RoundedPolygon(tempFeatures, center);\n}\n\nfunction convexFn(prev: Point, curr: Point, next: Point): boolean {\n const v1 = ptSub(curr, prev);\n const v2 = ptSub(next, curr);\n return v1.x * v2.y - v1.y * v2.x > 0;\n}\n\nexport function createPolygon(\n numVertices: number,\n radius = 1,\n centerX = 0,\n centerY = 0,\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null\n): RoundedPolygon {\n const vertices = verticesFromNumVerts(numVertices, radius, centerX, centerY);\n return createPolygonFromVertices(\n vertices,\n rounding,\n perVertexRounding,\n centerX,\n centerY\n );\n}\n\nexport function createCircle(\n numVertices = 8,\n radius = 1,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n const theta = floatPi / numVertices;\n const polygonRadius = radius / Math.cos(theta);\n return createPolygon(\n numVertices,\n polygonRadius,\n centerX,\n centerY,\n cornerRounding(radius)\n );\n}\n\nexport function createRectangle(\n width = 2,\n height = 2,\n rounding: CornerRounding = unrounded,\n perVertexRounding: CornerRounding[] | null = null,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n const left = centerX - width / 2;\n const top = centerY - height / 2;\n const right = centerX + width / 2;\n const bottom = centerY + height / 2;\n return createPolygonFromVertices(\n [right, bottom, left, bottom, left, top, right, top],\n rounding,\n perVertexRounding,\n centerX,\n centerY\n );\n}\n\nfunction starVerticesFromNumVerts(\n numVerticesPerRadius: number,\n radius: number,\n innerRadius: number,\n centerX: number,\n centerY: number\n): number[] {\n const result: number[] = [];\n for (let i = 0; i < numVerticesPerRadius; i++) {\n let v = radialToCartesian(radius, (floatPi / numVerticesPerRadius) * 2 * i);\n result.push(v.x + centerX, v.y + centerY);\n v = radialToCartesian(\n innerRadius,\n (floatPi / numVerticesPerRadius) * (2 * i + 1)\n );\n result.push(v.x + centerX, v.y + centerY);\n }\n return result;\n}\n\nexport function createStar(\n numVerticesPerRadius: number,\n radius = 1,\n innerRadius = 0.5,\n rounding: CornerRounding = unrounded,\n innerRounding: CornerRounding | null = null,\n perVertexRounding: CornerRounding[] | null = null,\n centerX = 0,\n centerY = 0\n): RoundedPolygon {\n let pvRounding = perVertexRounding;\n if (!pvRounding && innerRounding) {\n pvRounding = [];\n for (let i = 0; i < numVerticesPerRadius; i++) {\n pvRounding.push(rounding, innerRounding);\n }\n }\n const vertices = starVerticesFromNumVerts(\n numVerticesPerRadius,\n radius,\n innerRadius,\n centerX,\n centerY\n );\n return createPolygonFromVertices(\n vertices,\n rounding,\n pvRounding,\n centerX,\n centerY\n );\n}\n","// Ported from AOSP MaterialShapes.kt\n\n// all 37 Material Design 3 predefined shapes\n\nimport {\n type CornerRounding,\n cornerRounding,\n createCircle,\n createPolygonFromVertices,\n createRectangle,\n createStar,\n type RoundedPolygon,\n unrounded,\n} from \"./polygon\";\nimport { floatPi } from \"./utils\";\n\n// helpers\n\ninterface PointNRound {\n x: number;\n y: number;\n r: CornerRounding;\n}\n\nfunction pnr(x: number, y: number, r: CornerRounding = unrounded): PointNRound {\n return { x, y, r };\n}\n\nfunction angleDegrees(x: number, y: number): number {\n return (Math.atan2(y, x) * 180) / floatPi;\n}\n\nfunction toRadians(degrees: number): number {\n return (degrees / 360) * 2 * floatPi;\n}\n\nfunction distancePt(x: number, y: number): number {\n return Math.sqrt(x * x + y * y);\n}\n\nfunction rotateDegrees(\n px: number,\n py: number,\n angle: number,\n cx = 0,\n cy = 0\n): [number, number] {\n const a = toRadians(angle);\n const ox = px - cx;\n const oy = py - cy;\n return [\n ox * Math.cos(a) - oy * Math.sin(a) + cx,\n ox * Math.sin(a) + oy * Math.cos(a) + cy,\n ];\n}\n\nfunction doRepeatMirrored(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number\n): PointNRound[] {\n const angles = points.map((p) => angleDegrees(p.x - centerX, p.y - centerY));\n const distances = points.map((p) => distancePt(p.x - centerX, p.y - centerY));\n const actualReps = reps * 2;\n const sectionAngle = 360 / actualReps;\n const result: PointNRound[] = [];\n\n for (let it = 0; it < actualReps; it++) {\n const mirrored = it % 2 !== 0;\n for (let index = 0; index < points.length; index++) {\n const i = mirrored ? points.length - 1 - index : index;\n if (i > 0 || !mirrored) {\n const angleOffset = mirrored\n ? sectionAngle - angles[i] + 2 * angles[0]\n : angles[i];\n const a = toRadians(sectionAngle * it + angleOffset);\n const finalX = Math.cos(a) * distances[i] + centerX;\n const finalY = Math.sin(a) * distances[i] + centerY;\n result.push(pnr(finalX, finalY, points[i].r));\n }\n }\n }\n return result;\n}\n\nfunction doRepeatRotated(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number\n): PointNRound[] {\n const np = points.length;\n const result: PointNRound[] = [];\n for (let it = 0; it < np * reps; it++) {\n const srcPoint = points[it % np];\n const [rx, ry] = rotateDegrees(\n srcPoint.x,\n srcPoint.y,\n Math.floor(it / np) * (360 / reps),\n centerX,\n centerY\n );\n result.push(pnr(rx, ry, srcPoint.r));\n }\n return result;\n}\n\nfunction doRepeat(\n points: PointNRound[],\n reps: number,\n centerX: number,\n centerY: number,\n mirroring: boolean\n): PointNRound[] {\n if (mirroring) {\n return doRepeatMirrored(points, reps, centerX, centerY);\n }\n return doRepeatRotated(points, reps, centerX, centerY);\n}\n\nfunction customPolygon(\n points: PointNRound[],\n reps: number,\n centerX = 0.5,\n centerY = 0.5,\n mirroring = false\n): RoundedPolygon {\n const actualPoints = doRepeat(points, reps, centerX, centerY, mirroring);\n const vertices: number[] = [];\n const pvRounding: CornerRounding[] = [];\n for (const p of actualPoints) {\n vertices.push(p.x, p.y);\n pvRounding.push(p.r);\n }\n return createPolygonFromVertices(\n vertices,\n unrounded,\n pvRounding,\n centerX,\n centerY\n );\n}\n\nfunction rotatePolygon(\n polygon: RoundedPolygon,\n degrees: number\n): RoundedPolygon {\n const rad = toRadians(degrees);\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n return polygon.transformed((x, y) => ({\n x: x * cos - y * sin,\n y: x * sin + y * cos,\n }));\n}\n\n// shared rounding values\n\nconst r15 = cornerRounding(0.15);\nconst r20 = cornerRounding(0.2);\nconst r30 = cornerRounding(0.3);\nconst r50 = cornerRounding(0.5);\nconst r100 = cornerRounding(1);\n\n// shape factory func\n\nfunction circle(): RoundedPolygon {\n return createCircle(10);\n}\n\nfunction square(): RoundedPolygon {\n return createRectangle(1, 1, r30);\n}\n\nfunction slanted(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.926, 0.97, cornerRounding(0.189, 0.811)),\n pnr(-0.021, 0.967, cornerRounding(0.187, 0.057)),\n ],\n 2\n );\n}\n\nfunction arch(): RoundedPolygon {\n return rotatePolygon(\n createPolygonFromVertices(\n // 4 vertices for a square, manually positioning\n (() => {\n const r = 1;\n const verts: number[] = [];\n for (let i = 0; i < 4; i++) {\n const angle = (floatPi / 4) * 2 * i;\n verts.push(Math.cos(angle) * r, Math.sin(angle) * r);\n }\n return verts;\n })(),\n unrounded,\n [r100, r100, r20, r20],\n 0,\n 0\n ),\n -135\n );\n}\n\nfunction fan(): RoundedPolygon {\n return customPolygon(\n [\n pnr(1.004, 1.0, cornerRounding(0.148, 0.417)),\n pnr(0.0, 1.0, cornerRounding(0.151)),\n pnr(0.0, -0.003, cornerRounding(0.148)),\n pnr(0.978, 0.02, cornerRounding(0.803)),\n ],\n 1\n );\n}\n\nfunction arrow(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.892, cornerRounding(0.313)),\n pnr(-0.216, 1.05, cornerRounding(0.207)),\n pnr(0.499, -0.16, cornerRounding(0.215, 1.0)),\n pnr(1.225, 1.06, cornerRounding(0.211)),\n ],\n 1\n );\n}\n\nfunction semiCircle(): RoundedPolygon {\n return createRectangle(1.6, 1, unrounded, [r20, r20, r100, r100]);\n}\n\nfunction oval(): RoundedPolygon {\n const scaled = createCircle().transformed((x, y) => ({ x, y: y * 0.64 }));\n return rotatePolygon(scaled, -45);\n}\n\nfunction pill(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.961, 0.039, cornerRounding(0.426)),\n pnr(1.001, 0.428),\n pnr(1.0, 0.609, cornerRounding(1.0)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction triangle(): RoundedPolygon {\n return rotatePolygon(\n createPolygonFromVertices(\n (() => {\n const verts: number[] = [];\n for (let i = 0; i < 3; i++) {\n verts.push(\n Math.cos((floatPi / 3) * 2 * i),\n Math.sin((floatPi / 3) * 2 * i)\n );\n }\n return verts;\n })(),\n r20,\n null,\n 0,\n 0\n ),\n -90\n );\n}\n\nfunction diamond(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 1.096, cornerRounding(0.151, 0.524)),\n pnr(0.04, 0.5, cornerRounding(0.159)),\n ],\n 2\n );\n}\n\nfunction clamShell(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.171, 0.841, cornerRounding(0.159)),\n pnr(-0.02, 0.5, cornerRounding(0.14)),\n pnr(0.17, 0.159, cornerRounding(0.159)),\n ],\n 2\n );\n}\n\nfunction pentagon(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, -0.009, cornerRounding(0.172)),\n pnr(1.03, 0.365, cornerRounding(0.164)),\n pnr(0.828, 0.97, cornerRounding(0.169)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction gem(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.499, 1.023, cornerRounding(0.241, 0.778)),\n pnr(-0.005, 0.792, cornerRounding(0.208)),\n pnr(0.073, 0.258, cornerRounding(0.228)),\n pnr(0.433, 0.0, cornerRounding(0.491)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction sunny(): RoundedPolygon {\n return createStar(8, 1, 0.8, r15);\n}\n\nfunction verySunny(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 1.08, cornerRounding(0.085)),\n pnr(0.358, 0.843, cornerRounding(0.085)),\n ],\n 8\n );\n}\n\nfunction cookie4(): RoundedPolygon {\n return customPolygon(\n [\n pnr(1.237, 1.236, cornerRounding(0.258)),\n pnr(0.5, 0.918, cornerRounding(0.233)),\n ],\n 4\n );\n}\n\nfunction cookie6(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.723, 0.884, cornerRounding(0.394)),\n pnr(0.5, 1.099, cornerRounding(0.398)),\n ],\n 6\n );\n}\n\nfunction cookie7(): RoundedPolygon {\n return rotatePolygon(createStar(7, 1, 0.75, r50), -90);\n}\n\nfunction cookie9(): RoundedPolygon {\n return rotatePolygon(createStar(9, 1, 0.8, r50), -90);\n}\n\nfunction cookie12(): RoundedPolygon {\n return rotatePolygon(createStar(12, 1, 0.8, r50), -90);\n}\n\nfunction ghostish(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0, cornerRounding(1.0)),\n pnr(1, 0, cornerRounding(1.0)),\n pnr(1, 1.14, cornerRounding(0.254, 0.106)),\n pnr(0.575, 0.906, cornerRounding(0.253)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction clover4(): RoundedPolygon {\n return customPolygon(\n [pnr(0.5, 0.074), pnr(0.725, -0.099, cornerRounding(0.476))],\n 4,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction clover8(): RoundedPolygon {\n return customPolygon(\n [pnr(0.5, 0.036), pnr(0.758, -0.101, cornerRounding(0.209))],\n 8\n );\n}\n\nfunction burst(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, -0.006, cornerRounding(0.006)),\n pnr(0.592, 0.158, cornerRounding(0.006)),\n ],\n 12\n );\n}\n\nfunction softBurst(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.193, 0.277, cornerRounding(0.053)),\n pnr(0.176, 0.055, cornerRounding(0.053)),\n ],\n 10\n );\n}\n\nfunction boom(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.457, 0.296, cornerRounding(0.007)),\n pnr(0.5, -0.051, cornerRounding(0.007)),\n ],\n 15\n );\n}\n\nfunction softBoom(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.733, 0.454),\n pnr(0.839, 0.437, cornerRounding(0.532)),\n pnr(0.949, 0.449, cornerRounding(0.439, 1.0)),\n pnr(0.998, 0.478, cornerRounding(0.174)),\n ],\n 16,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction flower(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.37, 0.187),\n pnr(0.416, 0.049, cornerRounding(0.381)),\n pnr(0.479, 0.001, cornerRounding(0.095)),\n ],\n 8,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction puffy(): RoundedPolygon {\n const base = customPolygon(\n [\n pnr(0.5, 0.053),\n pnr(0.545, -0.04, cornerRounding(0.405)),\n pnr(0.67, -0.035, cornerRounding(0.426)),\n pnr(0.717, 0.066, cornerRounding(0.574)),\n pnr(0.722, 0.128),\n pnr(0.777, 0.002, cornerRounding(0.36)),\n pnr(0.914, 0.149, cornerRounding(0.66)),\n pnr(0.926, 0.289, cornerRounding(0.66)),\n pnr(0.881, 0.346),\n pnr(0.94, 0.344, cornerRounding(0.126)),\n pnr(1.003, 0.437, cornerRounding(0.255)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n return base.transformed((x, y) => ({ x, y: y * 0.742 }));\n}\n\nfunction puffyDiamond(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.87, 0.13, cornerRounding(0.146)),\n pnr(0.818, 0.357),\n pnr(1.0, 0.332, cornerRounding(0.853)),\n ],\n 4,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction pixelCircle(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.0),\n pnr(0.704, 0.0),\n pnr(0.704, 0.065),\n pnr(0.843, 0.065),\n pnr(0.843, 0.148),\n pnr(0.926, 0.148),\n pnr(0.926, 0.296),\n pnr(1.0, 0.296),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction pixelTriangle(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.11, 0.5),\n pnr(0.113, 0.0),\n pnr(0.287, 0.0),\n pnr(0.287, 0.087),\n pnr(0.421, 0.087),\n pnr(0.421, 0.17),\n pnr(0.56, 0.17),\n pnr(0.56, 0.265),\n pnr(0.674, 0.265),\n pnr(0.675, 0.344),\n pnr(0.789, 0.344),\n pnr(0.789, 0.439),\n pnr(0.888, 0.439),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction bun(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.796, 0.5),\n pnr(0.853, 0.518, cornerRounding(1)),\n pnr(0.992, 0.631, cornerRounding(1)),\n pnr(0.968, 1.0, cornerRounding(1)),\n ],\n 2,\n 0.5,\n 0.5,\n true\n );\n}\n\nfunction heart(): RoundedPolygon {\n return customPolygon(\n [\n pnr(0.5, 0.268, cornerRounding(0.016)),\n pnr(0.792, -0.066, cornerRounding(0.958)),\n pnr(1.064, 0.276, cornerRounding(1.0)),\n pnr(0.501, 0.946, cornerRounding(0.129)),\n ],\n 1,\n 0.5,\n 0.5,\n true\n );\n}\n\ntype ShapeFactory = () => RoundedPolygon;\n\nconst shapeFactories = {\n Circle: circle,\n Square: square,\n Slanted: slanted,\n Arch: arch,\n Fan: fan,\n Arrow: arrow,\n SemiCircle: semiCircle,\n Oval: oval,\n Pill: pill,\n Triangle: triangle,\n Diamond: diamond,\n ClamShell: clamShell,\n Pentagon: pentagon,\n Gem: gem,\n Sunny: sunny,\n VerySunny: verySunny,\n Cookie4Sided: cookie4,\n Cookie6Sided: cookie6,\n Cookie7Sided: cookie7,\n Cookie9Sided: cookie9,\n Cookie12Sided: cookie12,\n Ghostish: ghostish,\n Clover4Leaf: clover4,\n Clover8Leaf: clover8,\n Burst: burst,\n SoftBurst: softBurst,\n Boom: boom,\n SoftBoom: softBoom,\n Flower: flower,\n Puffy: puffy,\n PuffyDiamond: puffyDiamond,\n PixelCircle: pixelCircle,\n PixelTriangle: pixelTriangle,\n Bun: bun,\n Heart: heart,\n} satisfies Record<string, ShapeFactory>;\n\nexport type ShapeName = keyof typeof shapeFactories;\n\nexport const shapeNames: ShapeName[] = Object.keys(\n shapeFactories\n) as ShapeName[];\n\nconst cache = new Map<ShapeName, RoundedPolygon>();\n\nexport function getShape(name: ShapeName): RoundedPolygon {\n let shape = cache.get(name);\n if (!shape) {\n const factory = shapeFactories[name];\n shape = factory().normalized();\n cache.set(name, shape);\n }\n return shape;\n}\n","// Ported from AOSP androidx.graphics.shapes.Morph\n\nimport { Cubic, type Feature } from \"./cubic\";\nimport type { RoundedPolygon } from \"./polygon\";\nimport {\n angleEpsilon,\n distanceEpsilon,\n interpolate,\n type Point,\n positiveModulo,\n pt,\n ptDistance,\n ptSub,\n} from \"./utils\";\n\n// measurer\n\ninterface Measurer {\n measureCubic(c: Cubic): number;\n findCubicCutPoint(c: Cubic, m: number): number;\n}\n\nclass LengthMeasurer implements Measurer {\n private readonly segments = 3;\n\n measureCubic(c: Cubic): number {\n return this.closestProgressTo(c, Number.POSITIVE_INFINITY)[1];\n }\n\n findCubicCutPoint(c: Cubic, m: number): number {\n return this.closestProgressTo(c, m)[0];\n }\n\n private closestProgressTo(cubic: Cubic, threshold: number): [number, number] {\n let total = 0;\n let remainder = threshold;\n let prev: Point = pt(cubic.anchor0X, cubic.anchor0Y);\n\n for (let i = 1; i <= this.segments; i++) {\n const progress = i / this.segments;\n const point = cubic.pointOnCurve(progress);\n const segment = ptDistance(ptSub(point, prev));\n\n if (segment >= remainder) {\n return [\n progress - (1.0 - remainder / segment) / this.segments,\n threshold,\n ];\n }\n remainder -= segment;\n total += segment;\n prev = point;\n }\n return [1.0, total];\n }\n}\n\n// measured polygon\n\ninterface ProgressableFeature {\n progress: number;\n feature: Feature;\n}\n\ninterface MeasuredCubic {\n cubic: Cubic;\n startOutlineProgress: number;\n endOutlineProgress: number;\n measuredSize: number;\n}\n\ninterface MeasuredPolygon {\n cubics: MeasuredCubic[];\n features: ProgressableFeature[];\n measurer: Measurer;\n}\n\nfunction cutMeasuredCubicAtProgress(\n mc: MeasuredCubic,\n cutOutlineProgress: number,\n measurer: Measurer\n): [MeasuredCubic, MeasuredCubic] {\n const bounded = Math.max(\n mc.startOutlineProgress,\n Math.min(mc.endOutlineProgress, cutOutlineProgress)\n );\n const outlineProgressSize = mc.endOutlineProgress - mc.startOutlineProgress;\n const progressFromStart = bounded - mc.startOutlineProgress;\n const relativeProgress = progressFromStart / outlineProgressSize;\n const t = measurer.findCubicCutPoint(\n mc.cubic,\n relativeProgress * mc.measuredSize\n );\n\n const [c1, c2] = mc.cubic.split(t);\n return [\n {\n cubic: c1,\n startOutlineProgress: mc.startOutlineProgress,\n endOutlineProgress: bounded,\n measuredSize: measurer.measureCubic(c1),\n },\n {\n cubic: c2,\n startOutlineProgress: bounded,\n endOutlineProgress: mc.endOutlineProgress,\n measuredSize: measurer.measureCubic(c2),\n },\n ];\n}\n\nfunction measurePolygon(\n measurer: Measurer,\n polygon: RoundedPolygon\n): MeasuredPolygon {\n const cubics: Cubic[] = [];\n const featureToCubic: [Feature, number][] = [];\n\n for (const feature of polygon.features) {\n for (let cubicIndex = 0; cubicIndex < feature.cubics.length; cubicIndex++) {\n if (\n feature.type === \"corner\" &&\n cubicIndex === Math.floor(feature.cubics.length / 2)\n ) {\n featureToCubic.push([feature, cubics.length]);\n }\n cubics.push(feature.cubics[cubicIndex]);\n }\n }\n\n const measures: number[] = [0];\n let cumulative = 0;\n for (const cubic of cubics) {\n const m = measurer.measureCubic(cubic);\n cumulative += m;\n measures.push(cumulative);\n }\n const totalMeasure = cumulative;\n\n const outlineProgress = measures.map((m) => m / totalMeasure);\n\n const features: ProgressableFeature[] = featureToCubic.map(\n ([feature, ix]) => ({\n progress: positiveModulo(\n (outlineProgress[ix] + outlineProgress[ix + 1]) / 2,\n 1\n ),\n feature,\n })\n );\n\n // build measured cubics, filtering empty ones\n const measuredCubics: MeasuredCubic[] = [];\n let startProgress = 0;\n for (let i = 0; i < cubics.length; i++) {\n if (outlineProgress[i + 1] - outlineProgress[i] > distanceEpsilon) {\n measuredCubics.push({\n cubic: cubics[i],\n startOutlineProgress: startProgress,\n endOutlineProgress: outlineProgress[i + 1],\n measuredSize: measurer.measureCubic(cubics[i]),\n });\n startProgress = outlineProgress[i + 1];\n }\n }\n // ensure last ends at 1\n const lastMeasured = measuredCubics.at(-1);\n if (lastMeasured) {\n lastMeasured.endOutlineProgress = 1;\n }\n\n return { cubics: measuredCubics, features, measurer };\n}\n\nfunction cutAndShift(\n mp: MeasuredPolygon,\n cuttingPoint: number\n): MeasuredPolygon {\n if (cuttingPoint < distanceEpsilon) {\n return mp;\n }\n\n const cubics = mp.cubics;\n let targetIndex = cubics.findIndex(\n (c) =>\n cuttingPoint >= c.startOutlineProgress &&\n cuttingPoint <= c.endOutlineProgress\n );\n if (targetIndex === -1) {\n targetIndex = cubics.length - 1;\n }\n\n const [b1, b2] = cutMeasuredCubicAtProgress(\n cubics[targetIndex],\n cuttingPoint,\n mp.measurer\n );\n\n const retCubics: Cubic[] = [b2.cubic];\n for (let i = 1; i < cubics.length; i++) {\n retCubics.push(cubics[(i + targetIndex) % cubics.length].cubic);\n }\n retCubics.push(b1.cubic);\n\n // build outline progress\n const retOutlineProgress: number[] = [];\n for (let index = 0; index < cubics.length + 2; index++) {\n if (index === 0) {\n retOutlineProgress.push(0);\n } else if (index === cubics.length + 1) {\n retOutlineProgress.push(1);\n } else {\n const cubicIndex = (targetIndex + index - 1) % cubics.length;\n retOutlineProgress.push(\n positiveModulo(cubics[cubicIndex].endOutlineProgress - cuttingPoint, 1)\n );\n }\n }\n\n // shift features\n const newFeatures: ProgressableFeature[] = mp.features.map((f) => ({\n progress: positiveModulo(f.progress - cuttingPoint, 1),\n feature: f.feature,\n }));\n\n const measuredCubics: MeasuredCubic[] = [];\n let startProgress = 0;\n for (let i = 0; i < retCubics.length; i++) {\n if (retOutlineProgress[i + 1] - retOutlineProgress[i] > distanceEpsilon) {\n measuredCubics.push({\n cubic: retCubics[i],\n startOutlineProgress: startProgress,\n endOutlineProgress: retOutlineProgress[i + 1],\n measuredSize: mp.measurer.measureCubic(retCubics[i]),\n });\n startProgress = retOutlineProgress[i + 1];\n }\n }\n const lastCut = measuredCubics.at(-1);\n if (lastCut) {\n lastCut.endOutlineProgress = 1;\n }\n\n return {\n cubics: measuredCubics,\n features: newFeatures,\n measurer: mp.measurer,\n };\n}\n\n// float mapping / double mapper\n\nfunction progressInRange(progress: number, from: number, to: number): boolean {\n if (to >= from) {\n return progress >= from && progress <= to;\n }\n return progress >= from || progress <= to;\n}\n\nfunction progressDistance(p1: number, p2: number): number {\n const d = Math.abs(p1 - p2);\n return Math.min(d, 1 - d);\n}\n\nfunction linearMap(xValues: number[], yValues: number[], x: number): number {\n let segStartIndex = 0;\n for (let i = 0; i < xValues.length; i++) {\n if (progressInRange(x, xValues[i], xValues[(i + 1) % xValues.length])) {\n segStartIndex = i;\n break;\n }\n }\n const segEndIndex = (segStartIndex + 1) % xValues.length;\n const segSizeX = positiveModulo(\n xValues[segEndIndex] - xValues[segStartIndex],\n 1\n );\n const segSizeY = positiveModulo(\n yValues[segEndIndex] - yValues[segStartIndex],\n 1\n );\n const posInSeg =\n segSizeX < 0.001\n ? 0.5\n : positiveModulo(x - xValues[segStartIndex], 1) / segSizeX;\n return positiveModulo(yValues[segStartIndex] + segSizeY * posInSeg, 1);\n}\n\nclass DoubleMapper {\n private readonly sourceValues: number[];\n private readonly targetValues: number[];\n\n constructor(mappings: [number, number][]) {\n this.sourceValues = mappings.map((m) => m[0]);\n this.targetValues = mappings.map((m) => m[1]);\n }\n\n map(x: number): number {\n return linearMap(this.sourceValues, this.targetValues, x);\n }\n\n mapBack(x: number): number {\n return linearMap(this.targetValues, this.sourceValues, x);\n }\n\n static Identity = new DoubleMapper([\n [0, 0],\n [0.5, 0.5],\n ]);\n}\n\n// feature mapping\n\nfunction featureRepresentativePoint(f: Feature): Point {\n const first = f.cubics[0];\n const last = f.cubics.at(-1) ?? first;\n return pt(\n (first.anchor0X + last.anchor1X) / 2,\n (first.anchor0Y + last.anchor1Y) / 2\n );\n}\n\nfunction featureDistSquared(f1: Feature, f2: Feature): number {\n if (f1.type === \"corner\" && f2.type === \"corner\" && f1.convex !== f2.convex) {\n return Number.MAX_VALUE;\n }\n const p1 = featureRepresentativePoint(f1);\n const p2 = featureRepresentativePoint(f2);\n const d = ptSub(p1, p2);\n return d.x * d.x + d.y * d.y;\n}\n\nfunction buildCandidateList(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): { distance: number; f1: ProgressableFeature; f2: ProgressableFeature }[] {\n const result: {\n distance: number;\n f1: ProgressableFeature;\n f2: ProgressableFeature;\n }[] = [];\n for (const f1 of features1) {\n for (const f2 of features2) {\n const d = featureDistSquared(f1.feature, f2.feature);\n if (d !== Number.MAX_VALUE) {\n result.push({ distance: d, f1, f2 });\n }\n }\n }\n result.sort((a, b) => a.distance - b.distance);\n return result;\n}\n\nfunction canInsertMapping(\n mapping: [number, number][],\n insertionIndex: number,\n p1: number,\n p2: number\n): boolean {\n const n = mapping.length;\n if (n === 0) {\n return true;\n }\n const [before1, before2] = mapping[(insertionIndex + n - 1) % n];\n const [after1, after2] = mapping[insertionIndex % n];\n\n if (\n progressDistance(p1, before1) < distanceEpsilon ||\n progressDistance(p1, after1) < distanceEpsilon ||\n progressDistance(p2, before2) < distanceEpsilon ||\n progressDistance(p2, after2) < distanceEpsilon\n ) {\n return false;\n }\n\n return n <= 1 || progressInRange(p2, before2, after2);\n}\n\nfunction doMapping(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): [number, number][] {\n const candidates = buildCandidateList(features1, features2);\n\n if (candidates.length === 0) {\n return [\n [0, 0],\n [0.5, 0.5],\n ];\n }\n\n if (candidates.length === 1) {\n const dv = candidates[0];\n return [\n [dv.f1.progress, dv.f2.progress],\n [(dv.f1.progress + 0.5) % 1, (dv.f2.progress + 0.5) % 1],\n ];\n }\n\n const mapping: [number, number][] = [];\n const usedF1 = new Set<ProgressableFeature>();\n const usedF2 = new Set<ProgressableFeature>();\n\n for (const dv of candidates) {\n if (usedF1.has(dv.f1) || usedF2.has(dv.f2)) {\n continue;\n }\n\n let insertionIndex = 0;\n for (let i = 0; i < mapping.length; i++) {\n if (mapping[i][0] < dv.f1.progress) {\n insertionIndex = i + 1;\n }\n }\n\n if (\n !canInsertMapping(mapping, insertionIndex, dv.f1.progress, dv.f2.progress)\n ) {\n continue;\n }\n\n mapping.splice(insertionIndex, 0, [dv.f1.progress, dv.f2.progress]);\n usedF1.add(dv.f1);\n usedF2.add(dv.f2);\n }\n\n return mapping;\n}\n\nfunction featureMapper(\n features1: ProgressableFeature[],\n features2: ProgressableFeature[]\n): DoubleMapper {\n const filtered1 = features1.filter((f) => f.feature.type === \"corner\");\n const filtered2 = features2.filter((f) => f.feature.type === \"corner\");\n const mapping = doMapping(filtered1, filtered2);\n return new DoubleMapper(mapping);\n}\n\nexport class Morph {\n private readonly morphMatch: [Cubic, Cubic][];\n\n constructor(start: RoundedPolygon, end: RoundedPolygon) {\n this.morphMatch = matchPolygons(start, end);\n }\n\n asCubics(progress: number): Cubic[] {\n const result: Cubic[] = [];\n let firstCubic: Cubic | null = null;\n let lastCubic: Cubic | null = null;\n\n for (const [a, b] of this.morphMatch) {\n const points = new Float64Array(8);\n for (let j = 0; j < 8; j++) {\n points[j] = interpolate(a.points[j], b.points[j], progress);\n }\n const cubic = new Cubic(points);\n if (!firstCubic) {\n firstCubic = cubic;\n }\n if (lastCubic) {\n result.push(lastCubic);\n }\n lastCubic = cubic;\n }\n\n if (lastCubic && firstCubic) {\n result.push(\n new Cubic(\n lastCubic.anchor0X,\n lastCubic.anchor0Y,\n lastCubic.control0X,\n lastCubic.control0Y,\n lastCubic.control1X,\n lastCubic.control1Y,\n firstCubic.anchor0X,\n firstCubic.anchor0Y\n )\n );\n }\n\n return result;\n }\n}\n\nfunction matchPolygons(\n p1: RoundedPolygon,\n p2: RoundedPolygon\n): [Cubic, Cubic][] {\n const measurer = new LengthMeasurer();\n const measuredPolygon1 = measurePolygon(measurer, p1);\n const measuredPolygon2 = measurePolygon(measurer, p2);\n\n const doubleMapper = featureMapper(\n measuredPolygon1.features,\n measuredPolygon2.features\n );\n\n const polygon2CutPoint = doubleMapper.map(0);\n\n const bs1 = measuredPolygon1;\n const bs2 = cutAndShift(measuredPolygon2, polygon2CutPoint);\n\n const ret: [Cubic, Cubic][] = [];\n let i1 = 0;\n let i2 = 0;\n let b1: MeasuredCubic | null = bs1.cubics[i1++] ?? null;\n let b2: MeasuredCubic | null = bs2.cubics[i2++] ?? null;\n\n while (b1 !== null && b2 !== null) {\n const b1a = i1 === bs1.cubics.length ? 1 : b1.endOutlineProgress;\n const b2a =\n i2 === bs2.cubics.length\n ? 1\n : doubleMapper.mapBack(\n positiveModulo(b2.endOutlineProgress + polygon2CutPoint, 1)\n );\n\n const minb = Math.min(b1a, b2a);\n\n let seg1: MeasuredCubic;\n let newb1: MeasuredCubic | null;\n if (b1a > minb + angleEpsilon) {\n const [s, n] = cutMeasuredCubicAtProgress(b1, minb, measurer);\n seg1 = s;\n newb1 = n;\n } else {\n seg1 = b1;\n newb1 = bs1.cubics[i1++] ?? null;\n }\n\n let seg2: MeasuredCubic;\n let newb2: MeasuredCubic | null;\n if (b2a > minb + angleEpsilon) {\n const [s, n] = cutMeasuredCubicAtProgress(\n b2,\n positiveModulo(doubleMapper.map(minb) - polygon2CutPoint, 1),\n measurer\n );\n seg2 = s;\n newb2 = n;\n } else {\n seg2 = b2;\n newb2 = bs2.cubics[i2++] ?? null;\n }\n\n ret.push([seg1.cubic, seg2.cubic]);\n b1 = newb1;\n b2 = newb2;\n }\n\n return ret;\n}\n","import type { Cubic } from \"../core/cubic\";\nimport { Morph } from \"../core/morph\";\nimport type { RoundedPolygon } from \"../core/polygon\";\n\n/**\n * Convert cubics to a CSS `clip-path: path(\"...\")` value.\n *\n * Uses SVG path syntax inside clip-path. Note that CSS cannot\n * transition between different `path()` values — use `toClipPathPolygon`\n * for animatable shapes.\n */\nexport function toClipPathPath(cubics: Cubic[], size = 100): string {\n if (cubics.length === 0) {\n return 'path(\"\")';\n }\n\n const s = size;\n let d = `M${(cubics[0].anchor0X * s).toFixed(2)},${(cubics[0].anchor0Y * s).toFixed(2)}`;\n\n for (const c of cubics) {\n d += `C${(c.control0X * s).toFixed(2)},${(c.control0Y * s).toFixed(2)} ${(c.control1X * s).toFixed(2)},${(c.control1Y * s).toFixed(2)} ${(c.anchor1X * s).toFixed(2)},${(c.anchor1Y * s).toFixed(2)}`;\n }\n\n d += \"Z\";\n return `path(\"${d}\")`;\n}\n\n/**\n * Sample points along cubic bezier curves to produce a\n * CSS `clip-path: polygon(...)` value using percentage coordinates.\n *\n * This is the key function for CSS transitions with Tailwind.\n * CSS can transition between `polygon()` values that have the same\n * number of vertices. By using a fixed `samplesPerCubic`, all shapes\n * from the same `Morph` produce polygons with identical vertex counts,\n * enabling pure-CSS morphing:\n *\n * ```\n * const morph = new Morph(getShape('Circle'), getShape('Heart'));\n * const start = toClipPathPolygon(morph.asCubics(0));\n * const end = toClipPathPolygon(morph.asCubics(1));\n * // Both have the same vertex count → CSS can transition between them\n * ```\n *\n * @param cubics - Array of Cubic bezier curves (normalized 0–1)\n * @param samplesPerCubic - Points to sample per cubic segment (default 4)\n * @returns CSS `polygon(...)` string with percentage coordinates\n */\nexport function toClipPathPolygon(\n cubics: Cubic[],\n samplesPerCubic = 4\n): string {\n if (cubics.length === 0) {\n return \"polygon(0% 0%)\";\n }\n\n const points: string[] = [];\n\n for (const cubic of cubics) {\n for (let i = 0; i < samplesPerCubic; i++) {\n const t = i / samplesPerCubic;\n const point = cubic.pointOnCurve(t);\n points.push(\n `${(point.x * 100).toFixed(2)}% ${(point.y * 100).toFixed(2)}%`\n );\n }\n }\n\n return `polygon(${points.join(\",\")})`;\n}\n\n/**\n * Pre-compute a pair of `polygon()` strings from two shapes that are\n * guaranteed to have the same vertex count. This enables pure-CSS\n * transitions between the two shapes.\n *\n * The `Morph` class internally aligns both shapes so they have the same\n * number of cubic segments. Evaluating at progress 0 and 1 gives two\n * cubic arrays with identical segment counts, which produce polygon\n * strings with identical vertex counts when sampled.\n *\n * ```tsx\n * const [from, to] = toMorphPair(getShape('Circle'), getShape('Heart'));\n * // Use as: style={{ clipPath: from }}\n * // Hover: style={{ clipPath: to }}\n * // With: transition: clip-path 500ms ease\n * ```\n *\n * @param start - The starting shape\n * @param end - The ending shape\n * @param samplesPerCubic - Points to sample per cubic segment (default 4)\n * @returns A tuple of [startPolygon, endPolygon] CSS `polygon()` strings\n */\nexport function toMorphPair(\n start: RoundedPolygon,\n end: RoundedPolygon,\n samplesPerCubic = 4\n): [string, string] {\n const morph = new Morph(start, end);\n return [\n toClipPathPolygon(morph.asCubics(0), samplesPerCubic),\n toClipPathPolygon(morph.asCubics(1), samplesPerCubic),\n ];\n}\n","import type { Cubic } from \"../core/cubic\";\nimport type { RoundedPolygon } from \"../core/polygon\";\n\n/**\n * Convert an array of Cubics to an SVG path `d` attribute string.\n *\n * Each Cubic stores four points: anchor0 (start), control0, control1,\n * anchor1 (end). These map to the SVG cubic bezier command:\n * C control0X,control0Y control1X,control1Y anchor1X,anchor1Y\n *\n * Shapes from `getShape()` are normalized to 0–1 coordinates.\n * The `size` parameter scales them to pixel/viewBox space.\n */\nexport function toPathD(cubics: Cubic[], size = 100): string {\n if (cubics.length === 0) {\n return \"\";\n }\n\n const s = size;\n const parts: string[] = [\n `M${(cubics[0].anchor0X * s).toFixed(2)},${(cubics[0].anchor0Y * s).toFixed(2)}`,\n ];\n\n for (const c of cubics) {\n parts.push(\n `C${(c.control0X * s).toFixed(2)},${(c.control0Y * s).toFixed(2)} ${(c.control1X * s).toFixed(2)},${(c.control1Y * s).toFixed(2)} ${(c.anchor1X * s).toFixed(2)},${(c.anchor1Y * s).toFixed(2)}`\n );\n }\n\n parts.push(\"Z\");\n return parts.join(\"\");\n}\n\n/**\n * Convert a RoundedPolygon to an SVG path `d` attribute string.\n */\nexport function toSvgPath(polygon: RoundedPolygon, size = 100): string {\n return toPathD(polygon.cubics, size);\n}\n"]}
@@ -0,0 +1,219 @@
1
+ declare const distanceEpsilon = 0.0001;
2
+ declare const angleEpsilon = 0.000001;
3
+ declare const relaxedDistanceEpsilon = 0.005;
4
+ declare const floatPi: number;
5
+ declare const twoPi: number;
6
+ interface Point {
7
+ x: number;
8
+ y: number;
9
+ }
10
+
11
+ declare class Cubic {
12
+ readonly points: Float64Array;
13
+ constructor(points: Float64Array);
14
+ constructor(ax0: number, ay0: number, cx0: number, cy0: number, cx1: number, cy1: number, ax1: number, ay1: number);
15
+ get anchor0X(): number;
16
+ get anchor0Y(): number;
17
+ get control0X(): number;
18
+ get control0Y(): number;
19
+ get control1X(): number;
20
+ get control1Y(): number;
21
+ get anchor1X(): number;
22
+ get anchor1Y(): number;
23
+ pointOnCurve(t: number): Point;
24
+ zeroLength(): boolean;
25
+ convexTo(next: Cubic): boolean;
26
+ split(t: number): [Cubic, Cubic];
27
+ reverse(): Cubic;
28
+ transformed(f: (x: number, y: number) => Point): Cubic;
29
+ calculateBounds(approximate?: boolean): [number, number, number, number];
30
+ static straightLine(x0: number, y0: number, x1: number, y1: number): Cubic;
31
+ static circularArc(centerX: number, centerY: number, x0: number, y0: number, x1: number, y1: number): Cubic;
32
+ static empty(x0: number, y0: number): Cubic;
33
+ }
34
+ type Feature = {
35
+ type: "edge";
36
+ cubics: Cubic[];
37
+ } | {
38
+ type: "corner";
39
+ cubics: Cubic[];
40
+ convex: boolean;
41
+ };
42
+
43
+ interface CornerRounding {
44
+ radius: number;
45
+ smoothing: number;
46
+ }
47
+ declare const unrounded: CornerRounding;
48
+ declare function cornerRounding(radius: number, smoothing?: number): CornerRounding;
49
+ declare class RoundedPolygon {
50
+ readonly features: Feature[];
51
+ readonly center: Point;
52
+ readonly cubics: Cubic[];
53
+ constructor(features: Feature[], center: Point);
54
+ get centerX(): number;
55
+ get centerY(): number;
56
+ transformed(f: (x: number, y: number) => Point): RoundedPolygon;
57
+ normalized(): RoundedPolygon;
58
+ calculateBounds(approximate?: boolean): [number, number, number, number];
59
+ calculateMaxBounds(): [number, number, number, number];
60
+ }
61
+ declare function createPolygonFromVertices(vertices: number[], rounding?: CornerRounding, perVertexRounding?: CornerRounding[] | null, centerX?: number, centerY?: number): RoundedPolygon;
62
+ declare function createPolygon(numVertices: number, radius?: number, centerX?: number, centerY?: number, rounding?: CornerRounding, perVertexRounding?: CornerRounding[] | null): RoundedPolygon;
63
+ declare function createCircle(numVertices?: number, radius?: number, centerX?: number, centerY?: number): RoundedPolygon;
64
+ declare function createRectangle(width?: number, height?: number, rounding?: CornerRounding, perVertexRounding?: CornerRounding[] | null, centerX?: number, centerY?: number): RoundedPolygon;
65
+ declare function createStar(numVerticesPerRadius: number, radius?: number, innerRadius?: number, rounding?: CornerRounding, innerRounding?: CornerRounding | null, perVertexRounding?: CornerRounding[] | null, centerX?: number, centerY?: number): RoundedPolygon;
66
+
67
+ declare function circle(): RoundedPolygon;
68
+ declare function square(): RoundedPolygon;
69
+ declare function slanted(): RoundedPolygon;
70
+ declare function arch(): RoundedPolygon;
71
+ declare function fan(): RoundedPolygon;
72
+ declare function arrow(): RoundedPolygon;
73
+ declare function semiCircle(): RoundedPolygon;
74
+ declare function oval(): RoundedPolygon;
75
+ declare function pill(): RoundedPolygon;
76
+ declare function triangle(): RoundedPolygon;
77
+ declare function diamond(): RoundedPolygon;
78
+ declare function clamShell(): RoundedPolygon;
79
+ declare function pentagon(): RoundedPolygon;
80
+ declare function gem(): RoundedPolygon;
81
+ declare function sunny(): RoundedPolygon;
82
+ declare function verySunny(): RoundedPolygon;
83
+ declare function cookie4(): RoundedPolygon;
84
+ declare function cookie6(): RoundedPolygon;
85
+ declare function cookie7(): RoundedPolygon;
86
+ declare function cookie9(): RoundedPolygon;
87
+ declare function cookie12(): RoundedPolygon;
88
+ declare function ghostish(): RoundedPolygon;
89
+ declare function clover4(): RoundedPolygon;
90
+ declare function clover8(): RoundedPolygon;
91
+ declare function burst(): RoundedPolygon;
92
+ declare function softBurst(): RoundedPolygon;
93
+ declare function boom(): RoundedPolygon;
94
+ declare function softBoom(): RoundedPolygon;
95
+ declare function flower(): RoundedPolygon;
96
+ declare function puffy(): RoundedPolygon;
97
+ declare function puffyDiamond(): RoundedPolygon;
98
+ declare function pixelCircle(): RoundedPolygon;
99
+ declare function pixelTriangle(): RoundedPolygon;
100
+ declare function bun(): RoundedPolygon;
101
+ declare function heart(): RoundedPolygon;
102
+ declare const shapeFactories: {
103
+ Circle: typeof circle;
104
+ Square: typeof square;
105
+ Slanted: typeof slanted;
106
+ Arch: typeof arch;
107
+ Fan: typeof fan;
108
+ Arrow: typeof arrow;
109
+ SemiCircle: typeof semiCircle;
110
+ Oval: typeof oval;
111
+ Pill: typeof pill;
112
+ Triangle: typeof triangle;
113
+ Diamond: typeof diamond;
114
+ ClamShell: typeof clamShell;
115
+ Pentagon: typeof pentagon;
116
+ Gem: typeof gem;
117
+ Sunny: typeof sunny;
118
+ VerySunny: typeof verySunny;
119
+ Cookie4Sided: typeof cookie4;
120
+ Cookie6Sided: typeof cookie6;
121
+ Cookie7Sided: typeof cookie7;
122
+ Cookie9Sided: typeof cookie9;
123
+ Cookie12Sided: typeof cookie12;
124
+ Ghostish: typeof ghostish;
125
+ Clover4Leaf: typeof clover4;
126
+ Clover8Leaf: typeof clover8;
127
+ Burst: typeof burst;
128
+ SoftBurst: typeof softBurst;
129
+ Boom: typeof boom;
130
+ SoftBoom: typeof softBoom;
131
+ Flower: typeof flower;
132
+ Puffy: typeof puffy;
133
+ PuffyDiamond: typeof puffyDiamond;
134
+ PixelCircle: typeof pixelCircle;
135
+ PixelTriangle: typeof pixelTriangle;
136
+ Bun: typeof bun;
137
+ Heart: typeof heart;
138
+ };
139
+ type ShapeName = keyof typeof shapeFactories;
140
+ declare const shapeNames: ShapeName[];
141
+ declare function getShape(name: ShapeName): RoundedPolygon;
142
+
143
+ declare class Morph {
144
+ private readonly morphMatch;
145
+ constructor(start: RoundedPolygon, end: RoundedPolygon);
146
+ asCubics(progress: number): Cubic[];
147
+ }
148
+
149
+ /**
150
+ * Convert cubics to a CSS `clip-path: path("...")` value.
151
+ *
152
+ * Uses SVG path syntax inside clip-path. Note that CSS cannot
153
+ * transition between different `path()` values — use `toClipPathPolygon`
154
+ * for animatable shapes.
155
+ */
156
+ declare function toClipPathPath(cubics: Cubic[], size?: number): string;
157
+ /**
158
+ * Sample points along cubic bezier curves to produce a
159
+ * CSS `clip-path: polygon(...)` value using percentage coordinates.
160
+ *
161
+ * This is the key function for CSS transitions with Tailwind.
162
+ * CSS can transition between `polygon()` values that have the same
163
+ * number of vertices. By using a fixed `samplesPerCubic`, all shapes
164
+ * from the same `Morph` produce polygons with identical vertex counts,
165
+ * enabling pure-CSS morphing:
166
+ *
167
+ * ```
168
+ * const morph = new Morph(getShape('Circle'), getShape('Heart'));
169
+ * const start = toClipPathPolygon(morph.asCubics(0));
170
+ * const end = toClipPathPolygon(morph.asCubics(1));
171
+ * // Both have the same vertex count → CSS can transition between them
172
+ * ```
173
+ *
174
+ * @param cubics - Array of Cubic bezier curves (normalized 0–1)
175
+ * @param samplesPerCubic - Points to sample per cubic segment (default 4)
176
+ * @returns CSS `polygon(...)` string with percentage coordinates
177
+ */
178
+ declare function toClipPathPolygon(cubics: Cubic[], samplesPerCubic?: number): string;
179
+ /**
180
+ * Pre-compute a pair of `polygon()` strings from two shapes that are
181
+ * guaranteed to have the same vertex count. This enables pure-CSS
182
+ * transitions between the two shapes.
183
+ *
184
+ * The `Morph` class internally aligns both shapes so they have the same
185
+ * number of cubic segments. Evaluating at progress 0 and 1 gives two
186
+ * cubic arrays with identical segment counts, which produce polygon
187
+ * strings with identical vertex counts when sampled.
188
+ *
189
+ * ```tsx
190
+ * const [from, to] = toMorphPair(getShape('Circle'), getShape('Heart'));
191
+ * // Use as: style={{ clipPath: from }}
192
+ * // Hover: style={{ clipPath: to }}
193
+ * // With: transition: clip-path 500ms ease
194
+ * ```
195
+ *
196
+ * @param start - The starting shape
197
+ * @param end - The ending shape
198
+ * @param samplesPerCubic - Points to sample per cubic segment (default 4)
199
+ * @returns A tuple of [startPolygon, endPolygon] CSS `polygon()` strings
200
+ */
201
+ declare function toMorphPair(start: RoundedPolygon, end: RoundedPolygon, samplesPerCubic?: number): [string, string];
202
+
203
+ /**
204
+ * Convert an array of Cubics to an SVG path `d` attribute string.
205
+ *
206
+ * Each Cubic stores four points: anchor0 (start), control0, control1,
207
+ * anchor1 (end). These map to the SVG cubic bezier command:
208
+ * C control0X,control0Y control1X,control1Y anchor1X,anchor1Y
209
+ *
210
+ * Shapes from `getShape()` are normalized to 0–1 coordinates.
211
+ * The `size` parameter scales them to pixel/viewBox space.
212
+ */
213
+ declare function toPathD(cubics: Cubic[], size?: number): string;
214
+ /**
215
+ * Convert a RoundedPolygon to an SVG path `d` attribute string.
216
+ */
217
+ declare function toSvgPath(polygon: RoundedPolygon, size?: number): string;
218
+
219
+ export { type CornerRounding, Cubic, type Feature, Morph, type Point, RoundedPolygon, type ShapeName, angleEpsilon, cornerRounding, createCircle, createPolygon, createPolygonFromVertices, createRectangle, createStar, distanceEpsilon, floatPi, getShape, relaxedDistanceEpsilon, shapeNames, toClipPathPath, toClipPathPolygon, toMorphPair, toPathD, toSvgPath, twoPi, unrounded };