@elvora/core 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/chunk-VFHCOPTO.js +127 -0
- package/dist/chunk-VFHCOPTO.js.map +1 -0
- package/dist/focusTrap-Bko1L5FG.d.cts +18 -0
- package/dist/focusTrap-Bko1L5FG.d.ts +18 -0
- package/dist/index.cjs +749 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +346 -0
- package/dist/index.d.ts +346 -0
- package/dist/index.js +603 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +245 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +73 -0
- package/dist/react/index.d.ts +73 -0
- package/dist/react/index.js +109 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +75 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
export { FOCUSABLE_SELECTOR, createFocusTrap, generateId, getFirstFocusable, getFocusableElements, getLastFocusable, isElementVisible, isFocusable } from './chunk-VFHCOPTO.js';
|
|
2
|
+
|
|
3
|
+
// src/utils/composeRefs.ts
|
|
4
|
+
function setRef(ref, value) {
|
|
5
|
+
if (typeof ref === "function") {
|
|
6
|
+
ref(value);
|
|
7
|
+
} else if (ref != null) {
|
|
8
|
+
ref.current = value;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function composeRefs(...refs) {
|
|
12
|
+
return (node) => {
|
|
13
|
+
for (const ref of refs) {
|
|
14
|
+
setRef(ref, node);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/utils/composeEventHandlers.ts
|
|
20
|
+
function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
|
|
21
|
+
return function handleEvent(event) {
|
|
22
|
+
originalEventHandler?.(event);
|
|
23
|
+
if (checkForDefaultPrevented === false || !event.defaultPrevented) {
|
|
24
|
+
ourEventHandler?.(event);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/utils/mergeProps.ts
|
|
30
|
+
function mergeProps(a, b) {
|
|
31
|
+
const merged = { ...a };
|
|
32
|
+
for (const key in b) {
|
|
33
|
+
const aValue = a[key];
|
|
34
|
+
const bValue = b[key];
|
|
35
|
+
if (key.startsWith("on") && typeof aValue === "function" && typeof bValue === "function") {
|
|
36
|
+
merged[key] = composeEventHandlers(
|
|
37
|
+
aValue,
|
|
38
|
+
bValue
|
|
39
|
+
);
|
|
40
|
+
} else if (key === "className" && typeof aValue === "string" && typeof bValue === "string") {
|
|
41
|
+
merged[key] = `${aValue} ${bValue}`.trim();
|
|
42
|
+
} else if (key === "style" && aValue && bValue && typeof aValue === "object" && typeof bValue === "object") {
|
|
43
|
+
merged[key] = { ...aValue, ...bValue };
|
|
44
|
+
} else {
|
|
45
|
+
merged[key] = bValue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return merged;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/utils/dataAttr.ts
|
|
52
|
+
function dataAttr(condition) {
|
|
53
|
+
return condition ? "" : void 0;
|
|
54
|
+
}
|
|
55
|
+
function ariaAttr(condition) {
|
|
56
|
+
return condition ? true : void 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/utils/qrcode.ts
|
|
60
|
+
var ECC_ORDER = { L: 0, M: 1, Q: 2, H: 3 };
|
|
61
|
+
var ECC_CODEWORDS_PER_BLOCK = [
|
|
62
|
+
// L, M, Q, H
|
|
63
|
+
[7, 10, 13, 17],
|
|
64
|
+
// 1
|
|
65
|
+
[10, 16, 22, 28],
|
|
66
|
+
// 2
|
|
67
|
+
[15, 26, 18, 22],
|
|
68
|
+
// 3
|
|
69
|
+
[20, 18, 26, 16],
|
|
70
|
+
// 4
|
|
71
|
+
[26, 24, 18, 22],
|
|
72
|
+
// 5
|
|
73
|
+
[18, 16, 24, 28],
|
|
74
|
+
// 6
|
|
75
|
+
[20, 18, 18, 26],
|
|
76
|
+
// 7
|
|
77
|
+
[24, 22, 22, 26],
|
|
78
|
+
// 8
|
|
79
|
+
[30, 22, 20, 24],
|
|
80
|
+
// 9
|
|
81
|
+
[18, 26, 24, 28]
|
|
82
|
+
// 10
|
|
83
|
+
];
|
|
84
|
+
var NUM_ERROR_CORRECTION_BLOCKS = [
|
|
85
|
+
[1, 1, 1, 1],
|
|
86
|
+
[1, 1, 1, 1],
|
|
87
|
+
[1, 1, 2, 2],
|
|
88
|
+
[1, 2, 2, 4],
|
|
89
|
+
[1, 2, 4, 4],
|
|
90
|
+
[2, 4, 4, 4],
|
|
91
|
+
[2, 4, 6, 5],
|
|
92
|
+
[2, 4, 6, 6],
|
|
93
|
+
[2, 5, 8, 8],
|
|
94
|
+
[4, 5, 8, 8]
|
|
95
|
+
];
|
|
96
|
+
function getEccCount(ver, ecl) {
|
|
97
|
+
return ECC_CODEWORDS_PER_BLOCK[ver - 1][ECC_ORDER[ecl]];
|
|
98
|
+
}
|
|
99
|
+
function getNumBlocks(ver, ecl) {
|
|
100
|
+
return NUM_ERROR_CORRECTION_BLOCKS[ver - 1][ECC_ORDER[ecl]];
|
|
101
|
+
}
|
|
102
|
+
var NUM_RAW_DATA_MODULES = (ver) => {
|
|
103
|
+
let result = (16 * ver + 128) * ver + 64;
|
|
104
|
+
if (ver >= 2) {
|
|
105
|
+
const align = Math.floor(ver / 7) + 2;
|
|
106
|
+
result -= (25 * align - 10) * align - 55;
|
|
107
|
+
if (ver >= 7) result -= 36;
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
};
|
|
111
|
+
var NUM_DATA_CODEWORDS = (ver, ecl) => {
|
|
112
|
+
return Math.floor(NUM_RAW_DATA_MODULES(ver) / 8) - getEccCount(ver, ecl) * getNumBlocks(ver, ecl);
|
|
113
|
+
};
|
|
114
|
+
var EXP_TABLE = new Array(256).fill(0);
|
|
115
|
+
var LOG_TABLE = new Array(256).fill(0);
|
|
116
|
+
{
|
|
117
|
+
let x = 1;
|
|
118
|
+
for (let i = 0; i < 255; i++) {
|
|
119
|
+
EXP_TABLE[i] = x;
|
|
120
|
+
LOG_TABLE[x] = i;
|
|
121
|
+
x = x << 1;
|
|
122
|
+
if (x & 256) x ^= 285;
|
|
123
|
+
}
|
|
124
|
+
EXP_TABLE[255] = EXP_TABLE[0];
|
|
125
|
+
}
|
|
126
|
+
function rsMul(x, y) {
|
|
127
|
+
if (x === 0 || y === 0) return 0;
|
|
128
|
+
return EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255];
|
|
129
|
+
}
|
|
130
|
+
function rsGeneratorPoly(degree) {
|
|
131
|
+
const result = [1];
|
|
132
|
+
for (let i = 0; i < degree; i++) {
|
|
133
|
+
const next = new Array(result.length + 1).fill(0);
|
|
134
|
+
for (let j = 0; j < result.length; j++) {
|
|
135
|
+
next[j] = (next[j] ^ rsMul(result[j], EXP_TABLE[i])) & 255;
|
|
136
|
+
next[j + 1] = (next[j + 1] ^ result[j]) & 255;
|
|
137
|
+
}
|
|
138
|
+
for (let j = 0; j < next.length; j++) result[j] = next[j];
|
|
139
|
+
result.push(next[next.length - 1]);
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
function rsRemainder(data, generator) {
|
|
144
|
+
const result = new Array(generator.length - 1).fill(0);
|
|
145
|
+
for (const b of data) {
|
|
146
|
+
const factor = (b ^ result.shift()) & 255;
|
|
147
|
+
result.push(0);
|
|
148
|
+
for (let i = 0; i < result.length; i++) result[i] = (result[i] ^ rsMul(generator[i], factor)) & 255;
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
var BitBuffer = class {
|
|
153
|
+
constructor() {
|
|
154
|
+
this.bits = [];
|
|
155
|
+
}
|
|
156
|
+
append(value, length) {
|
|
157
|
+
for (let i = length - 1; i >= 0; i--) this.bits.push(value >>> i & 1);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
function encodeToBitBuffer(text, version) {
|
|
161
|
+
const buf = new BitBuffer();
|
|
162
|
+
buf.append(4, 4);
|
|
163
|
+
const charCountBits = version < 10 ? 8 : 16;
|
|
164
|
+
const enc = new TextEncoder();
|
|
165
|
+
const arr = enc.encode(text);
|
|
166
|
+
buf.append(arr.length, charCountBits);
|
|
167
|
+
for (const b of arr) buf.append(b, 8);
|
|
168
|
+
return buf;
|
|
169
|
+
}
|
|
170
|
+
function chooseVersion(text, ecl) {
|
|
171
|
+
for (let v = 1; v <= 10; v++) {
|
|
172
|
+
const buf = encodeToBitBuffer(text, v);
|
|
173
|
+
const capacity = NUM_DATA_CODEWORDS(v, ecl) * 8;
|
|
174
|
+
if (buf.bits.length <= capacity) return { version: v, bits: buf };
|
|
175
|
+
}
|
|
176
|
+
throw new Error("Data too long for QR Code v1-10. Trim the input or use a smaller ECC level.");
|
|
177
|
+
}
|
|
178
|
+
function buildDataCodewords(version, ecl, bits) {
|
|
179
|
+
const capacity = NUM_DATA_CODEWORDS(version, ecl) * 8;
|
|
180
|
+
const termLen = Math.min(4, capacity - bits.bits.length);
|
|
181
|
+
bits.append(0, termLen);
|
|
182
|
+
bits.append(0, (8 - bits.bits.length % 8) % 8);
|
|
183
|
+
const padBytes = [236, 17];
|
|
184
|
+
for (let i = 0; bits.bits.length < capacity; i++) bits.append(padBytes[i % 2], 8);
|
|
185
|
+
const bytes = [];
|
|
186
|
+
for (let i = 0; i < bits.bits.length; i += 8) {
|
|
187
|
+
let b = 0;
|
|
188
|
+
for (let j = 0; j < 8; j++) b = b << 1 | bits.bits[i + j];
|
|
189
|
+
bytes.push(b);
|
|
190
|
+
}
|
|
191
|
+
const eccPerBlock = getEccCount(version, ecl);
|
|
192
|
+
const numBlocks = getNumBlocks(version, ecl);
|
|
193
|
+
const totalCodewords = Math.floor(NUM_RAW_DATA_MODULES(version) / 8);
|
|
194
|
+
const numShortBlocks = numBlocks - totalCodewords % numBlocks;
|
|
195
|
+
const shortBlockLen = Math.floor(totalCodewords / numBlocks);
|
|
196
|
+
const blocks = [];
|
|
197
|
+
const generator = rsGeneratorPoly(eccPerBlock);
|
|
198
|
+
let k = 0;
|
|
199
|
+
for (let i = 0; i < numBlocks; i++) {
|
|
200
|
+
const dataLen = shortBlockLen - eccPerBlock + (i < numShortBlocks ? 0 : 1);
|
|
201
|
+
const data = bytes.slice(k, k + dataLen);
|
|
202
|
+
k += dataLen;
|
|
203
|
+
const block = data.slice();
|
|
204
|
+
const ec = rsRemainder(data, generator);
|
|
205
|
+
for (const b of ec) block.push(b);
|
|
206
|
+
blocks.push(block);
|
|
207
|
+
}
|
|
208
|
+
const result = [];
|
|
209
|
+
const lastBlock = blocks[blocks.length - 1];
|
|
210
|
+
for (let i = 0; i < lastBlock.length; i++) {
|
|
211
|
+
for (let j = 0; j < blocks.length; j++) {
|
|
212
|
+
if (i !== shortBlockLen - eccPerBlock || j >= numShortBlocks) result.push(blocks[j][i]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
function buildMatrix(version, ecl, codewords) {
|
|
218
|
+
const size = version * 4 + 17;
|
|
219
|
+
const matrix = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
220
|
+
const reserved = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
221
|
+
const setModule = (x, y, dark) => {
|
|
222
|
+
matrix[y][x] = dark;
|
|
223
|
+
reserved[y][x] = true;
|
|
224
|
+
};
|
|
225
|
+
const drawFinder = (cx, cy) => {
|
|
226
|
+
for (let dy = -4; dy <= 4; dy++) {
|
|
227
|
+
for (let dx = -4; dx <= 4; dx++) {
|
|
228
|
+
const x = cx + dx;
|
|
229
|
+
const y = cy + dy;
|
|
230
|
+
if (x < 0 || y < 0 || x >= size || y >= size) continue;
|
|
231
|
+
const dist = Math.max(Math.abs(dx), Math.abs(dy));
|
|
232
|
+
setModule(x, y, dist !== 2 && dist !== 4);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
drawFinder(3, 3);
|
|
237
|
+
drawFinder(size - 4, 3);
|
|
238
|
+
drawFinder(3, size - 4);
|
|
239
|
+
for (let i = 8; i < size - 8; i++) {
|
|
240
|
+
setModule(6, i, i % 2 === 0);
|
|
241
|
+
setModule(i, 6, i % 2 === 0);
|
|
242
|
+
}
|
|
243
|
+
if (version >= 2) {
|
|
244
|
+
const positions = getAlignmentPositions(version);
|
|
245
|
+
for (const ay of positions) {
|
|
246
|
+
for (const ax of positions) {
|
|
247
|
+
if (ax === 6 && ay === 6 || ax === 6 && ay === size - 7 || ax === size - 7 && ay === 6) continue;
|
|
248
|
+
for (let dy = -2; dy <= 2; dy++) {
|
|
249
|
+
for (let dx = -2; dx <= 2; dx++) {
|
|
250
|
+
const dist = Math.max(Math.abs(dx), Math.abs(dy));
|
|
251
|
+
setModule(ax + dx, ay + dy, dist !== 1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
setModule(8, size - 8, true);
|
|
258
|
+
for (let i = 0; i < 9; i++) {
|
|
259
|
+
reserved[8][i] = true;
|
|
260
|
+
reserved[i][8] = true;
|
|
261
|
+
}
|
|
262
|
+
for (let i = 0; i < 8; i++) {
|
|
263
|
+
reserved[8][size - 1 - i] = true;
|
|
264
|
+
reserved[size - 1 - i][8] = true;
|
|
265
|
+
}
|
|
266
|
+
const bits = [];
|
|
267
|
+
for (const b of codewords) for (let i = 7; i >= 0; i--) bits.push(b >>> i & 1);
|
|
268
|
+
let bitIdx = 0;
|
|
269
|
+
for (let right = size - 1; right >= 1; right -= 2) {
|
|
270
|
+
if (right === 6) right = 5;
|
|
271
|
+
for (let vert = 0; vert < size; vert++) {
|
|
272
|
+
for (let j = 0; j < 2; j++) {
|
|
273
|
+
const x = right - j;
|
|
274
|
+
const upward = (right + 1 & 2) === 0;
|
|
275
|
+
const y = upward ? size - 1 - vert : vert;
|
|
276
|
+
if (!reserved[y][x] && bitIdx < bits.length) {
|
|
277
|
+
matrix[y][x] = bits[bitIdx] === 1;
|
|
278
|
+
bitIdx++;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const mask = 0;
|
|
284
|
+
for (let y = 0; y < size; y++) {
|
|
285
|
+
for (let x = 0; x < size; x++) {
|
|
286
|
+
if (reserved[y][x]) continue;
|
|
287
|
+
if ((x + y) % 2 === 0) matrix[y][x] = !matrix[y][x];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const formatBits = encodeFormat(ECC_ORDER[ecl], mask);
|
|
291
|
+
for (let i = 0; i <= 5; i++) matrix[8][i] = (formatBits >> i & 1) === 1;
|
|
292
|
+
matrix[8][7] = (formatBits >> 6 & 1) === 1;
|
|
293
|
+
matrix[8][8] = (formatBits >> 7 & 1) === 1;
|
|
294
|
+
matrix[7][8] = (formatBits >> 8 & 1) === 1;
|
|
295
|
+
for (let i = 9; i < 15; i++) matrix[14 - i][8] = (formatBits >> i & 1) === 1;
|
|
296
|
+
for (let i = 0; i < 8; i++) matrix[size - 1 - i][8] = (formatBits >> i & 1) === 1;
|
|
297
|
+
for (let i = 8; i < 15; i++) matrix[8][size - 15 + i] = (formatBits >> i & 1) === 1;
|
|
298
|
+
return matrix;
|
|
299
|
+
}
|
|
300
|
+
function getAlignmentPositions(version) {
|
|
301
|
+
if (version === 1) return [];
|
|
302
|
+
const numAlign = Math.floor(version / 7) + 2;
|
|
303
|
+
const step = Math.ceil((version * 4 + 4) / (numAlign * 2 - 2) * 2) / 2 * 2;
|
|
304
|
+
const positions = [6];
|
|
305
|
+
for (let pos = version * 4 + 10; positions.length < numAlign; pos -= step) positions.splice(1, 0, pos);
|
|
306
|
+
return positions;
|
|
307
|
+
}
|
|
308
|
+
function encodeFormat(eclLevel, mask) {
|
|
309
|
+
const map = [1, 0, 3, 2];
|
|
310
|
+
const eclBits = map[eclLevel];
|
|
311
|
+
const data = eclBits << 3 | mask;
|
|
312
|
+
let bch = data;
|
|
313
|
+
for (let i = 0; i < 10; i++) bch = bch << 1 ^ (bch >> 9) * 1335;
|
|
314
|
+
return (data << 10 | bch) ^ 21522;
|
|
315
|
+
}
|
|
316
|
+
function generateQrMatrix(text, ecl = "M") {
|
|
317
|
+
const { version, bits } = chooseVersion(text, ecl);
|
|
318
|
+
const codewords = buildDataCodewords(version, ecl, bits);
|
|
319
|
+
const modules = buildMatrix(version, ecl, codewords);
|
|
320
|
+
return { size: modules.length, modules, version };
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// src/a11y/keys.ts
|
|
324
|
+
var Keys = {
|
|
325
|
+
Enter: "Enter",
|
|
326
|
+
Space: " ",
|
|
327
|
+
Escape: "Escape",
|
|
328
|
+
Tab: "Tab",
|
|
329
|
+
ArrowUp: "ArrowUp",
|
|
330
|
+
ArrowDown: "ArrowDown",
|
|
331
|
+
ArrowLeft: "ArrowLeft",
|
|
332
|
+
ArrowRight: "ArrowRight",
|
|
333
|
+
Home: "Home",
|
|
334
|
+
End: "End",
|
|
335
|
+
PageUp: "PageUp",
|
|
336
|
+
PageDown: "PageDown",
|
|
337
|
+
Backspace: "Backspace",
|
|
338
|
+
Delete: "Delete"
|
|
339
|
+
};
|
|
340
|
+
function isActivationKey(key) {
|
|
341
|
+
return key === Keys.Enter || key === Keys.Space;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// src/styles/button.ts
|
|
345
|
+
var sizeMap = {
|
|
346
|
+
xs: { padX: 8, padY: 4, font: 12, height: 24, gap: 4, radius: "sm" },
|
|
347
|
+
sm: { padX: 12, padY: 6, font: 13, height: 32, gap: 6, radius: "md" },
|
|
348
|
+
md: { padX: 16, padY: 8, font: 14, height: 40, gap: 8, radius: "md" },
|
|
349
|
+
lg: { padX: 20, padY: 10, font: 16, height: 48, gap: 8, radius: "lg" },
|
|
350
|
+
xl: { padX: 24, padY: 12, font: 18, height: 56, gap: 10, radius: "lg" }
|
|
351
|
+
};
|
|
352
|
+
function getButtonStyle(input) {
|
|
353
|
+
const { theme, variant, size, fullWidth, isLoading, isDisabled, isPressed, isHovered, isFocusVisible } = input;
|
|
354
|
+
const intent = theme.colors.intent[input.intent ?? (variant === "destructive" ? "danger" : "primary")];
|
|
355
|
+
const dims = sizeMap[size];
|
|
356
|
+
const radius = theme.radii[dims.radius];
|
|
357
|
+
const baseRoot = {
|
|
358
|
+
display: "inline-flex",
|
|
359
|
+
alignItems: "center",
|
|
360
|
+
justifyContent: "center",
|
|
361
|
+
flexDirection: "row",
|
|
362
|
+
gap: dims.gap,
|
|
363
|
+
paddingLeft: dims.padX,
|
|
364
|
+
paddingRight: dims.padX,
|
|
365
|
+
paddingTop: dims.padY,
|
|
366
|
+
paddingBottom: dims.padY,
|
|
367
|
+
minHeight: dims.height,
|
|
368
|
+
borderRadius: radius,
|
|
369
|
+
borderWidth: 1,
|
|
370
|
+
borderStyle: "solid",
|
|
371
|
+
borderColor: "transparent",
|
|
372
|
+
fontFamily: theme.tokens.typography.fontFamilies.sans,
|
|
373
|
+
fontSize: dims.font,
|
|
374
|
+
fontWeight: theme.tokens.typography.fontWeights.medium,
|
|
375
|
+
lineHeight: theme.tokens.typography.lineHeights.tight,
|
|
376
|
+
width: fullWidth ? "100%" : "auto",
|
|
377
|
+
cursor: isDisabled || isLoading ? "not-allowed" : "pointer",
|
|
378
|
+
opacity: isDisabled ? 0.5 : 1,
|
|
379
|
+
userSelect: "none",
|
|
380
|
+
transitionProperty: "background-color, border-color, color, box-shadow, transform",
|
|
381
|
+
transitionDuration: theme.durations.fast,
|
|
382
|
+
transitionTimingFunction: theme.easings.standard,
|
|
383
|
+
boxShadow: isFocusVisible ? theme.shadows.focus : void 0
|
|
384
|
+
};
|
|
385
|
+
let root = baseRoot;
|
|
386
|
+
let labelColor = theme.colors.fg;
|
|
387
|
+
let spinnerColor = theme.colors.fg;
|
|
388
|
+
switch (variant) {
|
|
389
|
+
case "primary":
|
|
390
|
+
case "destructive": {
|
|
391
|
+
const bg = isPressed ? intent.solidActive : isHovered ? intent.solidHover : intent.solid;
|
|
392
|
+
root = { ...root, backgroundColor: bg, borderColor: bg, color: intent.solidFg };
|
|
393
|
+
labelColor = intent.solidFg;
|
|
394
|
+
spinnerColor = intent.solidFg;
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
case "secondary": {
|
|
398
|
+
const bg = isPressed ? theme.colors.intent.neutral.subtleHover : isHovered ? theme.colors.intent.neutral.subtleHover : theme.colors.intent.neutral.subtle;
|
|
399
|
+
root = {
|
|
400
|
+
...root,
|
|
401
|
+
backgroundColor: bg,
|
|
402
|
+
borderColor: theme.colors.border,
|
|
403
|
+
color: theme.colors.fg
|
|
404
|
+
};
|
|
405
|
+
labelColor = theme.colors.fg;
|
|
406
|
+
spinnerColor = theme.colors.fg;
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
case "tertiary": {
|
|
410
|
+
const bg = isPressed ? intent.subtleHover : isHovered ? intent.subtle : "transparent";
|
|
411
|
+
root = { ...root, backgroundColor: bg, color: intent.fg };
|
|
412
|
+
labelColor = intent.fg;
|
|
413
|
+
spinnerColor = intent.fg;
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
case "outline": {
|
|
417
|
+
const bg = isPressed ? intent.subtleHover : isHovered ? intent.subtle : "transparent";
|
|
418
|
+
root = { ...root, backgroundColor: bg, borderColor: intent.border, color: intent.fg };
|
|
419
|
+
labelColor = intent.fg;
|
|
420
|
+
spinnerColor = intent.fg;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case "ghost": {
|
|
424
|
+
const bg = isPressed ? theme.colors.intent.neutral.subtleHover : isHovered ? theme.colors.intent.neutral.subtle : "transparent";
|
|
425
|
+
root = { ...root, backgroundColor: bg, color: theme.colors.fg };
|
|
426
|
+
labelColor = theme.colors.fg;
|
|
427
|
+
spinnerColor = theme.colors.fg;
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case "link": {
|
|
431
|
+
root = {
|
|
432
|
+
...root,
|
|
433
|
+
backgroundColor: "transparent",
|
|
434
|
+
minHeight: "auto",
|
|
435
|
+
padding: 0,
|
|
436
|
+
color: intent.fg,
|
|
437
|
+
textDecoration: isHovered || isPressed ? "underline" : "none",
|
|
438
|
+
borderWidth: 0
|
|
439
|
+
};
|
|
440
|
+
labelColor = intent.fg;
|
|
441
|
+
spinnerColor = intent.fg;
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return {
|
|
446
|
+
root,
|
|
447
|
+
label: {
|
|
448
|
+
color: labelColor,
|
|
449
|
+
fontSize: dims.font,
|
|
450
|
+
fontWeight: theme.tokens.typography.fontWeights.medium,
|
|
451
|
+
opacity: isLoading ? 0 : 1
|
|
452
|
+
},
|
|
453
|
+
spinnerColor
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// src/styles/input.ts
|
|
458
|
+
var sizeMap2 = {
|
|
459
|
+
xs: { padX: 8, padY: 4, font: 12, height: 24, radius: "sm" },
|
|
460
|
+
sm: { padX: 10, padY: 6, font: 13, height: 32, radius: "md" },
|
|
461
|
+
md: { padX: 12, padY: 8, font: 14, height: 40, radius: "md" },
|
|
462
|
+
lg: { padX: 14, padY: 10, font: 16, height: 48, radius: "lg" },
|
|
463
|
+
xl: { padX: 16, padY: 12, font: 18, height: 56, radius: "lg" }
|
|
464
|
+
};
|
|
465
|
+
var statusIntent = {
|
|
466
|
+
neutral: "neutral",
|
|
467
|
+
info: "info",
|
|
468
|
+
success: "success",
|
|
469
|
+
warning: "warning",
|
|
470
|
+
error: "danger"
|
|
471
|
+
};
|
|
472
|
+
function getInputStyle(input) {
|
|
473
|
+
const { theme, size, status, isDisabled, isReadOnly, isInvalid, isFocused, isHovered } = input;
|
|
474
|
+
const dims = sizeMap2[size];
|
|
475
|
+
const intent = theme.colors.intent[isInvalid ? "danger" : statusIntent[status]];
|
|
476
|
+
const borderColor = isFocused ? intent.border : isHovered && !isDisabled ? theme.colors.borderStrong : isInvalid || status === "error" ? theme.colors.intent.danger.border : theme.colors.border;
|
|
477
|
+
return {
|
|
478
|
+
display: "inline-flex",
|
|
479
|
+
alignItems: "center",
|
|
480
|
+
width: "100%",
|
|
481
|
+
minHeight: dims.height,
|
|
482
|
+
paddingLeft: dims.padX,
|
|
483
|
+
paddingRight: dims.padX,
|
|
484
|
+
paddingTop: dims.padY,
|
|
485
|
+
paddingBottom: dims.padY,
|
|
486
|
+
borderRadius: theme.radii[dims.radius],
|
|
487
|
+
borderWidth: 1,
|
|
488
|
+
borderStyle: "solid",
|
|
489
|
+
borderColor,
|
|
490
|
+
backgroundColor: isDisabled ? theme.colors.surface : theme.colors.surfaceElevated,
|
|
491
|
+
color: theme.colors.fg,
|
|
492
|
+
fontFamily: theme.tokens.typography.fontFamilies.sans,
|
|
493
|
+
fontSize: dims.font,
|
|
494
|
+
lineHeight: theme.tokens.typography.lineHeights.normal,
|
|
495
|
+
outline: "none",
|
|
496
|
+
opacity: isDisabled ? 0.6 : 1,
|
|
497
|
+
cursor: isDisabled ? "not-allowed" : isReadOnly ? "default" : "text",
|
|
498
|
+
boxShadow: isFocused ? `0 0 0 3px ${intent.ring}33` : void 0,
|
|
499
|
+
transitionProperty: "border-color, box-shadow, background-color",
|
|
500
|
+
transitionDuration: theme.durations.fast,
|
|
501
|
+
transitionTimingFunction: theme.easings.standard
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// src/styles/floatingLabel.ts
|
|
506
|
+
var sizeMap3 = {
|
|
507
|
+
xs: { padX: 8, padY: 4, restFont: 12, floatFont: 10 },
|
|
508
|
+
sm: { padX: 10, padY: 6, restFont: 13, floatFont: 11 },
|
|
509
|
+
md: { padX: 12, padY: 8, restFont: 14, floatFont: 12 },
|
|
510
|
+
lg: { padX: 14, padY: 10, restFont: 16, floatFont: 12 },
|
|
511
|
+
xl: { padX: 16, padY: 12, restFont: 18, floatFont: 13 }
|
|
512
|
+
};
|
|
513
|
+
function getFloatingLabelStyle(input) {
|
|
514
|
+
const { theme, size, variant, floated, focused, invalid, restAlign = "center" } = input;
|
|
515
|
+
const dims = sizeMap3[size];
|
|
516
|
+
const activeColor = invalid ? theme.colors.intent.danger.fg : focused ? theme.colors.intent.info.fg : theme.colors.fgMuted;
|
|
517
|
+
const floatedTop = variant === "outlined" ? 0 : 4;
|
|
518
|
+
const restTop = restAlign === "top" ? dims.padY : "50%";
|
|
519
|
+
const restTransform = restAlign === "top" ? "translateY(0)" : "translateY(-50%)";
|
|
520
|
+
return {
|
|
521
|
+
wrapper: {
|
|
522
|
+
position: "relative",
|
|
523
|
+
display: "inline-flex",
|
|
524
|
+
width: "100%"
|
|
525
|
+
},
|
|
526
|
+
label: {
|
|
527
|
+
position: "absolute",
|
|
528
|
+
left: dims.padX,
|
|
529
|
+
maxWidth: `calc(100% - ${dims.padX * 2}px)`,
|
|
530
|
+
whiteSpace: "nowrap",
|
|
531
|
+
overflow: "hidden",
|
|
532
|
+
textOverflow: "ellipsis",
|
|
533
|
+
pointerEvents: "none",
|
|
534
|
+
fontFamily: theme.tokens.typography.fontFamilies.sans,
|
|
535
|
+
color: floated ? activeColor : theme.colors.fgMuted,
|
|
536
|
+
top: floated ? floatedTop : restTop,
|
|
537
|
+
transform: floated ? "translateY(-50%)" : restTransform,
|
|
538
|
+
fontSize: floated ? dims.floatFont : dims.restFont,
|
|
539
|
+
lineHeight: theme.tokens.typography.lineHeights.snug,
|
|
540
|
+
transitionProperty: "top, font-size, color",
|
|
541
|
+
transitionDuration: theme.durations.fast,
|
|
542
|
+
transitionTimingFunction: theme.easings.standard,
|
|
543
|
+
// Outlined: paint the field background behind the floated label so the
|
|
544
|
+
// label visually "notches" the top border.
|
|
545
|
+
...variant === "outlined" && floated ? { paddingLeft: 4, paddingRight: 4, backgroundColor: theme.colors.surfaceElevated } : null
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// src/components/button.ts
|
|
551
|
+
var defaultButtonProps = {
|
|
552
|
+
variant: "primary",
|
|
553
|
+
size: "md",
|
|
554
|
+
type: "button",
|
|
555
|
+
fullWidth: false,
|
|
556
|
+
isLoading: false,
|
|
557
|
+
isDisabled: false,
|
|
558
|
+
loadingText: "Loading"
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
// src/components/input.ts
|
|
562
|
+
var defaultInputProps = {
|
|
563
|
+
size: "md",
|
|
564
|
+
status: "neutral",
|
|
565
|
+
isReadOnly: false,
|
|
566
|
+
isDisabled: false,
|
|
567
|
+
isRequired: false,
|
|
568
|
+
isInvalid: false
|
|
569
|
+
};
|
|
570
|
+
|
|
571
|
+
// src/components/tabs.ts
|
|
572
|
+
function getNextTabIndex(event, currentIndex, tabs, options = {}) {
|
|
573
|
+
const { orientation = "horizontal" } = options;
|
|
574
|
+
const last = tabs.length - 1;
|
|
575
|
+
const next = (i) => {
|
|
576
|
+
let n = i;
|
|
577
|
+
do {
|
|
578
|
+
n = n >= last ? 0 : n + 1;
|
|
579
|
+
} while (tabs[n]?.isDisabled && n !== i);
|
|
580
|
+
return n;
|
|
581
|
+
};
|
|
582
|
+
const prev = (i) => {
|
|
583
|
+
let p = i;
|
|
584
|
+
do {
|
|
585
|
+
p = p <= 0 ? last : p - 1;
|
|
586
|
+
} while (tabs[p]?.isDisabled && p !== i);
|
|
587
|
+
return p;
|
|
588
|
+
};
|
|
589
|
+
if (orientation === "horizontal") {
|
|
590
|
+
if (event.key === "ArrowRight") return next(currentIndex);
|
|
591
|
+
if (event.key === "ArrowLeft") return prev(currentIndex);
|
|
592
|
+
} else {
|
|
593
|
+
if (event.key === "ArrowDown") return next(currentIndex);
|
|
594
|
+
if (event.key === "ArrowUp") return prev(currentIndex);
|
|
595
|
+
}
|
|
596
|
+
if (event.key === "Home") return next(-1);
|
|
597
|
+
if (event.key === "End") return prev(0);
|
|
598
|
+
return currentIndex;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
export { Keys, ariaAttr, composeEventHandlers, composeRefs, dataAttr, defaultButtonProps, defaultInputProps, generateQrMatrix, getButtonStyle, getFloatingLabelStyle, getInputStyle, getNextTabIndex, isActivationKey, mergeProps, setRef };
|
|
602
|
+
//# sourceMappingURL=index.js.map
|
|
603
|
+
//# sourceMappingURL=index.js.map
|