@bug-on/m3-expressive 1.2.2 → 1.2.4

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.
@@ -2603,6 +2603,1922 @@ function TouchTarget() {
2603
2603
  }
2604
2604
  );
2605
2605
  }
2606
+
2607
+ // src/shapes/core/features.ts
2608
+ function cornerFeature(cubics, convex2) {
2609
+ return { type: "corner", cubics, convex: convex2 };
2610
+ }
2611
+ function edgeFeature(cubics) {
2612
+ return { type: "edge", cubics };
2613
+ }
2614
+ function transformFeature(feature, fn) {
2615
+ const cubics = feature.cubics.map((c) => c.transformed(fn));
2616
+ if (feature.type === "corner") {
2617
+ return cornerFeature(cubics, feature.convex);
2618
+ }
2619
+ return edgeFeature(cubics);
2620
+ }
2621
+
2622
+ // src/shapes/math/corner-rounding.ts
2623
+ var UNROUNDED = Object.freeze({
2624
+ radius: 0,
2625
+ smoothing: 0
2626
+ });
2627
+
2628
+ // src/shapes/utils/utils.ts
2629
+ var DISTANCE_EPSILON = 1e-4;
2630
+ var FLOAT_PI = Math.PI;
2631
+ function distance(dx, dy) {
2632
+ return Math.sqrt(dx * dx + dy * dy);
2633
+ }
2634
+ function distanceSquared(dx, dy) {
2635
+ return dx * dx + dy * dy;
2636
+ }
2637
+ function radialToCartesian(radius, angle) {
2638
+ return [radius * Math.cos(angle), radius * Math.sin(angle)];
2639
+ }
2640
+ function interpolate(start, stop, fraction) {
2641
+ return start + (stop - start) * fraction;
2642
+ }
2643
+ function square(value) {
2644
+ return value * value;
2645
+ }
2646
+ function convex(prevX, prevY, currX, currY, nextX, nextY) {
2647
+ const v1x = currX - prevX;
2648
+ const v1y = currY - prevY;
2649
+ const v2x = nextX - currX;
2650
+ const v2y = nextY - currY;
2651
+ return v1x * v2y - v1y * v2x > 0;
2652
+ }
2653
+
2654
+ // src/shapes/math/point.ts
2655
+ function point(x, y) {
2656
+ return { x, y };
2657
+ }
2658
+
2659
+ // src/shapes/math/cubic.ts
2660
+ var Cubic = class _Cubic {
2661
+ constructor(points) {
2662
+ if (points.length !== 8)
2663
+ throw new Error("Cubic points array must have exactly 8 elements");
2664
+ this.points = points;
2665
+ }
2666
+ /** First anchor point X */
2667
+ get anchor0X() {
2668
+ return this.points[0];
2669
+ }
2670
+ /** First anchor point Y */
2671
+ get anchor0Y() {
2672
+ return this.points[1];
2673
+ }
2674
+ /** First control point X */
2675
+ get control0X() {
2676
+ return this.points[2];
2677
+ }
2678
+ /** First control point Y */
2679
+ get control0Y() {
2680
+ return this.points[3];
2681
+ }
2682
+ /** Second control point X */
2683
+ get control1X() {
2684
+ return this.points[4];
2685
+ }
2686
+ /** Second control point Y */
2687
+ get control1Y() {
2688
+ return this.points[5];
2689
+ }
2690
+ /** Second anchor point X */
2691
+ get anchor1X() {
2692
+ return this.points[6];
2693
+ }
2694
+ /** Second anchor point Y */
2695
+ get anchor1Y() {
2696
+ return this.points[7];
2697
+ }
2698
+ /**
2699
+ * Returns a point on the curve at parameter t (0=start, 1=end).
2700
+ * Uses the standard cubic Bézier formula.
2701
+ * @param t - Parameter in [0, 1]
2702
+ */
2703
+ pointOnCurve(t) {
2704
+ const u = 1 - t;
2705
+ return point(
2706
+ this.anchor0X * (u * u * u) + this.control0X * (3 * t * u * u) + this.control1X * (3 * t * t * u) + this.anchor1X * (t * t * t),
2707
+ this.anchor0Y * (u * u * u) + this.control0Y * (3 * t * u * u) + this.control1Y * (3 * t * t * u) + this.anchor1Y * (t * t * t)
2708
+ );
2709
+ }
2710
+ /**
2711
+ * Returns true if this curve has (near) zero length.
2712
+ */
2713
+ zeroLength() {
2714
+ return Math.abs(this.anchor0X - this.anchor1X) < DISTANCE_EPSILON && Math.abs(this.anchor0Y - this.anchor1Y) < DISTANCE_EPSILON;
2715
+ }
2716
+ /**
2717
+ * Splits this cubic at parameter t, returning two cubics.
2718
+ * Uses De Casteljau's algorithm.
2719
+ * @param t - Split parameter in [0, 1]
2720
+ * @returns [left, right] pair
2721
+ */
2722
+ split(t) {
2723
+ const u = 1 - t;
2724
+ const mid = this.pointOnCurve(t);
2725
+ const left = new _Cubic([
2726
+ this.anchor0X,
2727
+ this.anchor0Y,
2728
+ this.anchor0X * u + this.control0X * t,
2729
+ this.anchor0Y * u + this.control0Y * t,
2730
+ this.anchor0X * (u * u) + this.control0X * (2 * u * t) + this.control1X * (t * t),
2731
+ this.anchor0Y * (u * u) + this.control0Y * (2 * u * t) + this.control1Y * (t * t),
2732
+ mid.x,
2733
+ mid.y
2734
+ ]);
2735
+ const right = new _Cubic([
2736
+ mid.x,
2737
+ mid.y,
2738
+ this.control0X * (u * u) + this.control1X * (2 * u * t) + this.anchor1X * (t * t),
2739
+ this.control0Y * (u * u) + this.control1Y * (2 * u * t) + this.anchor1Y * (t * t),
2740
+ this.control1X * u + this.anchor1X * t,
2741
+ this.control1Y * u + this.anchor1Y * t,
2742
+ this.anchor1X,
2743
+ this.anchor1Y
2744
+ ]);
2745
+ return [left, right];
2746
+ }
2747
+ /**
2748
+ * Returns a reversed copy of this cubic (anchor0 ↔ anchor1, controls swapped).
2749
+ */
2750
+ reverse() {
2751
+ return new _Cubic([
2752
+ this.anchor1X,
2753
+ this.anchor1Y,
2754
+ this.control1X,
2755
+ this.control1Y,
2756
+ this.control0X,
2757
+ this.control0Y,
2758
+ this.anchor0X,
2759
+ this.anchor0Y
2760
+ ]);
2761
+ }
2762
+ /**
2763
+ * Calculates the axis-aligned bounding box.
2764
+ * @param approximate - If true, uses control point hull (faster). Default: false.
2765
+ * @returns [minX, minY, maxX, maxY]
2766
+ */
2767
+ calculateBounds(approximate = false) {
2768
+ if (this.zeroLength()) {
2769
+ return [this.anchor0X, this.anchor0Y, this.anchor0X, this.anchor0Y];
2770
+ }
2771
+ let minX = Math.min(this.anchor0X, this.anchor1X);
2772
+ let minY = Math.min(this.anchor0Y, this.anchor1Y);
2773
+ let maxX = Math.max(this.anchor0X, this.anchor1X);
2774
+ let maxY = Math.max(this.anchor0Y, this.anchor1Y);
2775
+ if (approximate) {
2776
+ minX = Math.min(minX, this.control0X, this.control1X);
2777
+ minY = Math.min(minY, this.control0Y, this.control1Y);
2778
+ maxX = Math.max(maxX, this.control0X, this.control1X);
2779
+ maxY = Math.max(maxY, this.control0Y, this.control1Y);
2780
+ return [minX, minY, maxX, maxY];
2781
+ }
2782
+ const xa = -this.anchor0X + 3 * this.control0X - 3 * this.control1X + this.anchor1X;
2783
+ const xb = 2 * this.anchor0X - 4 * this.control0X + 2 * this.control1X;
2784
+ const xc = -this.anchor0X + this.control0X;
2785
+ const expandX = (t) => {
2786
+ if (t >= 0 && t <= 1) {
2787
+ const v = this.pointOnCurve(t).x;
2788
+ if (v < minX) minX = v;
2789
+ if (v > maxX) maxX = v;
2790
+ }
2791
+ };
2792
+ if (Math.abs(xa) < DISTANCE_EPSILON) {
2793
+ if (xb !== 0) expandX(2 * xc / (-2 * xb));
2794
+ } else {
2795
+ const xs = xb * xb - 4 * xa * xc;
2796
+ if (xs >= 0) {
2797
+ expandX((-xb + Math.sqrt(xs)) / (2 * xa));
2798
+ expandX((-xb - Math.sqrt(xs)) / (2 * xa));
2799
+ }
2800
+ }
2801
+ const ya = -this.anchor0Y + 3 * this.control0Y - 3 * this.control1Y + this.anchor1Y;
2802
+ const yb = 2 * this.anchor0Y - 4 * this.control0Y + 2 * this.control1Y;
2803
+ const yc = -this.anchor0Y + this.control0Y;
2804
+ const expandY = (t) => {
2805
+ if (t >= 0 && t <= 1) {
2806
+ const v = this.pointOnCurve(t).y;
2807
+ if (v < minY) minY = v;
2808
+ if (v > maxY) maxY = v;
2809
+ }
2810
+ };
2811
+ if (Math.abs(ya) < DISTANCE_EPSILON) {
2812
+ if (yb !== 0) expandY(2 * yc / (-2 * yb));
2813
+ } else {
2814
+ const ys = yb * yb - 4 * ya * yc;
2815
+ if (ys >= 0) {
2816
+ expandY((-yb + Math.sqrt(ys)) / (2 * ya));
2817
+ expandY((-yb - Math.sqrt(ys)) / (2 * ya));
2818
+ }
2819
+ }
2820
+ return [minX, minY, maxX, maxY];
2821
+ }
2822
+ /**
2823
+ * Interpolates between this cubic and another at fraction t.
2824
+ * @param other - Target cubic
2825
+ * @param t - Fraction [0, 1]
2826
+ */
2827
+ interpolateTo(other, t) {
2828
+ return new _Cubic(
2829
+ this.points.map((v, i) => interpolate(v, other.points[i], t))
2830
+ );
2831
+ }
2832
+ /**
2833
+ * Applies a PointTransformer to all anchor and control points.
2834
+ * @param fn - The transform function
2835
+ */
2836
+ transformed(fn) {
2837
+ const p = this.points.slice();
2838
+ for (let i = 0; i < 8; i += 2) {
2839
+ const [tx, ty] = fn(p[i], p[i + 1]);
2840
+ p[i] = tx;
2841
+ p[i + 1] = ty;
2842
+ }
2843
+ return new _Cubic(p);
2844
+ }
2845
+ toString() {
2846
+ return `Cubic(a0=(${this.anchor0X},${this.anchor0Y}) c0=(${this.control0X},${this.control0Y}) c1=(${this.control1X},${this.control1Y}) a1=(${this.anchor1X},${this.anchor1Y}))`;
2847
+ }
2848
+ // ─── Static factories ─────────────────────────────────────────────────────
2849
+ /**
2850
+ * Creates a cubic representing a straight line.
2851
+ * Control points lie at 1/3 and 2/3 of the line.
2852
+ * @param x0 - Start anchor X
2853
+ * @param y0 - Start anchor Y
2854
+ * @param x1 - End anchor X
2855
+ * @param y1 - End anchor Y
2856
+ */
2857
+ static straightLine(x0, y0, x1, y1) {
2858
+ return new _Cubic([
2859
+ x0,
2860
+ y0,
2861
+ interpolate(x0, x1, 1 / 3),
2862
+ interpolate(y0, y1, 1 / 3),
2863
+ interpolate(x0, x1, 2 / 3),
2864
+ interpolate(y0, y1, 2 / 3),
2865
+ x1,
2866
+ y1
2867
+ ]);
2868
+ }
2869
+ /**
2870
+ * Creates a cubic approximating a circular arc.
2871
+ * p0 and p1 must be equidistant from the center.
2872
+ * For arcs > 180°, use multiple cubics.
2873
+ *
2874
+ * @param centerX - Arc center X
2875
+ * @param centerY - Arc center Y
2876
+ * @param x0 - Start point X (on circle)
2877
+ * @param y0 - Start point Y (on circle)
2878
+ * @param x1 - End point X (on circle)
2879
+ * @param y1 - End point Y (on circle)
2880
+ */
2881
+ static circularArc(centerX, centerY, x0, y0, x1, y1) {
2882
+ const p0dx = x0 - centerX;
2883
+ const p0dy = y0 - centerY;
2884
+ const p1dx = x1 - centerX;
2885
+ const p1dy = y1 - centerY;
2886
+ const d0 = Math.sqrt(p0dx * p0dx + p0dy * p0dy);
2887
+ const d1 = Math.sqrt(p1dx * p1dx + p1dy * p1dy);
2888
+ if (d0 < DISTANCE_EPSILON || d1 < DISTANCE_EPSILON) {
2889
+ return _Cubic.straightLine(x0, y0, x1, y1);
2890
+ }
2891
+ const nx0 = p0dx / d0, ny0 = p0dy / d0;
2892
+ const nx1 = p1dx / d1, ny1 = p1dy / d1;
2893
+ const rx0 = -ny0, ry0 = nx0;
2894
+ const rx1 = -ny1, ry1 = nx1;
2895
+ const cosa = nx0 * nx1 + ny0 * ny1;
2896
+ if (cosa > 0.999) return _Cubic.straightLine(x0, y0, x1, y1);
2897
+ const clockwise = rx0 * p1dx + ry0 * p1dy >= 0;
2898
+ const k = d0 * (4 / 3) * (Math.sqrt(2 * (1 - cosa)) - Math.sqrt(1 - square(cosa))) / (1 - cosa) * (clockwise ? 1 : -1);
2899
+ return new _Cubic([
2900
+ x0,
2901
+ y0,
2902
+ x0 + rx0 * k,
2903
+ y0 + ry0 * k,
2904
+ x1 - rx1 * k,
2905
+ y1 - ry1 * k,
2906
+ x1,
2907
+ y1
2908
+ ]);
2909
+ }
2910
+ /**
2911
+ * Creates a zero-length cubic at the given point.
2912
+ * @param x - X coordinate
2913
+ * @param y - Y coordinate
2914
+ */
2915
+ static empty(x, y) {
2916
+ return new _Cubic([x, y, x, y, x, y, x, y]);
2917
+ }
2918
+ };
2919
+
2920
+ // src/shapes/core/rounded-polygon.ts
2921
+ var RoundedCorner = class {
2922
+ constructor(p0, p1, p2, rounding = UNROUNDED) {
2923
+ this.p0 = p0;
2924
+ this.p1 = p1;
2925
+ this.p2 = p2;
2926
+ this.rounding = rounding;
2927
+ this.center = point(0, 0);
2928
+ const v01x = p0.x - p1.x, v01y = p0.y - p1.y;
2929
+ const v21x = p2.x - p1.x, v21y = p2.y - p1.y;
2930
+ const d01 = distance(v01x, v01y);
2931
+ const d21 = distance(v21x, v21y);
2932
+ if (d01 > 0 && d21 > 0) {
2933
+ this.d1 = point(v01x / d01, v01y / d01);
2934
+ this.d2 = point(v21x / d21, v21y / d21);
2935
+ this.cornerRadius = rounding.radius;
2936
+ this.smoothing = rounding.smoothing;
2937
+ const cosA = this.d1.x * this.d2.x + this.d1.y * this.d2.y;
2938
+ this.sinAngle = Math.sqrt(Math.max(0, 1 - square(cosA)));
2939
+ this.expectedRoundCut = this.sinAngle > 1e-3 ? this.cornerRadius * (cosA + 1) / this.sinAngle : 0;
2940
+ } else {
2941
+ this.d1 = point(0, 0);
2942
+ this.d2 = point(0, 0);
2943
+ this.cornerRadius = 0;
2944
+ this.smoothing = 0;
2945
+ this.sinAngle = 0;
2946
+ this.expectedRoundCut = 0;
2947
+ }
2948
+ }
2949
+ get expectedCut() {
2950
+ return (1 + this.smoothing) * this.expectedRoundCut;
2951
+ }
2952
+ getCubics(allowedCut0, allowedCut1 = allowedCut0) {
2953
+ const allowedCut = Math.min(allowedCut0, allowedCut1);
2954
+ if (this.expectedRoundCut < DISTANCE_EPSILON || allowedCut < DISTANCE_EPSILON || this.cornerRadius < DISTANCE_EPSILON) {
2955
+ this.center = this.p1;
2956
+ return [Cubic.straightLine(this.p1.x, this.p1.y, this.p1.x, this.p1.y)];
2957
+ }
2958
+ const actualRoundCut = Math.min(allowedCut, this.expectedRoundCut);
2959
+ const actualSmoothing0 = this.calcSmoothingValue(allowedCut0);
2960
+ const actualSmoothing1 = this.calcSmoothingValue(allowedCut1);
2961
+ const actualR = this.cornerRadius * actualRoundCut / this.expectedRoundCut;
2962
+ const centerDist = Math.sqrt(square(actualR) + square(actualRoundCut));
2963
+ const midDirX = (this.d1.x + this.d2.x) / 2;
2964
+ const midDirY = (this.d1.y + this.d2.y) / 2;
2965
+ const midDist = distance(midDirX, midDirY);
2966
+ this.center = point(
2967
+ this.p1.x + midDirX / midDist * centerDist,
2968
+ this.p1.y + midDirY / midDist * centerDist
2969
+ );
2970
+ const ci0 = point(
2971
+ this.p1.x + this.d1.x * actualRoundCut,
2972
+ this.p1.y + this.d1.y * actualRoundCut
2973
+ );
2974
+ const ci2 = point(
2975
+ this.p1.x + this.d2.x * actualRoundCut,
2976
+ this.p1.y + this.d2.y * actualRoundCut
2977
+ );
2978
+ const flanking0 = this.computeFlankingCurve(
2979
+ actualRoundCut,
2980
+ actualSmoothing0,
2981
+ this.p1,
2982
+ this.p0,
2983
+ ci0,
2984
+ ci2,
2985
+ this.center,
2986
+ actualR
2987
+ );
2988
+ const flanking2 = this.computeFlankingCurve(
2989
+ actualRoundCut,
2990
+ actualSmoothing1,
2991
+ this.p1,
2992
+ this.p2,
2993
+ ci2,
2994
+ ci0,
2995
+ this.center,
2996
+ actualR
2997
+ ).reverse();
2998
+ return [
2999
+ flanking0,
3000
+ Cubic.circularArc(
3001
+ this.center.x,
3002
+ this.center.y,
3003
+ flanking0.anchor1X,
3004
+ flanking0.anchor1Y,
3005
+ flanking2.anchor0X,
3006
+ flanking2.anchor0Y
3007
+ ),
3008
+ flanking2
3009
+ ];
3010
+ }
3011
+ calcSmoothingValue(allowedCut) {
3012
+ if (allowedCut > this.expectedCut) return this.smoothing;
3013
+ if (allowedCut > this.expectedRoundCut) {
3014
+ return this.smoothing * (allowedCut - this.expectedRoundCut) / (this.expectedCut - this.expectedRoundCut);
3015
+ }
3016
+ return 0;
3017
+ }
3018
+ computeFlankingCurve(actualRoundCut, actualSmoothing, corner, sideStart, circleIntersect, otherIntersect, circleCenter, actualR) {
3019
+ var _a;
3020
+ const sdx = sideStart.x - corner.x, sdy = sideStart.y - corner.y;
3021
+ const sd = distance(sdx, sdy);
3022
+ const sideDir = point(sdx / sd, sdy / sd);
3023
+ const curveStart = point(
3024
+ corner.x + sideDir.x * actualRoundCut * (1 + actualSmoothing),
3025
+ corner.y + sideDir.y * actualRoundCut * (1 + actualSmoothing)
3026
+ );
3027
+ const px = interpolate(
3028
+ circleIntersect.x,
3029
+ (circleIntersect.x + otherIntersect.x) / 2,
3030
+ actualSmoothing
3031
+ );
3032
+ const py = interpolate(
3033
+ circleIntersect.y,
3034
+ (circleIntersect.y + otherIntersect.y) / 2,
3035
+ actualSmoothing
3036
+ );
3037
+ const ptoCx = px - circleCenter.x, ptoCy = py - circleCenter.y;
3038
+ const ptoCd = distance(ptoCx, ptoCy);
3039
+ const curveEnd = point(
3040
+ circleCenter.x + ptoCx / ptoCd * actualR,
3041
+ circleCenter.y + ptoCy / ptoCd * actualR
3042
+ );
3043
+ const tangentX = -(curveEnd.y - circleCenter.y);
3044
+ const tangentY = curveEnd.x - circleCenter.x;
3045
+ const anchorEnd = (_a = lineIntersection(
3046
+ sideStart,
3047
+ sideDir,
3048
+ curveEnd,
3049
+ point(tangentX, tangentY)
3050
+ )) != null ? _a : circleIntersect;
3051
+ const anchorStart = point(
3052
+ (curveStart.x + anchorEnd.x * 2) / 3,
3053
+ (curveStart.y + anchorEnd.y * 2) / 3
3054
+ );
3055
+ return new Cubic([
3056
+ curveStart.x,
3057
+ curveStart.y,
3058
+ anchorStart.x,
3059
+ anchorStart.y,
3060
+ anchorEnd.x,
3061
+ anchorEnd.y,
3062
+ curveEnd.x,
3063
+ curveEnd.y
3064
+ ]);
3065
+ }
3066
+ };
3067
+ function lineIntersection(p0, d0, p1, d1) {
3068
+ const rd1x = -d1.y, rd1y = d1.x;
3069
+ const den = d0.x * rd1x + d0.y * rd1y;
3070
+ if (Math.abs(den) < DISTANCE_EPSILON) return null;
3071
+ const num = (p1.x - p0.x) * rd1x + (p1.y - p0.y) * rd1y;
3072
+ if (Math.abs(den) < DISTANCE_EPSILON * Math.abs(num)) return null;
3073
+ const k = num / den;
3074
+ return point(p0.x + d0.x * k, p0.y + d0.y * k);
3075
+ }
3076
+ function calculateCenter(vertices) {
3077
+ let cx = 0, cy = 0;
3078
+ for (let i = 0; i < vertices.length; i += 2) {
3079
+ cx += vertices[i];
3080
+ cy += vertices[i + 1];
3081
+ }
3082
+ const n = vertices.length / 2;
3083
+ return point(cx / n, cy / n);
3084
+ }
3085
+ function verticesFromNumVerts(numVertices, radius, cx, cy) {
3086
+ const result = [];
3087
+ for (let i = 0; i < numVertices; i++) {
3088
+ const angle = FLOAT_PI / numVertices * 2 * i;
3089
+ const [rx, ry] = radialToCartesian(radius, angle);
3090
+ result.push(cx + rx, cy + ry);
3091
+ }
3092
+ return result;
3093
+ }
3094
+ var RoundedPolygon = class _RoundedPolygon {
3095
+ /** @internal Use static factory methods instead */
3096
+ constructor(features, center) {
3097
+ this.features = features;
3098
+ this.center = center;
3099
+ this.cubics = buildCubicsList(features);
3100
+ validateContiguity(this.cubics);
3101
+ }
3102
+ get centerX() {
3103
+ return this.center.x;
3104
+ }
3105
+ get centerY() {
3106
+ return this.center.y;
3107
+ }
3108
+ // ─── Static factories ────────────────────────────────────────────────
3109
+ /**
3110
+ * Creates a polygon from a vertex count (regular polygon).
3111
+ * @param numVertices - Number of vertices (≥ 3)
3112
+ * @param radius - Circumradius (default: 1)
3113
+ * @param centerX - Center X (default: 0)
3114
+ * @param centerY - Center Y (default: 0)
3115
+ * @param rounding - Corner rounding for all vertices
3116
+ * @param perVertexRounding - Per-vertex rounding overrides
3117
+ */
3118
+ static fromNumVertices(numVertices, radius = 1, centerX = 0, centerY = 0, rounding = UNROUNDED, perVertexRounding) {
3119
+ if (numVertices < 3)
3120
+ throw new Error("Polygon must have at least 3 vertices");
3121
+ const vertices = verticesFromNumVerts(
3122
+ numVertices,
3123
+ radius,
3124
+ centerX,
3125
+ centerY
3126
+ );
3127
+ return _RoundedPolygon.fromVertices(
3128
+ vertices,
3129
+ rounding,
3130
+ perVertexRounding,
3131
+ centerX,
3132
+ centerY
3133
+ );
3134
+ }
3135
+ /**
3136
+ * Creates a polygon from a flat vertex array [x0, y0, x1, y1, ...].
3137
+ * @param vertices - Flat array of x,y pairs (length must be even and ≥ 6)
3138
+ * @param rounding - Corner rounding for all vertices
3139
+ * @param perVertexRounding - Per-vertex rounding overrides
3140
+ * @param centerX - Center X (auto-calculated if not provided)
3141
+ * @param centerY - Center Y (auto-calculated if not provided)
3142
+ */
3143
+ static fromVertices(vertices, rounding = UNROUNDED, perVertexRounding, centerX, centerY) {
3144
+ if (vertices.length < 6)
3145
+ throw new Error("Polygon must have at least 3 vertices");
3146
+ if (vertices.length % 2 !== 0)
3147
+ throw new Error("Vertices array must have even length");
3148
+ if (perVertexRounding && perVertexRounding.length * 2 !== vertices.length) {
3149
+ throw new Error("perVertexRounding must match vertex count");
3150
+ }
3151
+ const n = vertices.length / 2;
3152
+ const roundedCorners = [];
3153
+ for (let i = 0; i < n; i++) {
3154
+ const vtxRounding = perVertexRounding ? perVertexRounding[i] : rounding;
3155
+ const prevIdx = (i + n - 1) % n * 2;
3156
+ const nextIdx = (i + 1) % n * 2;
3157
+ roundedCorners.push(
3158
+ new RoundedCorner(
3159
+ point(vertices[prevIdx], vertices[prevIdx + 1]),
3160
+ point(vertices[i * 2], vertices[i * 2 + 1]),
3161
+ point(vertices[nextIdx], vertices[nextIdx + 1]),
3162
+ vtxRounding
3163
+ )
3164
+ );
3165
+ }
3166
+ const cutAdjusts = [];
3167
+ for (let ix = 0; ix < n; ix++) {
3168
+ const expectedRoundCut = roundedCorners[ix].expectedRoundCut + roundedCorners[(ix + 1) % n].expectedRoundCut;
3169
+ const expectedCut = roundedCorners[ix].expectedCut + roundedCorners[(ix + 1) % n].expectedCut;
3170
+ const vx = vertices[ix * 2], vy = vertices[ix * 2 + 1];
3171
+ const nx = vertices[(ix + 1) % n * 2], ny = vertices[(ix + 1) % n * 2 + 1];
3172
+ const sideSize = distance(vx - nx, vy - ny);
3173
+ if (expectedRoundCut > sideSize) {
3174
+ cutAdjusts.push([sideSize / expectedRoundCut, 0]);
3175
+ } else if (expectedCut > sideSize) {
3176
+ cutAdjusts.push([
3177
+ 1,
3178
+ (sideSize - expectedRoundCut) / (expectedCut - expectedRoundCut)
3179
+ ]);
3180
+ } else {
3181
+ cutAdjusts.push([1, 1]);
3182
+ }
3183
+ }
3184
+ const corners = [];
3185
+ for (let i = 0; i < n; i++) {
3186
+ const allowedCuts = [];
3187
+ for (const delta of [0, 1]) {
3188
+ const [roundCutRatio, cutRatio] = cutAdjusts[(i + n - 1 + delta) % n];
3189
+ allowedCuts.push(
3190
+ roundedCorners[i].expectedRoundCut * roundCutRatio + (roundedCorners[i].expectedCut - roundedCorners[i].expectedRoundCut) * cutRatio
3191
+ );
3192
+ }
3193
+ corners.push(roundedCorners[i].getCubics(allowedCuts[0], allowedCuts[1]));
3194
+ }
3195
+ const tempFeatures = [];
3196
+ for (let i = 0; i < n; i++) {
3197
+ const prevIdx = (i + n - 1) % n;
3198
+ const nextIdx = (i + 1) % n;
3199
+ const currV = point(vertices[i * 2], vertices[i * 2 + 1]);
3200
+ const prevV = point(vertices[prevIdx * 2], vertices[prevIdx * 2 + 1]);
3201
+ const nextV = point(vertices[nextIdx * 2], vertices[nextIdx * 2 + 1]);
3202
+ const isConvex = convex(
3203
+ prevV.x,
3204
+ prevV.y,
3205
+ currV.x,
3206
+ currV.y,
3207
+ nextV.x,
3208
+ nextV.y
3209
+ );
3210
+ tempFeatures.push(cornerFeature(corners[i], isConvex));
3211
+ const lastCornerA1 = corners[i][corners[i].length - 1];
3212
+ const nextCornerA0 = corners[(i + 1) % n][0];
3213
+ tempFeatures.push(
3214
+ edgeFeature([
3215
+ Cubic.straightLine(
3216
+ lastCornerA1.anchor1X,
3217
+ lastCornerA1.anchor1Y,
3218
+ nextCornerA0.anchor0X,
3219
+ nextCornerA0.anchor0Y
3220
+ )
3221
+ ])
3222
+ );
3223
+ }
3224
+ const cx = centerX != null ? centerX : calculateCenter(vertices).x;
3225
+ const cy = centerY != null ? centerY : calculateCenter(vertices).y;
3226
+ return new _RoundedPolygon(tempFeatures, point(cx, cy));
3227
+ }
3228
+ /**
3229
+ * Creates a polygon from a pre-built Feature list.
3230
+ * @param features - Feature list (≥ 2 features)
3231
+ * @param centerX - Center X (auto-calculated if NaN)
3232
+ * @param centerY - Center Y (auto-calculated if NaN)
3233
+ */
3234
+ static fromFeatures(features, centerX = Number.NaN, centerY = Number.NaN) {
3235
+ if (features.length < 2)
3236
+ throw new Error("Polygon must have at least 2 features");
3237
+ const allVertices = [];
3238
+ for (const f of features) {
3239
+ for (const c of f.cubics) {
3240
+ allVertices.push(c.anchor0X, c.anchor0Y);
3241
+ }
3242
+ }
3243
+ const cx = Number.isNaN(centerX) ? calculateCenter(allVertices).x : centerX;
3244
+ const cy = Number.isNaN(centerY) ? calculateCenter(allVertices).y : centerY;
3245
+ return new _RoundedPolygon(features, point(cx, cy));
3246
+ }
3247
+ // ─── Instance methods ────────────────────────────────────────────────
3248
+ /**
3249
+ * Returns a new RoundedPolygon with all points transformed.
3250
+ * @param fn - Transform function: (x, y) => [x', y']
3251
+ */
3252
+ transformed(fn) {
3253
+ const [cx, cy] = fn(this.center.x, this.center.y);
3254
+ return new _RoundedPolygon(
3255
+ this.features.map((f) => transformFeature(f, fn)),
3256
+ point(cx, cy)
3257
+ );
3258
+ }
3259
+ /**
3260
+ * Returns a normalized copy: scaled and centered to fit in [0,1] × [0,1].
3261
+ * Maintains aspect ratio by using the larger dimension.
3262
+ */
3263
+ normalized() {
3264
+ const [minX, minY, maxX, maxY] = this.calculateBounds(false);
3265
+ const width = maxX - minX;
3266
+ const height = maxY - minY;
3267
+ const side = Math.max(width, height);
3268
+ const offsetX = (side - width) / 2 - minX;
3269
+ const offsetY = (side - height) / 2 - minY;
3270
+ return this.transformed((x, y) => [
3271
+ (x + offsetX) / side,
3272
+ (y + offsetY) / side
3273
+ ]);
3274
+ }
3275
+ /**
3276
+ * Calculates the axis-aligned bounding box.
3277
+ * @param approximate - If true, uses control point hull (faster). Default: true.
3278
+ * @returns [minX, minY, maxX, maxY]
3279
+ */
3280
+ calculateBounds(approximate = true) {
3281
+ let minX = Number.MAX_VALUE, minY = Number.MAX_VALUE;
3282
+ let maxX = -Number.MAX_VALUE, maxY = -Number.MAX_VALUE;
3283
+ for (const c of this.cubics) {
3284
+ const [cx0, cy0, cx1, cy1] = c.calculateBounds(approximate);
3285
+ if (cx0 < minX) minX = cx0;
3286
+ if (cy0 < minY) minY = cy0;
3287
+ if (cx1 > maxX) maxX = cx1;
3288
+ if (cy1 > maxY) maxY = cy1;
3289
+ }
3290
+ return [minX, minY, maxX, maxY];
3291
+ }
3292
+ /**
3293
+ * Calculates the maximum bounding square (useful for shapes that rotate).
3294
+ * @returns [minX, minY, maxX, maxY] of the max-bounds square
3295
+ */
3296
+ calculateMaxBounds() {
3297
+ let maxDistSq = 0;
3298
+ for (const c of this.cubics) {
3299
+ const ad = distanceSquared(
3300
+ c.anchor0X - this.centerX,
3301
+ c.anchor0Y - this.centerY
3302
+ );
3303
+ const mid = c.pointOnCurve(0.5);
3304
+ const md = distanceSquared(mid.x - this.centerX, mid.y - this.centerY);
3305
+ const m31 = Math.max(ad, md);
3306
+ if (m31 > maxDistSq) maxDistSq = m31;
3307
+ }
3308
+ const d = Math.sqrt(maxDistSq);
3309
+ return [
3310
+ this.centerX - d,
3311
+ this.centerY - d,
3312
+ this.centerX + d,
3313
+ this.centerY + d
3314
+ ];
3315
+ }
3316
+ };
3317
+ function buildCubicsList(features) {
3318
+ const result = [];
3319
+ let firstCubic = null;
3320
+ let lastCubic = null;
3321
+ let firstFeatureSplitStart = null;
3322
+ let firstFeatureSplitEnd = null;
3323
+ if (features.length > 0 && features[0].cubics.length === 3) {
3324
+ const center = features[0].cubics[1];
3325
+ const [start, end] = center.split(0.5);
3326
+ firstFeatureSplitStart = [features[0].cubics[0], start];
3327
+ firstFeatureSplitEnd = [end, features[0].cubics[2]];
3328
+ }
3329
+ for (let i = 0; i <= features.length; i++) {
3330
+ let featureCubics;
3331
+ if (i === 0 && firstFeatureSplitEnd) {
3332
+ featureCubics = firstFeatureSplitEnd;
3333
+ } else if (i === features.length) {
3334
+ if (firstFeatureSplitStart) featureCubics = firstFeatureSplitStart;
3335
+ else break;
3336
+ } else {
3337
+ featureCubics = features[i].cubics;
3338
+ }
3339
+ for (const cubic of featureCubics) {
3340
+ if (!cubic.zeroLength()) {
3341
+ if (lastCubic) result.push(lastCubic);
3342
+ lastCubic = cubic;
3343
+ if (!firstCubic) firstCubic = cubic;
3344
+ } else if (lastCubic) {
3345
+ const p = lastCubic.points.slice();
3346
+ p[6] = cubic.anchor1X;
3347
+ p[7] = cubic.anchor1Y;
3348
+ lastCubic = new Cubic(p);
3349
+ }
3350
+ }
3351
+ }
3352
+ if (lastCubic && firstCubic) {
3353
+ result.push(
3354
+ new Cubic([
3355
+ lastCubic.anchor0X,
3356
+ lastCubic.anchor0Y,
3357
+ lastCubic.control0X,
3358
+ lastCubic.control0Y,
3359
+ lastCubic.control1X,
3360
+ lastCubic.control1Y,
3361
+ firstCubic.anchor0X,
3362
+ firstCubic.anchor0Y
3363
+ ])
3364
+ );
3365
+ } else {
3366
+ result.push(Cubic.empty(0, 0));
3367
+ }
3368
+ return result;
3369
+ }
3370
+ function validateContiguity(cubics) {
3371
+ let prev = cubics[cubics.length - 1];
3372
+ for (const cubic of cubics) {
3373
+ if (Math.abs(cubic.anchor0X - prev.anchor1X) > DISTANCE_EPSILON || Math.abs(cubic.anchor0Y - prev.anchor1Y) > DISTANCE_EPSILON) {
3374
+ throw new Error(
3375
+ `RoundedPolygon must be contiguous: gap between (${cubic.anchor0X},${cubic.anchor0Y}) and (${prev.anchor1X},${prev.anchor1Y})`
3376
+ );
3377
+ }
3378
+ prev = cubic;
3379
+ }
3380
+ }
3381
+
3382
+ // src/shapes/catalog/md3-expressive-shapes.ts
3383
+ function createShape(pts) {
3384
+ const cubics = pts.map((p) => new Cubic(p));
3385
+ return RoundedPolygon.fromFeatures(
3386
+ cubics.map((c) => cornerFeature([c], false))
3387
+ );
3388
+ }
3389
+ var archShape = createShape([
3390
+ [1, 0.83461, 1, 0.8547, 1, 0.86477, 0.99898, 0.87322],
3391
+ [0.99898, 0.87322, 0.99115, 0.93918, 0.93918, 0.99115, 0.87322, 0.99898],
3392
+ [0.87322, 0.99898, 0.86477, 1, 0.8547, 1, 0.83461, 1],
3393
+ [0.83461, 1, 0.61154, 1, 0.38847, 1, 0.1654, 1],
3394
+ [0.1654, 1, 0.14529, 1, 0.13524, 1, 0.12679, 0.99898],
3395
+ [0.12679, 0.99898, 0.06084, 0.99115, 884e-5, 0.93918, 1e-3, 0.87322],
3396
+ [1e-3, 0.87322, 0, 0.86477, 0, 0.8547, 0, 0.83461],
3397
+ [0, 0.83461, 0, 0.72307, 0, 0.61154, 0, 0.5],
3398
+ [0, 0.5, 0, 0.22385, 0.22386, 0, 0.5, 0],
3399
+ [0.5, 0, 0.77615, 0, 1, 0.22385, 1, 0.5],
3400
+ [1, 0.5, 1, 0.61154, 1, 0.72307, 1, 0.83461]
3401
+ ]);
3402
+ var arrowShape = createShape([
3403
+ [0.8594, 0.44684, 0.81504, 0.37855, 0.77068, 0.31016, 0.72632, 0.24187],
3404
+ [0.72632, 0.24187, 0.69754, 0.19753, 0.66825, 0.1526, 0.62934, 0.11738],
3405
+ [0.62934, 0.11738, 0.59043, 0.08209, 0.54003, 0.05716, 0.48834, 0.06041],
3406
+ [0.48834, 0.06041, 0.44296, 0.06333, 0.4009, 0.08773, 0.36769, 0.11959],
3407
+ [0.36769, 0.11959, 0.33449, 0.15146, 0.30869, 0.1907, 0.28332, 0.22956],
3408
+ [0.28332, 0.22956, 0.21469, 0.33456, 0.14598, 0.43956, 0.07736, 0.54462],
3409
+ [0.07736, 0.54462, 0.04474, 0.5945, 0.01128, 0.64655, 226e-5, 0.70598],
3410
+ [226e-5, 0.70598, -864e-5, 0.77779, 0.02074, 0.85092, 0.07284, 0.89867],
3411
+ [0.07284, 0.89867, 0.12733, 0.94861, 0.21563, 0.94456, 0.28196, 0.93089],
3412
+ [0.28196, 0.93089, 0.35467, 0.91586, 0.42576, 0.8876, 0.49992, 0.88769],
3413
+ [0.49992, 0.88769, 0.56344, 0.88769, 0.62483, 0.90858, 0.68664, 0.92377],
3414
+ [0.68664, 0.92377, 0.74837, 0.93886, 0.8147, 0.94817, 0.8743, 0.9257],
3415
+ [0.8743, 0.9257, 0.94829, 0.89788, 1.00142, 0.81877, 0.99997, 0.73757],
3416
+ [0.99997, 0.73757, 0.99861, 0.66348, 0.95714, 0.59731, 0.91721, 0.53567],
3417
+ [0.91721, 0.53567, 0.89797, 0.50608, 0.87873, 0.47643, 0.85948, 0.44684],
3418
+ [0.85948, 0.44684, 0.85946, 0.44684, 0.85943, 0.44684, 0.8594, 0.44684]
3419
+ ]);
3420
+ var boomShape = createShape([
3421
+ [0.49006, 0.03176, 0.49241, 0.01294, 0.49359, 354e-5, 0.49537, 185e-5],
3422
+ [0.49537, 185e-5, 0.49796, -62e-5, 0.50203, -62e-5, 0.50462, 185e-5],
3423
+ [0.50462, 185e-5, 0.50641, 354e-5, 0.50759, 0.01294, 0.50994, 0.03176],
3424
+ [0.50994, 0.03176, 0.51992, 0.11153, 0.5299, 0.1913, 0.53987, 0.27107],
3425
+ [0.53987, 0.27107, 0.54082, 0.27866, 0.5413, 0.28244, 0.54266, 0.28403],
3426
+ [0.54266, 0.28403, 0.54464, 0.28628, 0.54787, 0.287, 0.5506, 0.28572],
3427
+ [0.5506, 0.28572, 0.55248, 0.28485, 0.55445, 0.28157, 0.55839, 0.275],
3428
+ [0.55839, 0.275, 0.59978, 0.20621, 0.64116, 0.13742, 0.68254, 0.06863],
3429
+ [0.68254, 0.06863, 0.69231, 0.05241, 0.69719, 0.04429, 0.6995, 0.04348],
3430
+ [0.6995, 0.04348, 0.70287, 0.04232, 0.70657, 0.04398, 0.70795, 0.04729],
3431
+ [0.70795, 0.04729, 0.70891, 0.04954, 0.70617, 0.05863, 0.70071, 0.07679],
3432
+ [0.70071, 0.07679, 0.67756, 0.15373, 0.6544, 0.23068, 0.63124, 0.30763],
3433
+ [0.63124, 0.30763, 0.62904, 0.31497, 0.62794, 0.31863, 0.62855, 0.3206],
3434
+ [0.62855, 0.3206, 0.62942, 0.32348, 0.6321, 0.32544, 0.63512, 0.32541],
3435
+ [0.63512, 0.32541, 0.63719, 0.32538, 0.64031, 0.32319, 0.64656, 0.31882],
3436
+ [0.64656, 0.31882, 0.7122, 0.2729, 0.77783, 0.22698, 0.84347, 0.18107],
3437
+ [0.84347, 0.18107, 0.85895, 0.17022, 0.86669, 0.16482, 0.86913, 0.16501],
3438
+ [0.86913, 0.16501, 0.87269, 0.16533, 0.87539, 0.16834, 0.87532, 0.17191],
3439
+ [0.87532, 0.17191, 0.87528, 0.17438, 0.86911, 0.18157, 0.85678, 0.19591],
3440
+ [0.85678, 0.19591, 0.80449, 0.25674, 0.75221, 0.31758, 0.69992, 0.37841],
3441
+ [0.69992, 0.37841, 0.69494, 0.38419, 0.69246, 0.3871, 0.69221, 0.38916],
3442
+ [0.69221, 0.38916, 0.69185, 0.39216, 0.6935, 0.39503, 0.69627, 0.39622],
3443
+ [0.69627, 0.39622, 0.69817, 0.39706, 0.70191, 0.39631, 0.70939, 0.39488],
3444
+ [0.70939, 0.39488, 0.78793, 0.37977, 0.86646, 0.36467, 0.945, 0.34957],
3445
+ [0.945, 0.34957, 0.96353, 0.346, 0.9728, 0.34422, 0.97494, 0.34541],
3446
+ [0.97494, 0.34541, 0.97806, 0.34713, 0.97931, 0.351, 0.9778, 0.35425],
3447
+ [0.9778, 0.35425, 0.97676, 0.35647, 0.96822, 0.3605, 0.95115, 0.36856],
3448
+ [0.95115, 0.36856, 0.87878, 0.40276, 0.80641, 0.43696, 0.73403, 0.47116],
3449
+ [0.73403, 0.47116, 0.72714, 0.47441, 0.7237, 0.47603, 0.72263, 0.47781],
3450
+ [0.72263, 0.47781, 0.72109, 0.48041, 0.72144, 0.48372, 0.72348, 0.48594],
3451
+ [0.72348, 0.48594, 0.72489, 0.48747, 0.7286, 0.48834, 0.73601, 0.49006],
3452
+ [0.73601, 0.49006, 0.81387, 0.50839, 0.89173, 0.52671, 0.96959, 0.54503],
3453
+ [0.96959, 0.54503, 0.98796, 0.54934, 0.99715, 0.5515, 0.99862, 0.55347],
3454
+ [0.99862, 0.55347, 1.00077, 0.55631, 1.00035, 0.56037, 0.99766, 0.56272],
3455
+ [0.99766, 0.56272, 0.9958, 0.56431, 0.98638, 0.56453, 0.96751, 0.56491],
3456
+ [0.96751, 0.56491, 0.88757, 0.56654, 0.80762, 0.56818, 0.72767, 0.56981],
3457
+ [0.72767, 0.56981, 0.72006, 0.56997, 0.71626, 0.57006, 0.71456, 0.57125],
3458
+ [0.71456, 0.57125, 0.7121, 0.573, 0.71108, 0.57617, 0.71206, 0.57903],
3459
+ [0.71206, 0.57903, 0.71272, 0.581, 0.71576, 0.58331, 0.72182, 0.58794],
3460
+ [0.72182, 0.58794, 0.78555, 0.6365, 0.84927, 0.68506, 0.91299, 0.73362],
3461
+ [0.91299, 0.73362, 0.92802, 0.74509, 0.93554, 0.75084, 0.93609, 0.75322],
3462
+ [0.93609, 0.75322, 0.93691, 0.7567, 0.93489, 0.76022, 0.93147, 0.76128],
3463
+ [0.93147, 0.76128, 0.92912, 0.762, 0.92043, 0.75831, 0.90304, 0.75097],
3464
+ [0.90304, 0.75097, 0.82934, 0.71977, 0.75565, 0.68857, 0.68195, 0.65737],
3465
+ [0.68195, 0.65737, 0.67493, 0.6544, 0.67142, 0.6529, 0.66939, 0.65331],
3466
+ [0.66939, 0.65331, 0.66644, 0.65391, 0.66423, 0.65637, 0.66396, 0.65937],
3467
+ [0.66396, 0.65937, 0.66378, 0.66144, 0.66561, 0.66481, 0.66928, 0.6715],
3468
+ [0.66928, 0.6715, 0.70784, 0.74193, 0.74641, 0.81237, 0.78497, 0.88281],
3469
+ [0.78497, 0.88281, 0.79407, 0.8994, 0.79862, 0.90771, 0.79815, 0.91015],
3470
+ [0.79815, 0.91015, 0.79748, 0.91366, 0.79421, 0.91604, 0.79067, 0.91562],
3471
+ [0.79067, 0.91562, 0.78824, 0.91531, 0.78179, 0.9084, 0.76888, 0.89456],
3472
+ [0.76888, 0.89456, 0.71418, 0.83591, 0.65947, 0.77727, 0.60477, 0.71862],
3473
+ [0.60477, 0.71862, 0.59956, 0.71306, 0.59695, 0.71025, 0.59494, 0.70981],
3474
+ [0.59494, 0.70981, 0.592, 0.70912, 0.58897, 0.71048, 0.58752, 0.71312],
3475
+ [0.58752, 0.71312, 0.58651, 0.71493, 0.58683, 0.71875, 0.58747, 0.72637],
3476
+ [0.58747, 0.72637, 0.59421, 0.80649, 0.60094, 0.8866, 0.60768, 0.96671],
3477
+ [0.60768, 0.96671, 0.60927, 0.98562, 0.61006, 0.99506, 0.60866, 0.99709],
3478
+ [0.60866, 0.99709, 0.60663, 1.00002, 0.60267, 1.00087, 0.59962, 0.99902],
3479
+ [0.59962, 0.99902, 0.59752, 0.99774, 0.59442, 0.98877, 0.58823, 0.97087],
3480
+ [0.58823, 0.97087, 0.56197, 0.89493, 0.53572, 0.819, 0.50946, 0.74306],
3481
+ [0.50946, 0.74306, 0.50696, 0.73581, 0.50571, 0.73222, 0.50406, 0.73097],
3482
+ [0.50406, 0.73097, 0.50165, 0.72916, 0.49834, 0.72916, 0.49594, 0.73097],
3483
+ [0.49594, 0.73097, 0.49428, 0.73222, 0.49303, 0.73581, 0.49053, 0.74306],
3484
+ [0.49053, 0.74306, 0.46428, 0.819, 0.43803, 0.89493, 0.41177, 0.97087],
3485
+ [0.41177, 0.97087, 0.40558, 0.98877, 0.40248, 0.99774, 0.40038, 0.99902],
3486
+ [0.40038, 0.99902, 0.39733, 1.00087, 0.39338, 1.00002, 0.39134, 0.99709],
3487
+ [0.39134, 0.99709, 0.38994, 0.99506, 0.39073, 0.98562, 0.39232, 0.96671],
3488
+ [0.39232, 0.96671, 0.39906, 0.8866, 0.40579, 0.80649, 0.41253, 0.72637],
3489
+ [0.41253, 0.72637, 0.41317, 0.71875, 0.41349, 0.71493, 0.41248, 0.71312],
3490
+ [0.41248, 0.71312, 0.41104, 0.71048, 0.408, 0.70912, 0.40507, 0.70981],
3491
+ [0.40507, 0.70981, 0.40305, 0.71025, 0.40044, 0.71306, 0.39523, 0.71862],
3492
+ [0.39523, 0.71862, 0.34053, 0.77727, 0.28582, 0.83591, 0.23112, 0.89456],
3493
+ [0.23112, 0.89456, 0.21821, 0.9084, 0.21176, 0.91531, 0.20933, 0.91562],
3494
+ [0.20933, 0.91562, 0.20578, 0.91604, 0.20252, 0.91366, 0.20184, 0.91015],
3495
+ [0.20184, 0.91015, 0.20138, 0.90771, 0.20593, 0.8994, 0.21503, 0.88281],
3496
+ [0.21503, 0.88281, 0.25359, 0.81237, 0.29215, 0.74193, 0.33072, 0.6715],
3497
+ [0.33072, 0.6715, 0.33439, 0.66481, 0.33622, 0.66144, 0.33604, 0.65937],
3498
+ [0.33604, 0.65937, 0.33577, 0.65637, 0.33356, 0.65391, 0.3306, 0.65331],
3499
+ [0.3306, 0.65331, 0.32857, 0.6529, 0.32506, 0.6544, 0.31805, 0.65737],
3500
+ [0.31805, 0.65737, 0.24435, 0.68857, 0.17065, 0.71977, 0.09695, 0.75097],
3501
+ [0.09695, 0.75097, 0.07957, 0.75831, 0.07087, 0.762, 0.06853, 0.76128],
3502
+ [0.06853, 0.76128, 0.06511, 0.76022, 0.06309, 0.7567, 0.06391, 0.75322],
3503
+ [0.06391, 0.75322, 0.06446, 0.75084, 0.07198, 0.74509, 0.08701, 0.73362],
3504
+ [0.08701, 0.73362, 0.15073, 0.68506, 0.21445, 0.6365, 0.27817, 0.58794],
3505
+ [0.27817, 0.58794, 0.28424, 0.58331, 0.28727, 0.581, 0.28794, 0.57903],
3506
+ [0.28794, 0.57903, 0.28892, 0.57617, 0.2879, 0.573, 0.28543, 0.57125],
3507
+ [0.28543, 0.57125, 0.28374, 0.57006, 0.27993, 0.56997, 0.27232, 0.56981],
3508
+ [0.27232, 0.56981, 0.19238, 0.56818, 0.11243, 0.56654, 0.03248, 0.56491],
3509
+ [0.03248, 0.56491, 0.01362, 0.56453, 419e-5, 0.56431, 234e-5, 0.56272],
3510
+ [234e-5, 0.56272, -35e-5, 0.56036, -77e-5, 0.55633, 138e-5, 0.55347],
3511
+ [138e-5, 0.55347, 285e-5, 0.5515, 0.01204, 0.54934, 0.03041, 0.54503],
3512
+ [0.03041, 0.54503, 0.10827, 0.52671, 0.18613, 0.50839, 0.26399, 0.49006],
3513
+ [0.26399, 0.49006, 0.2714, 0.48834, 0.27511, 0.48747, 0.27652, 0.48594],
3514
+ [0.27652, 0.48594, 0.27856, 0.48372, 0.27891, 0.48041, 0.27736, 0.47781],
3515
+ [0.27736, 0.47781, 0.2763, 0.47603, 0.27286, 0.47441, 0.26597, 0.47116],
3516
+ [0.26597, 0.47116, 0.19359, 0.43696, 0.12122, 0.40276, 0.04885, 0.36856],
3517
+ [0.04885, 0.36856, 0.03177, 0.3605, 0.02324, 0.35647, 0.0222, 0.35425],
3518
+ [0.0222, 0.35425, 0.02068, 0.35101, 0.02193, 0.34715, 0.02506, 0.34541],
3519
+ [0.02506, 0.34541, 0.0272, 0.34422, 0.03647, 0.346, 0.055, 0.34957],
3520
+ [0.055, 0.34957, 0.13353, 0.36467, 0.21207, 0.37977, 0.29061, 0.39488],
3521
+ [0.29061, 0.39488, 0.29809, 0.39631, 0.30183, 0.39706, 0.30373, 0.39622],
3522
+ [0.30373, 0.39622, 0.3065, 0.39502, 0.30815, 0.39215, 0.30779, 0.38916],
3523
+ [0.30779, 0.38916, 0.30755, 0.3871, 0.30506, 0.38419, 0.30008, 0.37841],
3524
+ [0.30008, 0.37841, 0.24779, 0.31758, 0.19551, 0.25674, 0.14322, 0.19591],
3525
+ [0.14322, 0.19591, 0.13089, 0.18157, 0.12472, 0.17438, 0.12468, 0.17191],
3526
+ [0.12468, 0.17191, 0.12461, 0.16834, 0.12731, 0.16533, 0.13086, 0.16501],
3527
+ [0.13086, 0.16501, 0.1333, 0.16482, 0.14104, 0.17022, 0.15653, 0.18107],
3528
+ [0.15653, 0.18107, 0.22217, 0.22698, 0.2878, 0.2729, 0.35344, 0.31882],
3529
+ [0.35344, 0.31882, 0.35969, 0.32319, 0.36281, 0.32538, 0.36488, 0.32541],
3530
+ [0.36488, 0.32541, 0.3679, 0.32544, 0.37058, 0.32348, 0.37145, 0.3206],
3531
+ [0.37145, 0.3206, 0.37206, 0.31863, 0.37096, 0.31497, 0.36875, 0.30763],
3532
+ [0.36875, 0.30763, 0.3456, 0.23068, 0.32244, 0.15373, 0.29929, 0.07679],
3533
+ [0.29929, 0.07679, 0.29382, 0.05863, 0.29109, 0.04954, 0.29205, 0.04729],
3534
+ [0.29205, 0.04729, 0.29342, 0.04399, 0.29711, 0.04232, 0.3005, 0.04348],
3535
+ [0.3005, 0.04348, 0.30281, 0.04429, 0.30769, 0.05241, 0.31745, 0.06863],
3536
+ [0.31745, 0.06863, 0.35884, 0.13742, 0.40022, 0.20621, 0.44161, 0.275],
3537
+ [0.44161, 0.275, 0.44555, 0.28157, 0.44752, 0.28485, 0.4494, 0.28572],
3538
+ [0.4494, 0.28572, 0.45212, 0.287, 0.45536, 0.28628, 0.45734, 0.28403],
3539
+ [0.45734, 0.28403, 0.4587, 0.28244, 0.45917, 0.27866, 0.46012, 0.27107],
3540
+ [0.46012, 0.27107, 0.4701, 0.1913, 0.48008, 0.11153, 0.49006, 0.03176]
3541
+ ]);
3542
+ var bunShape = createShape([
3543
+ [0.01546, 0.25425, 0.01545, 0.18682, 0.04224, 0.12214, 0.08992, 0.07446],
3544
+ [0.08992, 0.07446, 0.1376, 0.02678, 0.20228, -1e-5, 0.26971, 0],
3545
+ [0.26971, 0, 0.42313, 0, 0.57654, 0, 0.72996, 0],
3546
+ [0.72996, 0, 0.85665, -17e-5, 0.96413, 0.09297, 0.98198, 0.2184],
3547
+ [0.98198, 0.2184, 0.99983, 0.34383, 0.92261, 0.46325, 0.8009, 0.49844],
3548
+ [0.8009, 0.49844, 0.8002, 0.49863, 0.79972, 0.49927, 0.79974, 0.5],
3549
+ [0.79974, 0.5, 0.79974, 0.50072, 0.80021, 0.50134, 0.8009, 0.50156],
3550
+ [0.8009, 0.50156, 0.92232, 0.537, 0.99924, 0.65629, 0.98142, 0.78152],
3551
+ [0.98142, 0.78152, 0.96359, 0.90675, 0.85645, 0.99984, 0.72996, 1],
3552
+ [0.72996, 1, 0.57654, 1, 0.42313, 1, 0.26971, 1],
3553
+ [0.26971, 1, 0.20228, 1.00001, 0.1376, 0.97322, 0.08992, 0.92554],
3554
+ [0.08992, 0.92554, 0.04224, 0.87786, 0.01545, 0.81318, 0.01546, 0.74575],
3555
+ [0.01546, 0.74575, 0.01548, 0.63344, 0.08915, 0.53444, 0.19671, 0.50216],
3556
+ [0.19671, 0.50216, 0.19766, 0.50187, 0.19832, 0.501, 0.19832, 0.5],
3557
+ [0.19832, 0.5, 0.19832, 0.49901, 0.19766, 0.49813, 0.19671, 0.49784],
3558
+ [0.19671, 0.49784, 0.08915, 0.46556, 0.01548, 0.36656, 0.01546, 0.25425]
3559
+ ]);
3560
+ var burstShape = createShape([
3561
+ [0.49184, 797e-5, 0.49416, 384e-5, 0.49528, 181e-5, 0.49669, 94e-5],
3562
+ [0.49669, 94e-5, 0.49872, -31e-5, 0.50128, -31e-5, 0.50331, 94e-5],
3563
+ [0.50331, 94e-5, 0.50472, 181e-5, 0.50584, 384e-5, 0.50816, 797e-5],
3564
+ [0.50816, 797e-5, 0.53447, 0.055, 0.56078, 0.10203, 0.58709, 0.14906],
3565
+ [0.58709, 0.14906, 0.5885, 0.15159, 0.58922, 0.15287, 0.59019, 0.15362],
3566
+ [0.59019, 0.15362, 0.59156, 0.15475, 0.59334, 0.15522, 0.59509, 0.15494],
3567
+ [0.59509, 0.15494, 0.59631, 0.15475, 0.59756, 0.15403, 0.60003, 0.15253],
3568
+ [0.60003, 0.15253, 0.64634, 0.12496, 0.69266, 0.09739, 0.73897, 0.06981],
3569
+ [0.73897, 0.06981, 0.743, 0.06741, 0.74503, 0.06619, 0.74666, 0.06616],
3570
+ [0.74666, 0.06616, 0.74906, 0.06606, 0.75125, 0.06734, 0.75241, 0.06944],
3571
+ [0.75241, 0.06944, 0.75319, 0.07091, 0.75316, 0.07325, 0.75309, 0.07797],
3572
+ [0.75309, 0.07797, 0.75236, 0.13185, 0.75164, 0.18574, 0.75091, 0.23962],
3573
+ [0.75091, 0.23962, 0.75084, 0.24253, 0.75084, 0.24397, 0.75128, 0.24512],
3574
+ [0.75128, 0.24512, 0.75191, 0.24678, 0.75322, 0.24809, 0.75488, 0.24872],
3575
+ [0.75488, 0.24872, 0.75603, 0.24916, 0.75747, 0.24916, 0.76038, 0.24909],
3576
+ [0.76038, 0.24909, 0.81426, 0.24836, 0.86815, 0.24764, 0.92203, 0.24691],
3577
+ [0.92203, 0.24691, 0.92675, 0.24684, 0.92909, 0.24681, 0.93056, 0.24759],
3578
+ [0.93056, 0.24759, 0.93266, 0.24875, 0.93394, 0.25094, 0.93384, 0.25334],
3579
+ [0.93384, 0.25334, 0.93381, 0.25497, 0.93259, 0.257, 0.93019, 0.26103],
3580
+ [0.93019, 0.26103, 0.90261, 0.30734, 0.87504, 0.35366, 0.84747, 0.39997],
3581
+ [0.84747, 0.39997, 0.84597, 0.40244, 0.84525, 0.40369, 0.84506, 0.40491],
3582
+ [0.84506, 0.40491, 0.84478, 0.40666, 0.84525, 0.40844, 0.84638, 0.40981],
3583
+ [0.84638, 0.40981, 0.84713, 0.41078, 0.84841, 0.4115, 0.85094, 0.41291],
3584
+ [0.85094, 0.41291, 0.89797, 0.43922, 0.945, 0.46553, 0.99203, 0.49184],
3585
+ [0.99203, 0.49184, 0.99616, 0.49416, 0.99819, 0.49528, 0.99906, 0.49669],
3586
+ [0.99906, 0.49669, 1.00031, 0.49872, 1.00031, 0.50128, 0.99906, 0.50331],
3587
+ [0.99906, 0.50331, 0.99819, 0.50472, 0.99616, 0.50584, 0.99203, 0.50816],
3588
+ [0.99203, 0.50816, 0.945, 0.53447, 0.89797, 0.56078, 0.85094, 0.58709],
3589
+ [0.85094, 0.58709, 0.84841, 0.5885, 0.84713, 0.58922, 0.84638, 0.59019],
3590
+ [0.84638, 0.59019, 0.84525, 0.59156, 0.84478, 0.59334, 0.84506, 0.59509],
3591
+ [0.84506, 0.59509, 0.84525, 0.59631, 0.84597, 0.59756, 0.84747, 0.60003],
3592
+ [0.84747, 0.60003, 0.87504, 0.64634, 0.90261, 0.69266, 0.93019, 0.73897],
3593
+ [0.93019, 0.73897, 0.93259, 0.743, 0.93381, 0.74503, 0.93384, 0.74666],
3594
+ [0.93384, 0.74666, 0.93394, 0.74906, 0.93266, 0.75125, 0.93056, 0.75241],
3595
+ [0.93056, 0.75241, 0.92909, 0.75319, 0.92675, 0.75316, 0.92203, 0.75309],
3596
+ [0.92203, 0.75309, 0.86815, 0.75236, 0.81426, 0.75164, 0.76038, 0.75091],
3597
+ [0.76038, 0.75091, 0.75747, 0.75084, 0.75603, 0.75084, 0.75488, 0.75128],
3598
+ [0.75488, 0.75128, 0.75322, 0.75191, 0.75191, 0.75322, 0.75128, 0.75488],
3599
+ [0.75128, 0.75488, 0.75084, 0.75603, 0.75084, 0.75747, 0.75091, 0.76038],
3600
+ [0.75091, 0.76038, 0.75164, 0.81426, 0.75236, 0.86815, 0.75309, 0.92203],
3601
+ [0.75309, 0.92203, 0.75316, 0.92675, 0.75319, 0.92909, 0.75241, 0.93056],
3602
+ [0.75241, 0.93056, 0.75125, 0.93266, 0.74906, 0.93394, 0.74666, 0.93384],
3603
+ [0.74666, 0.93384, 0.74503, 0.93381, 0.743, 0.93259, 0.73897, 0.93019],
3604
+ [0.73897, 0.93019, 0.69266, 0.90261, 0.64634, 0.87504, 0.60003, 0.84747],
3605
+ [0.60003, 0.84747, 0.59756, 0.84597, 0.59631, 0.84525, 0.59509, 0.84506],
3606
+ [0.59509, 0.84506, 0.59334, 0.84478, 0.59156, 0.84525, 0.59019, 0.84638],
3607
+ [0.59019, 0.84638, 0.58922, 0.84713, 0.5885, 0.84841, 0.58709, 0.85094],
3608
+ [0.58709, 0.85094, 0.56078, 0.89797, 0.53447, 0.945, 0.50816, 0.99203],
3609
+ [0.50816, 0.99203, 0.50584, 0.99616, 0.50472, 0.99819, 0.50331, 0.99906],
3610
+ [0.50331, 0.99906, 0.50128, 1.00031, 0.49872, 1.00031, 0.49669, 0.99906],
3611
+ [0.49669, 0.99906, 0.49528, 0.99819, 0.49416, 0.99616, 0.49184, 0.99203],
3612
+ [0.49184, 0.99203, 0.46553, 0.945, 0.43922, 0.89797, 0.41291, 0.85094],
3613
+ [0.41291, 0.85094, 0.4115, 0.84841, 0.41078, 0.84713, 0.40981, 0.84638],
3614
+ [0.40981, 0.84638, 0.40844, 0.84525, 0.40666, 0.84478, 0.40491, 0.84506],
3615
+ [0.40491, 0.84506, 0.40369, 0.84525, 0.40244, 0.84597, 0.39997, 0.84747],
3616
+ [0.39997, 0.84747, 0.35366, 0.87504, 0.30734, 0.90261, 0.26103, 0.93019],
3617
+ [0.26103, 0.93019, 0.257, 0.93259, 0.25497, 0.93381, 0.25334, 0.93384],
3618
+ [0.25334, 0.93384, 0.25094, 0.93394, 0.24875, 0.93266, 0.24759, 0.93056],
3619
+ [0.24759, 0.93056, 0.24681, 0.92909, 0.24684, 0.92675, 0.24691, 0.92203],
3620
+ [0.24691, 0.92203, 0.24764, 0.86815, 0.24836, 0.81426, 0.24909, 0.76038],
3621
+ [0.24909, 0.76038, 0.24916, 0.75747, 0.24916, 0.75603, 0.24872, 0.75488],
3622
+ [0.24872, 0.75488, 0.24809, 0.75322, 0.24678, 0.75191, 0.24513, 0.75128],
3623
+ [0.24513, 0.75128, 0.24397, 0.75084, 0.24253, 0.75084, 0.23963, 0.75091],
3624
+ [0.23963, 0.75091, 0.18574, 0.75164, 0.13185, 0.75236, 0.07797, 0.75309],
3625
+ [0.07797, 0.75309, 0.07325, 0.75316, 0.07091, 0.75319, 0.06944, 0.75241],
3626
+ [0.06944, 0.75241, 0.06734, 0.75127, 0.06607, 0.74904, 0.06616, 0.74666],
3627
+ [0.06616, 0.74666, 0.06619, 0.74503, 0.06741, 0.743, 0.06981, 0.73897],
3628
+ [0.06981, 0.73897, 0.09739, 0.69266, 0.12496, 0.64634, 0.15253, 0.60003],
3629
+ [0.15253, 0.60003, 0.15403, 0.59756, 0.15475, 0.59631, 0.15494, 0.59509],
3630
+ [0.15494, 0.59509, 0.15522, 0.59334, 0.15475, 0.59156, 0.15363, 0.59019],
3631
+ [0.15363, 0.59019, 0.15288, 0.58922, 0.15159, 0.5885, 0.14906, 0.58709],
3632
+ [0.14906, 0.58709, 0.10203, 0.56078, 0.055, 0.53447, 797e-5, 0.50816],
3633
+ [797e-5, 0.50816, 384e-5, 0.50584, 181e-5, 0.50472, 94e-5, 0.50331],
3634
+ [94e-5, 0.50331, -31e-5, 0.50128, -31e-5, 0.49872, 94e-5, 0.49669],
3635
+ [94e-5, 0.49669, 181e-5, 0.49528, 384e-5, 0.49416, 797e-5, 0.49184],
3636
+ [797e-5, 0.49184, 0.055, 0.46553, 0.10203, 0.43922, 0.14906, 0.41291],
3637
+ [0.14906, 0.41291, 0.15159, 0.4115, 0.15287, 0.41078, 0.15362, 0.40981],
3638
+ [0.15362, 0.40981, 0.15475, 0.40844, 0.15522, 0.40666, 0.15494, 0.40491],
3639
+ [0.15494, 0.40491, 0.15475, 0.40369, 0.15403, 0.40244, 0.15253, 0.39997],
3640
+ [0.15253, 0.39997, 0.12496, 0.35366, 0.09739, 0.30734, 0.06981, 0.26103],
3641
+ [0.06981, 0.26103, 0.06741, 0.257, 0.06619, 0.25497, 0.06616, 0.25334],
3642
+ [0.06616, 0.25334, 0.06606, 0.25094, 0.06734, 0.24875, 0.06944, 0.24759],
3643
+ [0.06944, 0.24759, 0.07091, 0.24681, 0.07325, 0.24684, 0.07797, 0.24691],
3644
+ [0.07797, 0.24691, 0.13185, 0.24764, 0.18574, 0.24836, 0.23963, 0.24909],
3645
+ [0.23963, 0.24909, 0.24253, 0.24916, 0.24397, 0.24916, 0.24513, 0.24872],
3646
+ [0.24513, 0.24872, 0.24678, 0.24809, 0.24809, 0.24678, 0.24872, 0.24512],
3647
+ [0.24872, 0.24512, 0.24916, 0.24397, 0.24916, 0.24253, 0.24909, 0.23962],
3648
+ [0.24909, 0.23962, 0.24836, 0.18574, 0.24764, 0.13185, 0.24691, 0.07797],
3649
+ [0.24691, 0.07797, 0.24684, 0.07325, 0.24681, 0.07091, 0.24759, 0.06944],
3650
+ [0.24759, 0.06944, 0.24875, 0.06734, 0.25094, 0.06606, 0.25334, 0.06616],
3651
+ [0.25334, 0.06616, 0.25497, 0.06619, 0.257, 0.06741, 0.26103, 0.06981],
3652
+ [0.26103, 0.06981, 0.30734, 0.09739, 0.35366, 0.12496, 0.39997, 0.15253],
3653
+ [0.39997, 0.15253, 0.40244, 0.15403, 0.40369, 0.15475, 0.40491, 0.15494],
3654
+ [0.40491, 0.15494, 0.40666, 0.15522, 0.40844, 0.15475, 0.40981, 0.15362],
3655
+ [0.40981, 0.15362, 0.41078, 0.15287, 0.4115, 0.15159, 0.41291, 0.14906],
3656
+ [0.41291, 0.14906, 0.43922, 0.10203, 0.46553, 0.055, 0.49184, 797e-5]
3657
+ ]);
3658
+ var circleShape = createShape([
3659
+ [1, 0.5, 1, 0.77614, 0.77614, 1, 0.5, 1],
3660
+ [0.5, 1, 0.22386, 1, 0, 0.77614, 0, 0.5],
3661
+ [0, 0.5, 0, 0.22386, 0.22386, 0, 0.5, 0],
3662
+ [0.5, 0, 0.77614, 0, 1, 0.22386, 1, 0.5]
3663
+ ]);
3664
+ var clamshellShape = createShape([
3665
+ [0.95752, 0.36588, 0.97848, 0.4081, 0.98896, 0.42921, 0.99426, 0.45126],
3666
+ [0.99426, 0.45126, 1.00191, 0.4833, 1.00191, 0.5167, 0.99426, 0.54874],
3667
+ [0.99426, 0.54874, 0.98896, 0.57079, 0.97848, 0.5919, 0.95752, 0.63412],
3668
+ [0.95752, 0.63412, 0.93623, 0.677, 0.91494, 0.71987, 0.89365, 0.76275],
3669
+ [0.89365, 0.76275, 0.87268, 0.80497, 0.8622, 0.82608, 0.84842, 0.84244],
3670
+ [0.84842, 0.84244, 0.8285, 0.86609, 0.80339, 0.88295, 0.77581, 0.89118],
3671
+ [0.77581, 0.89118, 0.75673, 0.89688, 0.73577, 0.89688, 0.69384, 0.89688],
3672
+ [0.69384, 0.89688, 0.56461, 0.89688, 0.43539, 0.89688, 0.30616, 0.89688],
3673
+ [0.30616, 0.89688, 0.26423, 0.89688, 0.24327, 0.89688, 0.22419, 0.89118],
3674
+ [0.22419, 0.89118, 0.19661, 0.88295, 0.1715, 0.86609, 0.15158, 0.84244],
3675
+ [0.15158, 0.84244, 0.1378, 0.82608, 0.12732, 0.80497, 0.10635, 0.76275],
3676
+ [0.10635, 0.76275, 0.08506, 0.71987, 0.06377, 0.677, 0.04248, 0.63412],
3677
+ [0.04248, 0.63412, 0.02152, 0.5919, 0.01104, 0.57079, 574e-5, 0.54874],
3678
+ [574e-5, 0.54874, -191e-5, 0.5167, -191e-5, 0.4833, 574e-5, 0.45126],
3679
+ [574e-5, 0.45126, 0.01104, 0.42921, 0.02152, 0.4081, 0.04248, 0.36588],
3680
+ [0.04248, 0.36588, 0.06377, 0.323, 0.08506, 0.28013, 0.10635, 0.23725],
3681
+ [0.10635, 0.23725, 0.12732, 0.19503, 0.1378, 0.17392, 0.15158, 0.15756],
3682
+ [0.15158, 0.15756, 0.1715, 0.13391, 0.19661, 0.11705, 0.22419, 0.10882],
3683
+ [0.22419, 0.10882, 0.24327, 0.10312, 0.26423, 0.10312, 0.30616, 0.10312],
3684
+ [0.30616, 0.10312, 0.43539, 0.10312, 0.56461, 0.10312, 0.69384, 0.10312],
3685
+ [0.69384, 0.10312, 0.73577, 0.10312, 0.75673, 0.10312, 0.77581, 0.10882],
3686
+ [0.77581, 0.10882, 0.80339, 0.11705, 0.8285, 0.13391, 0.84842, 0.15756],
3687
+ [0.84842, 0.15756, 0.8622, 0.17392, 0.87268, 0.19503, 0.89365, 0.23725],
3688
+ [0.89365, 0.23725, 0.91494, 0.28013, 0.93623, 0.323, 0.95752, 0.36588]
3689
+ ]);
3690
+ var diamondShape = createShape([
3691
+ [0.67951, 0.864, 0.62689, 0.93286, 0.60059, 0.96728, 0.57021, 0.98296],
3692
+ [0.57021, 0.98296, 0.52616, 1.00568, 0.47384, 1.00568, 0.42979, 0.98296],
3693
+ [0.42979, 0.98296, 0.39941, 0.96728, 0.37311, 0.93286, 0.32049, 0.864],
3694
+ [0.32049, 0.864, 0.26225, 0.78778, 0.20401, 0.71156, 0.14577, 0.63534],
3695
+ [0.14577, 0.63534, 0.11377, 0.59346, 0.09777, 0.57252, 0.08984, 0.5501],
3696
+ [0.08984, 0.5501, 0.07838, 0.51768, 0.07838, 0.48232, 0.08984, 0.4499],
3697
+ [0.08984, 0.4499, 0.09777, 0.42748, 0.11377, 0.40654, 0.14577, 0.36466],
3698
+ [0.14577, 0.36466, 0.20401, 0.28844, 0.26225, 0.21222, 0.32049, 0.136],
3699
+ [0.32049, 0.136, 0.37311, 0.06714, 0.39941, 0.03271, 0.42979, 0.01704],
3700
+ [0.42979, 0.01704, 0.47384, -568e-5, 0.52616, -568e-5, 0.57021, 0.01704],
3701
+ [0.57021, 0.01704, 0.60059, 0.03272, 0.62689, 0.06714, 0.67951, 0.136],
3702
+ [0.67951, 0.136, 0.73775, 0.21222, 0.79599, 0.28844, 0.85423, 0.36466],
3703
+ [0.85423, 0.36466, 0.88623, 0.40654, 0.90223, 0.42748, 0.91016, 0.4499],
3704
+ [0.91016, 0.4499, 0.92162, 0.48232, 0.92162, 0.51768, 0.91016, 0.5501],
3705
+ [0.91016, 0.5501, 0.90223, 0.57252, 0.88623, 0.59346, 0.85423, 0.63534],
3706
+ [0.85423, 0.63534, 0.79599, 0.71156, 0.73775, 0.78778, 0.67951, 0.864]
3707
+ ]);
3708
+ var fanShape = createShape([
3709
+ [0, 0.15789, 0, 0.15232, 0, 0.14954, 7e-5, 0.14718],
3710
+ [7e-5, 0.14718, 256e-5, 0.06699, 0.06699, 256e-5, 0.14718, 8e-5],
3711
+ [0.14718, 8e-5, 0.14954, 0, 0.15232, 0, 0.1579, 0],
3712
+ [0.1579, 0, 0.18761, 0, 0.20246, 0, 0.21503, 39e-5],
3713
+ [0.21503, 39e-5, 0.64271, 0.01366, 0.98632, 0.35728, 0.99961, 0.78497],
3714
+ [0.99961, 0.78497, 1, 0.79753, 1, 0.81239, 1, 0.8421],
3715
+ [1, 0.8421, 1, 0.84767, 1, 0.85046, 0.99993, 0.85282],
3716
+ [0.99993, 0.85282, 0.99743, 0.93301, 0.933, 0.99744, 0.85282, 0.99993],
3717
+ [0.85282, 0.99993, 0.85046, 1, 0.84768, 1, 0.84211, 1],
3718
+ [0.84211, 1, 0.63634, 1, 0.43057, 1, 0.2248, 1],
3719
+ [0.2248, 1, 0.15688, 1, 0.12292, 1, 0.09598, 0.98933],
3720
+ [0.09598, 0.98933, 0.05698, 0.97389, 0.02611, 0.94301, 0.01067, 0.90402],
3721
+ [0.01067, 0.90402, 0, 0.87708, 0, 0.84312, 0, 0.7752],
3722
+ [0, 0.7752, 0, 0.56943, 0, 0.36366, 0, 0.15789]
3723
+ ]);
3724
+ var flowerShape = createShape([
3725
+ [0.85353, 0.14645, 0.81641, 0.10934, 0.73184, 0.12769, 0.62984, 0.1865],
3726
+ [0.62984, 0.1865, 0.59928, 0.07277, 0.55247, 0, 0.5, 0],
3727
+ [0.5, 0, 0.4475, 0, 0.40069, 0.07276, 0.37016, 0.18649],
3728
+ [0.37016, 0.18649, 0.26813, 0.12768, 0.18359, 0.10934, 0.14647, 0.14644],
3729
+ [0.14647, 0.14644, 0.10938, 0.18355, 0.12772, 0.26811, 0.18653, 0.37014],
3730
+ [0.18653, 0.37014, 0.07278, 0.40069, 0, 0.44751, 0, 0.5],
3731
+ [0, 0.5, 0, 0.55248, 0.07275, 0.59929, 0.1865, 0.62984],
3732
+ [0.1865, 0.62984, 0.12766, 0.73188, 0.10931, 0.81644, 0.14641, 0.85355],
3733
+ [0.14641, 0.85355, 0.18353, 0.89067, 0.26809, 0.87231, 0.37012, 0.81347],
3734
+ [0.37012, 0.81347, 0.40069, 0.92722, 0.4475, 1, 0.5, 1],
3735
+ [0.5, 1, 0.55247, 1, 0.59928, 0.92722, 0.62984, 0.81346],
3736
+ [0.62984, 0.81346, 0.73191, 0.8723, 0.81647, 0.89066, 0.85359, 0.85355],
3737
+ [0.85359, 0.85355, 0.89069, 0.81644, 0.87234, 0.73188, 0.8135, 0.62984],
3738
+ [0.8135, 0.62984, 0.92725, 0.59929, 1, 0.55248, 1, 0.5],
3739
+ [1, 0.5, 1, 0.44751, 0.92722, 0.40069, 0.81344, 0.37014],
3740
+ [0.81344, 0.37014, 0.87228, 0.26811, 0.89063, 0.18356, 0.85353, 0.14645]
3741
+ ]);
3742
+ var gemShape = createShape([
3743
+ [0.31244, 0.08536, 0.37064, 0.04306, 0.39978, 0.02191, 0.4308, 0.0114],
3744
+ [0.4308, 0.0114, 0.47568, -38e-4, 0.52432, -38e-4, 0.5692, 0.0114],
3745
+ [0.5692, 0.0114, 0.60022, 0.02191, 0.62936, 0.04306, 0.68756, 0.08536],
3746
+ [0.68756, 0.08536, 0.73121, 0.11706, 0.77485, 0.14876, 0.81849, 0.18046],
3747
+ [0.81849, 0.18046, 0.85308, 0.20558, 0.87038, 0.21814, 0.88446, 0.23321],
3748
+ [0.88446, 0.23321, 0.90483, 0.25499, 0.92046, 0.28077, 0.93035, 0.30891],
3749
+ [0.93035, 0.30891, 0.93721, 0.32838, 0.94032, 0.34951, 0.9466, 0.39178],
3750
+ [0.9466, 0.39178, 0.95468, 0.44627, 0.96276, 0.50076, 0.97083, 0.55524],
3751
+ [0.97083, 0.55524, 0.98183, 0.6294, 0.98734, 0.66648, 0.9818, 0.69989],
3752
+ [0.9818, 0.69989, 0.97375, 0.74823, 0.9495, 0.79239, 0.91301, 0.8251],
3753
+ [0.91301, 0.8251, 0.88779, 0.84771, 0.85353, 0.86296, 0.78503, 0.89347],
3754
+ [0.78503, 0.89347, 0.73331, 0.91651, 0.68159, 0.93954, 0.62987, 0.96258],
3755
+ [0.62987, 0.96258, 0.58853, 0.98099, 0.56785, 0.99019, 0.54663, 0.9949],
3756
+ [0.54663, 0.9949, 0.51592, 1.0017, 0.48408, 1.0017, 0.45337, 0.9949],
3757
+ [0.45337, 0.9949, 0.43215, 0.99019, 0.41147, 0.98099, 0.37013, 0.96258],
3758
+ [0.37013, 0.96258, 0.31841, 0.93954, 0.26669, 0.91651, 0.21497, 0.89347],
3759
+ [0.21497, 0.89347, 0.14647, 0.86296, 0.11221, 0.84771, 0.08699, 0.8251],
3760
+ [0.08699, 0.8251, 0.0505, 0.79239, 0.02625, 0.74823, 0.0182, 0.69989],
3761
+ [0.0182, 0.69989, 0.01266, 0.66648, 0.01817, 0.6294, 0.02917, 0.55524],
3762
+ [0.02917, 0.55524, 0.03724, 0.50076, 0.04532, 0.44627, 0.0534, 0.39178],
3763
+ [0.0534, 0.39178, 0.05968, 0.34951, 0.06279, 0.32838, 0.06965, 0.30891],
3764
+ [0.06965, 0.30891, 0.07954, 0.28077, 0.09517, 0.25499, 0.11554, 0.23321],
3765
+ [0.11554, 0.23321, 0.12962, 0.21814, 0.14692, 0.20558, 0.18151, 0.18046],
3766
+ [0.18151, 0.18046, 0.22515, 0.14876, 0.26879, 0.11706, 0.31244, 0.08536]
3767
+ ]);
3768
+ var ghostishShape = createShape([
3769
+ [0, 0.47619, 0, 0.2132, 0.22386, 0, 0.5, 0],
3770
+ [0.5, 0, 0.77614, 0, 1, 0.2132, 1, 0.47619],
3771
+ [1, 0.47619, 1, 0.5873, 1, 0.69841, 1, 0.80952],
3772
+ [1, 0.80952, 1, 0.91472, 0.91046, 1, 0.8, 1],
3773
+ [0.8, 1, 0.76726, 1, 0.73636, 0.99251, 0.70908, 0.97923],
3774
+ [0.70908, 0.97923, 0.69518, 0.97246, 0.68131, 0.96504, 0.66738, 0.95759],
3775
+ [0.66738, 0.95759, 0.61838, 0.93137, 0.56864, 0.90476, 0.51423, 0.90476],
3776
+ [0.51423, 0.90476, 0.50474, 0.90476, 0.49526, 0.90476, 0.48577, 0.90476],
3777
+ [0.48577, 0.90476, 0.43136, 0.90476, 0.38163, 0.93137, 0.33262, 0.95759],
3778
+ [0.33262, 0.95759, 0.31869, 0.96504, 0.30482, 0.97246, 0.29092, 0.97923],
3779
+ [0.29092, 0.97923, 0.26364, 0.99251, 0.23274, 1, 0.2, 1],
3780
+ [0.2, 1, 0.08954, 1, 0, 0.91472, 0, 0.80952],
3781
+ [0, 0.80952, 0, 0.69841, 0, 0.5873, 0, 0.47619]
3782
+ ]);
3783
+ var heartShape = createShape([
3784
+ [0.78469, 0.05353, 0.717, 0.05353, 0.6566, 0.08531, 0.61713, 0.135],
3785
+ [0.61713, 0.135, 0.57809, 0.17803, 0.53904, 0.22106, 0.5, 0.26409],
3786
+ [0.5, 0.26409, 0.5, 0.26396, 0.5, 0.26382, 0.5, 0.26369],
3787
+ [0.5, 0.26369, 0.46096, 0.22065, 0.42191, 0.1776, 0.38287, 0.13456],
3788
+ [0.38287, 0.13456, 0.3434, 0.08491, 0.283, 0.05312, 0.21531, 0.05312],
3789
+ [0.21531, 0.05312, 0.0964, 0.05312, 0, 0.15116, 0, 0.27206],
3790
+ [0, 0.27206, 0, 0.37831, 0.08867, 0.45772, 0.15287, 0.534],
3791
+ [0.15287, 0.534, 0.21684, 0.61003, 0.2808, 0.686, 0.34476, 0.762],
3792
+ [0.34476, 0.762, 0.39262, 0.81887, 0.44049, 0.87575, 0.48835, 0.93263],
3793
+ [0.48835, 0.93263, 0.49224, 0.93722, 0.49611, 0.94184, 0.5, 0.94647],
3794
+ [0.5, 0.94647, 0.5, 0.9466, 0.5, 0.94674, 0.5, 0.94688],
3795
+ [0.5, 0.94688, 0.50389, 0.94225, 0.50776, 0.93766, 0.51165, 0.93303],
3796
+ [0.51165, 0.93303, 0.55951, 0.87616, 0.60737, 0.81931, 0.65524, 0.76244],
3797
+ [0.65524, 0.76244, 0.7192, 0.68644, 0.78317, 0.61044, 0.84713, 0.53444],
3798
+ [0.84713, 0.53444, 0.91133, 0.45816, 1, 0.37875, 1, 0.27247],
3799
+ [1, 0.27247, 1, 0.15156, 0.9036, 0.05353, 0.78469, 0.05353]
3800
+ ]);
3801
+ var clover4LeafShape = createShape([
3802
+ [0.07095, 0.5, 0.02669, 0.44709, 0, 0.37882, 0, 0.30426],
3803
+ [0, 0.30426, 0, 0.13622, 0.13551, 0, 0.3027, 0],
3804
+ [0.3027, 0, 0.37834, 0, 0.44753, 0.02791, 0.50057, 0.07402],
3805
+ [0.50057, 0.07402, 0.55351, 0.02791, 0.62253, 0, 0.69801, 0],
3806
+ [0.69801, 0, 0.8648, 0, 1, 0.13622, 1, 0.30426],
3807
+ [1, 0.30426, 1, 0.37882, 0.97338, 0.44709, 0.92922, 0.5],
3808
+ [0.92922, 0.5, 0.97338, 0.55291, 1, 0.62118, 1, 0.69574],
3809
+ [1, 0.69574, 1, 0.86378, 0.8648, 1, 0.69801, 1],
3810
+ [0.69801, 1, 0.62253, 1, 0.55351, 0.97209, 0.50057, 0.92598],
3811
+ [0.50057, 0.92598, 0.44753, 0.97209, 0.37834, 1, 0.3027, 1],
3812
+ [0.3027, 1, 0.13551, 1, 0, 0.86378, 0, 0.69574],
3813
+ [0, 0.69574, 0, 0.62118, 0.02669, 0.55291, 0.07095, 0.5]
3814
+ ]);
3815
+ var clover8LeafShape = createShape([
3816
+ [0.96431, 0.5, 1.0451, 0.6505, 0.98406, 0.78678, 0.82834, 0.82831],
3817
+ [0.82834, 0.82831, 0.78678, 0.98406, 0.6505, 1.04506, 0.5, 0.96431],
3818
+ [0.5, 0.96431, 0.34947, 1.0451, 0.21319, 0.98406, 0.17166, 0.82834],
3819
+ [0.17166, 0.82834, 0.01594, 0.78678, -0.0451, 0.6505, 0.03569, 0.5],
3820
+ [0.03569, 0.5, -0.0451, 0.34947, 0.01594, 0.21319, 0.17166, 0.17166],
3821
+ [0.17166, 0.17166, 0.21319, 0.01594, 0.34947, -0.0451, 0.5, 0.03569],
3822
+ [0.5, 0.03569, 0.6505, -0.0451, 0.78678, 0.01594, 0.82831, 0.17166],
3823
+ [0.82831, 0.17166, 0.98406, 0.21319, 1.04506, 0.34947, 0.96431, 0.5]
3824
+ ]);
3825
+ var ovalShape = createShape([
3826
+ [0.77103, 0.77103, 0.53902, 1.00303, 0.22959, 1.06979, 0.07991, 0.9201],
3827
+ [0.07991, 0.9201, -0.06978, 0.7704, -304e-5, 0.46097, 0.22897, 0.22897],
3828
+ [0.22897, 0.22897, 0.46098, -303e-5, 0.77041, -0.06979, 0.92009, 0.0799],
3829
+ [0.92009, 0.0799, 1.06978, 0.2296, 1.00304, 0.53903, 0.77103, 0.77103]
3830
+ ]);
3831
+ var pentagonShape = createShape([
3832
+ [0.3426, 0.07617, 0.39138, 0.03842, 0.41575, 0.01954, 0.44181, 0.01017],
3833
+ [0.44181, 0.01017, 0.47942, -336e-5, 0.52058, -336e-5, 0.55819, 0.01017],
3834
+ [0.55819, 0.01017, 0.58425, 0.01954, 0.60862, 0.03842, 0.6574, 0.07617],
3835
+ [0.6574, 0.07617, 0.69296, 0.1037, 0.72853, 0.13123, 0.76409, 0.15876],
3836
+ [0.76409, 0.15876, 0.79963, 0.18455, 0.83517, 0.21034, 0.87071, 0.23613],
3837
+ [0.87071, 0.23613, 0.9213, 0.27285, 0.94662, 0.29123, 0.96352, 0.31429],
3838
+ [0.96352, 0.31429, 0.98796, 0.34769, 1.00083, 0.38872, 0.99996, 0.43069],
3839
+ [0.99996, 0.43069, 0.99933, 0.45972, 0.9893, 0.49006, 0.96918, 0.55072],
3840
+ [0.96918, 0.55072, 0.95522, 0.59283, 0.94126, 0.63495, 0.9273, 0.67706],
3841
+ [0.9273, 0.67706, 0.91443, 0.72021, 0.90155, 0.76335, 0.88868, 0.8065],
3842
+ [0.88868, 0.8065, 0.87052, 0.86724, 0.86146, 0.89762, 0.84562, 0.92124],
3843
+ [0.84562, 0.92124, 0.82268, 0.95543, 0.78934, 0.98055, 0.75099, 0.99259],
3844
+ [0.75099, 0.99259, 0.7245, 1.00093, 0.69393, 1.00043, 0.63281, 0.99946],
3845
+ [0.63281, 0.99946, 0.58854, 0.99876, 0.54427, 0.99806, 0.5, 0.99737],
3846
+ [0.5, 0.99737, 0.45573, 0.99806, 0.41146, 0.99876, 0.36719, 0.99946],
3847
+ [0.36719, 0.99946, 0.30607, 1.00043, 0.2755, 1.00093, 0.24901, 0.99259],
3848
+ [0.24901, 0.99259, 0.21066, 0.98055, 0.17732, 0.95543, 0.15438, 0.92124],
3849
+ [0.15438, 0.92124, 0.13854, 0.89762, 0.12948, 0.86724, 0.11132, 0.8065],
3850
+ [0.11132, 0.8065, 0.09845, 0.76335, 0.08557, 0.72021, 0.0727, 0.67706],
3851
+ [0.0727, 0.67706, 0.05874, 0.63495, 0.04478, 0.59283, 0.03082, 0.55072],
3852
+ [0.03082, 0.55072, 0.0107, 0.49006, 67e-5, 0.45972, 4e-5, 0.43069],
3853
+ [4e-5, 0.43069, -83e-5, 0.38872, 0.01204, 0.34769, 0.03648, 0.31429],
3854
+ [0.03648, 0.31429, 0.05338, 0.29123, 0.0787, 0.27285, 0.12929, 0.23613],
3855
+ [0.12929, 0.23613, 0.16483, 0.21034, 0.20037, 0.18455, 0.23591, 0.15876],
3856
+ [0.23591, 0.15876, 0.27147, 0.13123, 0.30704, 0.1037, 0.3426, 0.07617]
3857
+ ]);
3858
+ var pillShape = createShape([
3859
+ [0.2662, 0.1259, 0.43407, -0.04197, 0.70623, -0.04197, 0.8741, 0.1259],
3860
+ [0.8741, 0.1259, 1.04197, 0.29377, 1.04197, 0.56593, 0.8741, 0.7338],
3861
+ [0.8741, 0.7338, 0.82733, 0.78057, 0.78057, 0.82733, 0.7338, 0.8741],
3862
+ [0.7338, 0.8741, 0.56593, 1.04197, 0.29377, 1.04197, 0.1259, 0.8741],
3863
+ [0.1259, 0.8741, -0.04197, 0.70623, -0.04197, 0.43407, 0.1259, 0.2662],
3864
+ [0.1259, 0.2662, 0.17267, 0.21943, 0.21943, 0.17267, 0.2662, 0.1259]
3865
+ ]);
3866
+ var pixelCircleShape = createShape([
3867
+ [0.70372, 0, 0.56791, 0, 0.43209, 0, 0.29628, 0],
3868
+ [0.29628, 0, 0.29628, 0.0216, 0.29628, 0.04321, 0.29628, 0.06481],
3869
+ [0.29628, 0.06481, 0.24999, 0.06481, 0.2037, 0.06481, 0.15741, 0.06481],
3870
+ [0.15741, 0.06481, 0.15741, 0.09259, 0.15741, 0.12037, 0.15741, 0.14816],
3871
+ [0.15741, 0.14816, 0.12963, 0.14816, 0.10185, 0.14816, 0.07408, 0.14816],
3872
+ [0.07408, 0.14816, 0.07408, 0.19753, 0.07408, 0.24691, 0.07408, 0.29628],
3873
+ [0.07408, 0.29628, 0.04938, 0.29628, 0.02469, 0.29628, 0, 0.29628],
3874
+ [0, 0.29628, 0, 0.43209, 0, 0.56791, 0, 0.70372],
3875
+ [0, 0.70372, 0.02469, 0.70372, 0.04938, 0.70372, 0.07408, 0.70372],
3876
+ [0.07408, 0.70372, 0.07408, 0.75309, 0.07408, 0.80247, 0.07408, 0.85184],
3877
+ [0.07408, 0.85184, 0.10185, 0.85184, 0.12963, 0.85184, 0.15741, 0.85184],
3878
+ [0.15741, 0.85184, 0.15741, 0.87962, 0.15741, 0.90741, 0.15741, 0.93519],
3879
+ [0.15741, 0.93519, 0.2037, 0.93519, 0.24999, 0.93519, 0.29628, 0.93519],
3880
+ [0.29628, 0.93519, 0.29628, 0.95679, 0.29628, 0.9784, 0.29628, 1],
3881
+ [0.29628, 1, 0.43209, 1, 0.56791, 1, 0.70372, 1],
3882
+ [0.70372, 1, 0.70372, 0.9784, 0.70372, 0.95679, 0.70372, 0.93519],
3883
+ [0.70372, 0.93519, 0.75001, 0.93519, 0.7963, 0.93519, 0.84259, 0.93519],
3884
+ [0.84259, 0.93519, 0.84259, 0.90741, 0.84259, 0.87962, 0.84259, 0.85184],
3885
+ [0.84259, 0.85184, 0.87037, 0.85184, 0.89816, 0.85184, 0.92594, 0.85184],
3886
+ [0.92594, 0.85184, 0.92594, 0.80247, 0.92594, 0.75309, 0.92594, 0.70372],
3887
+ [0.92594, 0.70372, 0.95062, 0.70372, 0.97531, 0.70372, 1, 0.70372],
3888
+ [1, 0.70372, 1, 0.56791, 1, 0.43209, 1, 0.29628],
3889
+ [1, 0.29628, 0.97531, 0.29628, 0.95062, 0.29628, 0.92594, 0.29628],
3890
+ [0.92594, 0.29628, 0.92594, 0.24691, 0.92594, 0.19753, 0.92594, 0.14816],
3891
+ [0.92594, 0.14816, 0.89816, 0.14816, 0.87037, 0.14816, 0.84259, 0.14816],
3892
+ [0.84259, 0.14816, 0.84259, 0.12038, 0.84259, 0.09259, 0.84259, 0.06481],
3893
+ [0.84259, 0.06481, 0.7963, 0.06481, 0.75001, 0.06481, 0.70372, 0.06481],
3894
+ [0.70372, 0.06481, 0.70372, 0.04321, 0.70372, 0.0216, 0.70372, 0]
3895
+ ]);
3896
+ var pixelTriangleShape = createShape([
3897
+ [0.28637, 0, 0.22842, 0, 0.17046, 0, 0.1125, 0],
3898
+ [0.1125, 0, 0.1125, 0.33333, 0.1125, 0.66667, 0.1125, 1],
3899
+ [0.1125, 1, 0.17046, 1, 0.22842, 1, 0.28637, 1],
3900
+ [0.28637, 1, 0.28637, 0.97101, 0.28637, 0.94203, 0.28637, 0.91304],
3901
+ [0.28637, 0.91304, 0.33108, 0.91304, 0.37579, 0.91304, 0.4205, 0.91304],
3902
+ [0.4205, 0.91304, 0.4205, 0.88551, 0.4205, 0.85797, 0.4205, 0.83043],
3903
+ [0.4205, 0.83043, 0.46688, 0.83043, 0.51325, 0.83043, 0.55963, 0.83043],
3904
+ [0.55963, 0.83043, 0.55963, 0.79855, 0.55963, 0.76667, 0.55963, 0.73478],
3905
+ [0.55963, 0.73478, 0.59771, 0.73478, 0.63579, 0.73478, 0.67388, 0.73478],
3906
+ [0.67388, 0.73478, 0.67388, 0.70869, 0.67388, 0.68261, 0.67388, 0.65652],
3907
+ [0.67388, 0.65652, 0.71197, 0.65652, 0.75006, 0.65652, 0.78816, 0.65652],
3908
+ [0.78816, 0.65652, 0.78816, 0.62464, 0.78816, 0.59275, 0.78816, 0.56087],
3909
+ [0.78816, 0.56087, 0.82127, 0.56087, 0.85439, 0.56087, 0.8875, 0.56087],
3910
+ [0.8875, 0.56087, 0.8875, 0.52029, 0.8875, 0.47971, 0.8875, 0.43913],
3911
+ [0.8875, 0.43913, 0.85439, 0.43913, 0.82127, 0.43913, 0.78816, 0.43913],
3912
+ [0.78816, 0.43913, 0.78816, 0.40725, 0.78816, 0.37536, 0.78816, 0.34347],
3913
+ [0.78816, 0.34347, 0.75006, 0.34347, 0.71197, 0.34347, 0.67388, 0.34347],
3914
+ [0.67388, 0.34347, 0.67388, 0.31739, 0.67388, 0.2913, 0.67388, 0.26522],
3915
+ [0.67388, 0.26522, 0.63579, 0.26522, 0.59771, 0.26522, 0.55963, 0.26522],
3916
+ [0.55963, 0.26522, 0.55963, 0.23333, 0.55963, 0.20145, 0.55963, 0.16957],
3917
+ [0.55963, 0.16957, 0.51325, 0.16957, 0.46688, 0.16957, 0.4205, 0.16957],
3918
+ [0.4205, 0.16957, 0.4205, 0.14203, 0.4205, 0.11449, 0.4205, 0.08696],
3919
+ [0.4205, 0.08696, 0.37579, 0.08696, 0.33108, 0.08696, 0.28637, 0.08696],
3920
+ [0.28637, 0.08696, 0.28637, 0.05797, 0.28637, 0.02899, 0.28637, 0]
3921
+ ]);
3922
+ var puffyDiamondShape = createShape([
3923
+ [0.77937, 0.78048, 0.81712, 0.7427, 0.8299, 0.6894, 0.81768, 0.64111],
3924
+ [0.81768, 0.64111, 0.86599, 0.65339, 0.91937, 0.64063, 0.95718, 0.60282],
3925
+ [0.95718, 0.60282, 1.01427, 0.54574, 1.01427, 0.45319, 0.95718, 0.39611],
3926
+ [0.95718, 0.39611, 0.91959, 0.35852, 0.86662, 0.34569, 0.81856, 0.3576],
3927
+ [0.81856, 0.3576, 0.82928, 0.31027, 0.81621, 0.25865, 0.77937, 0.2218],
3928
+ [0.77937, 0.2218, 0.7415, 0.18394, 0.68803, 0.17119, 0.63969, 0.18355],
3929
+ [0.63969, 0.18355, 0.6525, 0.13492, 0.63984, 0.08095, 0.60169, 0.04282],
3930
+ [0.60169, 0.04282, 0.54462, -0.01426, 0.45206, -0.01426, 0.395, 0.04282],
3931
+ [0.395, 0.04282, 0.3571, 0.08073, 0.34435, 0.13427, 0.35678, 0.18269],
3932
+ [0.35678, 0.18269, 0.30938, 0.17184, 0.2576, 0.18487, 0.22069, 0.2218],
3933
+ [0.22069, 0.2218, 0.18385, 0.25865, 0.17079, 0.31028, 0.1815, 0.35761],
3934
+ [0.1815, 0.35761, 0.13341, 0.34568, 0.08041, 0.35851, 0.04282, 0.39611],
3935
+ [0.04282, 0.39611, -0.01427, 0.45319, -0.01427, 0.54574, 0.04282, 0.60282],
3936
+ [0.04282, 0.60282, 0.08063, 0.64064, 0.13404, 0.6534, 0.18235, 0.6411],
3937
+ [0.18235, 0.6411, 0.17013, 0.68939, 0.18291, 0.7427, 0.22069, 0.78048],
3938
+ [0.22069, 0.78048, 0.25744, 0.81725, 0.30894, 0.83033, 0.35619, 0.81973],
3939
+ [0.35619, 0.81973, 0.34478, 0.8675, 0.35772, 0.9199, 0.395, 0.95718],
3940
+ [0.395, 0.95718, 0.45206, 1.01426, 0.54462, 1.01426, 0.60169, 0.95718],
3941
+ [0.60169, 0.95718, 0.63919, 0.91968, 0.65206, 0.86688, 0.64028, 0.81888],
3942
+ [0.64028, 0.81888, 0.6885, 0.83098, 0.74165, 0.81817, 0.77937, 0.78048]
3943
+ ]);
3944
+ var puffyShape = createShape([
3945
+ [0.99994, 0.49408, 0.99912, 0.42679, 0.94916, 0.37292, 0.88825, 0.37382],
3946
+ [0.88825, 0.37382, 0.88491, 0.37382, 0.88159, 0.3741, 0.87831, 0.37449],
3947
+ [0.87831, 0.37449, 0.88087, 0.37218, 0.88337, 0.36982, 0.88575, 0.36722],
3948
+ [0.88575, 0.36722, 0.92937, 0.32028, 0.93028, 0.24307, 0.88784, 0.19483],
3949
+ [0.88784, 0.19483, 0.88534, 0.19201, 0.88287, 0.18919, 0.88031, 0.18648],
3950
+ [0.88031, 0.18648, 0.83669, 0.13954, 0.76694, 0.14055, 0.72444, 0.1888],
3951
+ [0.72444, 0.1888, 0.72209, 0.19144, 0.71997, 0.19421, 0.71787, 0.19703],
3952
+ [0.71787, 0.19703, 0.71822, 0.19342, 0.71844, 0.18975, 0.7185, 0.18603],
3953
+ [0.7185, 0.18603, 0.71934, 0.11874, 0.67066, 0.06346, 0.60981, 0.0625],
3954
+ [0.60981, 0.0625, 0.60682, 0.0625, 0.60383, 0.0625, 0.60084, 0.0625],
3955
+ [0.60084, 0.0625, 0.55575, 0.0625, 0.51706, 0.09248, 0.5, 0.13537],
3956
+ [0.5, 0.13537, 0.48294, 0.09248, 0.44422, 0.0625, 0.39916, 0.0625],
3957
+ [0.39916, 0.0625, 0.39617, 0.0625, 0.39318, 0.0625, 0.39019, 0.0625],
3958
+ [0.39019, 0.0625, 0.32934, 0.0634, 0.28066, 0.11869, 0.28147, 0.18603],
3959
+ [0.28147, 0.18603, 0.28147, 0.18975, 0.28172, 0.19342, 0.28206, 0.19703],
3960
+ [0.28206, 0.19703, 0.28, 0.19418, 0.27781, 0.19144, 0.2755, 0.1888],
3961
+ [0.2755, 0.1888, 0.23306, 0.14055, 0.16325, 0.13954, 0.11962, 0.18648],
3962
+ [0.11962, 0.18648, 0.11709, 0.18925, 0.11453, 0.19201, 0.11209, 0.19483],
3963
+ [0.11209, 0.19483, 0.06966, 0.24307, 0.07056, 0.32022, 0.11419, 0.36722],
3964
+ [0.11419, 0.36722, 0.11659, 0.36982, 0.11906, 0.37218, 0.12162, 0.37449],
3965
+ [0.12162, 0.37449, 0.11833, 0.37409, 0.11501, 0.37387, 0.11169, 0.37382],
3966
+ [0.11169, 0.37382, 0.05084, 0.37292, 87e-5, 0.42679, 0, 0.49408],
3967
+ [0, 0.49408, 0, 0.49803, 0, 0.50197, 0, 0.50592],
3968
+ [0, 0.50592, 81e-5, 0.57321, 0.05081, 0.62708, 0.11169, 0.62618],
3969
+ [0.11169, 0.62618, 0.11506, 0.62618, 0.11837, 0.6259, 0.12162, 0.62551],
3970
+ [0.12162, 0.62551, 0.11906, 0.62782, 0.11659, 0.63018, 0.11419, 0.63278],
3971
+ [0.11419, 0.63278, 0.07056, 0.67972, 0.06966, 0.75693, 0.11209, 0.80518],
3972
+ [0.11209, 0.80518, 0.11459, 0.80799, 0.11709, 0.81081, 0.11962, 0.81352],
3973
+ [0.11962, 0.81352, 0.16325, 0.86046, 0.233, 0.85945, 0.2755, 0.8112],
3974
+ [0.2755, 0.8112, 0.27784, 0.80856, 0.28, 0.80579, 0.28206, 0.80297],
3975
+ [0.28206, 0.80298, 0.28171, 0.80663, 0.28151, 0.8103, 0.28147, 0.81397],
3976
+ [0.28147, 0.81397, 0.28066, 0.88126, 0.32931, 0.9366, 0.39019, 0.9375],
3977
+ [0.39019, 0.9375, 0.39318, 0.9375, 0.39617, 0.9375, 0.39916, 0.9375],
3978
+ [0.39916, 0.9375, 0.44425, 0.9375, 0.48294, 0.90752, 0.5, 0.86463],
3979
+ [0.5, 0.86463, 0.51706, 0.90752, 0.55578, 0.9375, 0.60084, 0.9375],
3980
+ [0.60084, 0.9375, 0.60383, 0.9375, 0.60682, 0.9375, 0.60981, 0.9375],
3981
+ [0.60981, 0.9375, 0.67066, 0.9366, 0.71934, 0.88131, 0.71853, 0.81397],
3982
+ [0.71853, 0.81397, 0.71853, 0.81025, 0.71828, 0.80658, 0.71794, 0.80297],
3983
+ [0.71794, 0.80297, 0.72, 0.80579, 0.72216, 0.80856, 0.7245, 0.8112],
3984
+ [0.7245, 0.8112, 0.76694, 0.85945, 0.83675, 0.86046, 0.88037, 0.81352],
3985
+ [0.88037, 0.81352, 0.88291, 0.81075, 0.88547, 0.80799, 0.88791, 0.80518],
3986
+ [0.88791, 0.80518, 0.93034, 0.75693, 0.92944, 0.67978, 0.88581, 0.63278],
3987
+ [0.88581, 0.63278, 0.88341, 0.63018, 0.88094, 0.62782, 0.87838, 0.62551],
3988
+ [0.87838, 0.62551, 0.88167, 0.62591, 0.88499, 0.62613, 0.88831, 0.62618],
3989
+ [0.88831, 0.62618, 0.94916, 0.62708, 0.99919, 0.57327, 1, 0.50592],
3990
+ [1, 0.50592, 1, 0.50197, 1, 0.49803, 1, 0.49408],
3991
+ [1, 0.49408, 0.99998, 0.49408, 0.99996, 0.49408, 0.99994, 0.49408]
3992
+ ]);
3993
+ var semiCircleShape = createShape([
3994
+ [1, 0.70913, 1, 0.76622, 0.95372, 0.8125, 0.89663, 0.8125],
3995
+ [0.89663, 0.8125, 0.63221, 0.8125, 0.36779, 0.8125, 0.10337, 0.8125],
3996
+ [0.10337, 0.8125, 0.04628, 0.8125, 0, 0.76622, 0, 0.70913],
3997
+ [0, 0.70913, 0, 0.70192, 0, 0.69471, 0, 0.6875],
3998
+ [0, 0.6875, 0, 0.41134, 0.22386, 0.1875, 0.5, 0.1875],
3999
+ [0.5, 0.1875, 0.77614, 0.1875, 1, 0.41134, 1, 0.6875],
4000
+ [1, 0.6875, 1, 0.69471, 1, 0.70192, 1, 0.70913]
4001
+ ]);
4002
+ var cookie12SidedShape = createShape([
4003
+ [0.42719, 0.03077, 0.42887, 0.02912, 0.42972, 0.02827, 0.43044, 0.02759],
4004
+ [0.43044, 0.02759, 0.46953, -92e-4, 0.53047, -92e-4, 0.56956, 0.02759],
4005
+ [0.56956, 0.02759, 0.57028, 0.02827, 0.57113, 0.02912, 0.57281, 0.03077],
4006
+ [0.57281, 0.03077, 0.57384, 0.03174, 0.57434, 0.03224, 0.57481, 0.03271],
4007
+ [0.57481, 0.03271, 0.59982, 0.05657, 0.63526, 0.06606, 0.66885, 0.0579],
4008
+ [0.66885, 0.0579, 0.6695, 0.05774, 0.67019, 0.05756, 0.67157, 0.05721],
4009
+ [0.67157, 0.05721, 0.67385, 0.05662, 0.675, 0.05634, 0.67597, 0.05609],
4010
+ [0.67597, 0.05609, 0.72819, 0.04377, 0.781, 0.07424, 0.79644, 0.12565],
4011
+ [0.79644, 0.12565, 0.79672, 0.12662, 0.79704, 0.12774, 0.79769, 0.13003],
4012
+ [0.79769, 0.13003, 0.79807, 0.1314, 0.79825, 0.13209, 0.79844, 0.13274],
4013
+ [0.79844, 0.13274, 0.80817, 0.1659, 0.8341, 0.19183, 0.86726, 0.20156],
4014
+ [0.86726, 0.20156, 0.86791, 0.20175, 0.8686, 0.20193, 0.86997, 0.20231],
4015
+ [0.86997, 0.20231, 0.87226, 0.20296, 0.87338, 0.20328, 0.87435, 0.20356],
4016
+ [0.87435, 0.20356, 0.92576, 0.219, 0.95623, 0.27181, 0.94391, 0.32403],
4017
+ [0.94391, 0.32403, 0.94366, 0.325, 0.94338, 0.32615, 0.94279, 0.32843],
4018
+ [0.94279, 0.32843, 0.94244, 0.32981, 0.94226, 0.3305, 0.9421, 0.33115],
4019
+ [0.9421, 0.33115, 0.93394, 0.36474, 0.94343, 0.40018, 0.96729, 0.42519],
4020
+ [0.96729, 0.42519, 0.96776, 0.42566, 0.96826, 0.42616, 0.96923, 0.42719],
4021
+ [0.96923, 0.42719, 0.97088, 0.42887, 0.97173, 0.42972, 0.97241, 0.43044],
4022
+ [0.97241, 0.43044, 1.0092, 0.46953, 1.0092, 0.53047, 0.97241, 0.56956],
4023
+ [0.97241, 0.56956, 0.97173, 0.57028, 0.97088, 0.57113, 0.96923, 0.57281],
4024
+ [0.96923, 0.57281, 0.96826, 0.57384, 0.96776, 0.57434, 0.96729, 0.57481],
4025
+ [0.96729, 0.57481, 0.94343, 0.59982, 0.93394, 0.63526, 0.9421, 0.66885],
4026
+ [0.9421, 0.66885, 0.94226, 0.6695, 0.94244, 0.67019, 0.94279, 0.67157],
4027
+ [0.94279, 0.67157, 0.94338, 0.67385, 0.94366, 0.675, 0.94391, 0.67597],
4028
+ [0.94391, 0.67597, 0.95623, 0.72819, 0.92576, 0.781, 0.87435, 0.79644],
4029
+ [0.87435, 0.79644, 0.87338, 0.79672, 0.87226, 0.79704, 0.86997, 0.79769],
4030
+ [0.86997, 0.79769, 0.8686, 0.79807, 0.86791, 0.79825, 0.86726, 0.79844],
4031
+ [0.86726, 0.79844, 0.8341, 0.80817, 0.80817, 0.8341, 0.79844, 0.86726],
4032
+ [0.79844, 0.86726, 0.79825, 0.86791, 0.79807, 0.8686, 0.79769, 0.86997],
4033
+ [0.79769, 0.86997, 0.79704, 0.87226, 0.79672, 0.87338, 0.79644, 0.87435],
4034
+ [0.79644, 0.87435, 0.781, 0.92576, 0.72819, 0.95623, 0.67597, 0.94391],
4035
+ [0.67597, 0.94391, 0.675, 0.94366, 0.67385, 0.94338, 0.67157, 0.94279],
4036
+ [0.67157, 0.94279, 0.67019, 0.94244, 0.6695, 0.94226, 0.66885, 0.9421],
4037
+ [0.66885, 0.9421, 0.63526, 0.93394, 0.59982, 0.94343, 0.57481, 0.96729],
4038
+ [0.57481, 0.96729, 0.57434, 0.96776, 0.57384, 0.96826, 0.57281, 0.96923],
4039
+ [0.57281, 0.96923, 0.57113, 0.97088, 0.57028, 0.97173, 0.56956, 0.97241],
4040
+ [0.56956, 0.97241, 0.53047, 1.0092, 0.46953, 1.0092, 0.43044, 0.97241],
4041
+ [0.43044, 0.97241, 0.42972, 0.97173, 0.42887, 0.97088, 0.42719, 0.96923],
4042
+ [0.42719, 0.96923, 0.42616, 0.96826, 0.42566, 0.96776, 0.42519, 0.96729],
4043
+ [0.42519, 0.96729, 0.40018, 0.94343, 0.36474, 0.93394, 0.33115, 0.9421],
4044
+ [0.33115, 0.9421, 0.3305, 0.94226, 0.32981, 0.94244, 0.32843, 0.94279],
4045
+ [0.32843, 0.94279, 0.32615, 0.94338, 0.325, 0.94366, 0.32403, 0.94391],
4046
+ [0.32403, 0.94391, 0.27181, 0.95623, 0.219, 0.92576, 0.20356, 0.87435],
4047
+ [0.20356, 0.87435, 0.20328, 0.87338, 0.20296, 0.87226, 0.20231, 0.86997],
4048
+ [0.20231, 0.86997, 0.20193, 0.8686, 0.20175, 0.86791, 0.20156, 0.86726],
4049
+ [0.20156, 0.86726, 0.19183, 0.8341, 0.1659, 0.80817, 0.13274, 0.79844],
4050
+ [0.13274, 0.79844, 0.13209, 0.79825, 0.1314, 0.79807, 0.13003, 0.79769],
4051
+ [0.13003, 0.79769, 0.12774, 0.79704, 0.12662, 0.79672, 0.12565, 0.79644],
4052
+ [0.12565, 0.79644, 0.07424, 0.781, 0.04377, 0.72819, 0.05609, 0.67597],
4053
+ [0.05609, 0.67597, 0.05634, 0.675, 0.05662, 0.67385, 0.05721, 0.67157],
4054
+ [0.05721, 0.67157, 0.05756, 0.67019, 0.05774, 0.6695, 0.0579, 0.66885],
4055
+ [0.0579, 0.66885, 0.06606, 0.63526, 0.05657, 0.59982, 0.03271, 0.57481],
4056
+ [0.03271, 0.57481, 0.03224, 0.57434, 0.03174, 0.57384, 0.03077, 0.57281],
4057
+ [0.03077, 0.57281, 0.02912, 0.57113, 0.02827, 0.57028, 0.02759, 0.56956],
4058
+ [0.02759, 0.56956, -92e-4, 0.53047, -92e-4, 0.46953, 0.02759, 0.43044],
4059
+ [0.02759, 0.43044, 0.02827, 0.42972, 0.02912, 0.42887, 0.03077, 0.42719],
4060
+ [0.03077, 0.42719, 0.03174, 0.42616, 0.03224, 0.42566, 0.03271, 0.42519],
4061
+ [0.03271, 0.42519, 0.05657, 0.40018, 0.06606, 0.36474, 0.0579, 0.33115],
4062
+ [0.0579, 0.33115, 0.05774, 0.3305, 0.05756, 0.32981, 0.05721, 0.32843],
4063
+ [0.05721, 0.32843, 0.05662, 0.32615, 0.05634, 0.325, 0.05609, 0.32403],
4064
+ [0.05609, 0.32403, 0.04377, 0.27181, 0.07424, 0.219, 0.12565, 0.20356],
4065
+ [0.12565, 0.20356, 0.12662, 0.20328, 0.12774, 0.20296, 0.13003, 0.20231],
4066
+ [0.13003, 0.20231, 0.1314, 0.20193, 0.13209, 0.20175, 0.13274, 0.20156],
4067
+ [0.13274, 0.20156, 0.1659, 0.19183, 0.19183, 0.1659, 0.20156, 0.13274],
4068
+ [0.20156, 0.13274, 0.20175, 0.13209, 0.20193, 0.1314, 0.20231, 0.13003],
4069
+ [0.20231, 0.13003, 0.20296, 0.12774, 0.20328, 0.12662, 0.20356, 0.12565],
4070
+ [0.20356, 0.12565, 0.219, 0.07424, 0.27181, 0.04377, 0.32403, 0.05609],
4071
+ [0.32403, 0.05609, 0.325, 0.05634, 0.32615, 0.05662, 0.32843, 0.05721],
4072
+ [0.32843, 0.05721, 0.32981, 0.05756, 0.3305, 0.05774, 0.33115, 0.0579],
4073
+ [0.33115, 0.0579, 0.36474, 0.06606, 0.40018, 0.05657, 0.42519, 0.03271],
4074
+ [0.42519, 0.03271, 0.42566, 0.03224, 0.42616, 0.03174, 0.42719, 0.03077]
4075
+ ]);
4076
+ var cookie4SidedShape = createShape([
4077
+ [0.63833, 0.02217, 0.85312, -0.07111, 1.07112, 0.14689, 0.97783, 0.36168],
4078
+ [0.97783, 0.36168, 0.97269, 0.37351, 0.96755, 0.38534, 0.9624, 0.39718],
4079
+ [0.9624, 0.39718, 0.93394, 0.46277, 0.93394, 0.53723, 0.9624, 0.60282],
4080
+ [0.9624, 0.60282, 0.96755, 0.61466, 0.97269, 0.62649, 0.97783, 0.63832],
4081
+ [0.97783, 0.63832, 1.07112, 0.85311, 0.85312, 1.07111, 0.63833, 0.97783],
4082
+ [0.63833, 0.97783, 0.6265, 0.97268, 0.61466, 0.96754, 0.60283, 0.9624],
4083
+ [0.60283, 0.9624, 0.53724, 0.93393, 0.46278, 0.93393, 0.39718, 0.9624],
4084
+ [0.39718, 0.9624, 0.38535, 0.96754, 0.37352, 0.97268, 0.36168, 0.97783],
4085
+ [0.36168, 0.97783, 0.14689, 1.07111, -0.07112, 0.85311, 0.02217, 0.63832],
4086
+ [0.02217, 0.63832, 0.02731, 0.62649, 0.03245, 0.61466, 0.03759, 0.60282],
4087
+ [0.03759, 0.60282, 0.06608, 0.53723, 0.06608, 0.46277, 0.03759, 0.39718],
4088
+ [0.03759, 0.39718, 0.03245, 0.38534, 0.02731, 0.37351, 0.02217, 0.36168],
4089
+ [0.02217, 0.36168, -0.07112, 0.14689, 0.14689, -0.07111, 0.36168, 0.02217],
4090
+ [0.36168, 0.02217, 0.37352, 0.02732, 0.38535, 0.03246, 0.39718, 0.0376],
4091
+ [0.39718, 0.0376, 0.46278, 0.06607, 0.53724, 0.06607, 0.60283, 0.0376],
4092
+ [0.60283, 0.0376, 0.61466, 0.03246, 0.6265, 0.02732, 0.63833, 0.02217]
4093
+ ]);
4094
+ var cookie6SidedShape = createShape([
4095
+ [0.32337, 0.07142, 0.42176, -0.02381, 0.57824, -0.02381, 0.67663, 0.07142],
4096
+ [0.67663, 0.07142, 0.70677, 0.10055, 0.74365, 0.12178, 0.78399, 0.13319],
4097
+ [0.78399, 0.13319, 0.91589, 0.17053, 0.99413, 0.30566, 0.96061, 0.4382],
4098
+ [0.96061, 0.4382, 0.95036, 0.47876, 0.95036, 0.52124, 0.96061, 0.5618],
4099
+ [0.96061, 0.5618, 0.99413, 0.69434, 0.91589, 0.82947, 0.78399, 0.86681],
4100
+ [0.78399, 0.86681, 0.74365, 0.87822, 0.70677, 0.89945, 0.67663, 0.92858],
4101
+ [0.67663, 0.92858, 0.57824, 1.02381, 0.42176, 1.02381, 0.32337, 0.92858],
4102
+ [0.32337, 0.92858, 0.29323, 0.89945, 0.25635, 0.87822, 0.21601, 0.86681],
4103
+ [0.21601, 0.86681, 0.08411, 0.82947, 587e-5, 0.69434, 0.03939, 0.5618],
4104
+ [0.03939, 0.5618, 0.04964, 0.52124, 0.04964, 0.47876, 0.03939, 0.4382],
4105
+ [0.03939, 0.4382, 587e-5, 0.30566, 0.08411, 0.17053, 0.21601, 0.13319],
4106
+ [0.21601, 0.13319, 0.25635, 0.12178, 0.29323, 0.10055, 0.32337, 0.07142]
4107
+ ]);
4108
+ var cookie7SidedShape = createShape([
4109
+ [0.35209, 0.06806, 0.36326, 0.05824, 0.36884, 0.05334, 0.37397, 0.04937],
4110
+ [0.37397, 0.04937, 0.4482, -813e-5, 0.5518, -813e-5, 0.62603, 0.04937],
4111
+ [0.62603, 0.04937, 0.63116, 0.05334, 0.63674, 0.05824, 0.64791, 0.06806],
4112
+ [0.64791, 0.06806, 0.65164, 0.07137, 0.65351, 0.07299, 0.65539, 0.07459],
4113
+ [0.65539, 0.07459, 0.68167, 0.09662, 0.71303, 0.11176, 0.74663, 0.11862],
4114
+ [0.74663, 0.11862, 0.74903, 0.11912, 0.75147, 0.11956, 0.75637, 0.12043],
4115
+ [0.75637, 0.12043, 0.771, 0.12306, 0.77831, 0.12434, 0.78461, 0.1259],
4116
+ [0.78461, 0.1259, 0.87573, 0.14821, 0.94032, 0.2294, 0.94176, 0.3234],
4117
+ [0.94176, 0.3234, 0.94186, 0.3299, 0.94151, 0.33734, 0.9408, 0.35221],
4118
+ [0.9408, 0.35221, 0.94057, 0.35721, 0.94045, 0.35968, 0.94039, 0.36215],
4119
+ [0.94039, 0.36215, 0.93958, 0.39649, 0.94732, 0.43049, 0.96293, 0.46109],
4120
+ [0.96293, 0.46109, 0.96404, 0.46328, 0.96523, 0.46546, 0.96759, 0.46987],
4121
+ [0.96759, 0.46987, 0.97467, 0.48296, 0.97821, 0.4895, 0.98093, 0.4954],
4122
+ [0.98093, 0.4954, 1.02032, 0.58071, 0.99727, 0.68196, 0.92484, 0.74168],
4123
+ [0.92484, 0.74168, 0.91984, 0.74584, 0.91381, 0.75018, 0.90177, 0.7589],
4124
+ [0.90177, 0.7589, 0.89774, 0.76184, 0.89572, 0.76328, 0.89377, 0.76478],
4125
+ [0.89377, 0.76478, 0.86646, 0.78557, 0.84476, 0.81284, 0.83064, 0.84412],
4126
+ [0.83064, 0.84412, 0.82963, 0.84637, 0.82865, 0.84865, 0.82671, 0.85325],
4127
+ [0.82671, 0.85325, 0.82091, 0.86696, 0.818, 0.87381, 0.8151, 0.87962],
4128
+ [0.8151, 0.87962, 0.7731, 0.96368, 0.67977, 1.00875, 0.58801, 0.98925],
4129
+ [0.58801, 0.98925, 0.58166, 0.98787, 0.57451, 0.98587, 0.56019, 0.98187],
4130
+ [0.56019, 0.98187, 0.5554, 0.98056, 0.55301, 0.97987, 0.55063, 0.97928],
4131
+ [0.55063, 0.97928, 0.51741, 0.97084, 0.48259, 0.97084, 0.44937, 0.97928],
4132
+ [0.44937, 0.97928, 0.44699, 0.97987, 0.4446, 0.98056, 0.43981, 0.98187],
4133
+ [0.43981, 0.98187, 0.42549, 0.98587, 0.41834, 0.98787, 0.41199, 0.98925],
4134
+ [0.41199, 0.98925, 0.32023, 1.00875, 0.2269, 0.96368, 0.1849, 0.87962],
4135
+ [0.1849, 0.87962, 0.18199, 0.87381, 0.17909, 0.86696, 0.17329, 0.85325],
4136
+ [0.17329, 0.85325, 0.17135, 0.84865, 0.17037, 0.84637, 0.16936, 0.84412],
4137
+ [0.16936, 0.84412, 0.15523, 0.81284, 0.13353, 0.78557, 0.10623, 0.76478],
4138
+ [0.10623, 0.76478, 0.10428, 0.76328, 0.10226, 0.76184, 0.09823, 0.7589],
4139
+ [0.09823, 0.7589, 0.08619, 0.75018, 0.08017, 0.74584, 0.07516, 0.74168],
4140
+ [0.07516, 0.74168, 273e-5, 0.68196, -0.02032, 0.58071, 0.01907, 0.4954],
4141
+ [0.01907, 0.4954, 0.02179, 0.4895, 0.02533, 0.48296, 0.03241, 0.46987],
4142
+ [0.03241, 0.46987, 0.03477, 0.46546, 0.03596, 0.46328, 0.03707, 0.46109],
4143
+ [0.03707, 0.46109, 0.05268, 0.43049, 0.06042, 0.39649, 0.05961, 0.36215],
4144
+ [0.05961, 0.36215, 0.05955, 0.35968, 0.05943, 0.35721, 0.0592, 0.35221],
4145
+ [0.0592, 0.35221, 0.05849, 0.33734, 0.05813, 0.3299, 0.05824, 0.3234],
4146
+ [0.05824, 0.3234, 0.05968, 0.2294, 0.12427, 0.14821, 0.21539, 0.1259],
4147
+ [0.21539, 0.1259, 0.22169, 0.12434, 0.229, 0.12306, 0.24363, 0.12043],
4148
+ [0.24363, 0.12043, 0.24853, 0.11956, 0.25097, 0.11912, 0.25337, 0.11862],
4149
+ [0.25337, 0.11862, 0.28697, 0.11176, 0.31833, 0.09662, 0.34461, 0.07459],
4150
+ [0.34461, 0.07459, 0.34649, 0.07299, 0.34836, 0.07137, 0.35209, 0.06806]
4151
+ ]);
4152
+ var cookie9SidedShape = createShape([
4153
+ [0.39144, 0.04182, 0.39684, 0.03735, 0.39953, 0.03513, 0.402, 0.03326],
4154
+ [0.402, 0.03326, 0.45981, -0.01109, 0.54019, -0.01109, 0.598, 0.03326],
4155
+ [0.598, 0.03326, 0.60047, 0.03513, 0.60316, 0.03735, 0.60856, 0.04182],
4156
+ [0.60856, 0.04182, 0.61097, 0.04379, 0.61216, 0.04479, 0.61334, 0.04576],
4157
+ [0.61334, 0.04576, 0.64056, 0.06743, 0.67404, 0.07974, 0.70881, 0.08085],
4158
+ [0.70881, 0.08085, 0.71031, 0.08088, 0.71187, 0.08091, 0.71497, 0.08094],
4159
+ [0.71497, 0.08094, 0.72194, 0.08104, 0.72544, 0.08107, 0.7285, 0.08123],
4160
+ [0.7285, 0.08123, 0.80112, 0.08494, 0.86243, 0.13694, 0.87865, 0.20854],
4161
+ [0.87865, 0.20854, 0.87934, 0.21157, 0.88, 0.21504, 0.88131, 0.22194],
4162
+ [0.88131, 0.22194, 0.88187, 0.22504, 0.88215, 0.22657, 0.88247, 0.22807],
4163
+ [0.88247, 0.22807, 0.88956, 0.26244, 0.90737, 0.29357, 0.93325, 0.31694],
4164
+ [0.93325, 0.31694, 0.9344, 0.31797, 0.93556, 0.319, 0.93793, 0.32104],
4165
+ [0.93793, 0.32104, 0.94321, 0.32563, 0.94584, 0.32794, 0.94809, 0.33007],
4166
+ [0.94809, 0.33007, 1.00137, 0.38004, 1.01528, 0.45972, 0.98215, 0.5251],
4167
+ [0.98215, 0.5251, 0.98075, 0.52788, 0.97903, 0.53094, 0.97562, 0.53707],
4168
+ [0.97562, 0.53707, 0.97409, 0.53982, 0.97334, 0.54119, 0.97262, 0.54253],
4169
+ [0.97262, 0.54253, 0.9562, 0.57351, 0.95003, 0.60889, 0.955, 0.6436],
4170
+ [0.955, 0.6436, 0.95521, 0.64513, 0.95546, 0.64666, 0.95596, 0.64975],
4171
+ [0.95596, 0.64975, 0.95709, 0.65672, 0.95765, 0.66019, 0.95803, 0.66328],
4172
+ [0.95803, 0.66328, 0.96703, 0.73616, 0.927, 0.80622, 0.86003, 0.83478],
4173
+ [0.86003, 0.83478, 0.85718, 0.836, 0.8539, 0.83725, 0.8474, 0.83975],
4174
+ [0.8474, 0.83975, 0.8445, 0.84084, 0.84303, 0.84141, 0.84162, 0.84197],
4175
+ [0.84162, 0.84197, 0.80937, 0.855, 0.78212, 0.87812, 0.76381, 0.90794],
4176
+ [0.76381, 0.90794, 0.76303, 0.90925, 0.76225, 0.91059, 0.76065, 0.91328],
4177
+ [0.76065, 0.91328, 0.75709, 0.91934, 0.75531, 0.92237, 0.75362, 0.925],
4178
+ [0.75362, 0.925, 0.71415, 0.98665, 0.63894, 1.01434, 0.56944, 0.99272],
4179
+ [0.56944, 0.99272, 0.5665, 0.99181, 0.56319, 0.99065, 0.55662, 0.98831],
4180
+ [0.55662, 0.98831, 0.55369, 0.98728, 0.55222, 0.98675, 0.55078, 0.98628],
4181
+ [0.55078, 0.98628, 0.51782, 0.97531, 0.48218, 0.97531, 0.44922, 0.98628],
4182
+ [0.44922, 0.98628, 0.44778, 0.98675, 0.44631, 0.98728, 0.44338, 0.98831],
4183
+ [0.44338, 0.98831, 0.43681, 0.99065, 0.4335, 0.99181, 0.43056, 0.99272],
4184
+ [0.43056, 0.99272, 0.36106, 1.01434, 0.28585, 0.98665, 0.24638, 0.925],
4185
+ [0.24638, 0.925, 0.24469, 0.92237, 0.24291, 0.91934, 0.23935, 0.91328],
4186
+ [0.23935, 0.91328, 0.23775, 0.91059, 0.23697, 0.90925, 0.23619, 0.90794],
4187
+ [0.23619, 0.90794, 0.21788, 0.87812, 0.19063, 0.855, 0.15838, 0.84197],
4188
+ [0.15838, 0.84197, 0.15697, 0.84141, 0.1555, 0.84084, 0.1526, 0.83975],
4189
+ [0.1526, 0.83975, 0.1461, 0.83725, 0.14282, 0.836, 0.13997, 0.83478],
4190
+ [0.13997, 0.83478, 0.073, 0.80622, 0.03297, 0.73616, 0.04197, 0.66328],
4191
+ [0.04197, 0.66328, 0.04235, 0.66019, 0.04291, 0.65672, 0.04404, 0.64975],
4192
+ [0.04404, 0.64975, 0.04454, 0.64666, 0.04479, 0.64513, 0.045, 0.6436],
4193
+ [0.045, 0.6436, 0.04997, 0.60889, 0.0438, 0.57351, 0.02738, 0.54253],
4194
+ [0.02738, 0.54253, 0.02666, 0.54119, 0.02591, 0.53982, 0.02438, 0.53707],
4195
+ [0.02438, 0.53707, 0.02097, 0.53094, 0.01925, 0.52788, 0.01785, 0.5251],
4196
+ [0.01785, 0.5251, -0.01528, 0.45972, -137e-5, 0.38004, 0.05191, 0.33007],
4197
+ [0.05191, 0.33007, 0.05416, 0.32794, 0.05679, 0.32563, 0.06207, 0.32104],
4198
+ [0.06207, 0.32104, 0.06444, 0.319, 0.0656, 0.31797, 0.06675, 0.31694],
4199
+ [0.06675, 0.31694, 0.0927, 0.29347, 0.11049, 0.26234, 0.11753, 0.22807],
4200
+ [0.11753, 0.22807, 0.11785, 0.22657, 0.11813, 0.22504, 0.11869, 0.22194],
4201
+ [0.11869, 0.22194, 0.12, 0.21504, 0.12066, 0.21157, 0.12135, 0.20854],
4202
+ [0.12135, 0.20854, 0.13757, 0.13694, 0.19888, 0.08494, 0.2715, 0.08123],
4203
+ [0.2715, 0.08123, 0.27456, 0.08107, 0.27806, 0.08104, 0.28503, 0.08094],
4204
+ [0.28503, 0.08094, 0.28813, 0.08091, 0.28969, 0.08088, 0.29119, 0.08085],
4205
+ [0.29119, 0.08085, 0.32596, 0.07974, 0.35944, 0.06743, 0.38666, 0.04576],
4206
+ [0.38666, 0.04576, 0.38784, 0.04479, 0.38903, 0.04379, 0.39144, 0.04182]
4207
+ ]);
4208
+ var slantedShape = createShape([
4209
+ [0.04911, 0.28294, 0.05715, 0.20613, 0.06118, 0.16772, 0.07595, 0.13743],
4210
+ [0.07595, 0.13743, 0.09732, 0.09358, 0.13462, 0.05972, 0.18009, 0.04288],
4211
+ [0.18009, 0.04288, 0.21151, 0.03125, 0.24979, 0.03125, 0.32635, 0.03125],
4212
+ [0.32635, 0.03125, 0.45521, 0.03125, 0.58407, 0.03125, 0.71293, 0.03125],
4213
+ [0.71293, 0.03125, 0.80551, 0.03125, 0.85181, 0.03125, 0.88715, 0.04642],
4214
+ [0.88715, 0.04642, 0.93832, 0.06838, 0.97725, 0.11203, 0.99352, 0.16569],
4215
+ [0.99352, 0.16569, 1.00476, 0.20272, 0.9999, 0.24916, 0.99017, 0.34206],
4216
+ [0.99017, 0.34206, 0.97708, 0.46706, 0.96398, 0.59206, 0.95089, 0.71706],
4217
+ [0.95089, 0.71706, 0.94285, 0.79387, 0.93883, 0.83228, 0.92405, 0.86256],
4218
+ [0.92405, 0.86256, 0.90268, 0.90641, 0.86538, 0.94028, 0.81991, 0.95712],
4219
+ [0.81991, 0.95712, 0.78849, 0.96875, 0.75021, 0.96875, 0.67365, 0.96875],
4220
+ [0.67365, 0.96875, 0.54479, 0.96875, 0.41593, 0.96875, 0.28707, 0.96875],
4221
+ [0.28707, 0.96875, 0.19449, 0.96875, 0.14819, 0.96875, 0.11285, 0.95359],
4222
+ [0.11285, 0.95359, 0.06169, 0.93162, 0.02275, 0.88797, 648e-5, 0.83431],
4223
+ [648e-5, 0.83431, -476e-5, 0.79728, 1e-4, 0.75084, 983e-5, 0.65794],
4224
+ [983e-5, 0.65794, 0.02292, 0.53294, 0.03602, 0.40794, 0.04911, 0.28294]
4225
+ ]);
4226
+ var softBoomShape = createShape([
4227
+ [0.54668, 0.26546, 0.61712, -0.08849, 0.38296, -0.08849, 0.45337, 0.26546],
4228
+ [0.45337, 0.26546, 0.38296, -0.08849, 0.16664, 11e-4, 0.36715, 0.30118],
4229
+ [0.36715, 0.30118, 0.16664, 11e-4, 11e-4, 0.16665, 0.30118, 0.36715],
4230
+ [0.30118, 0.36715, 11e-4, 0.16665, -0.08849, 0.38296, 0.26546, 0.45334],
4231
+ [0.26546, 0.45334, -0.08849, 0.38293, -0.08849, 0.61706, 0.26546, 0.54665],
4232
+ [0.26546, 0.54665, -0.08849, 0.61706, 114e-5, 0.83334, 0.30118, 0.63284],
4233
+ [0.30118, 0.63284, 114e-5, 0.83334, 0.16668, 0.9989, 0.36715, 0.69881],
4234
+ [0.36715, 0.69881, 0.16664, 0.99884, 0.38296, 1.08843, 0.45334, 0.73452],
4235
+ [0.45334, 0.73452, 0.38293, 1.08849, 0.61706, 1.08849, 0.54665, 0.73452],
4236
+ [0.54665, 0.73452, 0.61706, 1.08849, 0.83334, 0.99884, 0.63284, 0.69881],
4237
+ [0.63284, 0.69881, 0.83334, 0.99884, 0.9989, 0.83331, 0.69881, 0.63284],
4238
+ [0.69881, 0.63284, 0.99884, 0.83334, 1.08843, 0.61702, 0.73452, 0.54665],
4239
+ [0.73452, 0.54665, 1.08849, 0.61706, 1.08849, 0.38293, 0.73452, 0.45334],
4240
+ [0.73452, 0.45334, 1.08849, 0.38293, 0.99884, 0.16665, 0.69881, 0.36715],
4241
+ [0.69881, 0.36715, 0.99884, 0.16665, 0.83331, 11e-4, 0.63284, 0.30118],
4242
+ [0.63284, 0.30118, 0.83334, 114e-5, 0.61702, -0.08845, 0.54665, 0.26546],
4243
+ [0.54665, 0.26546, 0.54666, 0.26546, 0.54667, 0.26546, 0.54668, 0.26546]
4244
+ ]);
4245
+ var softBurstShape = createShape([
4246
+ [0.45359, 0.0247, 0.47494, -823e-5, 0.52506, -823e-5, 0.54641, 0.0247],
4247
+ [0.54641, 0.0247, 0.56348, 0.05101, 0.58055, 0.07733, 0.59763, 0.10364],
4248
+ [0.59763, 0.10364, 0.61166, 0.12529, 0.64, 0.1341, 0.66466, 0.12447],
4249
+ [0.66466, 0.12447, 0.69464, 0.11278, 0.72462, 0.10108, 0.7546, 0.08939],
4250
+ [0.7546, 0.08939, 0.79213, 0.07475, 0.83266, 0.10291, 0.82972, 0.14156],
4251
+ [0.82972, 0.14156, 0.82736, 0.17245, 0.82499, 0.20334, 0.82263, 0.23422],
4252
+ [0.82263, 0.23422, 0.82066, 0.25963, 0.83816, 0.28266, 0.86403, 0.28875],
4253
+ [0.86403, 0.28875, 0.89548, 0.29614, 0.92693, 0.30352, 0.95838, 0.31091],
4254
+ [0.95838, 0.31091, 0.99772, 0.32016, 1.01322, 0.36572, 0.98707, 0.39535],
4255
+ [0.98707, 0.39535, 0.96617, 0.41899, 0.94527, 0.44264, 0.92438, 0.46629],
4256
+ [0.92438, 0.46629, 0.90719, 0.48575, 0.90719, 0.51425, 0.92438, 0.53372],
4257
+ [0.92438, 0.53372, 0.94527, 0.55737, 0.96617, 0.58102, 0.98707, 0.60466],
4258
+ [0.98707, 0.60466, 1.01322, 0.63429, 0.99772, 0.67985, 0.95838, 0.6891],
4259
+ [0.95838, 0.6891, 0.92693, 0.69648, 0.89548, 0.70387, 0.86403, 0.71126],
4260
+ [0.86403, 0.71126, 0.83816, 0.71735, 0.82066, 0.74038, 0.82263, 0.76579],
4261
+ [0.82263, 0.76579, 0.82499, 0.79667, 0.82736, 0.82756, 0.82972, 0.85844],
4262
+ [0.82972, 0.85844, 0.83266, 0.8971, 0.79213, 0.92526, 0.7546, 0.91063],
4263
+ [0.7546, 0.91063, 0.72462, 0.89893, 0.69464, 0.88724, 0.66466, 0.87554],
4264
+ [0.66466, 0.87554, 0.64, 0.86591, 0.61166, 0.87473, 0.59763, 0.89638],
4265
+ [0.59763, 0.89638, 0.58055, 0.92269, 0.56348, 0.94901, 0.54641, 0.97532],
4266
+ [0.54641, 0.97532, 0.52506, 1.00823, 0.47494, 1.00823, 0.45359, 0.97532],
4267
+ [0.45359, 0.97532, 0.43652, 0.94901, 0.41945, 0.92269, 0.40237, 0.89638],
4268
+ [0.40237, 0.89638, 0.38834, 0.87473, 0.36, 0.86591, 0.33534, 0.87554],
4269
+ [0.33534, 0.87554, 0.30536, 0.88724, 0.27538, 0.89893, 0.2454, 0.91063],
4270
+ [0.2454, 0.91063, 0.20787, 0.92526, 0.16734, 0.8971, 0.17028, 0.85844],
4271
+ [0.17028, 0.85844, 0.17264, 0.82756, 0.17501, 0.79667, 0.17737, 0.76579],
4272
+ [0.17737, 0.76579, 0.17934, 0.74038, 0.16184, 0.71735, 0.13597, 0.71126],
4273
+ [0.13597, 0.71126, 0.10452, 0.70387, 0.07307, 0.69648, 0.04162, 0.6891],
4274
+ [0.04162, 0.6891, 228e-5, 0.67985, -0.01322, 0.63429, 0.01293, 0.60466],
4275
+ [0.01293, 0.60466, 0.03383, 0.58102, 0.05473, 0.55737, 0.07562, 0.53372],
4276
+ [0.07562, 0.53372, 0.09281, 0.51425, 0.09281, 0.48575, 0.07562, 0.46629],
4277
+ [0.07562, 0.46629, 0.05473, 0.44264, 0.03383, 0.41899, 0.01293, 0.39535],
4278
+ [0.01293, 0.39535, -0.01322, 0.36572, 228e-5, 0.32016, 0.04162, 0.31091],
4279
+ [0.04162, 0.31091, 0.07307, 0.30352, 0.10452, 0.29614, 0.13597, 0.28875],
4280
+ [0.13597, 0.28875, 0.16184, 0.28266, 0.17934, 0.25963, 0.17737, 0.23422],
4281
+ [0.17737, 0.23422, 0.17501, 0.20334, 0.17264, 0.17245, 0.17028, 0.14156],
4282
+ [0.17028, 0.14156, 0.16734, 0.10291, 0.20787, 0.07475, 0.2454, 0.08939],
4283
+ [0.2454, 0.08939, 0.27538, 0.10108, 0.30536, 0.11278, 0.33534, 0.12447],
4284
+ [0.33534, 0.12447, 0.36, 0.1341, 0.38834, 0.12529, 0.40237, 0.10364],
4285
+ [0.40237, 0.10364, 0.41945, 0.07733, 0.43652, 0.05101, 0.45359, 0.0247]
4286
+ ]);
4287
+ var squareShape = createShape([
4288
+ [1, 0.5375, 1, 0.67725, 1, 0.74712, 0.97806, 0.80253],
4289
+ [0.97806, 0.80253, 0.94628, 0.88278, 0.88278, 0.94628, 0.80253, 0.97806],
4290
+ [0.80253, 0.97806, 0.74713, 1, 0.67725, 1, 0.5375, 1],
4291
+ [0.5375, 1, 0.5125, 1, 0.4875, 1, 0.4625, 1],
4292
+ [0.4625, 1, 0.32275, 1, 0.25288, 1, 0.19747, 0.97806],
4293
+ [0.19747, 0.97806, 0.11722, 0.94628, 0.05372, 0.88278, 0.02194, 0.80253],
4294
+ [0.02194, 0.80253, 0, 0.74713, 0, 0.67725, 0, 0.5375],
4295
+ [0, 0.5375, 0, 0.5125, 0, 0.4875, 0, 0.4625],
4296
+ [0, 0.4625, 0, 0.32275, 0, 0.25288, 0.02194, 0.19747],
4297
+ [0.02194, 0.19747, 0.0537, 0.11723, 0.11723, 0.05371, 0.19747, 0.02194],
4298
+ [0.19747, 0.02194, 0.25288, 0, 0.32275, 0, 0.4625, 0],
4299
+ [0.4625, 0, 0.4875, 0, 0.5125, 0, 0.5375, 0],
4300
+ [0.5375, 0, 0.67725, 0, 0.74712, 0, 0.80253, 0.02194],
4301
+ [0.80253, 0.02194, 0.88277, 0.05371, 0.9463, 0.11723, 0.97806, 0.19747],
4302
+ [0.97806, 0.19747, 1, 0.25288, 1, 0.32275, 1, 0.4625],
4303
+ [1, 0.4625, 1, 0.4875, 1, 0.5125, 1, 0.5375]
4304
+ ]);
4305
+ var sunnyShape = createShape([
4306
+ [0.77016, 0.1213, 0.80126, 0.12342, 0.81681, 0.12448, 0.82938, 0.12995],
4307
+ [0.82938, 0.12995, 0.84756, 0.13791, 0.86208, 0.15244, 0.87004, 0.17062],
4308
+ [0.87004, 0.17062, 0.87554, 0.18318, 0.8766, 0.19874, 0.87871, 0.22983],
4309
+ [0.87871, 0.22983, 0.88031, 0.25348, 0.88192, 0.27714, 0.88353, 0.3008],
4310
+ [0.88353, 0.3008, 0.88439, 0.31338, 0.88481, 0.31968, 0.88618, 0.32568],
4311
+ [0.88618, 0.32568, 0.88816, 0.33436, 0.89159, 0.34264, 0.89633, 0.35018],
4312
+ [0.89633, 0.35018, 0.89961, 0.35541, 0.90376, 0.36015, 0.91204, 0.36965],
4313
+ [0.91204, 0.36965, 0.92764, 0.38751, 0.94323, 0.40537, 0.95882, 0.42324],
4314
+ [0.95882, 0.42324, 0.97932, 0.44674, 0.98957, 0.45847, 0.99457, 0.47124],
4315
+ [0.99457, 0.47124, 1.0018, 0.48973, 1.0018, 0.51027, 0.99457, 0.52876],
4316
+ [0.99457, 0.52876, 0.98957, 0.54153, 0.97932, 0.55326, 0.95882, 0.57676],
4317
+ [0.95882, 0.57676, 0.94323, 0.59463, 0.92764, 0.61249, 0.91204, 0.63035],
4318
+ [0.91204, 0.63035, 0.90376, 0.63985, 0.89961, 0.64459, 0.89633, 0.64982],
4319
+ [0.89633, 0.64982, 0.89159, 0.65736, 0.88816, 0.66564, 0.88618, 0.67432],
4320
+ [0.88618, 0.67432, 0.88481, 0.68032, 0.88439, 0.68662, 0.88353, 0.6992],
4321
+ [0.88353, 0.6992, 0.88192, 0.72286, 0.88031, 0.74652, 0.87871, 0.77017],
4322
+ [0.87871, 0.77017, 0.8766, 0.80126, 0.87554, 0.81682, 0.87004, 0.82938],
4323
+ [0.87004, 0.82938, 0.86208, 0.84756, 0.84756, 0.86209, 0.82938, 0.87005],
4324
+ [0.82938, 0.87005, 0.81681, 0.87552, 0.80126, 0.87658, 0.77016, 0.8787],
4325
+ [0.77016, 0.8787, 0.7465, 0.88031, 0.72285, 0.88192, 0.69919, 0.88352],
4326
+ [0.69919, 0.88352, 0.68661, 0.88438, 0.68032, 0.88482, 0.67431, 0.88617],
4327
+ [0.67431, 0.88617, 0.66563, 0.88815, 0.65735, 0.89158, 0.64981, 0.89632],
4328
+ [0.64981, 0.89632, 0.6446, 0.89961, 0.63985, 0.90376, 0.63035, 0.91205],
4329
+ [0.63035, 0.91205, 0.61248, 0.92764, 0.59462, 0.94323, 0.57675, 0.95882],
4330
+ [0.57675, 0.95882, 0.55327, 0.97932, 0.54153, 0.98955, 0.52875, 0.99455],
4331
+ [0.52875, 0.99455, 0.51027, 1.00182, 0.48973, 1.00182, 0.47125, 0.99455],
4332
+ [0.47125, 0.99455, 0.45847, 0.98955, 0.44673, 0.97932, 0.42325, 0.95882],
4333
+ [0.42325, 0.95882, 0.40538, 0.94323, 0.38752, 0.92764, 0.36965, 0.91205],
4334
+ [0.36965, 0.91205, 0.36015, 0.90376, 0.3554, 0.89961, 0.35019, 0.89632],
4335
+ [0.35019, 0.89632, 0.34265, 0.89158, 0.33437, 0.88815, 0.32569, 0.88617],
4336
+ [0.32569, 0.88617, 0.31968, 0.88482, 0.31339, 0.88438, 0.30081, 0.88352],
4337
+ [0.30081, 0.88352, 0.27715, 0.88192, 0.2535, 0.88031, 0.22984, 0.8787],
4338
+ [0.22984, 0.8787, 0.19874, 0.87658, 0.18319, 0.87552, 0.17062, 0.87005],
4339
+ [0.17062, 0.87005, 0.15244, 0.86209, 0.13792, 0.84756, 0.12996, 0.82938],
4340
+ [0.12996, 0.82938, 0.12446, 0.81682, 0.1234, 0.80126, 0.12129, 0.77017],
4341
+ [0.12129, 0.77017, 0.11968, 0.74652, 0.11807, 0.72286, 0.11647, 0.6992],
4342
+ [0.11647, 0.6992, 0.11561, 0.68662, 0.11519, 0.68032, 0.11382, 0.67432],
4343
+ [0.11382, 0.67432, 0.11185, 0.66564, 0.10841, 0.65736, 0.10367, 0.64982],
4344
+ [0.10367, 0.64982, 0.10039, 0.64459, 0.09624, 0.63985, 0.08796, 0.63035],
4345
+ [0.08796, 0.63035, 0.07236, 0.61249, 0.05677, 0.59463, 0.04118, 0.57676],
4346
+ [0.04118, 0.57676, 0.02068, 0.55326, 0.01043, 0.54153, 543e-5, 0.52876],
4347
+ [543e-5, 0.52876, -18e-4, 0.51027, -18e-4, 0.48973, 543e-5, 0.47124],
4348
+ [543e-5, 0.47124, 0.01043, 0.45847, 0.02068, 0.44674, 0.04118, 0.42324],
4349
+ [0.04118, 0.42324, 0.05677, 0.40537, 0.07236, 0.38751, 0.08796, 0.36965],
4350
+ [0.08796, 0.36965, 0.09624, 0.36015, 0.10039, 0.35541, 0.10367, 0.35018],
4351
+ [0.10367, 0.35018, 0.10841, 0.34264, 0.11184, 0.33436, 0.11382, 0.32568],
4352
+ [0.11382, 0.32568, 0.11519, 0.31968, 0.11561, 0.31338, 0.11647, 0.3008],
4353
+ [0.11647, 0.3008, 0.11808, 0.27714, 0.11969, 0.25348, 0.12129, 0.22983],
4354
+ [0.12129, 0.22983, 0.1234, 0.19874, 0.12446, 0.18318, 0.12996, 0.17062],
4355
+ [0.12996, 0.17062, 0.13792, 0.15244, 0.15244, 0.13791, 0.17062, 0.12995],
4356
+ [0.17062, 0.12995, 0.18319, 0.12448, 0.19874, 0.12342, 0.22984, 0.1213],
4357
+ [0.22984, 0.1213, 0.2535, 0.11969, 0.27716, 0.11808, 0.30081, 0.11648],
4358
+ [0.30081, 0.11648, 0.31339, 0.11562, 0.31968, 0.11518, 0.32569, 0.11383],
4359
+ [0.32569, 0.11383, 0.33437, 0.11185, 0.34266, 0.10842, 0.35019, 0.10368],
4360
+ [0.35019, 0.10368, 0.3554, 0.10039, 0.36015, 0.09624, 0.36965, 0.08795],
4361
+ [0.36965, 0.08795, 0.38752, 0.07236, 0.40538, 0.05677, 0.42325, 0.04118],
4362
+ [0.42325, 0.04118, 0.44673, 0.02068, 0.45847, 0.01045, 0.47125, 545e-5],
4363
+ [0.47125, 545e-5, 0.48973, -182e-5, 0.51027, -182e-5, 0.52875, 545e-5],
4364
+ [0.52875, 545e-5, 0.54153, 0.01045, 0.55327, 0.02068, 0.57675, 0.04118],
4365
+ [0.57675, 0.04118, 0.59462, 0.05677, 0.61248, 0.07236, 0.63035, 0.08795],
4366
+ [0.63035, 0.08795, 0.63985, 0.09624, 0.6446, 0.10039, 0.64981, 0.10368],
4367
+ [0.64981, 0.10368, 0.65735, 0.10842, 0.66563, 0.11185, 0.67431, 0.11383],
4368
+ [0.67431, 0.11383, 0.68032, 0.11518, 0.68661, 0.11562, 0.69919, 0.11648],
4369
+ [0.69919, 0.11648, 0.72285, 0.11808, 0.7465, 0.11969, 0.77016, 0.1213]
4370
+ ]);
4371
+ var triangleShape = createShape([
4372
+ [0.33058, 0.2095, 0.37847, 0.12601, 0.40242, 0.08427, 0.43146, 0.06665],
4373
+ [0.43146, 0.06665, 0.47358, 0.04108, 0.52643, 0.04108, 0.56854, 0.06665],
4374
+ [0.56854, 0.06665, 0.59758, 0.08427, 0.62153, 0.12601, 0.66943, 0.2095],
4375
+ [0.66943, 0.2095, 0.75568, 0.35983, 0.84194, 0.51017, 0.92819, 0.66051],
4376
+ [0.92819, 0.66051, 0.97563, 0.7432, 0.99935, 0.78452, 0.99998, 0.81829],
4377
+ [0.99998, 0.81829, 1.00088, 0.86728, 0.97451, 0.91273, 0.93153, 0.93626],
4378
+ [0.93153, 0.93626, 0.90188, 0.95253, 0.85417, 0.95253, 0.75877, 0.95253],
4379
+ [0.75877, 0.95253, 0.58626, 0.95253, 0.41375, 0.95253, 0.24124, 0.95253],
4380
+ [0.24124, 0.95253, 0.14583, 0.95253, 0.09812, 0.95253, 0.06847, 0.93626],
4381
+ [0.06847, 0.93626, 0.02548, 0.91274, -89e-5, 0.86729, 2e-5, 0.81829],
4382
+ [2e-5, 0.81829, 65e-5, 0.78452, 0.02437, 0.7432, 0.07181, 0.66051],
4383
+ [0.07181, 0.66051, 0.15807, 0.51017, 0.24432, 0.35983, 0.33058, 0.2095]
4384
+ ]);
4385
+ var verySunnyShape = createShape([
4386
+ [0.42725, 0.04123, 0.46018, -0.01374, 0.53981, -0.01374, 0.57275, 0.04123],
4387
+ [0.57275, 0.04123, 0.58508, 0.06182, 0.59741, 0.08241, 0.60974, 0.10301],
4388
+ [0.60974, 0.10301, 0.62896, 0.13504, 0.66687, 0.15076, 0.70309, 0.14166],
4389
+ [0.70309, 0.14166, 0.72638, 0.13583, 0.74967, 0.13, 0.77296, 0.12416],
4390
+ [0.77296, 0.12416, 0.83512, 0.1086, 0.8914, 0.16488, 0.87583, 0.22704],
4391
+ [0.87583, 0.22704, 0.87, 0.25033, 0.86417, 0.27362, 0.85833, 0.29691],
4392
+ [0.85833, 0.29691, 0.84924, 0.33313, 0.86496, 0.37103, 0.89699, 0.39025],
4393
+ [0.89699, 0.39025, 0.91758, 0.40258, 0.93818, 0.41492, 0.95877, 0.42725],
4394
+ [0.95877, 0.42725, 1.01374, 0.46019, 1.01374, 0.53981, 0.95877, 0.57275],
4395
+ [0.95877, 0.57275, 0.93818, 0.58508, 0.91758, 0.59742, 0.89699, 0.60975],
4396
+ [0.89699, 0.60975, 0.86496, 0.62897, 0.84924, 0.66687, 0.85833, 0.70309],
4397
+ [0.85833, 0.70309, 0.86417, 0.72638, 0.87, 0.74967, 0.87583, 0.77296],
4398
+ [0.87583, 0.77296, 0.8914, 0.83512, 0.83512, 0.8914, 0.77296, 0.87584],
4399
+ [0.77296, 0.87584, 0.74967, 0.87, 0.72638, 0.86417, 0.70309, 0.85834],
4400
+ [0.70309, 0.85834, 0.66687, 0.84924, 0.62896, 0.86496, 0.60974, 0.89699],
4401
+ [0.60974, 0.89699, 0.59741, 0.91759, 0.58508, 0.93818, 0.57275, 0.95877],
4402
+ [0.57275, 0.95877, 0.53981, 1.01374, 0.46018, 1.01374, 0.42725, 0.95877],
4403
+ [0.42725, 0.95877, 0.41491, 0.93818, 0.40258, 0.91759, 0.39025, 0.89699],
4404
+ [0.39025, 0.89699, 0.37103, 0.86496, 0.33312, 0.84924, 0.29691, 0.85834],
4405
+ [0.29691, 0.85834, 0.27361, 0.86417, 0.25031, 0.87, 0.22702, 0.87584],
4406
+ [0.22702, 0.87584, 0.16489, 0.8914, 0.10859, 0.83512, 0.12416, 0.77296],
4407
+ [0.12416, 0.77296, 0.12999, 0.74967, 0.13583, 0.72638, 0.14167, 0.70309],
4408
+ [0.14167, 0.70309, 0.15075, 0.66687, 0.13505, 0.62897, 0.103, 0.60975],
4409
+ [0.103, 0.60975, 0.08241, 0.59742, 0.06181, 0.58508, 0.04121, 0.57275],
4410
+ [0.04121, 0.57275, -0.01373, 0.53981, -0.01373, 0.46019, 0.04121, 0.42725],
4411
+ [0.04121, 0.42725, 0.06181, 0.41492, 0.08241, 0.40258, 0.103, 0.39025],
4412
+ [0.103, 0.39025, 0.13505, 0.37103, 0.15075, 0.33313, 0.14167, 0.29691],
4413
+ [0.14167, 0.29691, 0.13583, 0.27362, 0.12999, 0.25033, 0.12416, 0.22704],
4414
+ [0.12416, 0.22704, 0.10859, 0.16488, 0.16489, 0.1086, 0.22702, 0.12416],
4415
+ [0.22702, 0.12416, 0.25031, 0.13, 0.27361, 0.13583, 0.29691, 0.14166],
4416
+ [0.29691, 0.14166, 0.33312, 0.15076, 0.37103, 0.13504, 0.39025, 0.10301],
4417
+ [0.39025, 0.10301, 0.40258, 0.08241, 0.41491, 0.06182, 0.42725, 0.04123]
4418
+ ]);
4419
+ function reversePolygon(polygon) {
4420
+ const reversedFeatures = polygon.features.map((f) => {
4421
+ const reversedCubics = f.cubics.map((c) => c.reverse()).reverse();
4422
+ if (f.type === "corner") {
4423
+ return cornerFeature(reversedCubics, f.convex);
4424
+ } else {
4425
+ return edgeFeature(reversedCubics);
4426
+ }
4427
+ }).reverse();
4428
+ return RoundedPolygon.fromFeatures(
4429
+ reversedFeatures,
4430
+ polygon.centerX,
4431
+ polygon.centerY
4432
+ );
4433
+ }
4434
+ function rotate180(polygon) {
4435
+ return polygon.transformed((x, y) => [1 - x, 1 - y]);
4436
+ }
4437
+ function flipV(polygon) {
4438
+ const flipped = polygon.transformed((x, y) => [x, 1 - y]);
4439
+ return reversePolygon(flipped);
4440
+ }
4441
+ var MD3Shapes = {
4442
+ arch: flipV(archShape),
4443
+ arrow: flipV(arrowShape),
4444
+ boom: boomShape,
4445
+ bun: bunShape,
4446
+ burst: burstShape,
4447
+ circle: circleShape,
4448
+ clamshell: clamshellShape,
4449
+ diamond: diamondShape,
4450
+ fan: rotate180(fanShape),
4451
+ flower: flowerShape,
4452
+ gem: flipV(gemShape),
4453
+ ghostish: flipV(ghostishShape),
4454
+ heart: flipV(heartShape),
4455
+ clover4Leaf: clover4LeafShape,
4456
+ clover8Leaf: clover8LeafShape,
4457
+ oval: flipV(ovalShape),
4458
+ pentagon: flipV(pentagonShape),
4459
+ pill: flipV(pillShape),
4460
+ pixelCircle: pixelCircleShape,
4461
+ pixelTriangle: pixelTriangleShape,
4462
+ puffyDiamond: puffyDiamondShape,
4463
+ puffy: puffyShape,
4464
+ semiCircle: flipV(semiCircleShape),
4465
+ cookie12Sided: cookie12SidedShape,
4466
+ cookie4Sided: cookie4SidedShape,
4467
+ cookie6Sided: cookie6SidedShape,
4468
+ cookie7Sided: cookie7SidedShape,
4469
+ cookie9Sided: cookie9SidedShape,
4470
+ slanted: flipV(slantedShape),
4471
+ softBoom: softBoomShape,
4472
+ softBurst: softBurstShape,
4473
+ square: squareShape,
4474
+ sunny: sunnyShape,
4475
+ triangle: flipV(triangleShape),
4476
+ verySunny: verySunnyShape
4477
+ };
4478
+
4479
+ // src/shapes/render/shape-rendering.ts
4480
+ function toSvgPath(cubics, width = 1, height = 1) {
4481
+ if (cubics.length === 0) return "";
4482
+ const paddingX = width * 0.015;
4483
+ const paddingY = height * 0.015;
4484
+ const sx = width - 2 * paddingX;
4485
+ const sy = height - 2 * paddingY;
4486
+ const flipY = (y) => paddingY + sy * (1 - y);
4487
+ const parts = [
4488
+ `M ${fmt(paddingX + cubics[0].anchor0X * sx)} ${fmt(flipY(cubics[0].anchor0Y))}`
4489
+ ];
4490
+ for (const c of cubics) {
4491
+ parts.push(
4492
+ `C ${fmt(paddingX + c.control0X * sx)} ${fmt(flipY(c.control0Y))},${fmt(paddingX + c.control1X * sx)} ${fmt(flipY(c.control1Y))},${fmt(paddingX + c.anchor1X * sx)} ${fmt(flipY(c.anchor1Y))}`
4493
+ );
4494
+ }
4495
+ parts.push("Z");
4496
+ return parts.join(" ");
4497
+ }
4498
+ function toClipPath(polygon, width, height) {
4499
+ const pathData = toSvgPath(polygon.cubics, width, height);
4500
+ return `path('${pathData}')`;
4501
+ }
4502
+ function fmt(v) {
4503
+ return Number(v.toFixed(4)).toString();
4504
+ }
4505
+
4506
+ // src/ui/navigation/navigation-shape-utils.ts
4507
+ function getNavigationShapeStyle(shape, width = 56, height = 56) {
4508
+ if (!shape || shape === "pill" || shape === "circle") {
4509
+ return void 0;
4510
+ }
4511
+ const polygon = MD3Shapes[shape];
4512
+ if (!polygon) {
4513
+ return void 0;
4514
+ }
4515
+ return {
4516
+ clipPath: toClipPath(polygon, width, height)
4517
+ };
4518
+ }
4519
+ function isSquareShape(shape) {
4520
+ return Boolean(shape && shape !== "pill");
4521
+ }
2606
4522
  var NavigationBarContext = React36.createContext({ variant: "flexible" });
2607
4523
  function cloneIconWithFill(icon, selected) {
2608
4524
  if (!React36.isValidElement(icon)) return icon;
@@ -2614,16 +4530,23 @@ function cloneIconWithFill(icon, selected) {
2614
4530
  }
2615
4531
  return icon;
2616
4532
  }
2617
- function ActivePill() {
4533
+ function ActivePill({
4534
+ shape = "pill",
4535
+ width = 56,
4536
+ height = 32
4537
+ }) {
2618
4538
  const { activeIndicatorTransition } = React36.useContext(NavigationBarContext);
4539
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
2619
4540
  return /* @__PURE__ */ jsx(
2620
4541
  m.div,
2621
4542
  {
2622
- className: "absolute inset-0 bg-m3-secondary-container pointer-events-none",
2623
- style: {
2624
- borderRadius: 9999,
4543
+ className: cn(
4544
+ "bg-m3-secondary-container pointer-events-none",
4545
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : shape === "circle" ? "absolute inset-0 rounded-full" : "absolute inset-0 rounded-full"
4546
+ ),
4547
+ style: __spreadValues(__spreadValues({
2625
4548
  zIndex: 0
2626
- },
4549
+ }, shapeStyle ? { width, height } : {}), shapeStyle),
2627
4550
  initial: { opacity: 0, scale: 0.5 },
2628
4551
  animate: { opacity: 1, scale: 1 },
2629
4552
  exit: { opacity: 0, scale: 0.5 },
@@ -2631,11 +4554,42 @@ function ActivePill() {
2631
4554
  }
2632
4555
  );
2633
4556
  }
2634
- function HoverStateLayer() {
2635
- return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] group-focus-visible:opacity-[0.10] active:opacity-[0.10] transition-opacity duration-200 pointer-events-none z-0" });
4557
+ function HoverStateLayer({
4558
+ shape = "pill",
4559
+ width = 56,
4560
+ height = 32
4561
+ }) {
4562
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
4563
+ return /* @__PURE__ */ jsx(
4564
+ "div",
4565
+ {
4566
+ className: cn(
4567
+ "bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] group-focus-visible:opacity-[0.10] active:opacity-[0.10] transition-opacity duration-200 pointer-events-none z-0",
4568
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : shape === "circle" ? "absolute inset-0 rounded-full" : "absolute inset-0 rounded-[16px]"
4569
+ ),
4570
+ style: __spreadValues(__spreadValues({}, shapeStyle ? { width, height } : {}), shapeStyle)
4571
+ }
4572
+ );
2636
4573
  }
2637
- function RippleLayer({ ripples, onRippleDone }) {
2638
- return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0", children: /* @__PURE__ */ jsx(Ripple, { ripples, onRippleDone }) });
4574
+ function RippleLayer({
4575
+ ripples,
4576
+ onRippleDone,
4577
+ shape = "pill",
4578
+ width = 56,
4579
+ height = 32
4580
+ }) {
4581
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
4582
+ return /* @__PURE__ */ jsx(
4583
+ "div",
4584
+ {
4585
+ className: cn(
4586
+ "overflow-hidden pointer-events-none z-0",
4587
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : shape === "circle" ? "absolute inset-0 rounded-full" : "absolute inset-0 rounded-[16px]"
4588
+ ),
4589
+ style: __spreadValues(__spreadValues({}, shapeStyle ? { width, height } : {}), shapeStyle),
4590
+ children: /* @__PURE__ */ jsx(Ripple, { ripples, onRippleDone })
4591
+ }
4592
+ );
2639
4593
  }
2640
4594
  function IconContainer({ selected, badge, children }) {
2641
4595
  return /* @__PURE__ */ jsxs(
@@ -2661,16 +4615,33 @@ var NavigationBarItemComponent = React36.forwardRef(
2661
4615
  onClick,
2662
4616
  disabled = false,
2663
4617
  badge,
4618
+ shape: shapeProp,
4619
+ shapeSize: shapeSizeProp,
4620
+ hideLabel = false,
2664
4621
  className,
2665
- "aria-label": ariaLabelProp
4622
+ "aria-label": ariaLabelProp,
4623
+ asChild = false,
4624
+ children
2666
4625
  }, ref) => {
4626
+ var _a, _b, _c;
2667
4627
  const {
2668
4628
  variant,
2669
4629
  itemLayout,
4630
+ shape: contextShape,
4631
+ labelVisibility: contextLabelVisibility,
4632
+ shapeSize: contextShapeSize,
2670
4633
  itemClassName: contextItemClassName
2671
4634
  } = React36.useContext(NavigationBarContext);
4635
+ const activeShape = (_a = shapeProp != null ? shapeProp : contextShape) != null ? _a : "pill";
4636
+ const isSquare = isSquareShape(activeShape);
4637
+ const resolvedShapeSize = (_b = shapeSizeProp != null ? shapeSizeProp : contextShapeSize) != null ? _b : 56;
2672
4638
  const isForcedHorizontal = itemLayout === "horizontal";
2673
4639
  const isResponsiveHorizontal = (variant === "flexible" || variant === "xr") && itemLayout === void 0;
4640
+ const shouldShowLabel = !hideLabel && (() => {
4641
+ if (contextLabelVisibility === "unlabeled") return false;
4642
+ if (contextLabelVisibility === "auto") return selected;
4643
+ return true;
4644
+ })();
2674
4645
  const { ripples, onPointerDown, removeRipple } = useRippleState({
2675
4646
  disabled
2676
4647
  });
@@ -2691,6 +4662,145 @@ var NavigationBarItemComponent = React36.forwardRef(
2691
4662
  [disabled, selected, onClick]
2692
4663
  );
2693
4664
  const filledIcon = cloneIconWithFill(icon, selected);
4665
+ const itemClassName = cn(
4666
+ "group relative flex cursor-pointer transition-colors duration-200 outline-none select-none h-full items-center justify-center min-w-0",
4667
+ variant === "xr" ? isResponsiveHorizontal ? "flex-1 min-[600px]:flex-initial min-[600px]:w-auto" : isForcedHorizontal ? "flex-initial w-auto" : "flex-1" : isForcedHorizontal ? "flex-initial w-auto" : "flex-1",
4668
+ disabled && "pointer-events-none opacity-[0.38]",
4669
+ contextItemClassName,
4670
+ className
4671
+ );
4672
+ const iconPillWidth = isSquare ? resolvedShapeSize : 56;
4673
+ const iconPillHeight = isSquare ? resolvedShapeSize : 32;
4674
+ if (asChild && children) {
4675
+ const child = React36.Children.only(children);
4676
+ const innerContent = /* @__PURE__ */ jsxs(Fragment, { children: [
4677
+ /* @__PURE__ */ jsxs(
4678
+ "div",
4679
+ {
4680
+ className: cn(
4681
+ "relative flex items-center justify-center flex-col gap-y-1 w-full px-1 py-1.5",
4682
+ isResponsiveHorizontal && "min-[600px]:flex-row min-[600px]:gap-y-0 min-[600px]:gap-x-1.5 min-[600px]:h-10 min-[600px]:px-4 min-[600px]:py-0 min-[600px]:rounded-full min-[600px]:w-auto",
4683
+ isForcedHorizontal && "flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto",
4684
+ // When label is hidden and not horizontal, remove bottom gap
4685
+ !shouldShowLabel && !isForcedHorizontal && "gap-y-0"
4686
+ ),
4687
+ children: [
4688
+ !isSquare && /* @__PURE__ */ jsxs(
4689
+ "div",
4690
+ {
4691
+ className: cn(
4692
+ "absolute inset-0 z-0 hidden",
4693
+ isResponsiveHorizontal && "min-[600px]:block",
4694
+ isForcedHorizontal && "block!"
4695
+ ),
4696
+ children: [
4697
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(ActivePill, { shape: activeShape, width: 56, height: 40 }) }),
4698
+ /* @__PURE__ */ jsx(HoverStateLayer, { shape: activeShape, width: 56, height: 40 }),
4699
+ /* @__PURE__ */ jsx(
4700
+ RippleLayer,
4701
+ {
4702
+ ripples,
4703
+ onRippleDone: removeRipple,
4704
+ shape: activeShape,
4705
+ width: 56,
4706
+ height: 40
4707
+ }
4708
+ )
4709
+ ]
4710
+ }
4711
+ ),
4712
+ /* @__PURE__ */ jsxs(
4713
+ "div",
4714
+ {
4715
+ className: cn(
4716
+ "relative flex items-center justify-center shrink-0 z-10",
4717
+ isSquare ? "mx-auto" : "h-8 w-14 mx-auto rounded-[16px]",
4718
+ !isSquare && isResponsiveHorizontal && "min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto",
4719
+ !isSquare && isForcedHorizontal && "size-6 w-auto h-auto"
4720
+ ),
4721
+ style: isSquare ? { width: resolvedShapeSize, height: resolvedShapeSize } : void 0,
4722
+ children: [
4723
+ /* @__PURE__ */ jsxs(
4724
+ "div",
4725
+ {
4726
+ className: cn(
4727
+ "absolute inset-0 z-0",
4728
+ !isSquare && isResponsiveHorizontal && "min-[600px]:hidden",
4729
+ !isSquare && isForcedHorizontal && "hidden"
4730
+ ),
4731
+ children: [
4732
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
4733
+ ActivePill,
4734
+ {
4735
+ shape: activeShape,
4736
+ width: iconPillWidth,
4737
+ height: iconPillHeight
4738
+ }
4739
+ ) }),
4740
+ /* @__PURE__ */ jsx(
4741
+ HoverStateLayer,
4742
+ {
4743
+ shape: activeShape,
4744
+ width: iconPillWidth,
4745
+ height: iconPillHeight
4746
+ }
4747
+ ),
4748
+ /* @__PURE__ */ jsx(
4749
+ RippleLayer,
4750
+ {
4751
+ ripples,
4752
+ onRippleDone: removeRipple,
4753
+ shape: activeShape,
4754
+ width: iconPillWidth,
4755
+ height: iconPillHeight
4756
+ }
4757
+ )
4758
+ ]
4759
+ }
4760
+ ),
4761
+ /* @__PURE__ */ jsx("div", { className: "relative z-10 flex size-6 items-center justify-center text-current", children: /* @__PURE__ */ jsx(IconContainer, { selected, badge, children: filledIcon }) })
4762
+ ]
4763
+ }
4764
+ ),
4765
+ label && /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", initial: false, children: shouldShowLabel && /* @__PURE__ */ jsx(
4766
+ m.span,
4767
+ {
4768
+ initial: { opacity: 0, height: 0, scale: 0.85, y: -2 },
4769
+ animate: { opacity: 1, height: "auto", scale: 1, y: 0 },
4770
+ exit: { opacity: 0, height: 0, scale: 0.85, y: -2 },
4771
+ transition: SPRING_TRANSITION_EXPRESSIVE,
4772
+ className: cn(
4773
+ "z-10 transition-colors duration-200 truncate px-1 inline-block overflow-hidden",
4774
+ selected ? "text-m3-on-surface font-medium" : "text-m3-on-surface-variant font-medium",
4775
+ "text-[12px] leading-4 tracking-[0.5px]"
4776
+ ),
4777
+ children: (_c = child.props.children) != null ? _c : label
4778
+ },
4779
+ "nav-label"
4780
+ ) })
4781
+ ]
4782
+ }
4783
+ ),
4784
+ /* @__PURE__ */ jsx(TouchTarget, {})
4785
+ ] });
4786
+ return /* @__PURE__ */ jsx(
4787
+ Slot,
4788
+ {
4789
+ ref,
4790
+ role: "menuitem",
4791
+ "aria-current": selected ? "page" : void 0,
4792
+ "aria-disabled": disabled ? true : void 0,
4793
+ "aria-label": (
4794
+ // Always provide aria-label even when label is visually hidden
4795
+ ariaLabelProp || (typeof label === "string" ? label : void 0)
4796
+ ),
4797
+ onClick: handleClick,
4798
+ onPointerDown,
4799
+ className: itemClassName,
4800
+ children: React36.cloneElement(child, { children: innerContent })
4801
+ }
4802
+ );
4803
+ }
2694
4804
  return /* @__PURE__ */ jsxs(
2695
4805
  m.button,
2696
4806
  {
@@ -2699,16 +4809,13 @@ var NavigationBarItemComponent = React36.forwardRef(
2699
4809
  role: "menuitem",
2700
4810
  "aria-current": selected ? "page" : void 0,
2701
4811
  "aria-disabled": disabled ? true : void 0,
2702
- "aria-label": ariaLabelProp || (typeof label === "string" ? label : void 0),
4812
+ "aria-label": (
4813
+ // Always provide aria-label even when label is visually hidden
4814
+ ariaLabelProp || (typeof label === "string" ? label : void 0)
4815
+ ),
2703
4816
  onClick: handleClick,
2704
4817
  onPointerDown,
2705
- className: cn(
2706
- "group relative flex cursor-pointer transition-colors duration-200 outline-none select-none h-full items-center justify-center min-w-0",
2707
- variant === "xr" ? isResponsiveHorizontal ? "flex-1 min-[600px]:flex-initial min-[600px]:w-auto" : isForcedHorizontal ? "flex-initial w-auto" : "flex-1" : isForcedHorizontal ? "flex-initial w-auto" : "flex-1",
2708
- disabled && "pointer-events-none opacity-[0.38]",
2709
- contextItemClassName,
2710
- className
2711
- ),
4818
+ className: itemClassName,
2712
4819
  children: [
2713
4820
  /* @__PURE__ */ jsxs(
2714
4821
  "div",
@@ -2716,10 +4823,12 @@ var NavigationBarItemComponent = React36.forwardRef(
2716
4823
  className: cn(
2717
4824
  "relative flex items-center justify-center flex-col gap-y-1 w-full px-1 py-1.5",
2718
4825
  isResponsiveHorizontal && "min-[600px]:flex-row min-[600px]:gap-y-0 min-[600px]:gap-x-1.5 min-[600px]:h-10 min-[600px]:px-4 min-[600px]:py-0 min-[600px]:rounded-full min-[600px]:w-auto",
2719
- isForcedHorizontal && "flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto"
4826
+ isForcedHorizontal && "flex-row gap-y-0 gap-x-1.5 h-10 px-4 py-0 rounded-full w-auto",
4827
+ // When label is hidden and not horizontal, remove bottom gap
4828
+ !shouldShowLabel && !isForcedHorizontal && "gap-y-0"
2720
4829
  ),
2721
4830
  children: [
2722
- /* @__PURE__ */ jsxs(
4831
+ !isSquare && /* @__PURE__ */ jsxs(
2723
4832
  "div",
2724
4833
  {
2725
4834
  className: cn(
@@ -2728,9 +4837,18 @@ var NavigationBarItemComponent = React36.forwardRef(
2728
4837
  isForcedHorizontal && "block!"
2729
4838
  ),
2730
4839
  children: [
2731
- /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(ActivePill, {}) }),
2732
- /* @__PURE__ */ jsx(HoverStateLayer, {}),
2733
- /* @__PURE__ */ jsx(RippleLayer, { ripples, onRippleDone: removeRipple })
4840
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(ActivePill, { shape: activeShape, width: 56, height: 40 }) }),
4841
+ /* @__PURE__ */ jsx(HoverStateLayer, { shape: activeShape, width: 56, height: 40 }),
4842
+ /* @__PURE__ */ jsx(
4843
+ RippleLayer,
4844
+ {
4845
+ ripples,
4846
+ onRippleDone: removeRipple,
4847
+ shape: activeShape,
4848
+ width: 56,
4849
+ height: 40
4850
+ }
4851
+ )
2734
4852
  ]
2735
4853
  }
2736
4854
  ),
@@ -2739,23 +4857,47 @@ var NavigationBarItemComponent = React36.forwardRef(
2739
4857
  {
2740
4858
  className: cn(
2741
4859
  "relative flex items-center justify-center shrink-0 z-10",
2742
- "h-8 w-16 mx-auto rounded-full",
2743
- isResponsiveHorizontal && "min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto",
2744
- isForcedHorizontal && "size-6 w-auto h-auto"
4860
+ isSquare ? "mx-auto" : "h-8 w-14 mx-auto rounded-[16px]",
4861
+ !isSquare && isResponsiveHorizontal && "min-[600px]:size-6 min-[600px]:w-auto min-[600px]:h-auto",
4862
+ !isSquare && isForcedHorizontal && "size-6 w-auto h-auto"
2745
4863
  ),
4864
+ style: isSquare ? { width: resolvedShapeSize, height: resolvedShapeSize } : void 0,
2746
4865
  children: [
2747
4866
  /* @__PURE__ */ jsxs(
2748
4867
  "div",
2749
4868
  {
2750
4869
  className: cn(
2751
4870
  "absolute inset-0 z-0",
2752
- isResponsiveHorizontal && "min-[600px]:hidden",
2753
- isForcedHorizontal && "hidden"
4871
+ !isSquare && isResponsiveHorizontal && "min-[600px]:hidden",
4872
+ !isSquare && isForcedHorizontal && "hidden"
2754
4873
  ),
2755
4874
  children: [
2756
- /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(ActivePill, {}) }),
2757
- /* @__PURE__ */ jsx(HoverStateLayer, {}),
2758
- /* @__PURE__ */ jsx(RippleLayer, { ripples, onRippleDone: removeRipple })
4875
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
4876
+ ActivePill,
4877
+ {
4878
+ shape: activeShape,
4879
+ width: iconPillWidth,
4880
+ height: iconPillHeight
4881
+ }
4882
+ ) }),
4883
+ /* @__PURE__ */ jsx(
4884
+ HoverStateLayer,
4885
+ {
4886
+ shape: activeShape,
4887
+ width: iconPillWidth,
4888
+ height: iconPillHeight
4889
+ }
4890
+ ),
4891
+ /* @__PURE__ */ jsx(
4892
+ RippleLayer,
4893
+ {
4894
+ ripples,
4895
+ onRippleDone: removeRipple,
4896
+ shape: activeShape,
4897
+ width: iconPillWidth,
4898
+ height: iconPillHeight
4899
+ }
4900
+ )
2759
4901
  ]
2760
4902
  }
2761
4903
  ),
@@ -2763,13 +4905,17 @@ var NavigationBarItemComponent = React36.forwardRef(
2763
4905
  ]
2764
4906
  }
2765
4907
  ),
2766
- /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: /* @__PURE__ */ jsx(
2767
- "span",
4908
+ label && /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", initial: false, children: shouldShowLabel && /* @__PURE__ */ jsx(
4909
+ m.span,
2768
4910
  {
4911
+ initial: { opacity: 0, height: 0, scale: 0.85, y: -2 },
4912
+ animate: { opacity: 1, height: "auto", scale: 1, y: 0 },
4913
+ exit: { opacity: 0, height: 0, scale: 0.85, y: -2 },
4914
+ transition: SPRING_TRANSITION_EXPRESSIVE,
2769
4915
  className: cn(
2770
- "z-10 transition-all duration-200 truncate px-1",
2771
- selected ? "text-m3-on-surface" : "text-m3-on-surface-variant",
2772
- "font-medium text-[12px] leading-4 tracking-[0.5px]"
4916
+ "z-10 transition-colors duration-200 truncate px-1 inline-block overflow-hidden",
4917
+ selected ? "text-m3-on-surface font-medium" : "text-m3-on-surface-variant font-medium",
4918
+ "text-[12px] leading-4 tracking-[0.5px]"
2773
4919
  ),
2774
4920
  children: label
2775
4921
  },
@@ -2791,9 +4937,9 @@ var navContainerVariants = cva(
2791
4937
  {
2792
4938
  variants: {
2793
4939
  variant: {
2794
- flexible: "bottom-0 left-0 right-0 w-full h-16 pb-safe",
2795
- baseline: "bottom-0 left-0 right-0 w-full h-20 pb-safe",
2796
- xr: "bottom-6 left-1/2 -translate-x-1/2 w-auto max-w-[calc(100%-2rem)] min-[600px]:max-w-fit h-20 min-[600px]:h-16 rounded-[48px] px-2"
4940
+ flexible: "bottom-0 left-0 right-0 w-full min-h-16 py-1 pb-safe",
4941
+ baseline: "bottom-0 left-0 right-0 w-full min-h-20 py-1 pb-safe",
4942
+ xr: "bottom-6 left-1/2 -translate-x-1/2 w-auto max-w-[calc(100%-2rem)] min-[600px]:max-w-fit min-h-20 min-[600px]:min-h-16 rounded-[48px] px-2 py-1"
2797
4943
  },
2798
4944
  position: {
2799
4945
  fixed: "fixed",
@@ -2815,6 +4961,9 @@ var NavigationBarComponent = React36.forwardRef(
2815
4961
  ({
2816
4962
  variant = "flexible",
2817
4963
  itemLayout,
4964
+ shape,
4965
+ labelVisibility,
4966
+ shapeSize,
2818
4967
  hideOnScroll = false,
2819
4968
  elevated = false,
2820
4969
  fixed = true,
@@ -2829,6 +4978,13 @@ var NavigationBarComponent = React36.forwardRef(
2829
4978
  const lastScrollY = React36.useRef(
2830
4979
  typeof window !== "undefined" ? window.scrollY : 0
2831
4980
  );
4981
+ const isSquare = isSquareShape(shape);
4982
+ const effectiveShapeSize = shapeSize != null ? shapeSize : isSquare ? 56 : 32;
4983
+ const computedMinHeight = React36.useMemo(() => {
4984
+ const baseHeight = variant === "baseline" ? 80 : 64;
4985
+ const requiredHeight = itemLayout === "horizontal" || labelVisibility === "unlabeled" ? effectiveShapeSize + 16 : effectiveShapeSize + 32;
4986
+ return Math.max(baseHeight, requiredHeight);
4987
+ }, [variant, itemLayout, labelVisibility, effectiveShapeSize]);
2832
4988
  React36.useEffect(() => {
2833
4989
  if (typeof window === "undefined" || !hideOnScroll) {
2834
4990
  setIsVisible(true);
@@ -2875,6 +5031,9 @@ var NavigationBarComponent = React36.forwardRef(
2875
5031
  value: {
2876
5032
  variant,
2877
5033
  itemLayout,
5034
+ shape,
5035
+ labelVisibility,
5036
+ shapeSize,
2878
5037
  activeIndicatorTransition,
2879
5038
  itemClassName
2880
5039
  },
@@ -2885,7 +5044,7 @@ var NavigationBarComponent = React36.forwardRef(
2885
5044
  role: "navigation",
2886
5045
  "aria-label": "Main navigation",
2887
5046
  className: navBaseClasses,
2888
- style,
5047
+ style: __spreadValues({ minHeight: computedMinHeight }, style),
2889
5048
  initial: false,
2890
5049
  animate: {
2891
5050
  y: isVisible ? "0%" : variant === "xr" ? "calc(100% + 40px)" : "100%"
@@ -2897,8 +5056,8 @@ var NavigationBarComponent = React36.forwardRef(
2897
5056
  role: "menubar",
2898
5057
  "aria-orientation": "horizontal",
2899
5058
  className: cn(
2900
- "flex w-full h-full mx-auto",
2901
- variant === "xr" ? "gap-0 min-[600px]:gap-1.5 items-center justify-center px-1" : "max-w-7xl gap-1.5"
5059
+ "flex w-full h-full mx-auto items-center justify-center",
5060
+ variant === "xr" ? "gap-0 min-[600px]:gap-1.5 px-1" : "max-w-7xl gap-1.5"
2902
5061
  ),
2903
5062
  children
2904
5063
  }
@@ -2911,7 +5070,11 @@ var NavigationBarComponent = React36.forwardRef(
2911
5070
  );
2912
5071
  NavigationBarComponent.displayName = "NavigationBar";
2913
5072
  var NavigationBar = React36.memo(NavigationBarComponent);
2914
- var NavigationRailContext = React36.createContext({ variant: "collapsed", labelVisibility: "labeled" });
5073
+ var NavigationRailContext = React36.createContext({
5074
+ variant: "collapsed",
5075
+ labelVisibility: "labeled",
5076
+ activeIndicatorWidth: "hug"
5077
+ });
2915
5078
  var MD3_MODAL_TRANSITION = {
2916
5079
  type: "tween",
2917
5080
  ease: [0.05, 0.7, 0.1, 1],
@@ -2922,9 +5085,9 @@ var railContainerVariants = cva(
2922
5085
  {
2923
5086
  variants: {
2924
5087
  variant: {
2925
- collapsed: "items-center h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none",
2926
- expanded: "items-start h-full pt-11 pb-4 shadow-none bg-m3-surface rounded-none",
2927
- modal: "bg-m3-surface shadow-lg rounded-r-[var(--m3-shape-corner-large)] h-full pt-11 pb-4",
5088
+ collapsed: "items-center h-full pt-11 pb-14 shadow-none bg-m3-surface rounded-none",
5089
+ expanded: "items-start h-full pt-11 pb-14 shadow-none bg-m3-surface rounded-none",
5090
+ modal: "bg-m3-surface shadow-lg rounded-r-[var(--m3-shape-corner-large)] h-full pt-11 pb-14",
2928
5091
  xr: "h-fit py-5 rounded-[48px] shadow-xl bg-m3-surface border border-white/5"
2929
5092
  },
2930
5093
  narrow: {
@@ -2967,14 +5130,28 @@ function setFocusedItem(items, index) {
2967
5130
  target.focus();
2968
5131
  }
2969
5132
  }
2970
- function ActivePill2({ layoutId, disableInitial = false }) {
5133
+ function ActivePill2({
5134
+ layoutId,
5135
+ disableInitial = false,
5136
+ shape = "pill",
5137
+ width = 56,
5138
+ height = 32
5139
+ }) {
2971
5140
  const { activeIndicatorTransition } = React36.useContext(NavigationRailContext);
5141
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
2972
5142
  return /* @__PURE__ */ jsx(
2973
5143
  m.div,
2974
5144
  {
2975
5145
  layoutId,
2976
- className: "absolute inset-0 bg-m3-secondary-container pointer-events-none",
2977
- style: { borderRadius: 9999, zIndex: 0, originX: 0.5, originY: 0.5 },
5146
+ className: cn(
5147
+ "bg-m3-secondary-container pointer-events-none",
5148
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : "absolute inset-0 rounded-full"
5149
+ ),
5150
+ style: __spreadValues(__spreadValues({
5151
+ zIndex: 0,
5152
+ originX: 0.5,
5153
+ originY: 0.5
5154
+ }, shapeStyle ? { width, height } : {}), shapeStyle),
2978
5155
  initial: disableInitial ? false : { opacity: 0, scale: 0.5 },
2979
5156
  animate: { opacity: 1, scale: 1 },
2980
5157
  exit: { opacity: 0, scale: 0.5, transition: { duration: 0.15 } },
@@ -2982,11 +5159,42 @@ function ActivePill2({ layoutId, disableInitial = false }) {
2982
5159
  }
2983
5160
  );
2984
5161
  }
2985
- function HoverStateLayer2() {
2986
- return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-full bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] transition-opacity duration-200 pointer-events-none z-0" });
5162
+ function HoverStateLayer2({
5163
+ shape = "pill",
5164
+ width = 56,
5165
+ height = 32
5166
+ }) {
5167
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
5168
+ return /* @__PURE__ */ jsx(
5169
+ "div",
5170
+ {
5171
+ className: cn(
5172
+ "bg-m3-on-surface opacity-0 group-hover:opacity-[0.08] transition-opacity duration-200 pointer-events-none z-0",
5173
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : "absolute inset-0 rounded-full"
5174
+ ),
5175
+ style: __spreadValues(__spreadValues({}, shapeStyle ? { width, height } : {}), shapeStyle)
5176
+ }
5177
+ );
2987
5178
  }
2988
- function RippleLayer2({ ripples, onRippleDone }) {
2989
- return /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-full overflow-hidden pointer-events-none z-0", children: /* @__PURE__ */ jsx(Ripple, { ripples, onRippleDone }) });
5179
+ function RippleLayer2({
5180
+ ripples,
5181
+ onRippleDone,
5182
+ shape = "pill",
5183
+ width = 56,
5184
+ height = 32
5185
+ }) {
5186
+ const shapeStyle = getNavigationShapeStyle(shape, width, height);
5187
+ return /* @__PURE__ */ jsx(
5188
+ "div",
5189
+ {
5190
+ className: cn(
5191
+ "overflow-hidden pointer-events-none z-0",
5192
+ shapeStyle ? "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-none" : "absolute inset-0 rounded-full"
5193
+ ),
5194
+ style: __spreadValues(__spreadValues({}, shapeStyle ? { width, height } : {}), shapeStyle),
5195
+ children: /* @__PURE__ */ jsx(Ripple, { ripples, onRippleDone })
5196
+ }
5197
+ );
2990
5198
  }
2991
5199
  function IconContainer2({ selected, badge, children }) {
2992
5200
  return /* @__PURE__ */ jsxs(
@@ -3012,15 +5220,31 @@ var NavigationRailItemComponent = React36.forwardRef(
3012
5220
  onClick,
3013
5221
  disabled = false,
3014
5222
  badge,
5223
+ shape: shapeProp,
5224
+ shapeSize: shapeSizeProp,
5225
+ activeIndicatorWidth: activeIndicatorWidthProp,
3015
5226
  className,
3016
- "aria-label": ariaLabelProp
5227
+ "aria-label": ariaLabelProp,
5228
+ asChild = false,
5229
+ children
3017
5230
  }, ref) => {
3018
- const { variant, labelVisibility } = React36.useContext(
3019
- NavigationRailContext
3020
- );
5231
+ var _a, _b, _c, _d;
5232
+ const {
5233
+ variant,
5234
+ labelVisibility,
5235
+ shape: contextShape,
5236
+ shapeSize: contextShapeSize,
5237
+ activeIndicatorWidth: contextActiveIndicatorWidth
5238
+ } = React36.useContext(NavigationRailContext);
5239
+ const activeShape = (_a = shapeProp != null ? shapeProp : contextShape) != null ? _a : "pill";
5240
+ const isSquare = isSquareShape(activeShape);
5241
+ const resolvedShapeSize = (_b = shapeSizeProp != null ? shapeSizeProp : contextShapeSize) != null ? _b : 56;
5242
+ const activeIndicatorWidth = (_c = activeIndicatorWidthProp != null ? activeIndicatorWidthProp : contextActiveIndicatorWidth) != null ? _c : "hug";
3021
5243
  const isExpanded = variant === "expanded" || variant === "modal";
3022
5244
  const isModal = variant === "modal";
3023
5245
  const enableLayout = !isModal;
5246
+ const isExpandedPill = isExpanded && !isSquare;
5247
+ const expandedPillWidthClass = activeIndicatorWidth === "fill" ? "w-full" : "w-fit";
3024
5248
  const activePillId = `rail-pill-${React36.useId()}`;
3025
5249
  const { ripples, onPointerDown, removeRipple } = useRippleState({
3026
5250
  disabled
@@ -3038,6 +5262,138 @@ var NavigationRailItemComponent = React36.forwardRef(
3038
5262
  );
3039
5263
  const filledIcon = cloneIconWithFill2(icon, selected);
3040
5264
  const labelInitial = isModal ? false : { opacity: 0, x: isExpanded ? -12 : 0, y: isExpanded ? 0 : -8 };
5265
+ const itemClassName = cn(
5266
+ "group relative flex cursor-pointer transition-colors duration-200 outline-none select-none",
5267
+ "focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2 rounded-full",
5268
+ disabled && "pointer-events-none opacity-[0.38]",
5269
+ isExpanded ? "w-full flex-row items-center px-3 h-14" : "w-full flex-col justify-center h-14",
5270
+ className
5271
+ );
5272
+ const iconPillWidth = isSquare ? resolvedShapeSize : 56;
5273
+ const iconPillHeight = isSquare ? resolvedShapeSize : 32;
5274
+ if (asChild && children) {
5275
+ const child = React36.Children.only(children);
5276
+ const innerContent = /* @__PURE__ */ jsxs(Fragment, { children: [
5277
+ /* @__PURE__ */ jsxs(
5278
+ m.div,
5279
+ {
5280
+ layout: enableLayout,
5281
+ className: cn(
5282
+ "relative flex z-10",
5283
+ isExpanded ? cn(
5284
+ "flex-row items-center h-14 px-4 gap-x-3 rounded-full",
5285
+ expandedPillWidthClass
5286
+ ) : "flex-col items-center justify-center w-full gap-y-1 rounded-full"
5287
+ ),
5288
+ children: [
5289
+ isExpandedPill && /* @__PURE__ */ jsxs(Fragment, { children: [
5290
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
5291
+ ActivePill2,
5292
+ {
5293
+ layoutId: activePillId,
5294
+ disableInitial: isModal,
5295
+ shape: activeShape
5296
+ }
5297
+ ) }),
5298
+ /* @__PURE__ */ jsx(HoverStateLayer2, { shape: activeShape }),
5299
+ /* @__PURE__ */ jsx(
5300
+ RippleLayer2,
5301
+ {
5302
+ ripples,
5303
+ onRippleDone: removeRipple,
5304
+ shape: activeShape
5305
+ }
5306
+ )
5307
+ ] }),
5308
+ /* @__PURE__ */ jsxs(
5309
+ m.div,
5310
+ {
5311
+ layout: enableLayout,
5312
+ className: cn(
5313
+ "relative flex items-center justify-center shrink-0 z-10",
5314
+ isSquare ? "mx-auto" : isExpandedPill ? "size-6" : "h-8 w-14 mx-auto rounded-full"
5315
+ ),
5316
+ style: isSquare ? { width: resolvedShapeSize, height: resolvedShapeSize } : void 0,
5317
+ children: [
5318
+ !isExpandedPill && /* @__PURE__ */ jsxs(Fragment, { children: [
5319
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
5320
+ ActivePill2,
5321
+ {
5322
+ layoutId: activePillId,
5323
+ disableInitial: isModal,
5324
+ shape: activeShape,
5325
+ width: iconPillWidth,
5326
+ height: iconPillHeight
5327
+ }
5328
+ ) }),
5329
+ /* @__PURE__ */ jsx(
5330
+ HoverStateLayer2,
5331
+ {
5332
+ shape: activeShape,
5333
+ width: iconPillWidth,
5334
+ height: iconPillHeight
5335
+ }
5336
+ ),
5337
+ /* @__PURE__ */ jsx(
5338
+ RippleLayer2,
5339
+ {
5340
+ ripples,
5341
+ onRippleDone: removeRipple,
5342
+ shape: activeShape,
5343
+ width: iconPillWidth,
5344
+ height: iconPillHeight
5345
+ }
5346
+ )
5347
+ ] }),
5348
+ /* @__PURE__ */ jsx(
5349
+ m.div,
5350
+ {
5351
+ layout: enableLayout ? "position" : false,
5352
+ className: "relative z-10 flex size-6 items-center justify-center text-current",
5353
+ children: /* @__PURE__ */ jsx(IconContainer2, { selected, badge, children: filledIcon })
5354
+ }
5355
+ )
5356
+ ]
5357
+ }
5358
+ ),
5359
+ /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: showLabel && (label || child.props.children) && /* @__PURE__ */ jsx(
5360
+ m.span,
5361
+ {
5362
+ layout: enableLayout ? "position" : false,
5363
+ initial: labelInitial,
5364
+ animate: { opacity: 1, x: 0, y: 0 },
5365
+ exit: { opacity: 0, transition: { duration: 0.1 } },
5366
+ transition: SPRING_TRANSITION,
5367
+ className: cn(
5368
+ "z-10 transition-colors duration-200 whitespace-nowrap",
5369
+ selected ? isExpandedPill ? "text-m3-on-secondary-container font-medium" : "text-m3-on-surface font-medium" : "text-m3-on-surface-variant font-medium",
5370
+ isExpanded ? "text-sm tracking-wide text-left" : "text-xs tracking-wide"
5371
+ ),
5372
+ children: (_d = child.props.children) != null ? _d : label
5373
+ },
5374
+ "rail-label"
5375
+ ) })
5376
+ ]
5377
+ }
5378
+ ),
5379
+ /* @__PURE__ */ jsx(TouchTarget, {})
5380
+ ] });
5381
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domMax, strict: true, children: /* @__PURE__ */ jsx(
5382
+ Slot,
5383
+ {
5384
+ ref,
5385
+ role: "menuitem",
5386
+ "aria-current": selected ? "page" : void 0,
5387
+ "aria-disabled": disabled ? true : void 0,
5388
+ "aria-label": ariaLabelProp || (typeof label === "string" ? label : void 0),
5389
+ onClick: handleClick,
5390
+ onPointerDown,
5391
+ className: itemClassName,
5392
+ tabIndex: -1,
5393
+ children: React36.cloneElement(child, { children: innerContent })
5394
+ }
5395
+ ) });
5396
+ }
3041
5397
  return /* @__PURE__ */ jsx(LazyMotion, { features: domMax, strict: true, children: /* @__PURE__ */ jsxs(
3042
5398
  m.button,
3043
5399
  {
@@ -3050,13 +5406,7 @@ var NavigationRailItemComponent = React36.forwardRef(
3050
5406
  "aria-label": ariaLabelProp || (typeof label === "string" ? label : void 0),
3051
5407
  onClick: handleClick,
3052
5408
  onPointerDown,
3053
- className: cn(
3054
- "group relative flex cursor-pointer transition-colors duration-200 outline-none select-none",
3055
- "focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2 rounded-full",
3056
- disabled && "pointer-events-none opacity-[0.38]",
3057
- isExpanded ? "w-full flex-row items-center px-3 h-14" : "w-full flex-col justify-center h-14",
3058
- className
3059
- ),
5409
+ className: itemClassName,
3060
5410
  tabIndex: -1,
3061
5411
  children: [
3062
5412
  /* @__PURE__ */ jsxs(
@@ -3065,31 +5415,71 @@ var NavigationRailItemComponent = React36.forwardRef(
3065
5415
  layout: enableLayout,
3066
5416
  className: cn(
3067
5417
  "relative flex z-10",
3068
- isExpanded ? "flex-row items-center w-fit h-14 px-4 gap-x-3 rounded-full" : "flex-col items-center justify-center w-full gap-y-1 rounded-full"
5418
+ isExpanded ? cn(
5419
+ "flex-row items-center h-14 px-4 gap-x-3 rounded-full",
5420
+ expandedPillWidthClass
5421
+ ) : "flex-col items-center justify-center w-full gap-y-1 rounded-full"
3069
5422
  ),
3070
5423
  children: [
3071
- isExpanded && /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
3072
- ActivePill2,
3073
- {
3074
- layoutId: activePillId,
3075
- disableInitial: isModal
3076
- }
3077
- ) }),
3078
- isExpanded && /* @__PURE__ */ jsx(HoverStateLayer2, {}),
3079
- isExpanded && /* @__PURE__ */ jsx(RippleLayer2, { ripples, onRippleDone: removeRipple }),
5424
+ isExpandedPill && /* @__PURE__ */ jsxs(Fragment, { children: [
5425
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
5426
+ ActivePill2,
5427
+ {
5428
+ layoutId: activePillId,
5429
+ disableInitial: isModal,
5430
+ shape: activeShape
5431
+ }
5432
+ ) }),
5433
+ /* @__PURE__ */ jsx(HoverStateLayer2, { shape: activeShape }),
5434
+ /* @__PURE__ */ jsx(
5435
+ RippleLayer2,
5436
+ {
5437
+ ripples,
5438
+ onRippleDone: removeRipple,
5439
+ shape: activeShape
5440
+ }
5441
+ )
5442
+ ] }),
3080
5443
  /* @__PURE__ */ jsxs(
3081
5444
  m.div,
3082
5445
  {
3083
5446
  layout: enableLayout,
3084
5447
  className: cn(
3085
5448
  "relative flex items-center justify-center shrink-0 z-10",
3086
- isExpanded ? "size-6" : "h-8 w-14 mx-auto"
5449
+ isSquare ? "mx-auto" : isExpandedPill ? "size-6" : "h-8 w-14 mx-auto rounded-full"
3087
5450
  ),
3088
- style: { borderRadius: 9999 },
5451
+ style: isSquare ? { width: resolvedShapeSize, height: resolvedShapeSize } : void 0,
3089
5452
  children: [
3090
- !isExpanded && /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(ActivePill2, { layoutId: activePillId }) }),
3091
- !isExpanded && /* @__PURE__ */ jsx(HoverStateLayer2, {}),
3092
- !isExpanded && /* @__PURE__ */ jsx(RippleLayer2, { ripples, onRippleDone: removeRipple }),
5453
+ !isExpandedPill && /* @__PURE__ */ jsxs(Fragment, { children: [
5454
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: selected && /* @__PURE__ */ jsx(
5455
+ ActivePill2,
5456
+ {
5457
+ layoutId: activePillId,
5458
+ disableInitial: isModal,
5459
+ shape: activeShape,
5460
+ width: iconPillWidth,
5461
+ height: iconPillHeight
5462
+ }
5463
+ ) }),
5464
+ /* @__PURE__ */ jsx(
5465
+ HoverStateLayer2,
5466
+ {
5467
+ shape: activeShape,
5468
+ width: iconPillWidth,
5469
+ height: iconPillHeight
5470
+ }
5471
+ ),
5472
+ /* @__PURE__ */ jsx(
5473
+ RippleLayer2,
5474
+ {
5475
+ ripples,
5476
+ onRippleDone: removeRipple,
5477
+ shape: activeShape,
5478
+ width: iconPillWidth,
5479
+ height: iconPillHeight
5480
+ }
5481
+ )
5482
+ ] }),
3093
5483
  /* @__PURE__ */ jsx(
3094
5484
  m.div,
3095
5485
  {
@@ -3111,8 +5501,8 @@ var NavigationRailItemComponent = React36.forwardRef(
3111
5501
  transition: SPRING_TRANSITION,
3112
5502
  className: cn(
3113
5503
  "z-10 transition-colors duration-200 whitespace-nowrap",
3114
- selected ? "text-m3-on-surface" : "text-m3-on-surface-variant",
3115
- isExpanded ? "text-sm font-medium tracking-wide text-left" : "text-xs font-medium tracking-wide"
5504
+ selected ? isExpandedPill ? "text-m3-on-secondary-container font-medium" : "text-m3-on-surface font-medium" : "text-m3-on-surface-variant font-medium",
5505
+ isExpanded ? "text-sm tracking-wide text-left" : "text-xs tracking-wide"
3116
5506
  ),
3117
5507
  children: label
3118
5508
  },
@@ -3172,6 +5562,9 @@ var NavigationRailComponent = React36.forwardRef(
3172
5562
  ({
3173
5563
  variant = "collapsed",
3174
5564
  labelVisibility = "labeled",
5565
+ shape,
5566
+ shapeSize,
5567
+ activeIndicatorWidth = "hug",
3175
5568
  header,
3176
5569
  fab,
3177
5570
  fabPlacement = "contained",
@@ -3185,6 +5578,7 @@ var NavigationRailComponent = React36.forwardRef(
3185
5578
  style
3186
5579
  }, ref) => {
3187
5580
  const isModal = variant === "modal";
5581
+ const isExpanded = variant === "expanded" || variant === "modal";
3188
5582
  const isXr = variant === "xr";
3189
5583
  const isSpatial = isXr && fabPlacement === "spatialized";
3190
5584
  const applyAnimation = !isXr || !isSpatial;
@@ -3226,10 +5620,12 @@ var NavigationRailComponent = React36.forwardRef(
3226
5620
  transition: isModal ? MD3_MODAL_TRANSITION : SPRING_TRANSITION,
3227
5621
  children: [
3228
5622
  (header || fab && !isSpatial) && /* @__PURE__ */ jsxs(
3229
- "div",
5623
+ m.div,
3230
5624
  {
5625
+ layout: true,
3231
5626
  className: cn(
3232
- "flex w-full flex-col items-center justify-start shrink-0 empty:hidden",
5627
+ "flex w-full flex-col justify-start shrink-0 empty:hidden",
5628
+ isExpanded ? "items-start px-3" : "items-center",
3233
5629
  navHeaderSpacing
3234
5630
  ),
3235
5631
  children: [
@@ -3295,6 +5691,9 @@ var NavigationRailComponent = React36.forwardRef(
3295
5691
  const contextValue = {
3296
5692
  variant,
3297
5693
  labelVisibility,
5694
+ shape,
5695
+ shapeSize,
5696
+ activeIndicatorWidth,
3298
5697
  activeIndicatorTransition
3299
5698
  };
3300
5699
  if (isModal) {
@@ -6194,6 +8593,12 @@ var BottomDockedToolbar = React36.forwardRef(
6194
8593
  BottomDockedToolbar.displayName = "BottomDockedToolbar";
6195
8594
 
6196
8595
  // src/ui/toolbar/toolbar-tokens.ts
8596
+ var TOOLBAR_SPRING_TRANSITION = {
8597
+ type: "spring",
8598
+ stiffness: 300,
8599
+ damping: 30,
8600
+ mass: 0.8
8601
+ };
6197
8602
  var FloatingToolbarTokens = {
6198
8603
  ContainerBetweenSpace: 4,
6199
8604
  ContainerHeight: 64};
@@ -6223,6 +8628,10 @@ var ToolbarToggleButtonTokens = {
6223
8628
  PaddingX: 16,
6224
8629
  Gap: 8
6225
8630
  };
8631
+ var ToolbarToggleButtonRadiusTokens = {
8632
+ pillRadius: 24,
8633
+ pressedRadius: 12
8634
+ };
6226
8635
  var ALIGNMENT_CLASS = {
6227
8636
  start: "justify-start",
6228
8637
  center: "justify-center",
@@ -6625,13 +9034,17 @@ var ToolbarIconButton = React36.forwardRef(
6625
9034
  toolbarSize = "default",
6626
9035
  selected,
6627
9036
  asChild,
6628
- className
9037
+ className,
9038
+ transition,
9039
+ whileTap
6629
9040
  } = _b, props = __objRest(_b, [
6630
9041
  "emphasis",
6631
9042
  "toolbarSize",
6632
9043
  "selected",
6633
9044
  "asChild",
6634
- "className"
9045
+ "className",
9046
+ "transition",
9047
+ "whileTap"
6635
9048
  ]);
6636
9049
  const context = useToolbarContext();
6637
9050
  const widthClass = TOOLBAR_ICON_BUTTON_WIDTH[toolbarSize];
@@ -6642,16 +9055,20 @@ var ToolbarIconButton = React36.forwardRef(
6642
9055
  } : {
6643
9056
  variant: "default"
6644
9057
  };
9058
+ const motionProps = asChild ? __spreadValues(__spreadValues({}, transition !== void 0 && { transition }), whileTap !== void 0 && { whileTap }) : {
9059
+ transition: transition != null ? transition : TOOLBAR_SPRING_TRANSITION,
9060
+ whileTap: whileTap != null ? whileTap : { scale: 0.95 }
9061
+ };
6645
9062
  return /* @__PURE__ */ jsx(
6646
9063
  IconButton,
6647
- __spreadValues(__spreadProps(__spreadValues({
9064
+ __spreadValues(__spreadProps(__spreadValues(__spreadValues({
6648
9065
  ref,
6649
9066
  asChild,
6650
9067
  colorStyle,
6651
9068
  size: "md",
6652
9069
  shape: "round",
6653
9070
  iconSize: ToolbarIconButtonTokens.IconSize
6654
- }, iconButtonProps), {
9071
+ }, motionProps), iconButtonProps), {
6655
9072
  className: cn(
6656
9073
  "h-[48px]",
6657
9074
  widthClass,
@@ -6731,6 +9148,34 @@ function useFloatingToolbarScrollBehavior(options = {}) {
6731
9148
  exitDirection
6732
9149
  };
6733
9150
  }
9151
+ var BUTTON_RADIUS_SPRING = FAST_EFFECTS_SPRING;
9152
+ ({
9153
+ xs: {
9154
+ // 1dp
9155
+ squareShapeRadius: cornerRadius.medium,
9156
+ // 12dp
9157
+ pressedShapeRadius: cornerRadius.small},
9158
+ sm: {
9159
+ // 1dp
9160
+ squareShapeRadius: cornerRadius.medium,
9161
+ // 12dp
9162
+ pressedShapeRadius: cornerRadius.small},
9163
+ md: {
9164
+ // 1dp
9165
+ squareShapeRadius: cornerRadius.large,
9166
+ // 16dp
9167
+ pressedShapeRadius: cornerRadius.medium},
9168
+ lg: {
9169
+ // 2dp
9170
+ squareShapeRadius: cornerRadius.extraLarge,
9171
+ // 28dp
9172
+ pressedShapeRadius: cornerRadius.large},
9173
+ xl: {
9174
+ // 3dp
9175
+ squareShapeRadius: cornerRadius.extraLarge,
9176
+ // 28dp
9177
+ pressedShapeRadius: cornerRadius.large}
9178
+ });
6734
9179
  var MOTION_PROP_KEYS = [
6735
9180
  "animate",
6736
9181
  "exit",
@@ -6761,29 +9206,34 @@ var ToolbarToggleButton = React36.forwardRef(
6761
9206
  selected = false,
6762
9207
  icon,
6763
9208
  children,
6764
- pressScale = 0.95,
6765
- pressBounceOffset = 6,
9209
+ pressExpand = true,
9210
+ pressExpandRatio = 0.06,
6766
9211
  ripple = true,
6767
9212
  asChild = false,
6768
9213
  className,
6769
9214
  type = "button",
6770
9215
  disabled,
6771
- onPointerDown: onPointerDownProp
9216
+ onPointerDown: onPointerDownProp,
9217
+ onPointerUp: onPointerUpProp,
9218
+ onPointerLeave: onPointerLeaveProp
6772
9219
  } = _b, props = __objRest(_b, [
6773
9220
  "emphasis",
6774
9221
  "selected",
6775
9222
  "icon",
6776
9223
  "children",
6777
- "pressScale",
6778
- "pressBounceOffset",
9224
+ "pressExpand",
9225
+ "pressExpandRatio",
6779
9226
  "ripple",
6780
9227
  "asChild",
6781
9228
  "className",
6782
9229
  "type",
6783
9230
  "disabled",
6784
- "onPointerDown"
9231
+ "onPointerDown",
9232
+ "onPointerUp",
9233
+ "onPointerLeave"
6785
9234
  ]);
6786
9235
  const context = useToolbarContext();
9236
+ const [isPressed, setIsPressed] = React36.useState(false);
6787
9237
  const {
6788
9238
  ripples,
6789
9239
  onPointerDown: handleRipplePointerDown,
@@ -6793,6 +9243,7 @@ var ToolbarToggleButton = React36.forwardRef(
6793
9243
  });
6794
9244
  const handlePointerDown = React36.useCallback(
6795
9245
  (e) => {
9246
+ setIsPressed(true);
6796
9247
  if (!disabled && ripple) {
6797
9248
  handleRipplePointerDown(e);
6798
9249
  }
@@ -6800,7 +9251,21 @@ var ToolbarToggleButton = React36.forwardRef(
6800
9251
  },
6801
9252
  [disabled, ripple, handleRipplePointerDown, onPointerDownProp]
6802
9253
  );
6803
- const baseClasses = "relative overflow-hidden inline-flex items-center justify-center min-w-[95px] h-[48px] px-4 rounded-full text-sm font-medium transition-colors select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/40 disabled:pointer-events-none disabled:opacity-38";
9254
+ const handlePointerUp = React36.useCallback(
9255
+ (e) => {
9256
+ setIsPressed(false);
9257
+ onPointerUpProp == null ? void 0 : onPointerUpProp(e);
9258
+ },
9259
+ [onPointerUpProp]
9260
+ );
9261
+ const handlePointerLeave = React36.useCallback(
9262
+ (e) => {
9263
+ setIsPressed(false);
9264
+ onPointerLeaveProp == null ? void 0 : onPointerLeaveProp(e);
9265
+ },
9266
+ [onPointerLeaveProp]
9267
+ );
9268
+ const baseClasses = "relative overflow-hidden inline-flex items-center justify-center min-w-[95px] h-[48px] px-4 text-sm font-medium select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/40 disabled:pointer-events-none disabled:opacity-38";
6804
9269
  const variantClasses = {
6805
9270
  standard: selected ? "bg-current/16 text-current hover:bg-current/20 active:bg-current/24" : "bg-transparent text-current hover:bg-current/8 active:bg-current/12",
6806
9271
  tonal: selected ? "bg-m3-secondary-container text-m3-on-secondary-container hover:shadow-sm" : "bg-m3-surface-container-high text-m3-on-surface hover:bg-m3-surface-container-highest",
@@ -6812,27 +9277,17 @@ var ToolbarToggleButton = React36.forwardRef(
6812
9277
  context == null ? void 0 : context.itemClassName,
6813
9278
  className
6814
9279
  );
6815
- const whileTapConfig = React36.useMemo(
9280
+ const animateConfig = React36.useMemo(
6816
9281
  () => ({
6817
- scale: pressScale,
6818
- x: pressBounceOffset ? [
6819
- 0,
6820
- -pressBounceOffset,
6821
- pressBounceOffset,
6822
- -pressBounceOffset / 2,
6823
- pressBounceOffset / 2,
6824
- 0
6825
- ] : 0
9282
+ scaleX: pressExpand && isPressed ? 1 + pressExpandRatio : 1,
9283
+ borderRadius: isPressed ? ToolbarToggleButtonRadiusTokens.pressedRadius : ToolbarToggleButtonRadiusTokens.pillRadius
6826
9284
  }),
6827
- [pressScale, pressBounceOffset]
9285
+ [pressExpand, pressExpandRatio, isPressed]
6828
9286
  );
6829
9287
  const transitionConfig = React36.useMemo(
6830
9288
  () => ({
6831
- scale: FAST_SPATIAL_SPRING,
6832
- x: {
6833
- duration: 0.35,
6834
- ease: "easeInOut"
6835
- }
9289
+ scaleX: FAST_SPATIAL_SPRING,
9290
+ borderRadius: BUTTON_RADIUS_SPRING
6836
9291
  }),
6837
9292
  []
6838
9293
  );
@@ -6886,7 +9341,9 @@ var ToolbarToggleButton = React36.forwardRef(
6886
9341
  ref,
6887
9342
  "aria-pressed": selected,
6888
9343
  className: combinedClassName,
6889
- onPointerDown: handlePointerDown
9344
+ onPointerDown: handlePointerDown,
9345
+ onPointerUp: handlePointerUp,
9346
+ onPointerLeave: handlePointerLeave
6890
9347
  }, strippedProps), {
6891
9348
  children: React36.cloneElement(child, { children: innerChildContent })
6892
9349
  })
@@ -6899,9 +9356,13 @@ var ToolbarToggleButton = React36.forwardRef(
6899
9356
  type,
6900
9357
  "aria-pressed": selected,
6901
9358
  disabled,
6902
- whileTap: whileTapConfig,
9359
+ animate: animateConfig,
6903
9360
  transition: transitionConfig,
9361
+ initial: false,
9362
+ style: { transformOrigin: "center" },
6904
9363
  onPointerDown: handlePointerDown,
9364
+ onPointerUp: handlePointerUp,
9365
+ onPointerLeave: handlePointerLeave,
6905
9366
  className: combinedClassName
6906
9367
  }, props), {
6907
9368
  children: [
@@ -6921,6 +9382,6 @@ var ToolbarToggleButton = React36.forwardRef(
6921
9382
  );
6922
9383
  ToolbarToggleButton.displayName = "ToolbarToggleButton";
6923
9384
 
6924
- export { APP_BAR_BOTTOM_SPRING, APP_BAR_COLORS, APP_BAR_COLOR_TRANSITION, APP_BAR_ENTER_ALWAYS_SPRING, APP_BAR_TITLE_FADE, AppBarColumn, AppBarOverflowIndicator, AppBarRow, AppBarTokens, BottomAppBar, BottomDockedToolbar, CHECK_ICON_VARIANTS, ContextMenu, ContextMenuContent, ContextMenuTrigger, DIVIDER_COLOR, DIVIDER_PADDING, DockedToolbar, FAST_EFFECTS_TRANSITION, FAST_SPATIAL_SPRING, GROUP_SHAPES, HorizontalFloatingToolbar, HorizontalFloatingToolbarWithFab, ITEM_SHAPE_CLASSES, LargeFlexibleAppBar, MENU_CHECK_ICON_SIZE, MENU_CONTAINER_VARIANTS, MENU_GROUP_GAP, MENU_ICON_SIZE, MENU_ITEM_MIN_HEIGHT, MENU_MAX_WIDTH, MENU_MIN_WIDTH, MediumFlexibleAppBar, Menu, MenuContent, MenuDivider, MenuGroup, MenuItem, MenuProvider, MenuTrigger, NavigationBar, NavigationBarComponent, NavigationBarItem, NavigationRail, NavigationRailItem, SEARCH_BAR_EXIT_SPRING, SEARCH_BAR_EXPAND_SPRING, SEARCH_COLORS, SEARCH_DOCKED_REVEAL_SPRING, SEARCH_FULLSCREEN_SPRING, SEARCH_TYPOGRAPHY, SEARCH_VIEW_SPRING, STANDARD_COLORS, SUBMENU_CONTAINER_VARIANTS, Search, SearchAppBar, SearchBar, SearchTokens, SearchView, SearchViewContainer, SearchViewDocked, SearchViewFullScreen, SmallAppBar, SubMenu, Tab, Tabs, TabsColors, TabsContent, TabsList, TabsTokens, ToolbarDivider, ToolbarDividerTokens, ToolbarIconButton, ToolbarIconButtonTokens, ToolbarToggleButton, ToolbarToggleButtonTokens, VIBRANT_COLORS, VerticalFloatingToolbar, VerticalFloatingToolbarWithFab, VerticalMenu, VerticalMenuContent, VerticalMenuDivider, VerticalMenuGroup, appBarTypography, getToolbarColors, standardFloatingToolbarColors, surfaceContainerHighFloatingToolbarColors, surfaceContainerHighestFloatingToolbarColors, tertiaryContainerFloatingToolbarColors, useAppBarScroll, useFloatingToolbarScrollBehavior, useMenuContext, useSearch, useSearchKeyboard, vibrantFloatingToolbarColors, xrFloatingToolbarColors };
9385
+ export { APP_BAR_BOTTOM_SPRING, APP_BAR_COLORS, APP_BAR_COLOR_TRANSITION, APP_BAR_ENTER_ALWAYS_SPRING, APP_BAR_TITLE_FADE, AppBarColumn, AppBarOverflowIndicator, AppBarRow, AppBarTokens, BottomAppBar, BottomDockedToolbar, CHECK_ICON_VARIANTS, ContextMenu, ContextMenuContent, ContextMenuTrigger, DIVIDER_COLOR, DIVIDER_PADDING, DockedToolbar, FAST_EFFECTS_TRANSITION, FAST_SPATIAL_SPRING, GROUP_SHAPES, HorizontalFloatingToolbar, HorizontalFloatingToolbarWithFab, ITEM_SHAPE_CLASSES, LargeFlexibleAppBar, MENU_CHECK_ICON_SIZE, MENU_CONTAINER_VARIANTS, MENU_GROUP_GAP, MENU_ICON_SIZE, MENU_ITEM_MIN_HEIGHT, MENU_MAX_WIDTH, MENU_MIN_WIDTH, MediumFlexibleAppBar, Menu, MenuContent, MenuDivider, MenuGroup, MenuItem, MenuProvider, MenuTrigger, NavigationBar, NavigationBarComponent, NavigationBarItem, NavigationRail, NavigationRailItem, SEARCH_BAR_EXIT_SPRING, SEARCH_BAR_EXPAND_SPRING, SEARCH_COLORS, SEARCH_DOCKED_REVEAL_SPRING, SEARCH_FULLSCREEN_SPRING, SEARCH_TYPOGRAPHY, SEARCH_VIEW_SPRING, STANDARD_COLORS, SUBMENU_CONTAINER_VARIANTS, Search, SearchAppBar, SearchBar, SearchTokens, SearchView, SearchViewContainer, SearchViewDocked, SearchViewFullScreen, SmallAppBar, SubMenu, Tab, Tabs, TabsColors, TabsContent, TabsList, TabsTokens, ToolbarDivider, ToolbarDividerTokens, ToolbarIconButton, ToolbarIconButtonTokens, ToolbarToggleButton, ToolbarToggleButtonTokens, VIBRANT_COLORS, VerticalFloatingToolbar, VerticalFloatingToolbarWithFab, VerticalMenu, VerticalMenuContent, VerticalMenuDivider, VerticalMenuGroup, appBarTypography, getNavigationShapeStyle, getToolbarColors, isSquareShape, standardFloatingToolbarColors, surfaceContainerHighFloatingToolbarColors, surfaceContainerHighestFloatingToolbarColors, tertiaryContainerFloatingToolbarColors, useAppBarScroll, useFloatingToolbarScrollBehavior, useMenuContext, useSearch, useSearchKeyboard, vibrantFloatingToolbarColors, xrFloatingToolbarColors };
6925
9386
  //# sourceMappingURL=navigation.mjs.map
6926
9387
  //# sourceMappingURL=navigation.mjs.map