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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/index.cjs +1758 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +219 -0
- package/dist/index.d.ts +219 -0
- package/dist/index.js +1735 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +1808 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +216 -0
- package/dist/react/index.d.ts +216 -0
- package/dist/react/index.js +1804 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +73 -0
|
@@ -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/output/svg-path.ts","../../src/react/shape.tsx","../../src/core/morph.ts","../../src/output/clip-path.ts","../../src/react/use-morph.ts","../../src/react/use-shape.ts"],"names":["square","useMemo","jsx","useState","useRef","useCallback","useEffect"],"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","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","import { useMemo } from \"react\";\nimport { getShape, type ShapeName } from \"../core/material-shapes\";\nimport { toPathD } from \"../output/svg-path\";\n\ninterface ShapeProps {\n /** Material shape name, e.g. \"Heart\", \"Circle\" */\n name: ShapeName;\n /** Size in px (width & height). Default 48 */\n size?: number;\n /** Fill color. Default \"currentColor\" */\n fill?: string;\n /** Stroke color */\n stroke?: string;\n /** Stroke width */\n strokeWidth?: number;\n /** Additional className for the SVG element */\n className?: string;\n /** Additional inline styles for the SVG element */\n style?: React.CSSProperties;\n}\n\n/**\n * Renders a Material shape as an inline SVG element.\n *\n * The SVG inherits `currentColor` by default, so it responds to\n * the parent's `color` CSS property — including Tailwind utilities.\n *\n * ```tsx\n * <Shape name=\"Heart\" size={32} className=\"text-red-500\" />\n * ```\n */\nexport function Shape({\n name,\n size = 48,\n fill = \"currentColor\",\n stroke,\n strokeWidth,\n className,\n style,\n}: ShapeProps) {\n const viewBoxSize = 100;\n const d = useMemo(() => {\n const shape = getShape(name);\n return toPathD(shape.cubics, viewBoxSize);\n }, [name]);\n\n return (\n <svg\n aria-hidden=\"true\"\n className={className}\n height={size}\n style={style}\n viewBox={`0 0 ${viewBoxSize} ${viewBoxSize}`}\n width={size}\n >\n <path d={d} fill={fill} stroke={stroke} strokeWidth={strokeWidth} />\n </svg>\n );\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 { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getShape, type ShapeName } from \"../core/material-shapes\";\nimport { Morph } from \"../core/morph\";\nimport { toClipPathPolygon } from \"../output/clip-path\";\nimport { toPathD } from \"../output/svg-path\";\n\ninterface MorphOptions {\n /** Target progress (0–1). Changes trigger animation. */\n progress: number;\n /** Animation duration in ms (default 300) */\n duration?: number;\n /** Samples per cubic for polygon output (default 4) */\n samples?: number;\n /** SVG path size (default 100) */\n size?: number;\n}\n\ninterface MorphOutput {\n /** SVG path `d` attribute string */\n pathD: string;\n /** CSS `clip-path: polygon(...)` value */\n clipPath: string;\n /** Current animated progress (0–1) */\n progress: number;\n}\n\n/**\n * React hook for JS-driven shape morphing with animation.\n *\n * Changes to `options.progress` animate smoothly from the current\n * position to the target. Useful for hover effects, scroll-driven\n * morphs, or any interactive shape transitions.\n *\n * ```tsx\n * const [hovered, setHovered] = useState(false);\n * const { clipPath } = useMorph('Circle', 'Heart', {\n * progress: hovered ? 1 : 0,\n * duration: 500,\n * });\n *\n * <img\n * style={{ clipPath }}\n * onMouseEnter={() => setHovered(true)}\n * onMouseLeave={() => setHovered(false)}\n * />\n * ```\n */\nexport function useMorph(\n startShape: ShapeName,\n endShape: ShapeName,\n options: MorphOptions\n): MorphOutput {\n const morph = useMemo(\n () => new Morph(getShape(startShape), getShape(endShape)),\n [startShape, endShape]\n );\n\n const [currentProgress, setCurrentProgress] = useState(options.progress);\n const animRef = useRef(0);\n const progressRef = useRef(currentProgress);\n progressRef.current = currentProgress;\n\n const targetRef = useRef(options.progress);\n\n const animate = useCallback((from: number, to: number, duration: number) => {\n cancelAnimationFrame(animRef.current);\n\n if (Math.abs(from - to) < 0.001) {\n setCurrentProgress(to);\n return;\n }\n\n let startTime: number | null = null;\n\n const step = (timestamp: number) => {\n if (!startTime) {\n startTime = timestamp;\n }\n const elapsed = timestamp - startTime;\n const t = Math.min(elapsed / duration, 1);\n const eased = t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;\n setCurrentProgress(from + (to - from) * eased);\n\n if (t < 1) {\n animRef.current = requestAnimationFrame(step);\n }\n };\n\n animRef.current = requestAnimationFrame(step);\n }, []);\n\n useEffect(() => {\n const prev = targetRef.current;\n targetRef.current = options.progress;\n\n if (Math.abs(prev - options.progress) > 0.001) {\n animate(progressRef.current, options.progress, options.duration ?? 300);\n }\n }, [options.progress, options.duration, animate]);\n\n useEffect(() => {\n return () => cancelAnimationFrame(animRef.current);\n }, []);\n\n const samples = options.samples ?? 4;\n const size = options.size ?? 100;\n\n return useMemo(() => {\n const cubics = morph.asCubics(currentProgress);\n return {\n pathD: toPathD(cubics, size),\n clipPath: toClipPathPolygon(cubics, samples),\n progress: currentProgress,\n };\n }, [morph, currentProgress, samples, size]);\n}\n","import { useMemo } from \"react\";\nimport { getShape, type ShapeName } from \"../core/material-shapes\";\nimport type { RoundedPolygon } from \"../core/polygon\";\nimport { toClipPathPolygon } from \"../output/clip-path\";\nimport { toPathD } from \"../output/svg-path\";\n\ninterface ShapeOutput {\n /** SVG path `d` attribute string, scaled to `size` */\n pathD: string;\n /** CSS `clip-path: polygon(...)` value using percentages */\n clipPath: string;\n /** The underlying RoundedPolygon for advanced use */\n polygon: RoundedPolygon;\n}\n\n/**\n * React hook that returns a Material shape as both an SVG path\n * and a CSS clip-path polygon.\n *\n * ```tsx\n * const { clipPath, pathD } = useShape('Heart');\n * // Use clipPath on any element: style={{ clipPath }}\n * // Use pathD in an SVG: <path d={pathD} />\n * ```\n */\nexport function useShape(name: ShapeName, size = 100): ShapeOutput {\n return useMemo(() => {\n const polygon = getShape(name);\n return {\n pathD: toPathD(polygon.cubics, size),\n clipPath: toClipPathPolygon(polygon.cubics),\n polygon,\n };\n }, [name, size]);\n}\n"]}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface Point {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
declare class Cubic {
|
|
9
|
+
readonly points: Float64Array;
|
|
10
|
+
constructor(points: Float64Array);
|
|
11
|
+
constructor(ax0: number, ay0: number, cx0: number, cy0: number, cx1: number, cy1: number, ax1: number, ay1: number);
|
|
12
|
+
get anchor0X(): number;
|
|
13
|
+
get anchor0Y(): number;
|
|
14
|
+
get control0X(): number;
|
|
15
|
+
get control0Y(): number;
|
|
16
|
+
get control1X(): number;
|
|
17
|
+
get control1Y(): number;
|
|
18
|
+
get anchor1X(): number;
|
|
19
|
+
get anchor1Y(): number;
|
|
20
|
+
pointOnCurve(t: number): Point;
|
|
21
|
+
zeroLength(): boolean;
|
|
22
|
+
convexTo(next: Cubic): boolean;
|
|
23
|
+
split(t: number): [Cubic, Cubic];
|
|
24
|
+
reverse(): Cubic;
|
|
25
|
+
transformed(f: (x: number, y: number) => Point): Cubic;
|
|
26
|
+
calculateBounds(approximate?: boolean): [number, number, number, number];
|
|
27
|
+
static straightLine(x0: number, y0: number, x1: number, y1: number): Cubic;
|
|
28
|
+
static circularArc(centerX: number, centerY: number, x0: number, y0: number, x1: number, y1: number): Cubic;
|
|
29
|
+
static empty(x0: number, y0: number): Cubic;
|
|
30
|
+
}
|
|
31
|
+
type Feature = {
|
|
32
|
+
type: "edge";
|
|
33
|
+
cubics: Cubic[];
|
|
34
|
+
} | {
|
|
35
|
+
type: "corner";
|
|
36
|
+
cubics: Cubic[];
|
|
37
|
+
convex: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
declare class RoundedPolygon {
|
|
41
|
+
readonly features: Feature[];
|
|
42
|
+
readonly center: Point;
|
|
43
|
+
readonly cubics: Cubic[];
|
|
44
|
+
constructor(features: Feature[], center: Point);
|
|
45
|
+
get centerX(): number;
|
|
46
|
+
get centerY(): number;
|
|
47
|
+
transformed(f: (x: number, y: number) => Point): RoundedPolygon;
|
|
48
|
+
normalized(): RoundedPolygon;
|
|
49
|
+
calculateBounds(approximate?: boolean): [number, number, number, number];
|
|
50
|
+
calculateMaxBounds(): [number, number, number, number];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
declare function circle(): RoundedPolygon;
|
|
54
|
+
declare function square(): RoundedPolygon;
|
|
55
|
+
declare function slanted(): RoundedPolygon;
|
|
56
|
+
declare function arch(): RoundedPolygon;
|
|
57
|
+
declare function fan(): RoundedPolygon;
|
|
58
|
+
declare function arrow(): RoundedPolygon;
|
|
59
|
+
declare function semiCircle(): RoundedPolygon;
|
|
60
|
+
declare function oval(): RoundedPolygon;
|
|
61
|
+
declare function pill(): RoundedPolygon;
|
|
62
|
+
declare function triangle(): RoundedPolygon;
|
|
63
|
+
declare function diamond(): RoundedPolygon;
|
|
64
|
+
declare function clamShell(): RoundedPolygon;
|
|
65
|
+
declare function pentagon(): RoundedPolygon;
|
|
66
|
+
declare function gem(): RoundedPolygon;
|
|
67
|
+
declare function sunny(): RoundedPolygon;
|
|
68
|
+
declare function verySunny(): RoundedPolygon;
|
|
69
|
+
declare function cookie4(): RoundedPolygon;
|
|
70
|
+
declare function cookie6(): RoundedPolygon;
|
|
71
|
+
declare function cookie7(): RoundedPolygon;
|
|
72
|
+
declare function cookie9(): RoundedPolygon;
|
|
73
|
+
declare function cookie12(): RoundedPolygon;
|
|
74
|
+
declare function ghostish(): RoundedPolygon;
|
|
75
|
+
declare function clover4(): RoundedPolygon;
|
|
76
|
+
declare function clover8(): RoundedPolygon;
|
|
77
|
+
declare function burst(): RoundedPolygon;
|
|
78
|
+
declare function softBurst(): RoundedPolygon;
|
|
79
|
+
declare function boom(): RoundedPolygon;
|
|
80
|
+
declare function softBoom(): RoundedPolygon;
|
|
81
|
+
declare function flower(): RoundedPolygon;
|
|
82
|
+
declare function puffy(): RoundedPolygon;
|
|
83
|
+
declare function puffyDiamond(): RoundedPolygon;
|
|
84
|
+
declare function pixelCircle(): RoundedPolygon;
|
|
85
|
+
declare function pixelTriangle(): RoundedPolygon;
|
|
86
|
+
declare function bun(): RoundedPolygon;
|
|
87
|
+
declare function heart(): RoundedPolygon;
|
|
88
|
+
declare const shapeFactories: {
|
|
89
|
+
Circle: typeof circle;
|
|
90
|
+
Square: typeof square;
|
|
91
|
+
Slanted: typeof slanted;
|
|
92
|
+
Arch: typeof arch;
|
|
93
|
+
Fan: typeof fan;
|
|
94
|
+
Arrow: typeof arrow;
|
|
95
|
+
SemiCircle: typeof semiCircle;
|
|
96
|
+
Oval: typeof oval;
|
|
97
|
+
Pill: typeof pill;
|
|
98
|
+
Triangle: typeof triangle;
|
|
99
|
+
Diamond: typeof diamond;
|
|
100
|
+
ClamShell: typeof clamShell;
|
|
101
|
+
Pentagon: typeof pentagon;
|
|
102
|
+
Gem: typeof gem;
|
|
103
|
+
Sunny: typeof sunny;
|
|
104
|
+
VerySunny: typeof verySunny;
|
|
105
|
+
Cookie4Sided: typeof cookie4;
|
|
106
|
+
Cookie6Sided: typeof cookie6;
|
|
107
|
+
Cookie7Sided: typeof cookie7;
|
|
108
|
+
Cookie9Sided: typeof cookie9;
|
|
109
|
+
Cookie12Sided: typeof cookie12;
|
|
110
|
+
Ghostish: typeof ghostish;
|
|
111
|
+
Clover4Leaf: typeof clover4;
|
|
112
|
+
Clover8Leaf: typeof clover8;
|
|
113
|
+
Burst: typeof burst;
|
|
114
|
+
SoftBurst: typeof softBurst;
|
|
115
|
+
Boom: typeof boom;
|
|
116
|
+
SoftBoom: typeof softBoom;
|
|
117
|
+
Flower: typeof flower;
|
|
118
|
+
Puffy: typeof puffy;
|
|
119
|
+
PuffyDiamond: typeof puffyDiamond;
|
|
120
|
+
PixelCircle: typeof pixelCircle;
|
|
121
|
+
PixelTriangle: typeof pixelTriangle;
|
|
122
|
+
Bun: typeof bun;
|
|
123
|
+
Heart: typeof heart;
|
|
124
|
+
};
|
|
125
|
+
type ShapeName = keyof typeof shapeFactories;
|
|
126
|
+
|
|
127
|
+
interface ShapeProps {
|
|
128
|
+
/** Material shape name, e.g. "Heart", "Circle" */
|
|
129
|
+
name: ShapeName;
|
|
130
|
+
/** Size in px (width & height). Default 48 */
|
|
131
|
+
size?: number;
|
|
132
|
+
/** Fill color. Default "currentColor" */
|
|
133
|
+
fill?: string;
|
|
134
|
+
/** Stroke color */
|
|
135
|
+
stroke?: string;
|
|
136
|
+
/** Stroke width */
|
|
137
|
+
strokeWidth?: number;
|
|
138
|
+
/** Additional className for the SVG element */
|
|
139
|
+
className?: string;
|
|
140
|
+
/** Additional inline styles for the SVG element */
|
|
141
|
+
style?: React.CSSProperties;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Renders a Material shape as an inline SVG element.
|
|
145
|
+
*
|
|
146
|
+
* The SVG inherits `currentColor` by default, so it responds to
|
|
147
|
+
* the parent's `color` CSS property — including Tailwind utilities.
|
|
148
|
+
*
|
|
149
|
+
* ```tsx
|
|
150
|
+
* <Shape name="Heart" size={32} className="text-red-500" />
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
declare function Shape({ name, size, fill, stroke, strokeWidth, className, style, }: ShapeProps): react_jsx_runtime.JSX.Element;
|
|
154
|
+
|
|
155
|
+
interface MorphOptions {
|
|
156
|
+
/** Target progress (0–1). Changes trigger animation. */
|
|
157
|
+
progress: number;
|
|
158
|
+
/** Animation duration in ms (default 300) */
|
|
159
|
+
duration?: number;
|
|
160
|
+
/** Samples per cubic for polygon output (default 4) */
|
|
161
|
+
samples?: number;
|
|
162
|
+
/** SVG path size (default 100) */
|
|
163
|
+
size?: number;
|
|
164
|
+
}
|
|
165
|
+
interface MorphOutput {
|
|
166
|
+
/** SVG path `d` attribute string */
|
|
167
|
+
pathD: string;
|
|
168
|
+
/** CSS `clip-path: polygon(...)` value */
|
|
169
|
+
clipPath: string;
|
|
170
|
+
/** Current animated progress (0–1) */
|
|
171
|
+
progress: number;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* React hook for JS-driven shape morphing with animation.
|
|
175
|
+
*
|
|
176
|
+
* Changes to `options.progress` animate smoothly from the current
|
|
177
|
+
* position to the target. Useful for hover effects, scroll-driven
|
|
178
|
+
* morphs, or any interactive shape transitions.
|
|
179
|
+
*
|
|
180
|
+
* ```tsx
|
|
181
|
+
* const [hovered, setHovered] = useState(false);
|
|
182
|
+
* const { clipPath } = useMorph('Circle', 'Heart', {
|
|
183
|
+
* progress: hovered ? 1 : 0,
|
|
184
|
+
* duration: 500,
|
|
185
|
+
* });
|
|
186
|
+
*
|
|
187
|
+
* <img
|
|
188
|
+
* style={{ clipPath }}
|
|
189
|
+
* onMouseEnter={() => setHovered(true)}
|
|
190
|
+
* onMouseLeave={() => setHovered(false)}
|
|
191
|
+
* />
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
declare function useMorph(startShape: ShapeName, endShape: ShapeName, options: MorphOptions): MorphOutput;
|
|
195
|
+
|
|
196
|
+
interface ShapeOutput {
|
|
197
|
+
/** SVG path `d` attribute string, scaled to `size` */
|
|
198
|
+
pathD: string;
|
|
199
|
+
/** CSS `clip-path: polygon(...)` value using percentages */
|
|
200
|
+
clipPath: string;
|
|
201
|
+
/** The underlying RoundedPolygon for advanced use */
|
|
202
|
+
polygon: RoundedPolygon;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* React hook that returns a Material shape as both an SVG path
|
|
206
|
+
* and a CSS clip-path polygon.
|
|
207
|
+
*
|
|
208
|
+
* ```tsx
|
|
209
|
+
* const { clipPath, pathD } = useShape('Heart');
|
|
210
|
+
* // Use clipPath on any element: style={{ clipPath }}
|
|
211
|
+
* // Use pathD in an SVG: <path d={pathD} />
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
declare function useShape(name: ShapeName, size?: number): ShapeOutput;
|
|
215
|
+
|
|
216
|
+
export { Shape, type ShapeName, useMorph, useShape };
|