@ariaui/radius 0.1.2 → 0.1.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.
@@ -0,0 +1,341 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/parse.ts
22
+ function parseRadius(input) {
23
+ if (typeof input === "number") {
24
+ return { value: input, unit: "px", original: `${input}px` };
25
+ }
26
+ const trimmed = input.trim();
27
+ if (trimmed.endsWith("rem")) {
28
+ const value2 = parseFloat(trimmed);
29
+ if (Number.isNaN(value2)) throw new Error(`Invalid radius value: "${input}"`);
30
+ return { value: value2, unit: "rem", original: trimmed };
31
+ }
32
+ if (trimmed.endsWith("%")) {
33
+ const value2 = parseFloat(trimmed);
34
+ if (Number.isNaN(value2)) throw new Error(`Invalid radius value: "${input}"`);
35
+ return { value: value2, unit: "%", original: trimmed };
36
+ }
37
+ const value = parseFloat(trimmed);
38
+ if (Number.isNaN(value)) throw new Error(`Invalid radius value: "${input}"`);
39
+ return { value, unit: "px", original: trimmed.endsWith("px") ? trimmed : `${value}px` };
40
+ }
41
+ function parseCorners(input) {
42
+ const parts = input.trim().split(/\s+/);
43
+ if (parts.length === 1) {
44
+ const v = parseRadius(parts[0]);
45
+ return { topLeft: v, topRight: v, bottomRight: v, bottomLeft: v };
46
+ }
47
+ if (parts.length === 2) {
48
+ const tlbr = parseRadius(parts[0]);
49
+ const trbl = parseRadius(parts[1]);
50
+ return { topLeft: tlbr, topRight: trbl, bottomRight: tlbr, bottomLeft: trbl };
51
+ }
52
+ if (parts.length === 3) {
53
+ const tl = parseRadius(parts[0]);
54
+ const trbl = parseRadius(parts[1]);
55
+ const br = parseRadius(parts[2]);
56
+ return { topLeft: tl, topRight: trbl, bottomRight: br, bottomLeft: trbl };
57
+ }
58
+ if (parts.length >= 4) {
59
+ return {
60
+ topLeft: parseRadius(parts[0]),
61
+ topRight: parseRadius(parts[1]),
62
+ bottomRight: parseRadius(parts[2]),
63
+ bottomLeft: parseRadius(parts[3])
64
+ };
65
+ }
66
+ throw new Error(`Invalid border-radius shorthand: "${input}"`);
67
+ }
68
+
69
+ // src/scale.ts
70
+ function createLinearScale(base = 0, step = 4, count = 6) {
71
+ const result = {};
72
+ for (let i = 0; i < count; i++) {
73
+ const value = base + step * i;
74
+ result[String(i)] = parseRadius(value);
75
+ }
76
+ return result;
77
+ }
78
+ function createScale(values) {
79
+ const result = {};
80
+ for (const [name, value] of Object.entries(values)) {
81
+ result[name] = parseRadius(value);
82
+ }
83
+ return result;
84
+ }
85
+ function scaleBy(scale, factor) {
86
+ const result = {};
87
+ for (const [name, rv] of Object.entries(scale)) {
88
+ const newValue = round(rv.value * factor);
89
+ result[name] = {
90
+ value: newValue,
91
+ unit: rv.unit,
92
+ original: `${newValue}${rv.unit}`
93
+ };
94
+ }
95
+ return result;
96
+ }
97
+ function clampScale(scale, min, max) {
98
+ const result = {};
99
+ for (const [name, rv] of Object.entries(scale)) {
100
+ const clamped = Math.max(min, Math.min(max, rv.value));
101
+ result[name] = {
102
+ value: clamped,
103
+ unit: rv.unit,
104
+ original: `${clamped}${rv.unit}`
105
+ };
106
+ }
107
+ return result;
108
+ }
109
+ function sortedLevels(scale) {
110
+ return Object.keys(scale).sort((a, b) => {
111
+ return toPx(scale[a]) - toPx(scale[b]);
112
+ });
113
+ }
114
+ function stepRadius(scale, current, direction) {
115
+ const ordered = sortedLevels(scale);
116
+ const idx = ordered.indexOf(current);
117
+ if (idx === -1) return current;
118
+ const next = direction === "up" ? idx + 1 : idx - 1;
119
+ const clamped = Math.max(0, Math.min(ordered.length - 1, next));
120
+ return ordered[clamped];
121
+ }
122
+ function round(value) {
123
+ return Math.round(value * 1e3) / 1e3;
124
+ }
125
+ function toPx(rv) {
126
+ if (rv.unit === "rem") return rv.value * 16;
127
+ return rv.value;
128
+ }
129
+
130
+ // src/corners.ts
131
+ function toRadiusValue(input) {
132
+ if (typeof input === "object" && "value" in input) return input;
133
+ return parseRadius(input);
134
+ }
135
+ var ZERO = { value: 0, unit: "px", original: "0px" };
136
+ function uniformCorners(radius) {
137
+ const v = toRadiusValue(radius);
138
+ return { topLeft: v, topRight: v, bottomRight: v, bottomLeft: v };
139
+ }
140
+ function setCorner(corners, corner, value) {
141
+ return __spreadProps(__spreadValues({}, corners), { [corner]: toRadiusValue(value) });
142
+ }
143
+ function setTop(corners, value) {
144
+ const v = toRadiusValue(value);
145
+ return __spreadProps(__spreadValues({}, corners), { topLeft: v, topRight: v });
146
+ }
147
+ function setBottom(corners, value) {
148
+ const v = toRadiusValue(value);
149
+ return __spreadProps(__spreadValues({}, corners), { bottomLeft: v, bottomRight: v });
150
+ }
151
+ function setLeft(corners, value) {
152
+ const v = toRadiusValue(value);
153
+ return __spreadProps(__spreadValues({}, corners), { topLeft: v, bottomLeft: v });
154
+ }
155
+ function setRight(corners, value) {
156
+ const v = toRadiusValue(value);
157
+ return __spreadProps(__spreadValues({}, corners), { topRight: v, bottomRight: v });
158
+ }
159
+ function roundCorners(radius, ...corners) {
160
+ const v = toRadiusValue(radius);
161
+ return {
162
+ topLeft: corners.includes("topLeft") ? v : ZERO,
163
+ topRight: corners.includes("topRight") ? v : ZERO,
164
+ bottomRight: corners.includes("bottomRight") ? v : ZERO,
165
+ bottomLeft: corners.includes("bottomLeft") ? v : ZERO
166
+ };
167
+ }
168
+
169
+ // src/nesting.ts
170
+ function toRadiusValue2(input) {
171
+ if (typeof input === "object" && "value" in input) return input;
172
+ return parseRadius(input);
173
+ }
174
+ function innerRadius(outer, gap) {
175
+ const o = toRadiusValue2(outer);
176
+ const inner = Math.max(0, o.value - gap);
177
+ return {
178
+ value: inner,
179
+ unit: o.unit,
180
+ original: `${inner}${o.unit}`
181
+ };
182
+ }
183
+ function innerCorners(outer, gap) {
184
+ return {
185
+ topLeft: innerRadius(outer.topLeft, gap),
186
+ topRight: innerRadius(outer.topRight, gap),
187
+ bottomRight: innerRadius(outer.bottomRight, gap),
188
+ bottomLeft: innerRadius(outer.bottomLeft, gap)
189
+ };
190
+ }
191
+ function requiredGap(outer, inner) {
192
+ const o = toRadiusValue2(outer);
193
+ const i = toRadiusValue2(inner);
194
+ return Math.max(0, o.value - i.value);
195
+ }
196
+ function nestingPair(outerRadius, gap) {
197
+ const outer = parseRadius(outerRadius);
198
+ const inner = innerRadius(outer, gap);
199
+ return { outer, inner };
200
+ }
201
+
202
+ // src/responsive.ts
203
+ var BREAKPOINTS = {
204
+ sm: 640,
205
+ md: 768,
206
+ lg: 1024,
207
+ xl: 1280,
208
+ "2xl": 1536
209
+ };
210
+ function responsiveRadius(config, breakpoints = BREAKPOINTS) {
211
+ const defaultEntry = config["default"];
212
+ if (defaultEntry === void 0) {
213
+ throw new Error('responsiveRadius: "default" entry is required');
214
+ }
215
+ const defaultValue = parseRadius(defaultEntry);
216
+ const bps = {};
217
+ for (const [key, value] of Object.entries(config)) {
218
+ if (key === "default") continue;
219
+ if (!(key in breakpoints)) {
220
+ throw new Error(
221
+ `responsiveRadius: unknown breakpoint "${key}". Available: ${Object.keys(breakpoints).join(", ")}`
222
+ );
223
+ }
224
+ bps[key] = parseRadius(value);
225
+ }
226
+ return { default: defaultValue, breakpoints: bps };
227
+ }
228
+ function mobileRadius(value, factor = 0.75) {
229
+ const scaled = Math.max(0, Math.round(value.value * factor));
230
+ return {
231
+ value: scaled,
232
+ unit: value.unit,
233
+ original: `${scaled}${value.unit}`
234
+ };
235
+ }
236
+ function sortedBreakpoints(responsive, breakpoints = BREAKPOINTS) {
237
+ return Object.entries(responsive.breakpoints).map(
238
+ ([name, value]) => {
239
+ var _a;
240
+ return [name, (_a = breakpoints[name]) != null ? _a : 0, value];
241
+ }
242
+ ).sort((a, b) => a[1] - b[1]);
243
+ }
244
+
245
+ // src/format.ts
246
+ function round2(value, decimals = 4) {
247
+ const f = Math.pow(10, decimals);
248
+ return Math.round(value * f) / f;
249
+ }
250
+ function toCSS(value) {
251
+ return `${value.value}${value.unit}`;
252
+ }
253
+ function toRem(value, base = 16) {
254
+ if (value.unit === "rem") return `${value.value}rem`;
255
+ if (value.unit === "%") return value.original;
256
+ const rem = round2(value.value / base);
257
+ return `${rem}rem`;
258
+ }
259
+ function toPx2(value, base = 16) {
260
+ if (value.unit === "px") return `${value.value}px`;
261
+ if (value.unit === "%") return value.original;
262
+ const px = round2(value.value * base);
263
+ return `${px}px`;
264
+ }
265
+ function toCSSShorthand(corners) {
266
+ const tl = toCSS(corners.topLeft);
267
+ const tr = toCSS(corners.topRight);
268
+ const br = toCSS(corners.bottomRight);
269
+ const bl = toCSS(corners.bottomLeft);
270
+ if (tl === tr && tr === br && br === bl) return tl;
271
+ if (tl === br && tr === bl) return `${tl} ${tr}`;
272
+ if (tr === bl) return `${tl} ${tr} ${br}`;
273
+ return `${tl} ${tr} ${br} ${bl}`;
274
+ }
275
+ function toCSSProperties(corners) {
276
+ return {
277
+ borderTopLeftRadius: toCSS(corners.topLeft),
278
+ borderTopRightRadius: toCSS(corners.topRight),
279
+ borderBottomRightRadius: toCSS(corners.bottomRight),
280
+ borderBottomLeftRadius: toCSS(corners.bottomLeft)
281
+ };
282
+ }
283
+ function toCSSDeclaration(corners) {
284
+ return `border-radius: ${toCSSShorthand(corners)};`;
285
+ }
286
+ function toTailwindClass(value) {
287
+ return `rounded-[${toCSS(value)}]`;
288
+ }
289
+ function toTailwindCorners(corners) {
290
+ const tl = toCSS(corners.topLeft);
291
+ const tr = toCSS(corners.topRight);
292
+ const br = toCSS(corners.bottomRight);
293
+ const bl = toCSS(corners.bottomLeft);
294
+ if (tl === tr && tr === br && br === bl) {
295
+ return `rounded-[${tl}]`;
296
+ }
297
+ return [
298
+ `rounded-tl-[${tl}]`,
299
+ `rounded-tr-[${tr}]`,
300
+ `rounded-br-[${br}]`,
301
+ `rounded-bl-[${bl}]`
302
+ ].join(" ");
303
+ }
304
+ function toCSSVar(level) {
305
+ return `var(--radius-${level})`;
306
+ }
307
+
308
+ export {
309
+ parseRadius,
310
+ parseCorners,
311
+ createLinearScale,
312
+ createScale,
313
+ scaleBy,
314
+ clampScale,
315
+ sortedLevels,
316
+ stepRadius,
317
+ uniformCorners,
318
+ setCorner,
319
+ setTop,
320
+ setBottom,
321
+ setLeft,
322
+ setRight,
323
+ roundCorners,
324
+ innerRadius,
325
+ innerCorners,
326
+ requiredGap,
327
+ nestingPair,
328
+ BREAKPOINTS,
329
+ responsiveRadius,
330
+ mobileRadius,
331
+ sortedBreakpoints,
332
+ toCSS,
333
+ toRem,
334
+ toPx2 as toPx,
335
+ toCSSShorthand,
336
+ toCSSProperties,
337
+ toCSSDeclaration,
338
+ toTailwindClass,
339
+ toTailwindCorners,
340
+ toCSSVar
341
+ };