tyrell-components 1.0.0-RC11 → 1.0.0-RC13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/css/tyrell-colors-static.css +316 -0
- package/css/tyrell-theme.css +1454 -0
- package/css/tyrell.css +112 -420
- package/dist/tyrell-colors-static.css +316 -0
- package/dist/tyrell-theme.css +1454 -0
- package/dist/tyrell.css +112 -420
- package/dist/tyrell.js +1 -1
- package/lib/base/ty-component.d.ts +7 -0
- package/lib/base/ty-component.d.ts.map +1 -1
- package/lib/base/ty-component.js +27 -0
- package/lib/base/ty-component.js.map +1 -1
- package/lib/components/button.d.ts +16 -1
- package/lib/components/button.d.ts.map +1 -1
- package/lib/components/button.js +34 -4
- package/lib/components/button.js.map +1 -1
- package/lib/components/calendar-month.d.ts +23 -0
- package/lib/components/calendar-month.d.ts.map +1 -1
- package/lib/components/calendar-month.js +168 -11
- package/lib/components/calendar-month.js.map +1 -1
- package/lib/components/calendar-navigation.d.ts +31 -5
- package/lib/components/calendar-navigation.d.ts.map +1 -1
- package/lib/components/calendar-navigation.js +71 -31
- package/lib/components/calendar-navigation.js.map +1 -1
- package/lib/components/calendar.d.ts +17 -2
- package/lib/components/calendar.d.ts.map +1 -1
- package/lib/components/calendar.js +83 -12
- package/lib/components/calendar.js.map +1 -1
- package/lib/components/checkbox.d.ts +14 -3
- package/lib/components/checkbox.d.ts.map +1 -1
- package/lib/components/checkbox.js +86 -57
- package/lib/components/checkbox.js.map +1 -1
- package/lib/components/copy.d.ts +14 -3
- package/lib/components/copy.d.ts.map +1 -1
- package/lib/components/copy.js +47 -25
- package/lib/components/copy.js.map +1 -1
- package/lib/components/date-picker.d.ts +26 -1
- package/lib/components/date-picker.d.ts.map +1 -1
- package/lib/components/date-picker.js +151 -32
- package/lib/components/date-picker.js.map +1 -1
- package/lib/components/input.d.ts +17 -2
- package/lib/components/input.d.ts.map +1 -1
- package/lib/components/input.js +104 -25
- package/lib/components/input.js.map +1 -1
- package/lib/components/modal.d.ts.map +1 -1
- package/lib/components/modal.js +28 -3
- package/lib/components/modal.js.map +1 -1
- package/lib/components/option.d.ts +0 -27
- package/lib/components/option.d.ts.map +1 -1
- package/lib/components/option.js +11 -102
- package/lib/components/option.js.map +1 -1
- package/lib/components/popup.d.ts.map +1 -1
- package/lib/components/popup.js +36 -2
- package/lib/components/popup.js.map +1 -1
- package/lib/components/radio.d.ts +6 -2
- package/lib/components/radio.d.ts.map +1 -1
- package/lib/components/radio.js +55 -13
- package/lib/components/radio.js.map +1 -1
- package/lib/components/scroll-container.d.ts +16 -0
- package/lib/components/scroll-container.d.ts.map +1 -1
- package/lib/components/scroll-container.js +105 -1
- package/lib/components/scroll-container.js.map +1 -1
- package/lib/components/select.d.ts +550 -0
- package/lib/components/select.d.ts.map +1 -0
- package/lib/components/select.js +2115 -0
- package/lib/components/select.js.map +1 -0
- package/lib/components/selected-tags.d.ts +93 -0
- package/lib/components/selected-tags.d.ts.map +1 -0
- package/lib/components/selected-tags.js +286 -0
- package/lib/components/selected-tags.js.map +1 -0
- package/lib/components/switch.d.ts +6 -3
- package/lib/components/switch.d.ts.map +1 -1
- package/lib/components/switch.js +54 -36
- package/lib/components/switch.js.map +1 -1
- package/lib/components/tabs.d.ts.map +1 -1
- package/lib/components/tabs.js +190 -25
- package/lib/components/tabs.js.map +1 -1
- package/lib/components/tag.d.ts +9 -1
- package/lib/components/tag.d.ts.map +1 -1
- package/lib/components/tag.js +41 -5
- package/lib/components/tag.js.map +1 -1
- package/lib/components/textarea.d.ts +3 -0
- package/lib/components/textarea.d.ts.map +1 -1
- package/lib/components/textarea.js +61 -6
- package/lib/components/textarea.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/index.d.ts +3 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/styles/button.d.ts +41 -6
- package/lib/styles/button.d.ts.map +1 -1
- package/lib/styles/button.js +294 -254
- 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 +100 -67
- package/lib/styles/calendar-month.js.map +1 -1
- package/lib/styles/calendar-navigation.d.ts +1 -1
- package/lib/styles/calendar-navigation.d.ts.map +1 -1
- package/lib/styles/calendar-navigation.js +20 -28
- package/lib/styles/calendar-navigation.js.map +1 -1
- package/lib/styles/checkbox.d.ts +7 -5
- package/lib/styles/checkbox.d.ts.map +1 -1
- package/lib/styles/checkbox.js +125 -8
- 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 +61 -6
- package/lib/styles/copy.js.map +1 -1
- package/lib/styles/custom-scrollbar.d.ts +1 -1
- package/lib/styles/custom-scrollbar.d.ts.map +1 -1
- package/lib/styles/custom-scrollbar.js +2 -2
- 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 +65 -103
- package/lib/styles/date-picker.js.map +1 -1
- package/lib/styles/file-upload.d.ts +1 -1
- package/lib/styles/file-upload.d.ts.map +1 -1
- package/lib/styles/file-upload.js +3 -3
- package/lib/styles/input.d.ts +3 -1
- package/lib/styles/input.d.ts.map +1 -1
- package/lib/styles/input.js +93 -419
- 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/option.d.ts +1 -1
- package/lib/styles/option.d.ts.map +1 -1
- package/lib/styles/option.js +20 -47
- package/lib/styles/option.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 +24 -21
- package/lib/styles/radio.js.map +1 -1
- package/lib/styles/scroll-container.d.ts +1 -1
- package/lib/styles/scroll-container.d.ts.map +1 -1
- package/lib/styles/scroll-container.js +6 -0
- package/lib/styles/scroll-container.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 +973 -0
- package/lib/styles/select-base.js.map +1 -0
- package/lib/styles/select.d.ts +12 -0
- package/lib/styles/select.d.ts.map +1 -0
- package/lib/styles/select.js +308 -0
- package/lib/styles/select.js.map +1 -0
- package/lib/styles/step.d.ts +1 -1
- package/lib/styles/step.d.ts.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 +25 -10
- package/lib/styles/switch.js.map +1 -1
- package/lib/styles/tab.d.ts +1 -1
- package/lib/styles/tab.d.ts.map +1 -1
- package/lib/styles/tabs.d.ts +1 -1
- package/lib/styles/tabs.d.ts.map +1 -1
- package/lib/styles/tabs.js +71 -1
- package/lib/styles/tabs.js.map +1 -1
- package/lib/styles/tag.d.ts +1 -1
- package/lib/styles/tag.d.ts.map +1 -1
- package/lib/styles/tag.js +40 -141
- package/lib/styles/tag.js.map +1 -1
- package/lib/styles/textarea.d.ts +1 -1
- package/lib/styles/textarea.d.ts.map +1 -1
- package/lib/styles/textarea.js +71 -37
- package/lib/styles/textarea.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/styles/wizard.d.ts +1 -1
- package/lib/styles/wizard.d.ts.map +1 -1
- package/lib/styles/wizard.js +18 -6
- package/lib/styles/wizard.js.map +1 -1
- package/lib/types/common.d.ts +2 -1
- package/lib/types/common.d.ts.map +1 -1
- package/lib/types/common.js +15 -1
- package/lib/types/common.js.map +1 -1
- package/lib/utils/calendar-utils.d.ts +0 -48
- package/lib/utils/calendar-utils.d.ts.map +1 -1
- package/lib/utils/calendar-utils.js +0 -69
- package/lib/utils/calendar-utils.js.map +1 -1
- package/lib/utils/flavor-sheet.d.ts +32 -0
- package/lib/utils/flavor-sheet.d.ts.map +1 -0
- package/lib/utils/flavor-sheet.js +40 -0
- package/lib/utils/flavor-sheet.js.map +1 -0
- package/lib/utils/icon-registry.d.ts +0 -13
- package/lib/utils/icon-registry.d.ts.map +1 -1
- package/lib/utils/icon-registry.js +0 -35
- package/lib/utils/icon-registry.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/locale.d.ts +0 -57
- package/lib/utils/locale.d.ts.map +1 -1
- package/lib/utils/locale.js +0 -89
- package/lib/utils/locale.js.map +1 -1
- package/lib/utils/number-format.d.ts +0 -21
- package/lib/utils/number-format.d.ts.map +1 -1
- package/lib/utils/number-format.js +0 -27
- package/lib/utils/number-format.js.map +1 -1
- package/lib/utils/positioning.d.ts +29 -22
- package/lib/utils/positioning.d.ts.map +1 -1
- package/lib/utils/positioning.js +23 -87
- package/lib/utils/positioning.js.map +1 -1
- package/lib/utils/scroll-lock.d.ts.map +1 -1
- package/lib/utils/scroll-lock.js +0 -1
- package/lib/utils/scroll-lock.js.map +1 -1
- package/lib/utils/styles.d.ts +0 -5
- package/lib/utils/styles.d.ts.map +1 -1
- package/lib/utils/styles.js +0 -7
- package/lib/utils/styles.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +22 -11
- package/css/tyrell-brand.css +0 -913
- package/dist/tyrell-brand.css +0 -913
- package/lib/components/dropdown.d.ts +0 -424
- package/lib/components/dropdown.d.ts.map +0 -1
- package/lib/components/dropdown.js +0 -1640
- package/lib/components/dropdown.js.map +0 -1
- package/lib/components/multiselect.d.ts +0 -397
- package/lib/components/multiselect.d.ts.map +0 -1
- package/lib/components/multiselect.js +0 -1595
- package/lib/components/multiselect.js.map +0 -1
- package/lib/styles/dropdown.d.ts +0 -12
- package/lib/styles/dropdown.d.ts.map +0 -1
- package/lib/styles/dropdown.js +0 -1081
- package/lib/styles/dropdown.js.map +0 -1
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,31 @@ 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
|
-
transition: all 0.15s ease-in-out;
|
|
80
|
-
|
|
113
|
+
transition: var(--ty-local-transition, all 0.15s ease-in-out);
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
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. */
|
|
123
|
+
/* :not(.focused) — hover must never override focus. Without the guard this
|
|
124
|
+
rule out-ranks .focused by specificity, so hovering a FOCUSED unflavored
|
|
125
|
+
input swapped its primary focus border for the dimmer neutral hover
|
|
126
|
+
border (focus ring stayed, border dimmed — read as a glitch). Same
|
|
127
|
+
pattern as date-picker's :hover:not(.open). */
|
|
128
|
+
.input-wrapper:hover:not(.disabled):not(.focused) {
|
|
129
|
+
border-color: var(--input-accent-bold, var(--input-border-hover, var(--ty-input-border-hover)));
|
|
89
130
|
}
|
|
90
131
|
|
|
91
132
|
.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));
|
|
133
|
+
border-color: var(--input-accent-bold, var(--input-border-focus, var(--ty-input-border-focus)));
|
|
134
|
+
box-shadow: 0 0 0 3px var(--input-ring, var(--input-shadow-focus, var(--ty-input-shadow-focus)));
|
|
94
135
|
}
|
|
95
136
|
|
|
96
137
|
.input-wrapper.disabled {
|
|
@@ -112,6 +153,34 @@ export const inputStyles = `
|
|
|
112
153
|
color: var(--ty-color-text-soft);
|
|
113
154
|
}
|
|
114
155
|
|
|
156
|
+
/* Password reveal toggle (rendered for type="password") */
|
|
157
|
+
.password-toggle {
|
|
158
|
+
display: flex;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
flex-shrink: 0;
|
|
162
|
+
width: 1.25rem;
|
|
163
|
+
height: 1.25rem;
|
|
164
|
+
padding: 0;
|
|
165
|
+
border: none;
|
|
166
|
+
background: none;
|
|
167
|
+
cursor: pointer;
|
|
168
|
+
color: var(--input-placeholder, var(--ty-input-placeholder));
|
|
169
|
+
transition: var(--ty-local-transition, color 0.15s ease-in-out);
|
|
170
|
+
}
|
|
171
|
+
.password-toggle:hover {
|
|
172
|
+
color: var(--input-color, var(--ty-input-color));
|
|
173
|
+
}
|
|
174
|
+
.password-toggle:focus-visible {
|
|
175
|
+
outline: 2px solid var(--input-accent, var(--ty-color-primary));
|
|
176
|
+
outline-offset: 2px;
|
|
177
|
+
border-radius: 2px;
|
|
178
|
+
}
|
|
179
|
+
.password-toggle svg {
|
|
180
|
+
width: 1rem;
|
|
181
|
+
height: 1rem;
|
|
182
|
+
}
|
|
183
|
+
|
|
115
184
|
/* Icon sizing for slotted icons */
|
|
116
185
|
::slotted(ty-icon) {
|
|
117
186
|
width: 1em;
|
|
@@ -186,22 +255,9 @@ input::placeholder {
|
|
|
186
255
|
|
|
187
256
|
/* ===== SIZE MODIFIERS ===== */
|
|
188
257
|
|
|
189
|
-
/* Extra Small */
|
|
190
|
-
.input-wrapper.xs {
|
|
191
|
-
min-height: 32px;
|
|
192
|
-
padding: 0 8px;
|
|
193
|
-
border-radius: var(--ty-input-radius-xs, var(--ty-radius-base));
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
.input-wrapper.xs input {
|
|
197
|
-
font-size: var(--ty-font-xs);
|
|
198
|
-
line-height: var(--ty-leading-xs);
|
|
199
|
-
letter-spacing: var(--ty-tracking-xs);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
258
|
/* Small */
|
|
203
259
|
.input-wrapper.sm {
|
|
204
|
-
min-height:
|
|
260
|
+
min-height: var(--ty-size-sm);
|
|
205
261
|
padding: 0 10px;
|
|
206
262
|
border-radius: var(--ty-input-radius-sm, var(--ty-radius-base));
|
|
207
263
|
}
|
|
@@ -214,7 +270,7 @@ input::placeholder {
|
|
|
214
270
|
|
|
215
271
|
/* Medium (default) */
|
|
216
272
|
.input-wrapper.md {
|
|
217
|
-
min-height:
|
|
273
|
+
min-height: var(--ty-size-md);
|
|
218
274
|
padding: 0 12px;
|
|
219
275
|
border-radius: var(--ty-input-radius-md, var(--ty-radius-base));
|
|
220
276
|
}
|
|
@@ -227,7 +283,7 @@ input::placeholder {
|
|
|
227
283
|
|
|
228
284
|
/* Large */
|
|
229
285
|
.input-wrapper.lg {
|
|
230
|
-
min-height:
|
|
286
|
+
min-height: var(--ty-size-lg);
|
|
231
287
|
padding: 0 14px;
|
|
232
288
|
border-radius: var(--ty-input-radius-lg, var(--ty-radius-base));
|
|
233
289
|
}
|
|
@@ -238,92 +294,8 @@ input::placeholder {
|
|
|
238
294
|
letter-spacing: var(--ty-tracking-base);
|
|
239
295
|
}
|
|
240
296
|
|
|
241
|
-
/*
|
|
242
|
-
.
|
|
243
|
-
min-height: 48px;
|
|
244
|
-
padding: 0 16px;
|
|
245
|
-
border-radius: var(--ty-input-radius-xl, var(--ty-radius-base));
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
.input-wrapper.xl input {
|
|
249
|
-
font-size: var(--ty-font-lg);
|
|
250
|
-
line-height: var(--ty-leading-lg);
|
|
251
|
-
letter-spacing: var(--ty-tracking-lg);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/* ===== SEMANTIC FLAVOR MODIFIERS ===== */
|
|
255
|
-
|
|
256
|
-
/* Primary */
|
|
257
|
-
.input-wrapper.primary {
|
|
258
|
-
border-color: var(--ty-input-primary-border, var(--ty-color-primary));
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
.input-wrapper.primary:hover:not(.disabled) {
|
|
262
|
-
border-color: var(--ty-color-primary-bold);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
.input-wrapper.primary.focused {
|
|
266
|
-
border-color: var(--ty-color-primary-bold);
|
|
267
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/* Secondary */
|
|
271
|
-
.input-wrapper.secondary {
|
|
272
|
-
border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.input-wrapper.secondary.focused {
|
|
276
|
-
border-color: var(--ty-color-secondary-bold);
|
|
277
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/* Success */
|
|
281
|
-
.input-wrapper.success {
|
|
282
|
-
border-color: var(--ty-input-success-border);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
.input-wrapper.success:hover:not(.disabled) {
|
|
286
|
-
border-color: var(--ty-color-success-bold);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
.input-wrapper.success.focused {
|
|
290
|
-
border-color: var(--ty-color-success-bold);
|
|
291
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/* Danger */
|
|
295
|
-
.input-wrapper.danger {
|
|
296
|
-
border-color: var(--ty-input-danger-border);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
.input-wrapper.danger:hover:not(.disabled) {
|
|
300
|
-
border-color: var(--ty-color-danger-bold);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
.input-wrapper.danger.focused {
|
|
304
|
-
border-color: var(--ty-color-danger-bold);
|
|
305
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/* Warning */
|
|
309
|
-
.input-wrapper.warning {
|
|
310
|
-
border-color: var(--ty-input-warning-border);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
.input-wrapper.warning:hover:not(.disabled) {
|
|
314
|
-
border-color: var(--ty-color-warning-bold);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
.input-wrapper.warning.focused {
|
|
318
|
-
border-color: var(--ty-color-warning-bold);
|
|
319
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/* Neutral (default) */
|
|
323
|
-
.input-wrapper.neutral.focused {
|
|
324
|
-
border-color: var(--input-border-focus, var(--ty-input-border-focus));
|
|
325
|
-
box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));
|
|
326
|
-
}
|
|
297
|
+
/* ===== SEMANTIC FLAVOR MODIFIERS (set --input-accent*, consumed above) ===== */
|
|
298
|
+
${FLAVORS.filter((f) => f !== "neutral").map((f) => inputFlavor(f)).join("")}
|
|
327
299
|
|
|
328
300
|
/* ===== ACCESSIBILITY ENHANCEMENTS ===== */
|
|
329
301
|
|
|
@@ -383,303 +355,5 @@ input:focus-visible {
|
|
|
383
355
|
letter-spacing: var(--ty-tracking-sm);
|
|
384
356
|
}
|
|
385
357
|
}
|
|
386
|
-
|
|
387
|
-
/* ===== CHECKBOX STYLING ===== */
|
|
388
|
-
|
|
389
|
-
.checkbox-container {
|
|
390
|
-
display: inline-flex;
|
|
391
|
-
align-items: center;
|
|
392
|
-
outline: none;
|
|
393
|
-
transition: all 0.15s ease-in-out;
|
|
394
|
-
user-select: none;
|
|
395
|
-
cursor: pointer;
|
|
396
|
-
|
|
397
|
-
/* Default size (md) - matching input sizes */
|
|
398
|
-
border-radius: 6px;
|
|
399
|
-
gap: var(--ty-spacing-1);
|
|
400
|
-
color: var(--ty-text-faint);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
.checkbox-container[aria-checked="true"] {
|
|
404
|
-
color: var(--ty-text);
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/* Ensure slotted label content inherits the color from container */
|
|
408
|
-
.checkbox-container ::slotted(*) {
|
|
409
|
-
color: inherit;
|
|
410
|
-
transition: color 0.15s ease-in-out;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
.checkbox-container label {
|
|
414
|
-
cursor: pointer;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
.checkbox-container label {
|
|
418
|
-
font-size: var(--ty-font-sm);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
.checkbox-container.sm label {
|
|
422
|
-
font-size: var(--ty-font-xs);
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
.checkbox-container.lg label {
|
|
426
|
-
font-size: var(--ty-font-base);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
.checkbox-container.xl label {
|
|
430
|
-
font-size: var(--ty-font-lg);
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/* Checkbox input container - different layout for checkboxes */
|
|
434
|
-
.input-container.checkbox-layout {
|
|
435
|
-
flex-direction: row;
|
|
436
|
-
align-items: center;
|
|
437
|
-
gap: 12px;
|
|
438
|
-
width: auto;
|
|
439
|
-
/* Don't force full width for checkboxes */
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
.input-container.checkbox-layout .ty-field-label {
|
|
443
|
-
margin-bottom: 0;
|
|
444
|
-
padding-left: 0;
|
|
445
|
-
order: 2;
|
|
446
|
-
cursor: pointer;
|
|
447
|
-
flex: 1;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
.input-container.checkbox-layout .checkbox-container {
|
|
451
|
-
order: 1;
|
|
452
|
-
flex-shrink: 0;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/* Error message positioning for checkboxes */
|
|
456
|
-
.input-container.checkbox-layout .error-message {
|
|
457
|
-
padding-left: 0;
|
|
458
|
-
margin-left: 52px;
|
|
459
|
-
/* Align with label text */
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
.checkbox-icon {
|
|
463
|
-
display: flex;
|
|
464
|
-
align-items: center;
|
|
465
|
-
justify-content: center;
|
|
466
|
-
color: inherit;
|
|
467
|
-
transition: color 0.15s ease-in-out;
|
|
468
|
-
pointer-events: none;
|
|
469
|
-
/* Let the container handle the click */
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
.checkbox-container svg {
|
|
473
|
-
width: 24px;
|
|
474
|
-
height: 24px;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
/* ===== CHECKBOX SIZE MODIFIERS ===== */
|
|
478
|
-
|
|
479
|
-
.checkbox-container.xs svg {
|
|
480
|
-
width: 16px;
|
|
481
|
-
height: 16px;
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
/* Adjust error message margin for XS */
|
|
485
|
-
.input-container.checkbox-layout .checkbox-container.xs~.error-message {
|
|
486
|
-
margin-left: 44px;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
.checkbox-container.sm svg {
|
|
491
|
-
width: 20px;
|
|
492
|
-
height: 20px;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/* Adjust error message margin for SM */
|
|
496
|
-
.input-container.checkbox-layout .checkbox-container.sm~.error-message {
|
|
497
|
-
margin-left: 48px;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
.checkbox-container.md svg {
|
|
502
|
-
width: 24px;
|
|
503
|
-
height: 24px;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
.checkbox-container.lg svg {
|
|
508
|
-
width: 28px;
|
|
509
|
-
height: 28px;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
.checkbox-container.xl svg {
|
|
513
|
-
width: 32px;
|
|
514
|
-
height: 32px;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
.checkbox-container.xl svg {
|
|
519
|
-
font-size: 20px;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/* Adjust error message margin for LG */
|
|
523
|
-
.input-container.checkbox-layout .checkbox-container.lg~.error-message {
|
|
524
|
-
margin-left: 56px;
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
/* Adjust error message margin for XL */
|
|
529
|
-
.input-container.checkbox-layout .checkbox-container.xl~.error-message {
|
|
530
|
-
margin-left: 60px;
|
|
531
|
-
/* 48px + 12px gap */
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
/* ===== CHECKBOX SEMANTIC FLAVORS ===== */
|
|
535
|
-
|
|
536
|
-
.checkbox-container.primary {
|
|
537
|
-
color: var(--ty-color-primary-soft);
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
.checkbox-container.primary[aria-checked="true"] {
|
|
542
|
-
color: var(--ty-color-primary);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
.checkbox-container.secondary {
|
|
546
|
-
color: var(--ty-color-secondary-soft);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
.checkbox-container.secondary[aria-checked="true"] {
|
|
551
|
-
color: var(--ty-color-secondary);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
.checkbox-container.success {
|
|
555
|
-
color: var(--ty-color-success-soft);
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
.checkbox-container.success[aria-checked="true"] {
|
|
560
|
-
color: var(--ty-color-success);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
.checkbox-container.danger {
|
|
564
|
-
color: var(--ty-color-danger-soft);
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
.checkbox-container.danger[aria-checked="true"] {
|
|
568
|
-
color: var(--ty-color-danger);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
.checkbox-container.warning {
|
|
572
|
-
color: var(--ty-color-warning-soft);
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
.checkbox-container.warning[aria-checked="true"] {
|
|
576
|
-
color: var(--ty-color-warning);
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
/* Neutral */
|
|
581
|
-
.checkbox-container.neutral {
|
|
582
|
-
color: var(--ty-color-neutral-soft);
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
.checkbox-container.neutral[aria-checked="true"] {
|
|
586
|
-
color: var(--ty-color-neutral);
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
/* Disabled state */
|
|
590
|
-
.checkbox-container.disabled {
|
|
591
|
-
pointer-events: none;
|
|
592
|
-
cursor: not-allowed;
|
|
593
|
-
opacity: 0.5;
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
.checkbox-container.disabled .checkbox-icon {
|
|
597
|
-
color: var(--ty-color-neutral-faint);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
/* Error state */
|
|
601
|
-
.checkbox-container.error .checkbox-icon {
|
|
602
|
-
color: var(--ty-color-danger);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
.checkbox-container.error:focus {
|
|
606
|
-
box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
/* Required state */
|
|
610
|
-
.checkbox-container.required .checkbox-icon {
|
|
611
|
-
/* Could add specific styling for required checkboxes */
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
/* ===== RESPONSIVE CHECKBOX BEHAVIOR ===== */
|
|
615
|
-
|
|
616
|
-
@container (max-width: 480px) {
|
|
617
|
-
.checkbox-container.lg {
|
|
618
|
-
width: 40px;
|
|
619
|
-
height: 40px;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
.checkbox-container.lg svg {
|
|
623
|
-
width: 20px;
|
|
624
|
-
height: 20px;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
.checkbox-container.xl {
|
|
628
|
-
width: 44px;
|
|
629
|
-
height: 44px;
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
.checkbox-container.xl svg {
|
|
633
|
-
width: 22px;
|
|
634
|
-
height: 22px;
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
@container (max-width: 320px) {
|
|
639
|
-
.checkbox-container.xl {
|
|
640
|
-
width: 40px;
|
|
641
|
-
height: 40px;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
.checkbox-container.xl svg {
|
|
645
|
-
width: 20px;
|
|
646
|
-
height: 20px;
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/* Fallback for browsers without container query support */
|
|
651
|
-
@media (max-width: 640px) {
|
|
652
|
-
.checkbox-container.lg {
|
|
653
|
-
width: 40px;
|
|
654
|
-
height: 40px;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
.checkbox-container.lg svg {
|
|
658
|
-
width: 20px;
|
|
659
|
-
height: 20px;
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
.checkbox-container.xl {
|
|
663
|
-
width: 44px;
|
|
664
|
-
height: 44px;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
.checkbox-container.xl svg {
|
|
668
|
-
width: 22px;
|
|
669
|
-
height: 22px;
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
@media (max-width: 480px) {
|
|
674
|
-
.checkbox-container.xl {
|
|
675
|
-
width: 40px;
|
|
676
|
-
height: 40px;
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
.checkbox-container.xl svg {
|
|
680
|
-
width: 20px;
|
|
681
|
-
height: 20px;
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
358
|
`;
|
|
685
359
|
//# sourceMappingURL=input.js.map
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwPzB,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"}
|