@tetrax/squircle 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,6 +34,7 @@ function App() {
34
34
  | `rounded-squircle-{0-96}` | Corner radius in px |
35
35
  | `corner-smoothing-{0-100}` | Smoothing (default: 100 = full squircle, G1 only) |
36
36
  | `squircle-g2` | Enable G2 curvature-continuous mode (ignores manual smoothing percent) |
37
+ | `squircle-z` | Enable Z-Squircle (Zomato) style mode (ignores manual smoothing percent) |
37
38
  | `squircle-border` | Enable squircle border overlay (1px) |
38
39
  | `squircle-border-{n}` | Border width (e.g. `squircle-border-2`, `squircle-border-1.5`) |
39
40
  | `border-{color}` | Border color — standard Tailwind (e.g. `border-gray-200`) |
@@ -55,6 +56,16 @@ All other Tailwind classes (`bg-*`, `p-*`, `text-*`, etc.) pass through normally
55
56
  G2 Smooth
56
57
  </Squircle>
57
58
 
59
+ // Z-Squircle (Zomato/ZSquircleView) style squircle
60
+ <Squircle className="rounded-squircle-24 squircle-z bg-amber-500 p-4 text-white">
61
+ Zomato Style
62
+ </Squircle>
63
+
64
+ // Alternatively with prop:
65
+ <Squircle cornerRadius={24} zSquircle className="bg-amber-500 p-4 text-white">
66
+ Zomato Style
67
+ </Squircle>
68
+
58
69
  // With border (standard Tailwind)
59
70
  <Squircle className="rounded-squircle-24 squircle-border border-gray-200 bg-white p-6">
60
71
  Card with border
@@ -89,6 +100,7 @@ All other Tailwind classes (`bg-*`, `p-*`, `text-*`, etc.) pass through normally
89
100
  | `cornerRadius` | `number` | from `rounded-squircle-*` | Override corner radius |
90
101
  | `cornerSmoothing` | `number` | `1` | Override smoothing (0–1, Standard G1 only) |
91
102
  | `g2Continuous` | `boolean` | `false` | Enable pure G2 curvature continuity |
103
+ | `zSquircle` | `boolean` | `false` | Enable Z-Squircle (Zomato) style mode |
92
104
  | `preserveSmoothing` | `boolean` | `false` | Preserve smoothing at large radii |
93
105
  | `as` | `ComponentType \| string` | `"div"` | HTML tag or component to render |
94
106
 
@@ -128,11 +140,11 @@ This works **directly on void elements** (like `<input>`, `<img>`, etc.) where a
128
140
  Hello from standard div!
129
141
  </div>
130
142
 
131
- <!-- Squirckled input tag (void element) — border renders perfectly! -->
143
+ <!-- Squirckled input tag with squircle-z (void element) — border renders perfectly! -->
132
144
  <input
133
145
  type="password"
134
146
  placeholder="Thick border: yellow-400/20"
135
- class="rounded-squircle-9 squircle-border-2 border-yellow-400/20 bg-[#1B1B1B] text-white px-4 py-3 outline-none"
147
+ class="rounded-squircle-9 squircle-border-2 squircle-z border-yellow-400/20 bg-[#1B1B1B] text-white px-4 py-3 outline-none"
136
148
  />
137
149
  ```
138
150
 
@@ -167,6 +179,7 @@ function Card() {
167
179
  | `borderColor` | `string` | `"transparent"` | Border color |
168
180
  | `borderWidth` | `number` | `1` | Border width in dp |
169
181
  | `backgroundColor` | `string` | — | Background fill |
182
+ | `zSquircle` | `boolean` | `false` | Enable Z-Squircle (Zomato) style mode |
170
183
  | `style` | `ViewStyle` | — | Additional styles |
171
184
 
172
185
  > React Native requires `react-native-svg` as a peer dependency.
@@ -216,6 +229,9 @@ drawSquircleRect(ctx, 10, 150, 200, 100, {
216
229
  tl: 8, tr: 32, br: 8, bl: 32
217
230
  });
218
231
 
232
+ // Z-Squircle (Zomato) style on Canvas (radius, smoothing, zSquircle)
233
+ drawSquircleRect(ctx, 10, 290, 200, 100, 24, 1, true);
234
+
219
235
  ctx.fillStyle = "#3b82f6";
220
236
  ctx.fill();
221
237
  ```
@@ -234,6 +250,7 @@ ctx.fill();
234
250
  | `cornerSmoothing` | `number` | `1` | 0 = rounded rect, 1 = full squircle |
235
251
  | `preserveSmoothing` | `boolean` | `false` | Preserve smoothing at large radii |
236
252
  | `g2Continuous` | `boolean` | `false` | Enable G2 curvature-continuous mode |
253
+ | `zSquircle` | `boolean` | `false` | Enable Z-Squircle (Zomato) style mode |
237
254
 
238
255
  ## How It Works
239
256
 
package/dist/core.d.mts CHANGED
@@ -1,68 +1,67 @@
1
- interface SquirclePathParams {
2
- width: number;
3
- height: number;
4
- cornerRadius?: number;
5
- topLeftCornerRadius?: number;
6
- topRightCornerRadius?: number;
7
- bottomRightCornerRadius?: number;
8
- bottomLeftCornerRadius?: number;
9
- cornerSmoothing?: number;
10
- preserveSmoothing?: boolean;
11
- g2Continuous?: boolean;
12
- }
13
- /**
14
- * Generate an SVG path string for a squircle rectangle.
15
- * Direct port of figma-squircle's getSvgPath(), with optional pure G2 Bézier mode.
16
- */
17
- declare function getSvgPath({ cornerRadius, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, cornerSmoothing, width, height, preserveSmoothing, g2Continuous, }: SquirclePathParams): string;
18
- /**
19
- * Compute an SVG path string from width/height/radius/smoothing.
20
- * Convenience wrapper around getSvgPath().
21
- */
22
- declare function computeSquirclePath(width: number, height: number, cornerRadius: number, cornerSmoothing?: number, preserveSmoothing?: boolean, g2Continuous?: boolean): string;
23
- /**
24
- * Render a squircle rectangle directly onto a Canvas 2D context using
25
- * G2 curvature-continuous Bézier curves (Pavel Klavík's optimal coefficients).
26
- *
27
- * FIX #5: Rewrote to use the same *relative delta* G2 coefficients as the
28
- * SVG path drawer, so Canvas and SVG paths are numerically identical.
29
- * Previous version used accumulated offsets (0.804, 0.912, 0.961) which
30
- * did not match the SVG path coefficients (0.185, 0.293, 0.342).
31
- *
32
- * @example
33
- * const ctx = canvas.getContext('2d');
34
- * ctx.beginPath();
35
- * drawSquircleRect(ctx, 0, 0, 200, 100, 24);
36
- * ctx.fillStyle = '#3b82f6';
37
- * ctx.fill();
38
- */
39
- declare function drawSquircleRect(ctx: CanvasRenderingContext2D | any, x: number, y: number, width: number, height: number, cornerRadius: number | {
40
- tl?: number;
41
- tr?: number;
42
- br?: number;
43
- bl?: number;
44
- }, smoothing?: number): void;
45
-
46
- interface SquircleClassConfig {
47
- cornerRadius: number | null;
48
- cornerSmoothing: number;
49
- squircleBorder: boolean;
50
- borderColor: string | null;
51
- borderWidth: number;
52
- g2Continuous: boolean;
53
- restClasses: string;
54
- }
55
- /**
56
- * Parse Tailwind-style class names and extract squircle config.
57
- *
58
- * When `squircle-border` is present, standard Tailwind `border-{color}` and
59
- * `border-{width}` classes are intercepted for the squircle border overlay.
60
- * Opacity modifiers like `border-gray-600/50` are fully supported.
61
- *
62
- * @example
63
- * parseSquircleClasses("rounded-squircle-24 squircle-border border-gray-600/50")
64
- * // → { cornerRadius: 24, squircleBorder: true, borderColor: "rgba(75, 85, 99, 0.5)", ... }
65
- */
66
- declare function parseSquircleClasses(className?: string): SquircleClassConfig;
67
-
68
- export { type SquircleClassConfig, computeSquirclePath, drawSquircleRect, getSvgPath, parseSquircleClasses };
1
+ interface SquirclePathParams {
2
+ width: number;
3
+ height: number;
4
+ cornerRadius?: number;
5
+ topLeftCornerRadius?: number;
6
+ topRightCornerRadius?: number;
7
+ bottomRightCornerRadius?: number;
8
+ bottomLeftCornerRadius?: number;
9
+ cornerSmoothing?: number;
10
+ preserveSmoothing?: boolean;
11
+ g2Continuous?: boolean;
12
+ zSquircle?: boolean;
13
+ }
14
+ /**
15
+ * Generate an SVG path string for a squircle rectangle.
16
+ * Direct port of figma-squircle's getSvgPath(), with optional pure G2 Bézier mode
17
+ * or ZSquircleView style single-Bézier mode.
18
+ */
19
+ declare function getSvgPath({ cornerRadius, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, cornerSmoothing, width, height, preserveSmoothing, g2Continuous, zSquircle, }: SquirclePathParams): string;
20
+ /**
21
+ * Compute an SVG path string from width/height/radius/smoothing.
22
+ * Convenience wrapper around getSvgPath().
23
+ */
24
+ declare function computeSquirclePath(width: number, height: number, cornerRadius: number, cornerSmoothing?: number, preserveSmoothing?: boolean, g2Continuous?: boolean, zSquircle?: boolean): string;
25
+ /**
26
+ * Render a squircle rectangle directly onto a Canvas 2D context using
27
+ * G2 curvature-continuous Bézier curves (Pavel Klavík's optimal coefficients)
28
+ * or ZSquircleView style single-Bézier curves.
29
+ *
30
+ * @example
31
+ * const ctx = canvas.getContext('2d');
32
+ * ctx.beginPath();
33
+ * drawSquircleRect(ctx, 0, 0, 200, 100, 24);
34
+ * ctx.fillStyle = '#3b82f6';
35
+ * ctx.fill();
36
+ */
37
+ declare function drawSquircleRect(ctx: CanvasRenderingContext2D | any, x: number, y: number, width: number, height: number, cornerRadius: number | {
38
+ tl?: number;
39
+ tr?: number;
40
+ br?: number;
41
+ bl?: number;
42
+ }, smoothing?: number, zSquircle?: boolean): void;
43
+
44
+ interface SquircleClassConfig {
45
+ cornerRadius: number | null;
46
+ cornerSmoothing: number;
47
+ squircleBorder: boolean;
48
+ borderColor: string | null;
49
+ borderWidth: number;
50
+ g2Continuous: boolean;
51
+ zSquircle: boolean;
52
+ restClasses: string;
53
+ }
54
+ /**
55
+ * Parse Tailwind-style class names and extract squircle config.
56
+ *
57
+ * When `squircle-border` is present, standard Tailwind `border-{color}` and
58
+ * `border-{width}` classes are intercepted for the squircle border overlay.
59
+ * Opacity modifiers like `border-gray-600/50` are fully supported.
60
+ *
61
+ * @example
62
+ * parseSquircleClasses("rounded-squircle-24 squircle-border border-gray-600/50")
63
+ * // → { cornerRadius: 24, squircleBorder: true, borderColor: "rgba(75, 85, 99, 0.5)", ... }
64
+ */
65
+ declare function parseSquircleClasses(className?: string): SquircleClassConfig;
66
+
67
+ export { type SquircleClassConfig, computeSquirclePath, drawSquircleRect, getSvgPath, parseSquircleClasses };
package/dist/core.d.ts CHANGED
@@ -1,68 +1,67 @@
1
- interface SquirclePathParams {
2
- width: number;
3
- height: number;
4
- cornerRadius?: number;
5
- topLeftCornerRadius?: number;
6
- topRightCornerRadius?: number;
7
- bottomRightCornerRadius?: number;
8
- bottomLeftCornerRadius?: number;
9
- cornerSmoothing?: number;
10
- preserveSmoothing?: boolean;
11
- g2Continuous?: boolean;
12
- }
13
- /**
14
- * Generate an SVG path string for a squircle rectangle.
15
- * Direct port of figma-squircle's getSvgPath(), with optional pure G2 Bézier mode.
16
- */
17
- declare function getSvgPath({ cornerRadius, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, cornerSmoothing, width, height, preserveSmoothing, g2Continuous, }: SquirclePathParams): string;
18
- /**
19
- * Compute an SVG path string from width/height/radius/smoothing.
20
- * Convenience wrapper around getSvgPath().
21
- */
22
- declare function computeSquirclePath(width: number, height: number, cornerRadius: number, cornerSmoothing?: number, preserveSmoothing?: boolean, g2Continuous?: boolean): string;
23
- /**
24
- * Render a squircle rectangle directly onto a Canvas 2D context using
25
- * G2 curvature-continuous Bézier curves (Pavel Klavík's optimal coefficients).
26
- *
27
- * FIX #5: Rewrote to use the same *relative delta* G2 coefficients as the
28
- * SVG path drawer, so Canvas and SVG paths are numerically identical.
29
- * Previous version used accumulated offsets (0.804, 0.912, 0.961) which
30
- * did not match the SVG path coefficients (0.185, 0.293, 0.342).
31
- *
32
- * @example
33
- * const ctx = canvas.getContext('2d');
34
- * ctx.beginPath();
35
- * drawSquircleRect(ctx, 0, 0, 200, 100, 24);
36
- * ctx.fillStyle = '#3b82f6';
37
- * ctx.fill();
38
- */
39
- declare function drawSquircleRect(ctx: CanvasRenderingContext2D | any, x: number, y: number, width: number, height: number, cornerRadius: number | {
40
- tl?: number;
41
- tr?: number;
42
- br?: number;
43
- bl?: number;
44
- }, smoothing?: number): void;
45
-
46
- interface SquircleClassConfig {
47
- cornerRadius: number | null;
48
- cornerSmoothing: number;
49
- squircleBorder: boolean;
50
- borderColor: string | null;
51
- borderWidth: number;
52
- g2Continuous: boolean;
53
- restClasses: string;
54
- }
55
- /**
56
- * Parse Tailwind-style class names and extract squircle config.
57
- *
58
- * When `squircle-border` is present, standard Tailwind `border-{color}` and
59
- * `border-{width}` classes are intercepted for the squircle border overlay.
60
- * Opacity modifiers like `border-gray-600/50` are fully supported.
61
- *
62
- * @example
63
- * parseSquircleClasses("rounded-squircle-24 squircle-border border-gray-600/50")
64
- * // → { cornerRadius: 24, squircleBorder: true, borderColor: "rgba(75, 85, 99, 0.5)", ... }
65
- */
66
- declare function parseSquircleClasses(className?: string): SquircleClassConfig;
67
-
68
- export { type SquircleClassConfig, computeSquirclePath, drawSquircleRect, getSvgPath, parseSquircleClasses };
1
+ interface SquirclePathParams {
2
+ width: number;
3
+ height: number;
4
+ cornerRadius?: number;
5
+ topLeftCornerRadius?: number;
6
+ topRightCornerRadius?: number;
7
+ bottomRightCornerRadius?: number;
8
+ bottomLeftCornerRadius?: number;
9
+ cornerSmoothing?: number;
10
+ preserveSmoothing?: boolean;
11
+ g2Continuous?: boolean;
12
+ zSquircle?: boolean;
13
+ }
14
+ /**
15
+ * Generate an SVG path string for a squircle rectangle.
16
+ * Direct port of figma-squircle's getSvgPath(), with optional pure G2 Bézier mode
17
+ * or ZSquircleView style single-Bézier mode.
18
+ */
19
+ declare function getSvgPath({ cornerRadius, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, cornerSmoothing, width, height, preserveSmoothing, g2Continuous, zSquircle, }: SquirclePathParams): string;
20
+ /**
21
+ * Compute an SVG path string from width/height/radius/smoothing.
22
+ * Convenience wrapper around getSvgPath().
23
+ */
24
+ declare function computeSquirclePath(width: number, height: number, cornerRadius: number, cornerSmoothing?: number, preserveSmoothing?: boolean, g2Continuous?: boolean, zSquircle?: boolean): string;
25
+ /**
26
+ * Render a squircle rectangle directly onto a Canvas 2D context using
27
+ * G2 curvature-continuous Bézier curves (Pavel Klavík's optimal coefficients)
28
+ * or ZSquircleView style single-Bézier curves.
29
+ *
30
+ * @example
31
+ * const ctx = canvas.getContext('2d');
32
+ * ctx.beginPath();
33
+ * drawSquircleRect(ctx, 0, 0, 200, 100, 24);
34
+ * ctx.fillStyle = '#3b82f6';
35
+ * ctx.fill();
36
+ */
37
+ declare function drawSquircleRect(ctx: CanvasRenderingContext2D | any, x: number, y: number, width: number, height: number, cornerRadius: number | {
38
+ tl?: number;
39
+ tr?: number;
40
+ br?: number;
41
+ bl?: number;
42
+ }, smoothing?: number, zSquircle?: boolean): void;
43
+
44
+ interface SquircleClassConfig {
45
+ cornerRadius: number | null;
46
+ cornerSmoothing: number;
47
+ squircleBorder: boolean;
48
+ borderColor: string | null;
49
+ borderWidth: number;
50
+ g2Continuous: boolean;
51
+ zSquircle: boolean;
52
+ restClasses: string;
53
+ }
54
+ /**
55
+ * Parse Tailwind-style class names and extract squircle config.
56
+ *
57
+ * When `squircle-border` is present, standard Tailwind `border-{color}` and
58
+ * `border-{width}` classes are intercepted for the squircle border overlay.
59
+ * Opacity modifiers like `border-gray-600/50` are fully supported.
60
+ *
61
+ * @example
62
+ * parseSquircleClasses("rounded-squircle-24 squircle-border border-gray-600/50")
63
+ * // → { cornerRadius: 24, squircleBorder: true, borderColor: "rgba(75, 85, 99, 0.5)", ... }
64
+ */
65
+ declare function parseSquircleClasses(className?: string): SquircleClassConfig;
66
+
67
+ export { type SquircleClassConfig, computeSquirclePath, drawSquircleRect, getSvgPath, parseSquircleClasses };