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