tyrell-components 1.0.0-TC30 → 1.0.0-TC32
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/css/tyrell.css +48 -12
- package/dist/tyrell.css +48 -12
- package/dist/tyrell.js +1 -1
- package/lib/components/calendar-month.d.ts +17 -0
- package/lib/components/calendar-month.d.ts.map +1 -1
- package/lib/components/calendar-month.js +121 -7
- package/lib/components/calendar-month.js.map +1 -1
- package/lib/components/calendar.d.ts +3 -1
- package/lib/components/calendar.d.ts.map +1 -1
- package/lib/components/calendar.js +19 -9
- package/lib/components/calendar.js.map +1 -1
- package/lib/components/checkbox.d.ts +4 -3
- package/lib/components/checkbox.d.ts.map +1 -1
- package/lib/components/checkbox.js +23 -35
- package/lib/components/checkbox.js.map +1 -1
- package/lib/components/copy.d.ts +4 -3
- package/lib/components/copy.d.ts.map +1 -1
- package/lib/components/copy.js +22 -21
- package/lib/components/copy.js.map +1 -1
- package/lib/components/date-picker.d.ts +5 -1
- package/lib/components/date-picker.d.ts.map +1 -1
- package/lib/components/date-picker.js +113 -32
- package/lib/components/date-picker.js.map +1 -1
- package/lib/components/input.d.ts +3 -2
- package/lib/components/input.d.ts.map +1 -1
- package/lib/components/input.js +24 -21
- package/lib/components/input.js.map +1 -1
- package/lib/components/modal.d.ts.map +1 -1
- package/lib/components/modal.js +22 -3
- package/lib/components/modal.js.map +1 -1
- package/lib/components/popup.d.ts.map +1 -1
- package/lib/components/popup.js +14 -0
- package/lib/components/popup.js.map +1 -1
- package/lib/components/radio.d.ts +5 -2
- package/lib/components/radio.d.ts.map +1 -1
- package/lib/components/radio.js +16 -5
- package/lib/components/radio.js.map +1 -1
- package/lib/components/select.d.ts +75 -5
- package/lib/components/select.d.ts.map +1 -1
- package/lib/components/select.js +282 -47
- package/lib/components/select.js.map +1 -1
- package/lib/components/selected-tags.d.ts +1 -1
- package/lib/components/selected-tags.js +1 -1
- package/lib/components/switch.d.ts +4 -3
- package/lib/components/switch.d.ts.map +1 -1
- package/lib/components/switch.js +17 -29
- package/lib/components/switch.js.map +1 -1
- package/lib/components/tabs.d.ts.map +1 -1
- package/lib/components/tabs.js +18 -2
- package/lib/components/tabs.js.map +1 -1
- package/lib/components/tooltip.d.ts +4 -2
- package/lib/components/tooltip.d.ts.map +1 -1
- package/lib/components/tooltip.js +109 -70
- package/lib/components/tooltip.js.map +1 -1
- package/lib/components/wizard.d.ts.map +1 -1
- package/lib/components/wizard.js +22 -3
- package/lib/components/wizard.js.map +1 -1
- package/lib/styles/button.d.ts.map +1 -1
- package/lib/styles/button.js +10 -6
- package/lib/styles/button.js.map +1 -1
- package/lib/styles/calendar-month.d.ts +3 -1
- package/lib/styles/calendar-month.d.ts.map +1 -1
- package/lib/styles/calendar-month.js +63 -8
- package/lib/styles/calendar-month.js.map +1 -1
- package/lib/styles/checkbox.d.ts +3 -1
- package/lib/styles/checkbox.d.ts.map +1 -1
- package/lib/styles/checkbox.js +31 -53
- package/lib/styles/checkbox.js.map +1 -1
- package/lib/styles/copy.d.ts +3 -1
- package/lib/styles/copy.d.ts.map +1 -1
- package/lib/styles/copy.js +27 -4
- package/lib/styles/copy.js.map +1 -1
- package/lib/styles/date-picker.d.ts +3 -1
- package/lib/styles/date-picker.d.ts.map +1 -1
- package/lib/styles/date-picker.js +52 -98
- package/lib/styles/date-picker.js.map +1 -1
- package/lib/styles/input.d.ts +3 -1
- package/lib/styles/input.d.ts.map +1 -1
- package/lib/styles/input.js +58 -119
- package/lib/styles/input.js.map +1 -1
- package/lib/styles/multiselect.d.ts +3 -1
- package/lib/styles/multiselect.d.ts.map +1 -1
- package/lib/styles/multiselect.js +26 -2
- package/lib/styles/multiselect.js.map +1 -1
- package/lib/styles/radio.d.ts +3 -1
- package/lib/styles/radio.d.ts.map +1 -1
- package/lib/styles/radio.js +23 -20
- package/lib/styles/radio.js.map +1 -1
- package/lib/styles/select-base.d.ts +9 -0
- package/lib/styles/select-base.d.ts.map +1 -0
- package/lib/styles/select-base.js +929 -0
- package/lib/styles/select-base.js.map +1 -0
- package/lib/styles/select.d.ts +3 -3
- package/lib/styles/select.d.ts.map +1 -1
- package/lib/styles/select.js +20 -18
- package/lib/styles/select.js.map +1 -1
- package/lib/styles/switch.d.ts +3 -1
- package/lib/styles/switch.d.ts.map +1 -1
- package/lib/styles/switch.js +23 -8
- package/lib/styles/switch.js.map +1 -1
- package/lib/styles/tooltip.d.ts +4 -2
- package/lib/styles/tooltip.d.ts.map +1 -1
- package/lib/styles/tooltip.js +4 -119
- package/lib/styles/tooltip.js.map +1 -1
- package/lib/utils/icons.d.ts +10 -0
- package/lib/utils/icons.d.ts.map +1 -0
- package/lib/utils/icons.js +10 -0
- package/lib/utils/icons.js.map +1 -0
- package/lib/utils/loader-registry.d.ts +2 -2
- package/lib/utils/loader-registry.js +2 -2
- package/lib/utils/positioning.d.ts +27 -0
- package/lib/utils/positioning.d.ts.map +1 -1
- package/lib/utils/positioning.js +20 -3
- package/lib/utils/positioning.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/styles/input.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/styles/input.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+CH,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,WAAiC,CAAC;AAEnF,eAAO,MAAM,WAAW,QA+SvB,CAAA"}
|
package/lib/styles/input.js
CHANGED
|
@@ -3,6 +3,50 @@
|
|
|
3
3
|
* PORTED FROM: clj/ty/components/input.css
|
|
4
4
|
* Phase A: Regular input styles only (no checkbox, no numeric formatting)
|
|
5
5
|
*/
|
|
6
|
+
import { FLAVORS } from "../types/common.js";
|
|
7
|
+
/* Flavor rules only set --input-accent (border), --input-accent-bold
|
|
8
|
+
(hover/focus border), and --input-ring (focus shadow); the wrapper base
|
|
9
|
+
rules consume them. They double as the per-instance override API:
|
|
10
|
+
`ty-input { --input-accent: … }`. Neutral is skipped — it IS the default
|
|
11
|
+
chrome (--ty-input-* tokens), and input's auto-danger-on-error logic
|
|
12
|
+
relies on neutral being the unstyled state.
|
|
13
|
+
|
|
14
|
+
Fallback flavor `fb` is used for custom flavors: suffixed tokens fall
|
|
15
|
+
back to the custom base color first (a flavor defining only
|
|
16
|
+
--ty-color-X still gets sensible hover/focus), then to neutral.
|
|
17
|
+
|
|
18
|
+
Emphasis ladder mirrors the neutral chrome (faint rest → soft hover →
|
|
19
|
+
focus + ring): a flavored field rests on its -soft shade and only
|
|
20
|
+
escalates to the full color on hover/focus — a resting field shouldn't
|
|
21
|
+
shout its full-saturation border (tones shift the whole ladder). */
|
|
22
|
+
const inputFlavor = (f, fb) => {
|
|
23
|
+
const c = (s) => fb
|
|
24
|
+
? s
|
|
25
|
+
? `var(--ty-color-${f}${s}, var(--ty-color-${f}, var(--ty-color-${fb}${s})))`
|
|
26
|
+
: `var(--ty-color-${f}, var(--ty-color-${fb}))`
|
|
27
|
+
: s
|
|
28
|
+
? `var(--ty-color-${f}${s}, var(--ty-color-${f}))`
|
|
29
|
+
: `var(--ty-color-${f})`;
|
|
30
|
+
return `
|
|
31
|
+
:host([flavor="${f}"]) {
|
|
32
|
+
--input-accent: var(--ty-input-${f}-border, ${c("-soft")});
|
|
33
|
+
--input-accent-bold: ${c("")};
|
|
34
|
+
--input-ring: color-mix(in oklab, ${c("")} 15%, transparent);
|
|
35
|
+
}
|
|
36
|
+
:host([flavor="${f}+"]) {
|
|
37
|
+
--input-accent: ${c("")};
|
|
38
|
+
--input-accent-bold: ${c("-strong")};
|
|
39
|
+
--input-ring: color-mix(in oklab, ${c("-strong")} 15%, transparent);
|
|
40
|
+
}
|
|
41
|
+
:host([flavor="${f}-"]) {
|
|
42
|
+
--input-accent: ${c("-faint")};
|
|
43
|
+
--input-accent-bold: ${c("-soft")};
|
|
44
|
+
--input-ring: color-mix(in oklab, ${c("-soft")} 15%, transparent);
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
};
|
|
48
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
49
|
+
export const inputCustomFlavorCss = (base) => inputFlavor(base, "neutral");
|
|
6
50
|
export const inputStyles = `
|
|
7
51
|
:host {
|
|
8
52
|
display: block;
|
|
@@ -10,16 +54,6 @@ export const inputStyles = `
|
|
|
10
54
|
width: 100%;
|
|
11
55
|
}
|
|
12
56
|
|
|
13
|
-
:host([size="xl"]) {
|
|
14
|
-
font-size: 20px;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
:host([size="xs"]) {
|
|
19
|
-
font-size: 12px;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
57
|
:host([size="sm"]) {
|
|
24
58
|
font-size: 14px;
|
|
25
59
|
}
|
|
@@ -73,24 +107,26 @@ export const inputStyles = `
|
|
|
73
107
|
gap: 0.5rem; /* No gap by default */
|
|
74
108
|
width: 100%;
|
|
75
109
|
box-sizing: border-box;
|
|
76
|
-
border: 1px solid var(--input-border, var(--ty-input-border));
|
|
110
|
+
border: 1px solid var(--input-accent, var(--input-border, var(--ty-input-border)));
|
|
77
111
|
border-radius: var(--ty-radius-base);
|
|
78
112
|
background: var(--input-bg, var(--input-bg, var(--ty-input-bg)));
|
|
79
113
|
transition: all 0.15s ease-in-out;
|
|
80
114
|
|
|
81
115
|
/* Default size (md) */
|
|
82
|
-
min-height:
|
|
116
|
+
min-height: var(--ty-size-md);
|
|
83
117
|
padding: 0 12px;
|
|
84
118
|
}
|
|
85
119
|
|
|
86
|
-
/* Wrapper states
|
|
120
|
+
/* Wrapper states — --input-accent* are set by the flavor rules below;
|
|
121
|
+
without a flavor attribute they're unset and the default chrome chain
|
|
122
|
+
(per-instance --input-* var, then --ty-input-* token) applies. */
|
|
87
123
|
.input-wrapper:hover:not(.disabled) {
|
|
88
|
-
border-color: var(--input-border-hover, var(--ty-input-border-hover));
|
|
124
|
+
border-color: var(--input-accent-bold, var(--input-border-hover, var(--ty-input-border-hover)));
|
|
89
125
|
}
|
|
90
126
|
|
|
91
127
|
.input-wrapper.focused {
|
|
92
|
-
border-color: var(--input-border-focus, var(--ty-input-border-focus));
|
|
93
|
-
box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));
|
|
128
|
+
border-color: var(--input-accent-bold, var(--input-border-focus, var(--ty-input-border-focus)));
|
|
129
|
+
box-shadow: 0 0 0 3px var(--input-ring, var(--input-shadow-focus, var(--ty-input-shadow-focus)));
|
|
94
130
|
}
|
|
95
131
|
|
|
96
132
|
.input-wrapper.disabled {
|
|
@@ -131,7 +167,7 @@ export const inputStyles = `
|
|
|
131
167
|
color: var(--input-color, var(--ty-input-color));
|
|
132
168
|
}
|
|
133
169
|
.password-toggle:focus-visible {
|
|
134
|
-
outline: 2px solid var(--ty-color-primary);
|
|
170
|
+
outline: 2px solid var(--input-accent, var(--ty-color-primary));
|
|
135
171
|
outline-offset: 2px;
|
|
136
172
|
border-radius: 2px;
|
|
137
173
|
}
|
|
@@ -214,22 +250,9 @@ input::placeholder {
|
|
|
214
250
|
|
|
215
251
|
/* ===== SIZE MODIFIERS ===== */
|
|
216
252
|
|
|
217
|
-
/* Extra Small */
|
|
218
|
-
.input-wrapper.xs {
|
|
219
|
-
min-height: 32px;
|
|
220
|
-
padding: 0 8px;
|
|
221
|
-
border-radius: var(--ty-input-radius-xs, var(--ty-radius-base));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
.input-wrapper.xs input {
|
|
225
|
-
font-size: var(--ty-font-xs);
|
|
226
|
-
line-height: var(--ty-leading-xs);
|
|
227
|
-
letter-spacing: var(--ty-tracking-xs);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
253
|
/* Small */
|
|
231
254
|
.input-wrapper.sm {
|
|
232
|
-
min-height:
|
|
255
|
+
min-height: var(--ty-size-sm);
|
|
233
256
|
padding: 0 10px;
|
|
234
257
|
border-radius: var(--ty-input-radius-sm, var(--ty-radius-base));
|
|
235
258
|
}
|
|
@@ -242,7 +265,7 @@ input::placeholder {
|
|
|
242
265
|
|
|
243
266
|
/* Medium (default) */
|
|
244
267
|
.input-wrapper.md {
|
|
245
|
-
min-height:
|
|
268
|
+
min-height: var(--ty-size-md);
|
|
246
269
|
padding: 0 12px;
|
|
247
270
|
border-radius: var(--ty-input-radius-md, var(--ty-radius-base));
|
|
248
271
|
}
|
|
@@ -255,7 +278,7 @@ input::placeholder {
|
|
|
255
278
|
|
|
256
279
|
/* Large */
|
|
257
280
|
.input-wrapper.lg {
|
|
258
|
-
min-height:
|
|
281
|
+
min-height: var(--ty-size-lg);
|
|
259
282
|
padding: 0 14px;
|
|
260
283
|
border-radius: var(--ty-input-radius-lg, var(--ty-radius-base));
|
|
261
284
|
}
|
|
@@ -266,92 +289,8 @@ input::placeholder {
|
|
|
266
289
|
letter-spacing: var(--ty-tracking-base);
|
|
267
290
|
}
|
|
268
291
|
|
|
269
|
-
/*
|
|
270
|
-
.
|
|
271
|
-
min-height: 48px;
|
|
272
|
-
padding: 0 16px;
|
|
273
|
-
border-radius: var(--ty-input-radius-xl, var(--ty-radius-base));
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
.input-wrapper.xl input {
|
|
277
|
-
font-size: var(--ty-font-lg);
|
|
278
|
-
line-height: var(--ty-leading-lg);
|
|
279
|
-
letter-spacing: var(--ty-tracking-lg);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/* ===== SEMANTIC FLAVOR MODIFIERS ===== */
|
|
283
|
-
|
|
284
|
-
/* Primary */
|
|
285
|
-
.input-wrapper.primary {
|
|
286
|
-
border-color: var(--ty-input-primary-border, var(--ty-color-primary));
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
.input-wrapper.primary:hover:not(.disabled) {
|
|
290
|
-
border-color: var(--ty-color-primary-bold);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
.input-wrapper.primary.focused {
|
|
294
|
-
border-color: var(--ty-color-primary-bold);
|
|
295
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/* Secondary */
|
|
299
|
-
.input-wrapper.secondary {
|
|
300
|
-
border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
.input-wrapper.secondary.focused {
|
|
304
|
-
border-color: var(--ty-color-secondary-bold);
|
|
305
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/* Success */
|
|
309
|
-
.input-wrapper.success {
|
|
310
|
-
border-color: var(--ty-input-success-border);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
.input-wrapper.success:hover:not(.disabled) {
|
|
314
|
-
border-color: var(--ty-color-success-bold);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
.input-wrapper.success.focused {
|
|
318
|
-
border-color: var(--ty-color-success-bold);
|
|
319
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/* Danger */
|
|
323
|
-
.input-wrapper.danger {
|
|
324
|
-
border-color: var(--ty-input-danger-border);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
.input-wrapper.danger:hover:not(.disabled) {
|
|
328
|
-
border-color: var(--ty-color-danger-bold);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
.input-wrapper.danger.focused {
|
|
332
|
-
border-color: var(--ty-color-danger-bold);
|
|
333
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/* Warning */
|
|
337
|
-
.input-wrapper.warning {
|
|
338
|
-
border-color: var(--ty-input-warning-border);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
.input-wrapper.warning:hover:not(.disabled) {
|
|
342
|
-
border-color: var(--ty-color-warning-bold);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
.input-wrapper.warning.focused {
|
|
346
|
-
border-color: var(--ty-color-warning-bold);
|
|
347
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/* Neutral (default) */
|
|
351
|
-
.input-wrapper.neutral.focused {
|
|
352
|
-
border-color: var(--input-border-focus, var(--ty-input-border-focus));
|
|
353
|
-
box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));
|
|
354
|
-
}
|
|
292
|
+
/* ===== SEMANTIC FLAVOR MODIFIERS (set --input-accent*, consumed above) ===== */
|
|
293
|
+
${FLAVORS.filter((f) => f !== "neutral").map((f) => inputFlavor(f)).join("")}
|
|
355
294
|
|
|
356
295
|
/* ===== ACCESSIBILITY ENHANCEMENTS ===== */
|
|
357
296
|
|
package/lib/styles/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/styles/input.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/styles/input.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;;;;;;;;;;sEAcsE;AACtE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CACtB,EAAE;QACA,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,GAAG,CAAC,KAAK;YAC7E,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,IAAI;QACjD,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI;YAClD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;IAC/B,OAAO;iBACQ,CAAC;mCACiB,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;yBACjC,CAAC,CAAC,EAAE,CAAC;sCACQ,CAAC,CAAC,EAAE,CAAC;;iBAE1B,CAAC;oBACE,CAAC,CAAC,EAAE,CAAC;yBACA,CAAC,CAAC,SAAS,CAAC;sCACC,CAAC,CAAC,SAAS,CAAC;;iBAEjC,CAAC;oBACE,CAAC,CAAC,QAAQ,CAAC;yBACN,CAAC,CAAC,OAAO,CAAC;sCACG,CAAC,CAAC,OAAO,CAAC;;CAE/C,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmPzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D3E,CAAA"}
|
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
* Multiselect Component Styles
|
|
3
3
|
* PORTED FROM: clj/ty/components/multiselect.css
|
|
4
4
|
*/
|
|
5
|
-
export declare const multiselectStyles = "\n/* Multiselect-specific styles extending dropdown base styles */\n\n:host {\n --mobile-border-color: var(--ty-border, #5858587d);\n}\n\n/* ===== DIALOG POSITIONING SUPPORT ===== */\n\n.dropdown-dialog {\n position: fixed;\n width: var(--dropdown-width, 200px);\n max-width: 100vw;\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n box-sizing: border-box;\n padding: var(--dropdown-padding, 20px);\n /* Modal handles z-index automatically */\n\n /* Hidden by default */\n opacity: 0;\n transition: opacity 400ms ease;\n\n transform: translate(var(--dropdown-offset-x, 0px), var(--dropdown-offset-y, 0px));\n top: -1000px;\n left: -1000px;\n}\n\n/* When opened via showModal(), apply flex layout and direction */\n.dropdown-dialog[open] {\n display: flex;\n flex-direction: column;\n}\n\n/* Direction-based positioning with CSS classes */\n.dropdown-dialog.position-below {\n left: var(--dropdown-x);\n top: var(--dropdown-y);\n}\n\n.dropdown-dialog.position-above {\n left: var(--dropdown-x);\n bottom: var(--dropdown-y);\n top: auto;\n flex-direction: column-reverse;\n}\n\n.dropdown-dialog.position-above .dropdown-header {\n margin-top: 4px;\n}\n\n.dropdown-dialog.position-below .dropdown-header {\n margin-bottom: 4px;\n}\n\n.dropdown-dialog.position-below .dropdown-options {\n /* Optional: Add upward-pointing shadow for below positioning */\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1), var(--ty-shadow-md);\n}\n\n/* Animate when .open class is added */\n.dropdown-dialog.open {\n opacity: 1;\n}\n\n.dropdown-dialog.open .dropdown-options {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.dropdown-dialog::backdrop {\n background: transparent;\n}\n\n/* ===== DIALOG HEADER ===== */\n\n.dropdown-header {\n display: flex;\n align-items: center;\n gap: var(--ty-spacing-2);\n position: relative;\n}\n\n.dropdown-search-input {\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n background: var(--input-bg, var(--ty-input-bg));\n color: var(--input-color, var(--ty-input-color));\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-md);\n font-family: var(--ty-font-sans);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-normal);\n min-height: var(--ty-size-md);\n padding: var(--ty-spacing-2) var(--ty-spacing-3);\n padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));\n transition: var(--ty-transition-all);\n outline: none;\n}\n\n.dropdown-search-input:focus {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n.dropdown-search-input:disabled {\n background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.dropdown-search-input::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n}\n\n.dropdown-search-chevron {\n position: absolute;\n top: 50%;\n right: var(--ty-spacing-3);\n transform: translateY(-50%);\n width: 1rem;\n height: 1rem;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n transition: var(--ty-transition-transform);\n pointer-events: none;\n}\n\n.dropdown-search-chevron.open {\n transform: translateY(-50%) rotate(180deg);\n}\n\n.dropdown-search-chevron svg {\n width: 100%;\n height: 100%;\n}\n\n/* ===== MULTISELECT-SPECIFIC STYLES ===== */\n\n/* Multiselect stub modifications */\n.multiselect-stub {\n min-height: 2.5rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n align-items: center;\n padding: 0.5rem 2.5rem 0.5rem 0.75rem;\n /* Transitions - includes opacity for open state */\n transition: var(--ty-transition-all), opacity 0.2s ease;\n outline: none;\n background: var(--input-bg, var(--ty-input-bg));\n color: var(--input-color, var(--ty-input-color));\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-md);\n font-family: var(--ty-font-sans);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n cursor: pointer;\n position: relative;\n width: 100%;\n box-sizing: border-box;\n}\n\n.multiselect-stub:hover {\n border-color: var(--input-border-hover, var(--ty-input-border-hover));\n}\n\n.multiselect-stub[disabled] {\n background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n/* Hide stub when dropdown is open */\n.dropdown-wrapper:has(.dropdown-chevron.open) .multiselect-stub {\n opacity: 0;\n pointer-events: none;\n}\n\n/* Hide stub chips when mobile dialog is open (let modal show them) */\n.dropdown-mode-mobile .dropdown-wrapper:has(.mobile-dialog[open]) .multiselect-chips {\n display: none;\n}\n\n/* When tags are present, reduce padding to make room */\n.multiselect-stub.has-tags {\n padding: 0.25rem 2.5rem 0.25rem 0.5rem;\n width: 100%;\n}\n\n.multiselect-stub.has-tags slot[name=\"selected\"] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n}\n\n/* ===== CHEVRON INDICATOR ===== */\n\n.dropdown-chevron {\n position: absolute;\n top: 50%;\n right: var(--ty-spacing-3);\n transform: translateY(-50%);\n width: 1rem;\n height: 1rem;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n transition: var(--ty-transition-transform);\n pointer-events: none;\n}\n\n.dropdown-chevron.open {\n transform: translateY(-50%) rotate(180deg);\n}\n\n.dropdown-chevron svg {\n width: 100%;\n height: 100%;\n}\n\n\n/* Tags container */\n.multiselect-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n min-width: 0;\n}\n\n.dropdown-placeholder {\n flex-grow: 1;\n color: var(--input-placeholder, var(--ty-input-placeholder, #9ca3af));\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-light);\n font-style: italic;\n}\n\n/* Placeholder styling when tags are present */\n.dropdown-placeholder.hidden {\n display: none;\n}\n\n/* Options area styling - Override for multiselect */\n.dropdown-options {\n opacity: 0;\n background: var(--input-bg, var(--ty-input-bg));\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-lg);\n max-height: 16rem;\n width: 100%;\n max-width: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n scroll-behavior: smooth;\n box-sizing: border-box;\n position: relative;\n box-shadow:\n 0 20px 25px -5px rgba(0, 0, 0, 0.1),\n 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n\n /* Animation properties */\n transform: translateY(-8px) scale(0.95);\n transition:\n opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n\n /* Multiselect-specific: flex wrap for tags */\n display: flex;\n flex-wrap: wrap;\n padding: 0.5rem;\n gap: 0.5rem;\n\n}\n\n/* Hide native scrollbar only when custom scrollbar is active */\n.dropdown-options.ty-custom-scroll {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.dropdown-options.ty-custom-scroll::-webkit-scrollbar {\n display: none;\n}\n\n/* Options wrapper - positioned container for scrollbar track */\n.dropdown-options-wrapper {\n position: relative;\n}\n\n/* Show custom scrollbar on hover */\n.dropdown-options-wrapper:hover .ty-scrollbar-track-y.has-overflow {\n opacity: 1;\n}\n\n/* Make ty-tags in dropdown clickable with pointer cursor */\n.dropdown-options ty-tag {\n user-select: none;\n transition: transform 0.1s ease;\n}\n\n.dropdown-options ty-tag:hover {\n transform: scale(1.02);\n}\n\n.dropdown-options ty-tag:active {\n transform: scale(0.98);\n}\n\n/* Visual feedback for selected tags in options */\n.dropdown-options ty-tag[selected] {\n opacity: 0.5;\n}\n\n/* Ensure ty-tag components in multiselect have proper sizing */\n.multiselect-chips ty-tag {\n max-width: 150px;\n}\n\n/* Responsive adjustments */\n@media (max-width: 640px) {\n .multiselect-chips ty-tag {\n max-width: 100px;\n }\n}\n\n\n/* Ensure proper spacing in container layouts */\n.multiselect-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n/* ===== DROPDOWN WRAPPER & LABEL ===== */\n\n.dropdown-wrapper {\n position: relative;\n display: block;\n width: 100%;\n}\n\n.ty-field-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: 6px;\n padding-left: 12px;\n display: flex;\n align-items: center;\n}\n\n/* Required indicator - using SVG icon */\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: #ef4444;\n width: 12px;\n height: 12px;\n vertical-align: middle;\n margin-left: 4px;\n}\n\n.required-icon svg {\n width: 100%;\n height: 100%;\n}\n\n:host([disabled]) .multiselect-container {\n pointer-events: none;\n}\n\n/* ============================================================================\n MOBILE MODAL STYLES\n ============================================================================ */\n\n.dropdown-mode-mobile .mobile-dialog {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100vw;\n height: 100vh;\n max-width: 100vw;\n max-height: 100vh;\n margin: 0;\n padding: 0;\n padding-top: 10vh; /* Position content from top */\n border: none;\n background: transparent; /* Backdrop handles background */\n /* Note: Don't set display - browser controls <dialog> visibility */\n align-items: flex-start;\n justify-content: center;\n opacity: 0;\n transition: opacity 300ms ease;\n}\n\n/* When opened via showModal(), add flex layout */\n.dropdown-mode-mobile .mobile-dialog[open] {\n display: flex;\n}\n\n.dropdown-mode-mobile .mobile-dialog.open {\n opacity: 1;\n}\n\n/* Native dialog backdrop with blur */\n.dropdown-mode-mobile .mobile-dialog::backdrop {\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n}\n\n.dropdown-mode-mobile .mobile-dialog-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: calc(100% - 32px); /* Side margins */\n max-width: 400px; /* Constrained width like dropdown */\n min-height: 200px;\n max-height: calc(90vh - 10vh);\n opacity: 0;\n transform: scale(0.95);\n transition: \n opacity 300ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 300ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.dropdown-mode-mobile .mobile-dialog.open .mobile-dialog-content {\n opacity: 1;\n transform: scale(1);\n}\n\n.dropdown-mode-mobile .mobile-search-input:focus {\n border-color: var(--ty-border);\n}\n\n/* Mobile search header - label floats above, search + close below */\n.dropdown-mode-mobile .mobile-search-header {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n padding: 0;\n background: transparent;\n position: relative;\n}\n\n.dropdown-mode-mobile .mobile-header-content {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n}\n\n/* Header for non-searchable (label + close button) */\n.dropdown-mode-mobile .mobile-header-nosearch {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-bottom: 16px;\n padding: 0;\n background: transparent;\n position: relative;\n min-height: 40px;\n}\n\n.dropdown-mode-mobile .mobile-header-label {\n position: absolute;\n bottom: 100%;\n left: 6px;\n margin-bottom: 4px;\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n font-weight: 700;\n color: var(--ty-color-neutral);\n pointer-events: none;\n}\n\n/* Close button - circular with border (matches dropdown.ts) */\n.dropdown-mode-mobile .mobile-close-button {\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--ty-surface-floating);\n border: 2px solid var(--mobile-border-color);\n border-radius: 50%;\n color: var(--ty-text-strong);\n cursor: pointer;\n transition: var(--ty-transition-all);\n padding: 0;\n}\n\n.dropdown-mode-mobile .mobile-close-button:hover {\n background: var(--ty-bg-neutral);\n border-color: var(--ty-border);\n color: var(--ty-text-strong);\n}\n\n.dropdown-mode-mobile .mobile-close-button:active {\n transform: scale(0.9);\n}\n\n.dropdown-mode-mobile .mobile-close-button svg {\n width: 24px;\n height: 24px;\n}\n\n/* Mobile search input (matches dropdown.ts) */\n.dropdown-mode-mobile .mobile-search-input {\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n background: var(--ty-surface-floating);\n color: var(--ty-text);\n border: 2px solid;\n border-color: var(--mobile-border-color);\n border-radius: var(--ty-radius-md);\n font-family: var(--ty-font-sans);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-normal);\n padding: var(--ty-spacing-2) var(--ty-spacing-3);\n height: 40px;\n transition: var(--ty-transition-all);\n outline: none;\n}\n\n.dropdown-mode-mobile .mobile-search-input::placeholder {\n color: var(--ty-text-faint);\n}\n\n.dropdown-mode-mobile .mobile-search-input:focus {\n border-color: var(--ty-border);\n}\n\n/* ============================================================================\n MOBILE BODY & SECTIONS - UPDATED STRUCTURE\n ============================================================================ */\n\n/* Mobile body - contains both sections */\n.dropdown-mode-mobile .mobile-body {\n position: relative;\n display: flex;\n flex-direction: column;\n height: var(--body-height, 350px);\n max-height: 350px;\n overflow: hidden;\n background: var(--ty-surface-floating);\n border-radius: var(--ty-radius-lg);\n box-shadow: \n 0 20px 25px -5px rgba(0, 0, 0, 0.1),\n 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n border: 2px solid;\n border-color: var(--mobile-border-color);\n}\n\n/* ===== SECTION HEADERS - Labels, not buttons ===== */\n\n.dropdown-mode-mobile .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 36px;\n flex-shrink: 0;\n padding: 0 16px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--ty-text-bold);\n background: transparent;\n cursor: default;\n user-select: none;\n}\n\n.dropdown-mode-mobile .section-header .section-title {\n flex: 1;\n}\n\n.dropdown-mode-mobile .section-header .section-count {\n font-weight: 500;\n color: var(--ty-text-faint);\n margin-left: 0.25rem;\n}\n\n/* ===== SELECTED STRIP - pinned, capped height, collapses when empty ===== */\n\n.dropdown-mode-mobile .mobile-selected-section {\n display: flex;\n flex-direction: column;\n background: var(--ty-input-bg);\n overflow: hidden;\n flex: 0 0 auto;\n max-height: 40%;\n transition: max-height 200ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Empty: collapse to header only */\n.dropdown-mode-mobile .mobile-selected-section[data-empty=\"true\"] {\n max-height: 36px;\n flex: 0 0 36px;\n}\n\n.dropdown-mode-mobile .mobile-selected-section .section-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 0.75rem 1rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-content: flex-start;\n /* Soft fade at bottom edge \u2014 hints at scrollable overflow */\n -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 12px), transparent);\n mask-image: linear-gradient(to bottom, black calc(100% - 12px), transparent);\n}\n\n/* ===== AVAILABLE LIST - takes remaining space ===== */\n\n.dropdown-mode-mobile .mobile-available-section {\n display: flex;\n flex-direction: column;\n background: var(--ty-input-bg);\n overflow: hidden;\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.dropdown-mode-mobile .mobile-available-section .section-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 0.75rem 1rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-content: flex-start;\n}\n\n/* ===== EMPTY STATES =====\n Selected strip collapses (no text needed).\n Available shows the empty message only when there are zero tags total. */\n\n.dropdown-mode-mobile .empty-state {\n display: none;\n width: 100%;\n padding: 2rem 1rem;\n text-align: center;\n color: var(--ty-text-faint);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-style: italic;\n}\n\n.dropdown-mode-mobile .mobile-available-section[data-empty=\"true\"] .empty-state {\n display: block;\n}\n\n.dropdown-mode-mobile .mobile-selected-section[data-empty=\"true\"] .section-content,\n.dropdown-mode-mobile .mobile-available-section[data-empty=\"true\"] slot {\n display: none;\n}\n\n/* ===== TAG STYLING IN MOBILE ===== */\n\n.dropdown-mode-mobile .section-content ::slotted(ty-tag) {\n cursor: pointer;\n user-select: none;\n transition: transform 0.1s ease;\n margin: 2px 0; /* Vertical spacing like dropdown options */\n /* Fade + scale entry \u2014 replays on each (re)insertion when a tag moves\n between selected and available slots */\n animation: ty-multiselect-tag-enter 180ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@media (hover: hover) {\n .dropdown-mode-mobile .section-content ::slotted(ty-tag:hover) {\n transform: scale(1.02);\n }\n}\n\n.dropdown-mode-mobile .section-content ::slotted(ty-tag:active) {\n transform: scale(0.96);\n}\n\n/* Dimmed appearance for hidden filtered tags */\n.dropdown-mode-mobile .section-content ::slotted(ty-tag[hidden]) {\n display: none !important;\n}\n\n@keyframes ty-multiselect-tag-enter {\n from { opacity: 0; transform: scale(0.85); }\n to { opacity: 1; transform: scale(1); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dropdown-mode-mobile .section-content ::slotted(ty-tag) {\n animation: none;\n }\n}\n\n/* ==================== LOADING STATE ====================\n Spinner overlay shown inside the options area while the parent\n (external-search mode) is fetching. Search input stays usable.\n\n Carries its own surface so it stays visible even when the host\n has restyled the popup with a transparent or unusual background.\n Override with --ty-loader-bg / --ty-loader-radius / --ty-loader-border.\n*/\n.dropdown-loading {\n display: none;\n align-items: center;\n justify-content: center;\n gap: var(--ty-spacing-2);\n padding: var(--ty-spacing-4) var(--ty-spacing-3);\n color: var(--ty-text-soft);\n font-size: var(--ty-font-sm);\n min-height: 4rem;\n /* Match the .dropdown-options popup look \u2014 same background, border, radius, shadow */\n background: var(--ty-loader-bg, var(--input-bg, var(--ty-input-bg)));\n border: 1px solid var(--ty-loader-border, var(--input-border, var(--ty-input-border)));\n border-radius: var(--ty-loader-radius, var(--ty-radius-lg));\n box-shadow: var(--ty-loader-shadow, 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04));\n box-sizing: border-box;\n}\n\n.dropdown-options-wrapper.loading .dropdown-loading {\n display: flex;\n}\n\n/* Slot is transparent for layout \u2014 fallback (spinner + text) and user-provided\n slotted content both act as direct flex children of .dropdown-loading. */\n.dropdown-loading > slot[name=\"loading\"] {\n display: contents;\n}\n\n/* Mobile: full-screen dialog is the surface \u2014 drop the card chrome,\n stack vertically, scale up so it feels native to a fullscreen view.\n Slotted content adapts automatically since the slot is display:contents. */\n.dropdown-mode-mobile .dropdown-loading {\n background: transparent;\n border: none;\n box-shadow: none;\n flex: 1;\n flex-direction: column;\n gap: var(--ty-spacing-3);\n padding: var(--ty-spacing-8) var(--ty-spacing-4);\n min-height: 12rem;\n}\n\n.dropdown-mode-mobile .dropdown-loading-spinner {\n width: 2rem;\n height: 2rem;\n}\n\n.dropdown-mode-mobile .dropdown-loading-text {\n font-size: var(--ty-font-base);\n}\n\n.dropdown-options-wrapper.loading .dropdown-options,\n.dropdown-options-wrapper.loading > slot#options-slot,\n.dropdown-options-wrapper.loading .empty-state {\n display: none;\n}\n\n.dropdown-loading-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.125rem;\n height: 1.125rem;\n flex-shrink: 0;\n animation: ty-multiselect-spin 0.7s linear infinite;\n color: var(--ty-color-primary);\n}\n\n.dropdown-loading-spinner svg {\n width: 100%;\n height: 100%;\n}\n\n.dropdown-loading-text {\n color: var(--ty-text-soft);\n}\n\n@keyframes ty-multiselect-spin {\n to { transform: rotate(360deg); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dropdown-loading-spinner {\n animation-duration: 1.6s;\n }\n}\n\n/* Custom scrollbar styles */\n\n/* ===================================== */\n/* Custom Scrollbar - Vertical Track */\n/* ===================================== */\n\n.ty-scrollbar-track-y {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-y.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-y.has-overflow:hover,\n.ty-scrollbar-track-y.has-overflow.scrolling,\n.ty-scrollbar-track-y.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-y::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-y:hover::before,\n.ty-scrollbar-track-y.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-y {\n position: absolute;\n right: 0;\n width: 100%;\n min-height: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-y:hover,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-y:active,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Custom Scrollbar - Horizontal Track */\n/* ===================================== */\n\n.ty-scrollbar-track-x {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-x.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-x.has-overflow:hover,\n.ty-scrollbar-track-x.has-overflow.scrolling,\n.ty-scrollbar-track-x.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-x::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-x:hover::before,\n.ty-scrollbar-track-x.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-x {\n position: absolute;\n bottom: 0;\n height: 100%;\n min-width: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-x:hover,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-x:active,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Touch devices - hide custom scrollbar */\n/* ===================================== */\n\n@media (pointer: coarse) and (hover: none) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x {\n display: none !important;\n }\n}\n\n/* Respect reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x,\n .ty-scrollbar-thumb-y,\n .ty-scrollbar-thumb-x {\n transition-duration: 0ms !important;\n }\n}\n\n";
|
|
5
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
6
|
+
export declare const selectCustomFlavorCss: (base: string) => string;
|
|
7
|
+
export declare const multiselectStyles: string;
|
|
6
8
|
//# sourceMappingURL=multiselect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiselect.d.ts","sourceRoot":"","sources":["../../src/styles/multiselect.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"multiselect.d.ts","sourceRoot":"","sources":["../../src/styles/multiselect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAAkC,CAAC;AAErF,eAAO,MAAM,iBAAiB,QAqzB7B,CAAC"}
|
|
@@ -2,7 +2,28 @@
|
|
|
2
2
|
* Multiselect Component Styles
|
|
3
3
|
* PORTED FROM: clj/ty/components/multiselect.css
|
|
4
4
|
*/
|
|
5
|
+
import { FLAVORS } from "../types/common.js";
|
|
5
6
|
import { customScrollbarStyles } from "./custom-scrollbar.js";
|
|
7
|
+
/* Flavor rules only set --select-accent (border) and --select-accent-bold
|
|
8
|
+
(hover border); the .multiselect-stub rules below consume them. Doubles
|
|
9
|
+
as the per-instance override API: `ty-select { --select-accent: … }`.
|
|
10
|
+
Neutral is skipped — it IS the default unstyled chrome (--ty-input-*
|
|
11
|
+
tokens), same convention as ty-input/ty-date-picker. Fallback flavor `fb`
|
|
12
|
+
is used for custom flavors so missing tokens degrade to neutral. */
|
|
13
|
+
const selectFlavor = (f, fb) => {
|
|
14
|
+
const c = (s) => fb
|
|
15
|
+
? s
|
|
16
|
+
? `var(--ty-color-${f}${s}, var(--ty-color-${f}, var(--ty-color-${fb}${s})))`
|
|
17
|
+
: `var(--ty-color-${f}, var(--ty-color-${fb}))`
|
|
18
|
+
: `var(--ty-color-${f}${s})`;
|
|
19
|
+
return `
|
|
20
|
+
:host([flavor="${f}"]) { --select-accent: var(--ty-input-${f}-border, ${c("")}); --select-accent-bold: ${c("-bold")}; }
|
|
21
|
+
:host([flavor="${f}+"]) { --select-accent: ${c("-strong")}; --select-accent-bold: ${c("-strong")}; }
|
|
22
|
+
:host([flavor="${f}-"]) { --select-accent: ${c("-soft")}; --select-accent-bold: ${c("")}; }
|
|
23
|
+
`;
|
|
24
|
+
};
|
|
25
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
26
|
+
export const selectCustomFlavorCss = (base) => selectFlavor(base, "neutral");
|
|
6
27
|
export const multiselectStyles = `
|
|
7
28
|
/* Multiselect-specific styles extending dropdown base styles */
|
|
8
29
|
|
|
@@ -160,7 +181,7 @@ export const multiselectStyles = `
|
|
|
160
181
|
outline: none;
|
|
161
182
|
background: var(--input-bg, var(--ty-input-bg));
|
|
162
183
|
color: var(--input-color, var(--ty-input-color));
|
|
163
|
-
border: 1px solid var(--input-border, var(--ty-input-border));
|
|
184
|
+
border: 1px solid var(--select-accent, var(--input-border, var(--ty-input-border)));
|
|
164
185
|
border-radius: var(--ty-radius-md);
|
|
165
186
|
font-family: var(--ty-font-sans);
|
|
166
187
|
font-size: var(--ty-font-sm);
|
|
@@ -173,7 +194,7 @@ export const multiselectStyles = `
|
|
|
173
194
|
}
|
|
174
195
|
|
|
175
196
|
.multiselect-stub:hover {
|
|
176
|
-
border-color: var(--input-border-hover, var(--ty-input-border-hover));
|
|
197
|
+
border-color: var(--select-accent-bold, var(--input-border-hover, var(--ty-input-border-hover)));
|
|
177
198
|
}
|
|
178
199
|
|
|
179
200
|
.multiselect-stub[disabled] {
|
|
@@ -821,5 +842,8 @@ export const multiselectStyles = `
|
|
|
821
842
|
|
|
822
843
|
/* Custom scrollbar styles */
|
|
823
844
|
${customScrollbarStyles}
|
|
845
|
+
|
|
846
|
+
/* ===== FLAVOR VARIANTS (set --select-accent*, consumed above) ===== */
|
|
847
|
+
${FLAVORS.filter((f) => f !== "neutral").map((f) => selectFlavor(f)).join("")}
|
|
824
848
|
`;
|
|
825
849
|
//# sourceMappingURL=multiselect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiselect.js","sourceRoot":"","sources":["../../src/styles/multiselect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAizB/B,qBAAqB;
|
|
1
|
+
{"version":3,"file":"multiselect.js","sourceRoot":"","sources":["../../src/styles/multiselect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;sEAKsE;AACtE,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CACtB,EAAE;QACA,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,GAAG,CAAC,KAAK;YAC7E,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,IAAI;QACjD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,OAAO;iBACQ,CAAC,0CAA0C,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC;iBACnG,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,SAAS,CAAC;iBAC/E,CAAC,2BAA2B,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC;CACtF,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAizB/B,qBAAqB;;;EAGrB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CAC5E,CAAC"}
|
package/lib/styles/radio.d.ts
CHANGED
|
@@ -4,5 +4,7 @@
|
|
|
4
4
|
* ty-radio-group: optional label + vertical/horizontal stack of radios + error message
|
|
5
5
|
* ty-radio: circle with inner dot when checked
|
|
6
6
|
*/
|
|
7
|
-
export declare const radioStyles = "\n\n:host {\n display: block;\n font-family: var(--ty-font-sans);\n width: 100%;\n}\n\n:host([size=\"xl\"]) {\n font-size: 20px;\n}\n\n\n:host([size=\"xs\"]) {\n font-size: 12px;\n}\n\n\n:host([size=\"sm\"]) {\n font-size: 14px;\n}\n\n:host([size=\"lg\"]) {\n font-size: 18px;\n}\n\n.input-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ===== LABEL STYLING ===== */\n\n.ty-field-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: 6px;\n padding-left: 12px;\n display: flex;\n align-items: center;\n}\n\n/* Required indicator - using SVG icon */\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: var(--ty-color-danger);\n width: 12px;\n height: 12px;\n margin-left: 4px;\n vertical-align: middle;\n}\n\n.required-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* ===== INPUT WRAPPER WITH SLOTS ===== */\n\n.input-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* No gap by default */\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-base);\n background: var(--input-bg, var(--input-bg, var(--ty-input-bg)));\n transition: all 0.15s ease-in-out;\n \n /* Default size (md) */\n min-height: 40px;\n padding: 0 12px;\n}\n\n/* Wrapper states */\n.input-wrapper:hover:not(.disabled) {\n border-color: var(--input-border-hover, var(--ty-input-border-hover));\n}\n\n.input-wrapper.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n.input-wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--input-disabled-bg, var(--ty-input-disabled-bg));\n border-color: var(--input-disabled-border, var(--ty-input-disabled-border));\n}\n\n/* ===== SLOT STYLING ===== */\n\n/* Style slotted content directly (no wrappers needed) */\n::slotted([slot=\"start\"]),\n::slotted([slot=\"end\"]) {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--ty-color-text-soft);\n}\n\n/* Password reveal toggle (rendered for type=\"password\") */\n.password-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n transition: color 0.15s ease-in-out;\n}\n.password-toggle:hover {\n color: var(--input-color, var(--ty-input-color));\n}\n.password-toggle:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n.password-toggle svg {\n width: 1rem;\n height: 1rem;\n}\n\n/* Icon sizing for slotted icons */\n::slotted(ty-icon) {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n}\n\n/* ===== ERROR MESSAGE STYLING ===== */\n\n.error-message {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n color: var(--ty-color-danger);\n margin-top: 4px;\n padding-left: 12px;\n}\n\n/* Error state for wrapper */\n.input-wrapper.error {\n border-color: var(--ty-color-danger);\n background: var(--ty-bg-danger-soft);\n}\n\n.input-wrapper.error.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== INPUT BASE STYLING ===== */\n\ninput {\n /* Reset and base styles \u2014 Linear-paired typography */\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n color: var(--input-color, var(--ty-input-color));\n font-family: inherit;\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-normal);\n padding: 0;\n margin: 0;\n}\n\n/* Remove number input spinner arrows */\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=\"number\"] {\n -moz-appearance: textfield;\n}\n\n/* Disabled state */\ninput:disabled {\n cursor: not-allowed;\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n}\n\n/* Placeholder styling */\ninput::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n font-weight: 400;\n}\n\n/* ===== SIZE MODIFIERS ===== */\n\n/* Extra Small */\n.input-wrapper.xs {\n min-height: 32px;\n padding: 0 8px;\n border-radius: var(--ty-input-radius-xs, var(--ty-radius-base));\n}\n\n.input-wrapper.xs input {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n}\n\n/* Small */\n.input-wrapper.sm {\n min-height: 36px;\n padding: 0 10px;\n border-radius: var(--ty-input-radius-sm, var(--ty-radius-base));\n}\n\n.input-wrapper.sm input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Medium (default) */\n.input-wrapper.md {\n min-height: 40px;\n padding: 0 12px;\n border-radius: var(--ty-input-radius-md, var(--ty-radius-base));\n}\n\n.input-wrapper.md input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Large */\n.input-wrapper.lg {\n min-height: 44px;\n padding: 0 14px;\n border-radius: var(--ty-input-radius-lg, var(--ty-radius-base));\n}\n\n.input-wrapper.lg input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n}\n\n/* Extra Large */\n.input-wrapper.xl {\n min-height: 48px;\n padding: 0 16px;\n border-radius: var(--ty-input-radius-xl, var(--ty-radius-base));\n}\n\n.input-wrapper.xl input {\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n}\n\n/* ===== SEMANTIC FLAVOR MODIFIERS ===== */\n\n/* Primary */\n.input-wrapper.primary {\n border-color: var(--ty-input-primary-border, var(--ty-color-primary));\n}\n\n.input-wrapper.primary:hover:not(.disabled) {\n border-color: var(--ty-color-primary-bold);\n}\n\n.input-wrapper.primary.focused {\n border-color: var(--ty-color-primary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);\n}\n\n/* Secondary */\n.input-wrapper.secondary {\n border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));\n}\n\n.input-wrapper.secondary.focused {\n border-color: var(--ty-color-secondary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);\n}\n\n/* Success */\n.input-wrapper.success {\n border-color: var(--ty-input-success-border);\n}\n\n.input-wrapper.success:hover:not(.disabled) {\n border-color: var(--ty-color-success-bold);\n}\n\n.input-wrapper.success.focused {\n border-color: var(--ty-color-success-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);\n}\n\n/* Danger */\n.input-wrapper.danger {\n border-color: var(--ty-input-danger-border);\n}\n\n.input-wrapper.danger:hover:not(.disabled) {\n border-color: var(--ty-color-danger-bold);\n}\n\n.input-wrapper.danger.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);\n}\n\n/* Warning */\n.input-wrapper.warning {\n border-color: var(--ty-input-warning-border);\n}\n\n.input-wrapper.warning:hover:not(.disabled) {\n border-color: var(--ty-color-warning-bold);\n}\n\n.input-wrapper.warning.focused {\n border-color: var(--ty-color-warning-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);\n}\n\n/* Neutral (default) */\n.input-wrapper.neutral.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== ACCESSIBILITY ENHANCEMENTS ===== */\n\ninput:focus-visible {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .input-wrapper {\n border-width: 2px;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .input-wrapper {\n transition: none;\n }\n}\n\n/* ===== RESPONSIVE BEHAVIOR ===== */\n\n@media (max-width: 640px) {\n .input-wrapper.lg {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.lg input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n\n .input-wrapper.xl {\n min-height: 44px;\n padding: 0 14px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n }\n}\n\n@media (max-width: 480px) {\n .input-wrapper.xl {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n}\n\n\n/* Override input's :host. ty-radio is just the circle (inline);\n ty-radio-group is a form-field block. */\n:host(ty-radio) {\n display: inline-flex;\n width: auto;\n vertical-align: middle;\n}\n\n:host(ty-radio-group) {\n display: block;\n width: 100%;\n}\n\n/* ===== RADIO GROUP ===== */\n.radio-group-container {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n font-family: var(--ty-font-sans);\n color: var(--ty-color-text);\n}\n\n.radio-group-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-color-text);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.radio-group-list {\n display: flex;\n gap: 0.6rem;\n align-items: flex-start;\n}\n\n.radio-group-list.vertical {\n flex-direction: column;\n align-items: flex-start;\n}\n\n.radio-group-list.horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n}\n\n.radio-group-error {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n color: var(--ty-color-danger);\n}\n\n.radio-group-container .required-icon {\n width: 0.65em;\n height: 0.65em;\n color: var(--ty-color-danger);\n}\n.radio-group-container .required-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* ===== RADIO ITEM (just the circle) ===== */\n.radio-container {\n display: inline-block;\n cursor: pointer;\n user-select: none;\n outline: none;\n vertical-align: middle;\n}\n\n.radio-container.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.radio-container:focus-visible .radio-circle,\n.radio-container.focused .radio-circle {\n box-shadow: 0 0 0 3px var(--ty-input-shadow-focus);\n}\n\n.radio-circle {\n position: relative;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid var(--ty-input-border);\n background: var(--ty-input-bg);\n box-sizing: border-box;\n transition: border-color 0.15s ease-in-out;\n}\n\n.radio-circle::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--ty-color-primary);\n transform: translate(-50%, -50%) scale(0);\n transition: transform 0.15s ease-in-out;\n}\n\n.radio-container[aria-checked=\"true\"] .radio-circle {\n border-color: var(--ty-color-primary);\n}\n\n.radio-container[aria-checked=\"true\"] .radio-circle::after {\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Size variants */\n.radio-container.xs .radio-circle { width: 14px; height: 14px; }\n.radio-container.xs .radio-circle::after { width: 6px; height: 6px; }\n\n.radio-container.sm .radio-circle { width: 16px; height: 16px; }\n.radio-container.sm .radio-circle::after { width: 7px; height: 7px; }\n\n.radio-container.lg .radio-circle { width: 22px; height: 22px; }\n.radio-container.lg .radio-circle::after { width: 10px; height: 10px; }\n\n.radio-container.xl .radio-circle { width: 26px; height: 26px; }\n.radio-container.xl .radio-circle::after { width: 12px; height: 12px; }\n\n/* Flavor variants \u2014 color of inner dot + checked border */\n.radio-container.primary[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-primary); }\n.radio-container.primary .radio-circle::after { background: var(--ty-color-primary); }\n\n.radio-container.secondary[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-secondary); }\n.radio-container.secondary .radio-circle::after { background: var(--ty-color-secondary); }\n\n.radio-container.success[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-success); }\n.radio-container.success .radio-circle::after { background: var(--ty-color-success); }\n\n.radio-container.danger[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-danger); }\n.radio-container.danger .radio-circle::after { background: var(--ty-color-danger); }\n\n.radio-container.warning[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-warning); }\n.radio-container.warning .radio-circle::after { background: var(--ty-color-warning); }\n\n.radio-container.neutral[aria-checked=\"true\"] .radio-circle { border-color: var(--ty-color-neutral); }\n.radio-container.neutral .radio-circle::after { background: var(--ty-color-neutral); }\n";
|
|
7
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
8
|
+
export declare const radioCustomFlavorCss: (base: string) => string;
|
|
9
|
+
export declare const radioStyles: string;
|
|
8
10
|
//# sourceMappingURL=radio.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../src/styles/radio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../src/styles/radio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,WAAiC,CAAC;AAEnF,eAAO,MAAM,WAAW,QAyIvB,CAAC"}
|
package/lib/styles/radio.js
CHANGED
|
@@ -4,7 +4,24 @@
|
|
|
4
4
|
* ty-radio-group: optional label + vertical/horizontal stack of radios + error message
|
|
5
5
|
* ty-radio: circle with inner dot when checked
|
|
6
6
|
*/
|
|
7
|
+
import { FLAVORS } from "../types/common.js";
|
|
7
8
|
import { inputStyles } from "./input.js";
|
|
9
|
+
/* Flavor rules only set --radio-color (checked border + inner dot); base
|
|
10
|
+
rules below consume it. Doubles as the per-instance override API:
|
|
11
|
+
`ty-radio { --radio-color: … }`. Fallback flavor `fb` is used for custom
|
|
12
|
+
flavors so missing tokens degrade to neutral. */
|
|
13
|
+
const radioFlavor = (f, fb) => {
|
|
14
|
+
const tok = (s) => fb
|
|
15
|
+
? `var(--ty-color-${f}${s}, var(--ty-color-${fb}${s}))`
|
|
16
|
+
: `var(--ty-color-${f}${s})`;
|
|
17
|
+
return `
|
|
18
|
+
:host([flavor="${f}"]) { --radio-color: ${tok("")}; }
|
|
19
|
+
:host([flavor="${f}+"]) { --radio-color: ${tok("-strong")}; }
|
|
20
|
+
:host([flavor="${f}-"]) { --radio-color: ${tok("-soft")}; }
|
|
21
|
+
`;
|
|
22
|
+
};
|
|
23
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
24
|
+
export const radioCustomFlavorCss = (base) => radioFlavor(base, "neutral");
|
|
8
25
|
export const radioStyles = `
|
|
9
26
|
${inputStyles}
|
|
10
27
|
|
|
@@ -104,6 +121,8 @@ ${inputStyles}
|
|
|
104
121
|
transition: border-color 0.15s ease-in-out;
|
|
105
122
|
}
|
|
106
123
|
|
|
124
|
+
/* Default (no flavor attribute) is primary — defaults don't reflect to the
|
|
125
|
+
host attribute, so the base rules' fallback carries the default look. */
|
|
107
126
|
.radio-circle::after {
|
|
108
127
|
content: "";
|
|
109
128
|
position: absolute;
|
|
@@ -112,13 +131,13 @@ ${inputStyles}
|
|
|
112
131
|
width: 8px;
|
|
113
132
|
height: 8px;
|
|
114
133
|
border-radius: 50%;
|
|
115
|
-
background: var(--ty-color-primary);
|
|
134
|
+
background: var(--radio-color, var(--ty-color-primary));
|
|
116
135
|
transform: translate(-50%, -50%) scale(0);
|
|
117
136
|
transition: transform 0.15s ease-in-out;
|
|
118
137
|
}
|
|
119
138
|
|
|
120
139
|
.radio-container[aria-checked="true"] .radio-circle {
|
|
121
|
-
border-color: var(--ty-color-primary);
|
|
140
|
+
border-color: var(--radio-color, var(--ty-color-primary));
|
|
122
141
|
}
|
|
123
142
|
|
|
124
143
|
.radio-container[aria-checked="true"] .radio-circle::after {
|
|
@@ -138,23 +157,7 @@ ${inputStyles}
|
|
|
138
157
|
.radio-container.xl .radio-circle { width: 26px; height: 26px; }
|
|
139
158
|
.radio-container.xl .radio-circle::after { width: 12px; height: 12px; }
|
|
140
159
|
|
|
141
|
-
/* Flavor variants — color
|
|
142
|
-
.
|
|
143
|
-
.radio-container.primary .radio-circle::after { background: var(--ty-color-primary); }
|
|
144
|
-
|
|
145
|
-
.radio-container.secondary[aria-checked="true"] .radio-circle { border-color: var(--ty-color-secondary); }
|
|
146
|
-
.radio-container.secondary .radio-circle::after { background: var(--ty-color-secondary); }
|
|
147
|
-
|
|
148
|
-
.radio-container.success[aria-checked="true"] .radio-circle { border-color: var(--ty-color-success); }
|
|
149
|
-
.radio-container.success .radio-circle::after { background: var(--ty-color-success); }
|
|
150
|
-
|
|
151
|
-
.radio-container.danger[aria-checked="true"] .radio-circle { border-color: var(--ty-color-danger); }
|
|
152
|
-
.radio-container.danger .radio-circle::after { background: var(--ty-color-danger); }
|
|
153
|
-
|
|
154
|
-
.radio-container.warning[aria-checked="true"] .radio-circle { border-color: var(--ty-color-warning); }
|
|
155
|
-
.radio-container.warning .radio-circle::after { background: var(--ty-color-warning); }
|
|
156
|
-
|
|
157
|
-
.radio-container.neutral[aria-checked="true"] .radio-circle { border-color: var(--ty-color-neutral); }
|
|
158
|
-
.radio-container.neutral .radio-circle::after { background: var(--ty-color-neutral); }
|
|
160
|
+
/* Flavor variants — set --radio-color, consumed by the base rules above */
|
|
161
|
+
${FLAVORS.map((f) => radioFlavor(f)).join("")}
|
|
159
162
|
`;
|
|
160
163
|
//# sourceMappingURL=radio.js.map
|
package/lib/styles/radio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio.js","sourceRoot":"","sources":["../../src/styles/radio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG;EACzB,WAAW
|
|
1
|
+
{"version":3,"file":"radio.js","sourceRoot":"","sources":["../../src/styles/radio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;mDAGmD;AACnD,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC7C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CACxB,EAAE;QACA,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI;QACvD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,OAAO;iBACQ,CAAC,yBAAyB,GAAG,CAAC,EAAE,CAAC;iBACjC,CAAC,yBAAyB,GAAG,CAAC,SAAS,CAAC;iBACxC,CAAC,yBAAyB,GAAG,CAAC,OAAO,CAAC;CACtD,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,WAAW,GAAG;EACzB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuIX,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select Field Styles — shared chrome for ty-select (both single and
|
|
3
|
+
* multiple modes). Formerly split across ty-dropdown / ty-multiselect;
|
|
4
|
+
* those were consolidated into ty-select and this file kept the name.
|
|
5
|
+
*/
|
|
6
|
+
/** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
|
|
7
|
+
export declare const selectCustomFlavorCss: (base: string) => string;
|
|
8
|
+
export declare const selectBaseStyles: string;
|
|
9
|
+
//# sourceMappingURL=select-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-base.d.ts","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAAkC,CAAC;AAErF,eAAO,MAAM,gBAAgB,QAq3B5B,CAAC"}
|