@keenmate/web-multiselect 1.8.6 → 1.10.0

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.
@@ -1,597 +1,599 @@
1
- /* ==============================================================================
2
- CSS CUSTOM PROPERTIES (:host level)
3
- ==============================================================================
4
- This file defines all CSS custom properties at the :host level, making them:
5
- - Inspectable in browser DevTools
6
- - Overridable from outside Shadow DOM
7
- - Self-documenting in compiled CSS
8
-
9
- Usage from outside Shadow DOM:
10
- multi-select {
11
- --ms-accent-color: #10b981;
12
- --ms-input-border-radius: 0.5rem;
13
- }
14
- ============================================================================== */
15
-
16
- :host {
17
- /* ==========================================================================
18
- BASE SIZING UNIT
19
- ==========================================================================
20
- All sizing values are based on this unit for consistent scaling.
21
- Default: 10px produces standard pixel values
22
- Pure Admin: Set to 1rem (inherits from html { font-size: 10px })
23
- Custom: Set to any value to scale all sizes proportionally */
24
- --ms-rem: 10px;
25
-
26
- /* ==========================================================================
27
- FONT FAMILY (set at :host so all shadow DOM content inherits)
28
- ========================================================================== */
29
- font-family: var(--ms-font-family, var(--base-font-family, inherit));
30
-
31
- /* ==========================================================================
32
- HOST ELEMENT SIZING
33
- ==========================================================================
34
- Allows external width/height styling on <web-multiselect> element */
35
- display: block;
36
-
37
- /* ==========================================================================
38
- COLORS & THEME
39
- ==========================================================================
40
- Color variables follow this priority chain:
41
- 1. External override: --ms-accent-color: #custom
42
- 2. Base theme value: var(--base-accent-color)
43
- 3. Hardcoded default fallback */
44
-
45
- /* Accent Colors */
46
- --ms-accent-color: var(--base-accent-color, #3b82f6);
47
- --ms-accent-color-hover: var(--base-accent-color-hover, #2563eb);
48
- --ms-accent-color-active: var(--base-accent-color-active, #1d4ed8);
49
-
50
- /* Accent Color Light Variants (for backgrounds) */
51
- --ms-accent-color-light: var(--base-accent-color-light, #eff6ff);
52
- --ms-accent-color-light-hover: var(--base-accent-color-light-hover, #e0f2fe);
53
-
54
- /* Text Color Levels (FluentUI-style hierarchy) */
55
- --ms-text-color-1: var(--base-text-color-1, #111827);
56
- --ms-text-color-2: var(--base-text-color-2, #353b47);
57
- --ms-text-color-3: var(--base-text-color-3, #6b7280);
58
- --ms-text-color-4: var(--base-text-color-4, #a0a3a9);
59
- --ms-text-color-on-accent: var(--base-text-color-on-accent, #ffffff);
60
-
61
- /* Legacy aliases (for backward compatibility) */
62
- --ms-text-primary: var(--ms-text-color-1);
63
- --ms-text-secondary: var(--ms-text-color-3);
64
-
65
- /* Background Colors */
66
- --ms-primary-bg: var(--base-main-bg, #f3f4f6);
67
- --ms-primary-bg-hover: var(--base-hover-bg, #e5e7eb);
68
-
69
- /* Border Base Variables */
70
- --ms-border-color: var(--base-border-color, #e5e7eb);
71
- --ms-border: var(--base-border, 1px solid var(--ms-border-color));
72
-
73
- /* ==========================================================================
74
- SEMANTIC VARIABLES - Component-Specific Theming
75
- ==========================================================================
76
- Pattern: --ms-{component}-{property}-{state}
77
- Example: --ms-input-bg, --ms-option-text-color-hover */
78
-
79
- /* Input Component Semantic Variables */
80
- --ms-input-bg: var(--base-input-bg, #ffffff);
81
- --ms-input-color: var(--base-input-color, var(--ms-text-color-1));
82
- --ms-input-border: var(--base-input-border, 1px solid var(--ms-border-color));
83
- --ms-input-border-hover: var(--base-input-border-hover, 1px solid var(--ms-accent-color));
84
- --ms-input-border-focus: var(--base-input-border-focus, 1px solid var(--ms-accent-color));
85
- --ms-input-placeholder-color: var(--base-input-placeholder-color, var(--ms-text-color-4));
86
- --ms-input-bg-disabled: var(--base-input-bg-disabled, rgba(107, 114, 128, 0.05));
87
-
88
- /* Toggle Icon Semantic Variables */
89
- --ms-toggle-icon-color: var(--ms-text-color-3);
90
- --ms-toggle-icon-color-open: var(--ms-text-color-3);
91
-
92
- /* Counter Badge (in Input) Semantic Variables */
93
- --ms-counter-badge-bg: var(--ms-accent-color);
94
- --ms-counter-badge-bg-hover: var(--ms-accent-color-hover);
95
- --ms-counter-badge-color: var(--ms-text-color-on-accent);
96
-
97
- /* Floating Hint Semantic Variables */
98
- --ms-hint-bg: var(--base-main-bg, #ffffff);
99
- --ms-hint-color: var(--ms-text-color-4);
100
- --ms-hint-border-color: var(--ms-border-color);
101
-
102
- /* Dropdown Semantic Variables */
103
- --ms-dropdown-bg: var(--base-dropdown-bg, #ffffff);
104
- --ms-dropdown-text-color: var(--ms-text-color-1);
105
- --ms-dropdown-border-color: var(--ms-border-color);
106
- --ms-dropdown-box-shadow-semantic: var(--base-dropdown-box-shadow, 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1));
107
-
108
- /* Dropdown Actions Semantic Variables */
109
- --ms-actions-bg: var(--base-main-bg, #ffffff);
110
- --ms-actions-border-color: var(--ms-border-color);
111
-
112
- /* Action Button Semantic Variables */
113
- --ms-action-button-bg: transparent;
114
- --ms-action-button-bg-hover: var(--ms-primary-bg);
115
- --ms-action-button-border-color: var(--ms-border-color);
116
- --ms-action-button-border-color-hover: var(--ms-accent-color);
117
- --ms-action-button-color: var(--ms-text-color-1);
118
-
119
- /* Group Semantic Variables */
120
- --ms-group-border-color: var(--ms-border-color);
121
- --ms-group-label-color: var(--ms-text-color-3);
122
-
123
- /* Option Semantic Variables */
124
- --ms-option-text-color: var(--ms-text-color-1);
125
- --ms-option-bg: transparent;
126
- --ms-option-bg-hover: var(--ms-primary-bg);
127
- --ms-option-color-hover: inherit;
128
- --ms-option-bg-focused: var(--ms-primary-bg);
129
- --ms-option-color-focused: inherit;
130
- --ms-option-outline-color-focused: var(--ms-accent-color);
131
- --ms-option-bg-selected: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
132
- --ms-option-bg-matched: color-mix(in srgb, var(--ms-accent-color) 8%, transparent);
133
- --ms-option-color-matched: inherit;
134
- --ms-option-border-matched-color: color-mix(in srgb, var(--ms-accent-color) 40%, transparent);
135
-
136
- /* Option Content Semantic Variables */
137
- --ms-option-title-color: var(--ms-text-color-1);
138
- --ms-option-subtitle-color: var(--ms-text-color-3);
139
- --ms-option-mark-bg: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
140
- --ms-option-mark-color: inherit;
141
-
142
- /* Empty/Loading State Semantic Variables */
143
- --ms-empty-color: var(--ms-text-color-3);
144
- --ms-loading-color: var(--ms-text-color-3);
145
-
146
- /* Badge Semantic Variables */
147
- --ms-badge-bg: var(--ms-accent-color-light);
148
- --ms-badge-bg-hover: var(--base-hover-bg, var(--ms-input-bg));
149
- --ms-badge-bg-active: var(--ms-accent-color-light-hover);
150
-
151
- /* Badge Text Semantic Variables */
152
- --ms-badge-text-bg: var(--ms-accent-color-light);
153
- --ms-badge-text-color: var(--ms-accent-color);
154
- --ms-badge-text-bg-hover: var(--base-hover-bg, var(--ms-input-bg));
155
- --ms-badge-text-color-hover: var(--ms-badge-text-color);
156
-
157
- /* Badge Remove Button Semantic Variables */
158
- --ms-badge-remove-bg: var(--ms-accent-color);
159
- --ms-badge-remove-bg-hover: var(--ms-accent-color-hover);
160
- --ms-badge-remove-color: var(--ms-text-color-on-accent);
161
-
162
- /* Badge Counter Variant Semantic Variables */
163
- /* Neutral/gray styling to distinguish from accent-colored selection badges */
164
- --ms-badge-counter-border-color: var(--ms-border-color);
165
- --ms-badge-counter-text-bg: var(--ms-primary-bg-hover);
166
- --ms-badge-counter-text-color: var(--ms-text-color-1);
167
- --ms-badge-counter-remove-bg: var(--ms-text-color-3);
168
- --ms-badge-counter-remove-bg-hover: var(--ms-text-color-1);
169
- --ms-badge-counter-remove-color: var(--ms-text-color-on-accent);
170
-
171
- /* Count Display Semantic Variables */
172
- --ms-counter-wrapper-bg: transparent;
173
- --ms-counter-wrapper-bg-hover: var(--ms-primary-bg);
174
- --ms-counter-wrapper-border-color: var(--ms-border-color);
175
- --ms-counter-wrapper-border-color-hover: var(--ms-accent-color);
176
- --ms-count-text-color: var(--ms-text-color-1);
177
- --ms-count-clear-bg: transparent;
178
- --ms-count-clear-bg-hover: var(--ms-accent-color);
179
- --ms-count-clear-color: var(--ms-text-color-3);
180
- --ms-count-clear-color-hover: var(--ms-accent-color);
181
-
182
- /* Tooltip Semantic Variables */
183
- --ms-tooltip-bg: var(--base-tooltip-bg, #333333);
184
- --ms-tooltip-text-color: var(--base-tooltip-text-color, #ffffff);
185
-
186
- /* Selected Popover Semantic Variables */
187
- --ms-selected-popover-bg: var(--base-dropdown-bg, #ffffff);
188
- --ms-selected-popover-border-color: var(--ms-border-color);
189
- --ms-selected-popover-header-bg: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
190
- --ms-selected-popover-header-color: var(--ms-text-color-1);
191
- --ms-selected-popover-header-border-color: var(--ms-border-color);
192
- --ms-selected-popover-close-bg: transparent;
193
- --ms-selected-popover-close-bg-hover: var(--ms-accent-color);
194
- --ms-selected-popover-close-color: var(--ms-text-color-3);
195
- --ms-selected-popover-close-color-hover: var(--ms-accent-color);
196
-
197
- /* ==========================================================================
198
- INPUT COMPONENT
199
- ========================================================================== */
200
- --ms-input-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
201
- --ms-input-padding-right: calc(4 * var(--ms-rem));
202
- --ms-input-padding-h: calc(1.2 * var(--ms-rem));
203
- --ms-input-height: calc(var(--base-input-size-md-height, 3.5) * var(--ms-rem));
204
- --ms-input-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
205
- --ms-input-border-width: 1px;
206
- --ms-input-border-radius: var(--ms-border-radius-md);
207
- --ms-input-text: var(--ms-text-color-1);
208
- --ms-input-bg-disabled: rgba(107, 114, 128, 0.05);
209
-
210
- /* ==========================================================================
211
- INPUT SIZE VARIANTS
212
- ==========================================================================
213
- Five size variants for the input element (xs, sm, md, lg, xl)
214
- Heights reference --base-input-size-*-height for consistency across components */
215
- --ms-input-size-xs-font: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
216
- --ms-input-size-xs-padding-v: calc(0.4 * var(--ms-rem));
217
- --ms-input-size-xs-padding-h: calc(0.8 * var(--ms-rem));
218
- --ms-input-size-xs-height: calc(var(--base-input-size-xs-height, 3.1) * var(--ms-rem)); /* 31px */
219
-
220
- --ms-input-size-sm-font: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
221
- --ms-input-size-sm-padding-v: calc(0.5 * var(--ms-rem));
222
- --ms-input-size-sm-padding-h: calc(1.0 * var(--ms-rem));
223
- --ms-input-size-sm-height: calc(var(--base-input-size-sm-height, 3.3) * var(--ms-rem)); /* 33px */
224
-
225
- --ms-input-size-md-font: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
226
- --ms-input-size-md-padding-v: calc(0.8 * var(--ms-rem));
227
- --ms-input-size-md-padding-h: calc(1.2 * var(--ms-rem));
228
- --ms-input-size-md-height: calc(var(--base-input-size-md-height, 3.5) * var(--ms-rem)); /* 35px */
229
-
230
- --ms-input-size-lg-font: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
231
- --ms-input-size-lg-padding-v: calc(1.0 * var(--ms-rem));
232
- --ms-input-size-lg-padding-h: calc(1.4 * var(--ms-rem));
233
- --ms-input-size-lg-height: calc(var(--base-input-size-lg-height, 3.8) * var(--ms-rem)); /* 38px */
234
-
235
- --ms-input-size-xl-font: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
236
- --ms-input-size-xl-padding-v: calc(1.2 * var(--ms-rem));
237
- --ms-input-size-xl-padding-h: calc(1.6 * var(--ms-rem));
238
- --ms-input-size-xl-height: calc(var(--base-input-size-xl-height, 4.1) * var(--ms-rem)); /* 41px */
239
-
240
- /* ==========================================================================
241
- TOGGLE ICON
242
- ========================================================================== */
243
- --ms-toggle-right: calc(1.2 * var(--ms-rem));
244
- --ms-toggle-color: var(--ms-text-color-3);
245
- --ms-transform-center-y: translateY(-50%);
246
- --ms-transform-rotate-180: 180deg;
247
-
248
- /* ==========================================================================
249
- COUNT BADGE (in input)
250
- ========================================================================== */
251
- --ms-counter-offset: calc(3.2 * var(--ms-rem));
252
- --ms-counter-padding: calc(0.2 * var(--ms-rem)) calc(0.4 * var(--ms-rem));
253
- --ms-counter-bg: var(--ms-accent-color);
254
- --ms-counter-color: var(--ms-text-color-on-accent);
255
- --ms-counter-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
256
- --ms-counter-font-weight: var(--base-font-weight-semibold, 600);
257
- --ms-counter-border-radius: var(--ms-border-radius-sm);
258
- --ms-counter-bg-hover: var(--ms-accent-color-hover);
259
- --ms-transform-scale-hover: 1.1;
260
-
261
- /* ==========================================================================
262
- FLOATING HINT
263
- ========================================================================== */
264
- --ms-hint-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
265
- --ms-hint-border: var(--ms-border);
266
- --ms-hint-border-radius: var(--ms-border-radius-lg);
267
- --ms-hint-box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
268
- --ms-hint-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
269
-
270
- /* ==========================================================================
271
- DROPDOWN
272
- ========================================================================== */
273
- --ms-dropdown-border: var(--base-dropdown-border, 1px solid var(--ms-border-color));
274
- --ms-dropdown-border-radius: var(--ms-border-radius-lg);
275
- --ms-dropdown-box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
276
- --ms-options-max-height: calc(32 * var(--ms-rem));
277
- --ms-option-color: var(--ms-text-color-1);
278
- --ms-z-index-dropdown: 9999;
279
- --ms-z-index-sticky: 1;
280
-
281
- /* ==========================================================================
282
- DROPDOWN ACTIONS
283
- ========================================================================== */
284
- --ms-actions-gap: calc(0.4 * var(--ms-rem));
285
- --ms-actions-padding: calc(0.8 * var(--ms-rem));
286
- --ms-actions-border-bottom: var(--ms-border);
287
-
288
- /* Action Button */
289
- --ms-action-btn-padding: calc(0.4 * var(--ms-rem)) calc(0.8 * var(--ms-rem));
290
- --ms-action-btn-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
291
- --ms-action-btn-border: var(--ms-border);
292
- --ms-action-btn-border-radius: var(--ms-border-radius-sm);
293
- --ms-action-btn-bg: transparent;
294
- --ms-action-btn-color: inherit;
295
- --ms-action-btn-bg-hover: var(--ms-primary-bg);
296
- --ms-action-btn-border-color-hover: var(--ms-accent-color);
297
- --ms-transform-scale-active: 0.98;
298
-
299
- /* ==========================================================================
300
- OPTIONS CONTAINER & GROUPS
301
- ========================================================================== */
302
- --ms-options-padding: 0;
303
-
304
- /* Group */
305
- --ms-group-border-top: var(--ms-border);
306
- --ms-group-margin-top: calc(0.4 * var(--ms-rem));
307
- --ms-group-padding-top: calc(0.4 * var(--ms-rem));
308
-
309
- /* Group Label */
310
- --ms-group-label-padding: calc(0.4 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
311
- --ms-group-label-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
312
- --ms-group-label-font-weight: var(--base-font-weight-semibold, 600);
313
- --ms-group-label-color: var(--ms-text-color-3);
314
- --ms-group-label-transform: uppercase;
315
- --ms-group-label-letter-spacing: 0.05em;
316
-
317
- /* ==========================================================================
318
- INDIVIDUAL OPTIONS
319
- ========================================================================== */
320
- --ms-option-gap: calc(0.8 * var(--ms-rem));
321
- --ms-option-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
322
- --ms-option-padding-h: calc(1.2 * var(--ms-rem));
323
- --ms-option-bg: transparent;
324
- --ms-option-bg-hover: var(--ms-primary-bg);
325
- --ms-option-bg-focused: var(--ms-primary-bg);
326
- --ms-option-outline-focused: 2px solid var(--ms-accent-color);
327
- --ms-option-focus-outline-offset: -2px;
328
- --ms-option-bg-matched: color-mix(in srgb, var(--ms-accent-color) 8%, transparent);
329
- --ms-option-border-matched: 3px solid color-mix(in srgb, var(--ms-accent-color) 40%, transparent);
330
- --ms-option-bg-selected: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
331
-
332
- /* Option State Combinations */
333
- --ms-option-bg-focused-hover: var(--ms-primary-bg);
334
- --ms-option-bg-matched-hover: color-mix(in srgb, var(--ms-accent-color) 12%, transparent);
335
- --ms-option-bg-selected-focused: color-mix(in srgb, var(--ms-accent-color) 15%, transparent);
336
- --ms-option-bg-selected-matched: color-mix(in srgb, var(--ms-accent-color) 15%, transparent);
337
- --ms-option-disabled-bg: var(--base-disabled-bg, transparent);
338
- --ms-option-bg-disabled-selected: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
339
-
340
- --ms-disabled-opacity: 0.5;
341
-
342
- /* ==========================================================================
343
- OPTION CONTENT
344
- ========================================================================== */
345
- --ms-option-content-gap: calc(0.8 * var(--ms-rem));
346
-
347
- /* Option Icon */
348
- --ms-option-icon-size: calc(2 * var(--ms-rem));
349
- --ms-option-icon-font-size: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
350
-
351
- /* Option Title */
352
- --ms-option-title-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
353
- --ms-option-mark-bg: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
354
- --ms-option-mark-color: inherit;
355
- --ms-option-mark-font-weight: var(--base-font-weight-semibold, 600);
356
-
357
- /* Option Subtitle */
358
- --ms-option-subtitle-margin-top: calc(0.4 * var(--ms-rem));
359
- --ms-option-subtitle-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
360
- --ms-option-subtitle-line-height: var(--base-line-height-tight, 1.25);
361
-
362
- /* Checkbox */
363
- --ms-checkbox-margin-top: calc(0.2 * var(--ms-rem));
364
- --ms-checkbox-margin-right: 0;
365
- --ms-checkbox-margin-bottom: 0;
366
- --ms-checkbox-margin-left: 0;
367
- --ms-checkbox-size: calc(1.6 * var(--ms-rem));
368
- --ms-checkbox-scale: 1;
369
- --ms-checkbox-align: center;
370
-
371
- /* Checkbox Styling */
372
- --ms-checkbox-bg: var(--ms-input-bg);
373
- --ms-checkbox-border: var(--ms-border);
374
- --ms-checkbox-border-radius: calc(0.3 * var(--ms-rem));
375
- --ms-checkbox-checked-bg: var(--ms-accent-color);
376
- --ms-checkbox-checked-border: 1px solid var(--ms-accent-color);
377
- --ms-checkbox-checkmark-color: var(--ms-text-color-on-accent);
378
- --ms-checkbox-hover-border-color: var(--ms-accent-color);
379
- --ms-checkbox-disabled-bg: var(--ms-primary-bg);
380
- --ms-checkbox-disabled-border: var(--ms-border);
381
-
382
- /* Checkbox State Combinations */
383
- --ms-checkbox-checked-bg-hover: var(--ms-accent-color-hover);
384
- --ms-checkbox-checked-border-color-hover: var(--ms-accent-color-hover);
385
-
386
- /* ==========================================================================
387
- EMPTY & LOADING STATES
388
- ========================================================================== */
389
- --ms-empty-padding: calc(1.6 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
390
- --ms-empty-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
391
- --ms-empty-color: var(--ms-text-color-3);
392
-
393
- /* Loader */
394
- --ms-loader-padding: calc(1.6 * var(--ms-rem));
395
- --ms-loader-gap: calc(0.8 * var(--ms-rem));
396
-
397
- /* Loading Text */
398
- --ms-loading-text-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
399
- --ms-loading-text-color: var(--ms-text-color-3);
400
-
401
- /* ==========================================================================
402
- BADGES DISPLAY
403
- ========================================================================== */
404
- --ms-badges-gap: calc(0.8 * var(--ms-rem));
405
- --ms-badges-margin-bottom: calc(0.8 * var(--ms-rem));
406
- --ms-badges-margin-top: calc(0.8 * var(--ms-rem));
407
- --ms-badges-margin-left: calc(0.4 * var(--ms-rem));
408
- --ms-badges-margin-right: calc(0.4 * var(--ms-rem));
409
-
410
- /* Vertical alignment for inline (left/right) badge positioning */
411
- /* Options: center (default), flex-start (top), flex-end (bottom) */
412
- --ms-inline-align: center;
413
-
414
- /* Individual Badge */
415
- --ms-badge-gap: calc(0.8 * var(--ms-rem));
416
- --ms-badge-height: calc(2.7 * var(--ms-rem));
417
- --ms-badge-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
418
- --ms-badge-font-weight: var(--base-font-weight-semibold, 600);
419
- --ms-badge-border-radius: var(--ms-border-radius-sm);
420
- --ms-badge-bg: var(--ms-accent-color-light);
421
- --ms-badge-bg-hover: var(--ms-badge-bg-hover);
422
- --ms-badge-bg-active: var(--ms-accent-color-light-hover);
423
- --ms-order-first: -1;
424
-
425
- /* ==========================================================================
426
- BADGE TEXT & REMOVE BUTTON
427
- ========================================================================== */
428
- /* Badge Text */
429
- --ms-badge-text-padding: 0 calc(0.8 * var(--ms-rem));
430
- --ms-badge-text-bg: var(--ms-accent-color-light);
431
- --ms-badge-text-color: var(--ms-accent-color);
432
- --ms-badge-text-border: none;
433
-
434
- /* Badge Remove Button */
435
- --ms-badge-remove-width: calc(2.7 * var(--ms-rem));
436
- --ms-badge-remove-bg: var(--ms-accent-color);
437
- --ms-badge-remove-color: var(--ms-text-color-on-accent);
438
- --ms-badge-remove-border: none;
439
- --ms-badge-remove-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
440
- --ms-badge-remove-bg-hover: var(--ms-accent-color-hover);
441
- --ms-badge-remove-box-shadow-focus: 0 0 0 2px color-mix(in srgb, var(--ms-accent-color) 50%, transparent);
442
- --ms-icon-remove: "×";
443
-
444
- /* Badge Counter Indicator (layout-only properties, colors come from semantic section) */
445
- --ms-badge-counter-bg: transparent;
446
- --ms-badge-counter-border: var(--ms-border);
447
- --ms-badge-counter-border-radius: var(--ms-border-radius-sm);
448
-
449
- /* ==========================================================================
450
- "+X MORE" BADGE
451
- ========================================================================== */
452
- --ms-more-badge-bg: var(--ms-accent-color-light);
453
- --ms-more-badge-hover-bg: var(--ms-badge-bg-hover);
454
- --ms-more-badge-active-bg: var(--ms-accent-color-light-hover);
455
-
456
- /* ==========================================================================
457
- COUNT DISPLAY MODE
458
- ========================================================================== */
459
- --ms-count-display-margin-bottom: calc(0.8 * var(--ms-rem));
460
- --ms-count-display-margin-top: calc(0.8 * var(--ms-rem));
461
- --ms-count-display-margin-left: calc(0.8 * var(--ms-rem));
462
- --ms-count-display-margin-right: calc(0.8 * var(--ms-rem));
463
-
464
- /* Count Badge Wrapper */
465
- --ms-counter-wrapper-bg: transparent;
466
- --ms-counter-wrapper-border: var(--ms-border);
467
- --ms-counter-wrapper-border-radius: var(--ms-border-radius-sm);
468
- --ms-counter-wrapper-padding: calc(0.4 * var(--ms-rem)) calc(0.8 * var(--ms-rem));
469
- --ms-counter-wrapper-gap: calc(0.4 * var(--ms-rem));
470
- --ms-counter-wrapper-bg-hover: var(--ms-primary-bg);
471
- --ms-counter-wrapper-border-color-hover: var(--ms-accent-color);
472
-
473
- /* ==========================================================================
474
- COUNT TEXT & CLEAR BUTTON
475
- ========================================================================== */
476
- /* Count Text */
477
- --ms-count-text-bg: transparent;
478
- --ms-count-text-border: none;
479
- --ms-count-text-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
480
- --ms-count-text-color: var(--ms-text-color-1);
481
-
482
- /* Count Clear Button */
483
- --ms-count-clear-size: calc(1.6 * var(--ms-rem));
484
- --ms-count-clear-bg: transparent;
485
- --ms-count-clear-color: var(--ms-text-color-3);
486
- --ms-count-clear-font-size: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
487
- --ms-count-clear-border-radius: 50%;
488
- --ms-count-clear-bg-hover: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
489
- --ms-count-clear-color-hover: var(--ms-accent-color);
490
- --ms-icon-clear: "×";
491
-
492
- /* ==========================================================================
493
- TOOLTIPS
494
- ========================================================================== */
495
- --ms-tooltip-color: var(--ms-tooltip-text-color);
496
- --ms-tooltip-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
497
- --ms-tooltip-border-radius: var(--ms-border-radius-lg);
498
- --ms-tooltip-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
499
- --ms-tooltip-max-width: calc(32 * var(--ms-rem));
500
- --ms-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
501
- --ms-tooltip-z-index: 10000;
502
-
503
- /* ==========================================================================
504
- SELECTED POPOVER
505
- ========================================================================== */
506
- --ms-z-index-popover: 10000;
507
- --ms-selected-popover-width: calc(32 * var(--ms-rem));
508
- --ms-selected-popover-max-height: calc(32 * var(--ms-rem));
509
- --ms-selected-popover-border: var(--ms-border);
510
- --ms-selected-popover-border-radius: var(--ms-border-radius-lg);
511
- --ms-selected-popover-box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
512
-
513
- /* Popover Header */
514
- --ms-selected-popover-header-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
515
- --ms-selected-popover-header-bg: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
516
- --ms-selected-popover-header-border-bottom: var(--ms-border);
517
- --ms-selected-popover-header-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
518
- --ms-selected-popover-header-font-weight: var(--base-font-weight-semibold, 600);
519
- --ms-selected-popover-header-color: var(--ms-text-color-1);
520
-
521
- /* ==========================================================================
522
- POPOVER CLOSE BUTTON
523
- ========================================================================== */
524
- --ms-popover-close-size: calc(2.4 * var(--ms-rem));
525
- --ms-selected-popover-close-bg: transparent;
526
- --ms-selected-popover-close-color: var(--ms-text-color-3);
527
- --ms-selected-popover-close-font-size: calc(var(--base-font-size-xl, 2) * var(--ms-rem));
528
- --ms-selected-popover-close-border-radius: 50%;
529
- --ms-selected-popover-close-bg-hover: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
530
- --ms-selected-popover-close-color-hover: var(--ms-accent-color);
531
-
532
- /* ==========================================================================
533
- POPOVER BODY
534
- ========================================================================== */
535
- --ms-selected-popover-body-gap: calc(0.4 * var(--ms-rem));
536
- --ms-selected-popover-body-padding: calc(0.8 * var(--ms-rem));
537
- --ms-selected-popover-body-max-height: calc(28.8 * var(--ms-rem));
538
-
539
- /* ==========================================================================
540
- TYPOGRAPHY SCALE
541
- ========================================================================== */
542
- /* Font Sizes (unitless multipliers × --ms-rem) */
543
- --ms-font-size-2xs: calc(var(--base-font-size-2xs, 1) * var(--ms-rem));
544
- --ms-font-size-xs: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
545
- --ms-font-size-sm: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
546
- --ms-font-size-base: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
547
- --ms-font-size-lg: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
548
-
549
- /* Font Weights */
550
- --ms-font-weight-normal: var(--base-font-weight-normal, 400);
551
- --ms-font-weight-medium: var(--base-font-weight-medium, 500);
552
- --ms-font-weight-semibold: var(--base-font-weight-semibold, 600);
553
-
554
- /* Line Heights */
555
- --ms-line-height-none: 1;
556
- --ms-line-height-tight: var(--base-line-height-tight, 1.25);
557
- --ms-line-height-normal: var(--base-line-height-normal, 1.5);
558
- --ms-line-height-relaxed: var(--base-line-height-relaxed, 1.75);
559
-
560
- /* ==========================================================================
561
- BORDER RADIUS SCALE
562
- ========================================================================== */
563
- --ms-border-radius-sm: calc(var(--base-border-radius-sm, 0.4) * var(--ms-rem));
564
- --ms-border-radius-md: calc(var(--base-border-radius-md, 0.6) * var(--ms-rem));
565
- --ms-border-radius-lg: calc(var(--base-border-radius-lg, 0.8) * var(--ms-rem));
566
- --ms-border-radius: var(--ms-border-radius-md);
567
-
568
- /* ==========================================================================
569
- SPACING & SIZING
570
- ========================================================================== */
571
- --ms-spacing-xs: calc(0.4 * var(--ms-rem));
572
- --ms-spacing-sm: calc(0.8 * var(--ms-rem));
573
- --ms-spacing-md: calc(1.2 * var(--ms-rem));
574
- --ms-spacing-lg: calc(1.6 * var(--ms-rem));
575
-
576
- /* ==========================================================================
577
- TRANSITIONS & EFFECTS
578
- ========================================================================== */
579
- --ms-transition-fast: 150ms;
580
- --ms-transition-normal: 200ms;
581
- --ms-easing-snappy: cubic-bezier(0.4, 0, 0.2, 1);
582
-
583
- /* ==========================================================================
584
- OPACITY VALUES
585
- ========================================================================== */
586
- --ms-placeholder-opacity: 0.6;
587
- --ms-disabled-input-opacity: 0.6;
588
-
589
- /* ==========================================================================
590
- SCROLLBAR
591
- ========================================================================== */
592
- --ms-scrollbar-width: 8px;
593
- --ms-scrollbar-track-bg: transparent;
594
- --ms-scrollbar-thumb-bg: var(--ms-border-color);
595
- --ms-scrollbar-thumb-bg-hover: var(--ms-text-color-3);
596
- --ms-scrollbar-thumb-border-radius: 4px;
597
- }
1
+ /* ==============================================================================
2
+ CSS CUSTOM PROPERTIES (:host level)
3
+ ==============================================================================
4
+ This file defines all CSS custom properties at the :host level, making them:
5
+ - Inspectable in browser DevTools
6
+ - Overridable from outside Shadow DOM
7
+ - Self-documenting in compiled CSS
8
+
9
+ Usage from outside Shadow DOM:
10
+ multi-select {
11
+ --ms-accent-color: #10b981;
12
+ --ms-input-border-radius: 0.5rem;
13
+ }
14
+ ============================================================================== */
15
+
16
+ :host {
17
+ /* ==========================================================================
18
+ BASE SIZING UNIT
19
+ ==========================================================================
20
+ All sizing values are based on this unit for consistent scaling.
21
+ Default: 10px produces standard pixel values
22
+ Pure Admin: Set to 1rem (inherits from html { font-size: 10px })
23
+ Custom: Set to any value to scale all sizes proportionally */
24
+ --ms-rem: 10px;
25
+
26
+ /* ==========================================================================
27
+ FONT FAMILY (set at :host so all shadow DOM content inherits)
28
+ ========================================================================== */
29
+ font-family: var(--ms-font-family, var(--base-font-family, inherit));
30
+
31
+ /* ==========================================================================
32
+ HOST ELEMENT SIZING
33
+ ==========================================================================
34
+ Allows external width/height styling on <web-multiselect> element */
35
+ display: block;
36
+
37
+ /* ==========================================================================
38
+ COLORS & THEME
39
+ ==========================================================================
40
+ Color variables follow this priority chain:
41
+ 1. External override: --ms-accent-color: #custom
42
+ 2. Base theme value: var(--base-accent-color)
43
+ 3. Hardcoded default fallback */
44
+
45
+ /* Accent Colors */
46
+ --ms-accent-color: var(--base-accent-color, #3b82f6);
47
+ --ms-accent-color-hover: var(--base-accent-color-hover, #2563eb);
48
+ --ms-accent-color-active: var(--base-accent-color-active, #1d4ed8);
49
+
50
+ /* Accent Color Light Variants (for backgrounds) */
51
+ --ms-accent-color-light: var(--base-accent-color-light, #eff6ff);
52
+ --ms-accent-color-light-hover: var(--base-accent-color-light-hover, #e0f2fe);
53
+
54
+ /* Text Color Levels (FluentUI-style hierarchy) */
55
+ --ms-text-color-1: var(--base-text-color-1, #111827);
56
+ --ms-text-color-2: var(--base-text-color-2, #353b47);
57
+ --ms-text-color-3: var(--base-text-color-3, #6b7280);
58
+ --ms-text-color-4: var(--base-text-color-4, #a0a3a9);
59
+ --ms-text-color-on-accent: var(--base-text-color-on-accent, #ffffff);
60
+
61
+ /* Legacy aliases (for backward compatibility) */
62
+ --ms-text-primary: var(--ms-text-color-1);
63
+ --ms-text-secondary: var(--ms-text-color-3);
64
+
65
+ /* Background Colors
66
+ --ms-primary-bg drives option hover/focus, action-button hover, counter-wrapper hover, etc.
67
+ Theme authors can override via either --base-primary-bg (semantic) or --base-main-bg (legacy);
68
+ direct --ms-primary-bg / --ms-option-bg-hover overrides take precedence over both. */
69
+ --ms-primary-bg: var(--base-primary-bg, var(--base-main-bg, #f3f4f6));
70
+ --ms-primary-bg-hover: var(--base-hover-bg, #e5e7eb);
71
+
72
+ /* Border Base Variables */
73
+ --ms-border-color: var(--base-border-color, #e5e7eb);
74
+ --ms-border: var(--base-border, 1px solid var(--ms-border-color));
75
+
76
+ /* ==========================================================================
77
+ SEMANTIC VARIABLES - Component-Specific Theming
78
+ ==========================================================================
79
+ Pattern: --ms-{component}-{property}-{state}
80
+ Example: --ms-input-bg, --ms-option-text-color-hover */
81
+
82
+ /* Input Component Semantic Variables */
83
+ --ms-input-bg: var(--base-input-bg, #ffffff);
84
+ --ms-input-color: var(--base-input-color, var(--ms-text-color-1));
85
+ --ms-input-border: var(--base-input-border, 1px solid var(--ms-border-color));
86
+ --ms-input-border-hover: var(--base-input-border-hover, 1px solid var(--ms-accent-color));
87
+ --ms-input-border-focus: var(--base-input-border-focus, 1px solid var(--ms-accent-color));
88
+ --ms-input-placeholder-color: var(--base-input-placeholder-color, var(--ms-text-color-4));
89
+ --ms-input-bg-disabled: var(--base-input-bg-disabled, rgba(107, 114, 128, 0.05));
90
+
91
+ /* Toggle Icon Semantic Variables */
92
+ --ms-toggle-icon-color: var(--ms-text-color-3);
93
+ --ms-toggle-icon-color-open: var(--ms-text-color-3);
94
+
95
+ /* Counter Badge (in Input) Semantic Variables */
96
+ --ms-counter-badge-bg: var(--ms-accent-color);
97
+ --ms-counter-badge-bg-hover: var(--ms-accent-color-hover);
98
+ --ms-counter-badge-color: var(--ms-text-color-on-accent);
99
+
100
+ /* Floating Hint Semantic Variables */
101
+ --ms-hint-bg: var(--base-main-bg, #ffffff);
102
+ --ms-hint-color: var(--ms-text-color-4);
103
+ --ms-hint-border-color: var(--ms-border-color);
104
+
105
+ /* Dropdown Semantic Variables */
106
+ --ms-dropdown-bg: var(--base-dropdown-bg, #ffffff);
107
+ --ms-dropdown-text-color: var(--ms-text-color-1);
108
+ --ms-dropdown-border-color: var(--ms-border-color);
109
+ --ms-dropdown-box-shadow-semantic: var(--base-dropdown-box-shadow, 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1));
110
+
111
+ /* Dropdown Actions Semantic Variables */
112
+ --ms-actions-bg: var(--base-main-bg, #ffffff);
113
+ --ms-actions-border-color: var(--ms-border-color);
114
+
115
+ /* Action Button Semantic Variables */
116
+ --ms-action-button-bg: transparent;
117
+ --ms-action-button-bg-hover: var(--ms-primary-bg);
118
+ --ms-action-button-border-color: var(--ms-border-color);
119
+ --ms-action-button-border-color-hover: var(--ms-accent-color);
120
+ --ms-action-button-color: var(--ms-text-color-1);
121
+
122
+ /* Group Semantic Variables */
123
+ --ms-group-border-color: var(--ms-border-color);
124
+ --ms-group-label-color: var(--ms-text-color-3);
125
+
126
+ /* Option Semantic Variables */
127
+ --ms-option-text-color: var(--ms-text-color-1);
128
+ --ms-option-bg: transparent;
129
+ --ms-option-bg-hover: var(--ms-primary-bg);
130
+ --ms-option-color-hover: inherit;
131
+ --ms-option-bg-focused: var(--ms-primary-bg);
132
+ --ms-option-color-focused: inherit;
133
+ --ms-option-outline-color-focused: var(--ms-accent-color);
134
+ --ms-option-bg-selected: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
135
+ --ms-option-bg-matched: color-mix(in srgb, var(--ms-accent-color) 8%, transparent);
136
+ --ms-option-color-matched: inherit;
137
+ --ms-option-border-matched-color: color-mix(in srgb, var(--ms-accent-color) 40%, transparent);
138
+
139
+ /* Option Content Semantic Variables */
140
+ --ms-option-title-color: var(--ms-text-color-1);
141
+ --ms-option-subtitle-color: var(--ms-text-color-3);
142
+ --ms-option-mark-bg: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
143
+ --ms-option-mark-color: inherit;
144
+
145
+ /* Empty/Loading State Semantic Variables */
146
+ --ms-empty-color: var(--ms-text-color-3);
147
+ --ms-loading-color: var(--ms-text-color-3);
148
+
149
+ /* Badge Semantic Variables */
150
+ --ms-badge-bg: var(--ms-accent-color-light);
151
+ --ms-badge-bg-hover: var(--base-hover-bg, var(--ms-input-bg));
152
+ --ms-badge-bg-active: var(--ms-accent-color-light-hover);
153
+
154
+ /* Badge Text Semantic Variables */
155
+ --ms-badge-text-bg: var(--ms-accent-color-light);
156
+ --ms-badge-text-color: var(--ms-accent-color);
157
+ --ms-badge-text-bg-hover: var(--base-hover-bg, var(--ms-input-bg));
158
+ --ms-badge-text-color-hover: var(--ms-badge-text-color);
159
+
160
+ /* Badge Remove Button Semantic Variables */
161
+ --ms-badge-remove-bg: var(--ms-accent-color);
162
+ --ms-badge-remove-bg-hover: var(--ms-accent-color-hover);
163
+ --ms-badge-remove-color: var(--ms-text-color-on-accent);
164
+
165
+ /* Badge Counter Variant Semantic Variables */
166
+ /* Neutral/gray styling to distinguish from accent-colored selection badges */
167
+ --ms-badge-counter-border-color: var(--ms-border-color);
168
+ --ms-badge-counter-text-bg: var(--ms-primary-bg-hover);
169
+ --ms-badge-counter-text-color: var(--ms-text-color-1);
170
+ --ms-badge-counter-remove-bg: var(--ms-text-color-3);
171
+ --ms-badge-counter-remove-bg-hover: var(--ms-text-color-1);
172
+ --ms-badge-counter-remove-color: var(--ms-text-color-on-accent);
173
+
174
+ /* Count Display Semantic Variables */
175
+ --ms-counter-wrapper-bg: transparent;
176
+ --ms-counter-wrapper-bg-hover: var(--ms-primary-bg);
177
+ --ms-counter-wrapper-border-color: var(--ms-border-color);
178
+ --ms-counter-wrapper-border-color-hover: var(--ms-accent-color);
179
+ --ms-count-text-color: var(--ms-text-color-1);
180
+ --ms-count-clear-bg: transparent;
181
+ --ms-count-clear-bg-hover: var(--ms-accent-color);
182
+ --ms-count-clear-color: var(--ms-text-color-3);
183
+ --ms-count-clear-color-hover: var(--ms-accent-color);
184
+
185
+ /* Tooltip Semantic Variables */
186
+ --ms-tooltip-bg: var(--base-tooltip-bg, #333333);
187
+ --ms-tooltip-text-color: var(--base-tooltip-text-color, #ffffff);
188
+
189
+ /* Selected Popover Semantic Variables */
190
+ --ms-selected-popover-bg: var(--base-dropdown-bg, #ffffff);
191
+ --ms-selected-popover-border-color: var(--ms-border-color);
192
+ --ms-selected-popover-header-bg: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
193
+ --ms-selected-popover-header-color: var(--ms-text-color-1);
194
+ --ms-selected-popover-header-border-color: var(--ms-border-color);
195
+ --ms-selected-popover-close-bg: transparent;
196
+ --ms-selected-popover-close-bg-hover: var(--ms-accent-color);
197
+ --ms-selected-popover-close-color: var(--ms-text-color-3);
198
+ --ms-selected-popover-close-color-hover: var(--ms-accent-color);
199
+
200
+ /* ==========================================================================
201
+ INPUT COMPONENT
202
+ ========================================================================== */
203
+ --ms-input-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
204
+ --ms-input-padding-right: calc(4 * var(--ms-rem));
205
+ --ms-input-padding-h: calc(1.2 * var(--ms-rem));
206
+ --ms-input-height: calc(var(--base-input-size-md-height, 3.5) * var(--ms-rem));
207
+ --ms-input-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
208
+ --ms-input-border-width: 1px;
209
+ --ms-input-border-radius: var(--ms-border-radius-md);
210
+ --ms-input-text: var(--ms-text-color-1);
211
+ --ms-input-bg-disabled: rgba(107, 114, 128, 0.05);
212
+
213
+ /* ==========================================================================
214
+ INPUT SIZE VARIANTS
215
+ ==========================================================================
216
+ Five size variants for the input element (xs, sm, md, lg, xl)
217
+ Heights reference --base-input-size-*-height for consistency across components */
218
+ --ms-input-size-xs-font: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
219
+ --ms-input-size-xs-padding-v: calc(0.4 * var(--ms-rem));
220
+ --ms-input-size-xs-padding-h: calc(0.8 * var(--ms-rem));
221
+ --ms-input-size-xs-height: calc(var(--base-input-size-xs-height, 3.1) * var(--ms-rem)); /* 31px */
222
+
223
+ --ms-input-size-sm-font: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
224
+ --ms-input-size-sm-padding-v: calc(0.5 * var(--ms-rem));
225
+ --ms-input-size-sm-padding-h: calc(1.0 * var(--ms-rem));
226
+ --ms-input-size-sm-height: calc(var(--base-input-size-sm-height, 3.3) * var(--ms-rem)); /* 33px */
227
+
228
+ --ms-input-size-md-font: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
229
+ --ms-input-size-md-padding-v: calc(0.8 * var(--ms-rem));
230
+ --ms-input-size-md-padding-h: calc(1.2 * var(--ms-rem));
231
+ --ms-input-size-md-height: calc(var(--base-input-size-md-height, 3.5) * var(--ms-rem)); /* 35px */
232
+
233
+ --ms-input-size-lg-font: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
234
+ --ms-input-size-lg-padding-v: calc(1.0 * var(--ms-rem));
235
+ --ms-input-size-lg-padding-h: calc(1.4 * var(--ms-rem));
236
+ --ms-input-size-lg-height: calc(var(--base-input-size-lg-height, 3.8) * var(--ms-rem)); /* 38px */
237
+
238
+ --ms-input-size-xl-font: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
239
+ --ms-input-size-xl-padding-v: calc(1.2 * var(--ms-rem));
240
+ --ms-input-size-xl-padding-h: calc(1.6 * var(--ms-rem));
241
+ --ms-input-size-xl-height: calc(var(--base-input-size-xl-height, 4.1) * var(--ms-rem)); /* 41px */
242
+
243
+ /* ==========================================================================
244
+ TOGGLE ICON
245
+ ========================================================================== */
246
+ --ms-toggle-right: calc(1.2 * var(--ms-rem));
247
+ --ms-toggle-color: var(--ms-text-color-3);
248
+ --ms-transform-center-y: translateY(-50%);
249
+ --ms-transform-rotate-180: 180deg;
250
+
251
+ /* ==========================================================================
252
+ COUNT BADGE (in input)
253
+ ========================================================================== */
254
+ --ms-counter-offset: calc(3.2 * var(--ms-rem));
255
+ --ms-counter-padding: calc(0.2 * var(--ms-rem)) calc(0.4 * var(--ms-rem));
256
+ --ms-counter-bg: var(--ms-accent-color);
257
+ --ms-counter-color: var(--ms-text-color-on-accent);
258
+ --ms-counter-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
259
+ --ms-counter-font-weight: var(--base-font-weight-semibold, 600);
260
+ --ms-counter-border-radius: var(--ms-border-radius-sm);
261
+ --ms-counter-bg-hover: var(--ms-accent-color-hover);
262
+ --ms-transform-scale-hover: 1.1;
263
+
264
+ /* ==========================================================================
265
+ FLOATING HINT
266
+ ========================================================================== */
267
+ --ms-hint-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
268
+ --ms-hint-border: 1px solid var(--ms-hint-border-color);
269
+ --ms-hint-border-radius: var(--ms-border-radius-lg);
270
+ --ms-hint-box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
271
+ --ms-hint-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
272
+
273
+ /* ==========================================================================
274
+ DROPDOWN
275
+ ========================================================================== */
276
+ --ms-dropdown-border: var(--base-dropdown-border, 1px solid var(--ms-dropdown-border-color));
277
+ --ms-dropdown-border-radius: var(--ms-border-radius-lg);
278
+ --ms-dropdown-box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
279
+ --ms-options-max-height: calc(32 * var(--ms-rem));
280
+ --ms-option-color: var(--ms-text-color-1);
281
+ --ms-z-index-dropdown: 9999;
282
+ --ms-z-index-sticky: 1;
283
+
284
+ /* ==========================================================================
285
+ DROPDOWN ACTIONS
286
+ ========================================================================== */
287
+ --ms-actions-gap: calc(0.4 * var(--ms-rem));
288
+ --ms-actions-padding: calc(0.8 * var(--ms-rem));
289
+ --ms-actions-border-bottom: 1px solid var(--ms-actions-border-color);
290
+
291
+ /* Action Button */
292
+ --ms-action-btn-padding: calc(0.4 * var(--ms-rem)) calc(0.8 * var(--ms-rem));
293
+ --ms-action-btn-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
294
+ --ms-action-btn-border: var(--ms-border);
295
+ --ms-action-btn-border-radius: var(--ms-border-radius-sm);
296
+ --ms-action-btn-bg: transparent;
297
+ --ms-action-btn-color: inherit;
298
+ --ms-action-btn-bg-hover: var(--ms-primary-bg);
299
+ --ms-action-btn-border-color-hover: var(--ms-accent-color);
300
+ --ms-transform-scale-active: 0.98;
301
+
302
+ /* ==========================================================================
303
+ OPTIONS CONTAINER & GROUPS
304
+ ========================================================================== */
305
+ --ms-options-padding: 0;
306
+
307
+ /* Group */
308
+ --ms-group-border-top: 1px solid var(--ms-group-border-color);
309
+ --ms-group-margin-top: calc(0.4 * var(--ms-rem));
310
+ --ms-group-padding-top: calc(0.4 * var(--ms-rem));
311
+
312
+ /* Group Label */
313
+ --ms-group-label-padding: calc(0.4 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
314
+ --ms-group-label-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
315
+ --ms-group-label-font-weight: var(--base-font-weight-semibold, 600);
316
+ --ms-group-label-color: var(--ms-text-color-3);
317
+ --ms-group-label-transform: uppercase;
318
+ --ms-group-label-letter-spacing: 0.05em;
319
+
320
+ /* ==========================================================================
321
+ INDIVIDUAL OPTIONS
322
+ ==========================================================================
323
+ Per-component theming colors live in the SEMANTIC VARIABLES block above
324
+ (--ms-option-bg, --ms-option-bg-hover, --ms-option-bg-focused,
325
+ --ms-option-bg-matched, --ms-option-bg-selected, --ms-option-outline-color-focused,
326
+ --ms-option-border-matched-color). This block holds layout-only sizing. */
327
+ --ms-option-gap: calc(0.8 * var(--ms-rem));
328
+ --ms-option-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
329
+ --ms-option-padding-h: calc(1.2 * var(--ms-rem));
330
+ --ms-option-outline-focused: 2px solid var(--ms-option-outline-color-focused);
331
+ --ms-option-focus-outline-offset: -2px;
332
+ --ms-option-border-matched: 3px solid var(--ms-option-border-matched-color);
333
+
334
+ /* Option State Combinations */
335
+ --ms-option-bg-focused-hover: var(--ms-primary-bg);
336
+ --ms-option-bg-matched-hover: color-mix(in srgb, var(--ms-accent-color) 12%, transparent);
337
+ --ms-option-bg-selected-focused: color-mix(in srgb, var(--ms-accent-color) 15%, transparent);
338
+ --ms-option-bg-selected-matched: color-mix(in srgb, var(--ms-accent-color) 15%, transparent);
339
+ --ms-option-disabled-bg: var(--base-disabled-bg, transparent);
340
+ --ms-option-bg-disabled-selected: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
341
+
342
+ --ms-disabled-opacity: 0.5;
343
+
344
+ /* ==========================================================================
345
+ OPTION CONTENT
346
+ ========================================================================== */
347
+ --ms-option-content-gap: calc(0.8 * var(--ms-rem));
348
+
349
+ /* Option Icon */
350
+ --ms-option-icon-size: calc(2 * var(--ms-rem));
351
+ --ms-option-icon-font-size: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
352
+
353
+ /* Option Title (--ms-option-mark-bg / --ms-option-mark-color live in the SEMANTIC VARIABLES block above) */
354
+ --ms-option-title-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
355
+ --ms-option-mark-font-weight: var(--base-font-weight-semibold, 600);
356
+
357
+ /* Option Subtitle */
358
+ --ms-option-subtitle-margin-top: calc(0.4 * var(--ms-rem));
359
+ --ms-option-subtitle-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
360
+ --ms-option-subtitle-line-height: var(--base-line-height-tight, 1.25);
361
+
362
+ /* Checkbox */
363
+ --ms-checkbox-margin-top: calc(0.2 * var(--ms-rem));
364
+ --ms-checkbox-margin-right: 0;
365
+ --ms-checkbox-margin-bottom: 0;
366
+ --ms-checkbox-margin-left: 0;
367
+ --ms-checkbox-size: calc(1.6 * var(--ms-rem));
368
+ --ms-checkbox-scale: 1;
369
+ --ms-checkbox-align: center;
370
+
371
+ /* Checkbox Styling */
372
+ --ms-checkbox-bg: var(--ms-input-bg);
373
+ --ms-checkbox-border: var(--ms-border);
374
+ --ms-checkbox-border-radius: calc(0.3 * var(--ms-rem));
375
+ --ms-checkbox-checked-bg: var(--ms-accent-color);
376
+ --ms-checkbox-checked-border: 1px solid var(--ms-accent-color);
377
+ --ms-checkbox-checkmark-color: var(--ms-text-color-on-accent);
378
+ --ms-checkbox-hover-border-color: var(--ms-accent-color);
379
+ --ms-checkbox-disabled-bg: var(--ms-primary-bg);
380
+ --ms-checkbox-disabled-border: var(--ms-border);
381
+
382
+ /* Checkbox State Combinations */
383
+ --ms-checkbox-checked-bg-hover: var(--ms-accent-color-hover);
384
+ --ms-checkbox-checked-border-color-hover: var(--ms-accent-color-hover);
385
+
386
+ /* ==========================================================================
387
+ EMPTY & LOADING STATES
388
+ ========================================================================== */
389
+ --ms-empty-padding: calc(1.6 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
390
+ --ms-empty-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
391
+ --ms-empty-color: var(--ms-text-color-3);
392
+
393
+ /* Loader */
394
+ --ms-loader-padding: calc(1.6 * var(--ms-rem));
395
+ --ms-loader-gap: calc(0.8 * var(--ms-rem));
396
+
397
+ /* Loading Text */
398
+ --ms-loading-text-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
399
+ --ms-loading-text-color: var(--ms-text-color-3);
400
+
401
+ /* ==========================================================================
402
+ BADGES DISPLAY
403
+ ========================================================================== */
404
+ --ms-badges-gap: calc(0.8 * var(--ms-rem));
405
+ --ms-badges-margin-bottom: calc(0.8 * var(--ms-rem));
406
+ --ms-badges-margin-top: calc(0.8 * var(--ms-rem));
407
+ --ms-badges-margin-left: calc(0.4 * var(--ms-rem));
408
+ --ms-badges-margin-right: calc(0.4 * var(--ms-rem));
409
+
410
+ /* Vertical alignment for inline (left/right) badge positioning */
411
+ /* Options: center (default), flex-start (top), flex-end (bottom) */
412
+ --ms-inline-align: center;
413
+
414
+ /* Individual Badge (--ms-badge-bg / --ms-badge-bg-hover / --ms-badge-bg-active live in the SEMANTIC VARIABLES block above) */
415
+ --ms-badge-gap: calc(0.8 * var(--ms-rem));
416
+ --ms-badge-height: calc(2.7 * var(--ms-rem));
417
+ --ms-badge-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
418
+ --ms-badge-font-weight: var(--base-font-weight-semibold, 600);
419
+ --ms-badge-border-radius: var(--ms-border-radius-sm);
420
+ --ms-order-first: -1;
421
+
422
+ /* ==========================================================================
423
+ BADGE TEXT & REMOVE BUTTON
424
+ ========================================================================== */
425
+ /* Badge Text */
426
+ --ms-badge-text-padding: 0 calc(0.8 * var(--ms-rem));
427
+ --ms-badge-text-bg: var(--ms-accent-color-light);
428
+ --ms-badge-text-color: var(--ms-accent-color);
429
+ --ms-badge-text-border: none;
430
+
431
+ /* Badge Remove Button */
432
+ --ms-badge-remove-width: calc(2.7 * var(--ms-rem));
433
+ --ms-badge-remove-bg: var(--ms-accent-color);
434
+ --ms-badge-remove-color: var(--ms-text-color-on-accent);
435
+ --ms-badge-remove-border: none;
436
+ --ms-badge-remove-font-size: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
437
+ --ms-badge-remove-bg-hover: var(--ms-accent-color-hover);
438
+ --ms-badge-remove-box-shadow-focus: 0 0 0 2px color-mix(in srgb, var(--ms-accent-color) 50%, transparent);
439
+ --ms-badge-remove-icon-size: calc(1.0 * var(--ms-rem));
440
+ /* SVG X glyph — rendered via mask so it inherits --ms-badge-remove-color via currentColor.
441
+ Override this var to use a different shape; the value must be a CSS url() pointing to a mask-friendly SVG. */
442
+ --ms-icon-remove: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M6 6L18 18M18 6L6 18' stroke='black' stroke-width='2.5' stroke-linecap='round' fill='none'/></svg>");
443
+
444
+ /* Badge Counter Indicator (layout-only properties, colors come from semantic section) */
445
+ --ms-badge-counter-bg: transparent;
446
+ --ms-badge-counter-border: 1px solid var(--ms-badge-counter-border-color);
447
+ --ms-badge-counter-border-radius: var(--ms-border-radius-sm);
448
+
449
+ /* ==========================================================================
450
+ "+X MORE" BADGE
451
+ ========================================================================== */
452
+ --ms-more-badge-bg: var(--ms-accent-color-light);
453
+ --ms-more-badge-hover-bg: var(--ms-badge-bg-hover);
454
+ --ms-more-badge-active-bg: var(--ms-accent-color-light-hover);
455
+
456
+ /* ==========================================================================
457
+ COUNT DISPLAY MODE
458
+ ========================================================================== */
459
+ --ms-count-display-margin-bottom: calc(0.8 * var(--ms-rem));
460
+ --ms-count-display-margin-top: calc(0.8 * var(--ms-rem));
461
+ --ms-count-display-margin-left: calc(0.8 * var(--ms-rem));
462
+ --ms-count-display-margin-right: calc(0.8 * var(--ms-rem));
463
+
464
+ /* Count Badge Wrapper */
465
+ --ms-counter-wrapper-bg: transparent;
466
+ --ms-counter-wrapper-border: var(--ms-border);
467
+ --ms-counter-wrapper-border-radius: var(--ms-border-radius-sm);
468
+ --ms-counter-wrapper-padding: calc(0.4 * var(--ms-rem)) calc(0.8 * var(--ms-rem));
469
+ --ms-counter-wrapper-gap: calc(0.4 * var(--ms-rem));
470
+ --ms-counter-wrapper-bg-hover: var(--ms-primary-bg);
471
+ --ms-counter-wrapper-border-color-hover: var(--ms-accent-color);
472
+
473
+ /* ==========================================================================
474
+ COUNT TEXT & CLEAR BUTTON
475
+ ========================================================================== */
476
+ /* Count Text */
477
+ --ms-count-text-bg: transparent;
478
+ --ms-count-text-border: none;
479
+ --ms-count-text-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
480
+ --ms-count-text-color: var(--ms-text-color-1);
481
+
482
+ /* Count Clear Button */
483
+ --ms-count-clear-size: calc(1.6 * var(--ms-rem));
484
+ --ms-count-clear-bg: transparent;
485
+ --ms-count-clear-color: var(--ms-text-color-3);
486
+ --ms-count-clear-font-size: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
487
+ --ms-count-clear-border-radius: var(--ms-border-radius-sm);
488
+ --ms-count-clear-bg-hover: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
489
+ --ms-count-clear-color-hover: var(--ms-accent-color);
490
+ --ms-count-clear-icon-size: calc(1.4 * var(--ms-rem));
491
+ --ms-icon-clear: var(--ms-icon-remove);
492
+
493
+ /* ==========================================================================
494
+ TOOLTIPS
495
+ ========================================================================== */
496
+ --ms-tooltip-color: var(--ms-tooltip-text-color);
497
+ --ms-tooltip-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
498
+ --ms-tooltip-border-radius: var(--ms-border-radius-lg);
499
+ --ms-tooltip-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
500
+ --ms-tooltip-max-width: calc(32 * var(--ms-rem));
501
+ --ms-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
502
+ --ms-tooltip-z-index: 10000;
503
+
504
+ /* ==========================================================================
505
+ SELECTED POPOVER
506
+ ========================================================================== */
507
+ --ms-z-index-popover: 10000;
508
+ --ms-selected-popover-width: calc(32 * var(--ms-rem));
509
+ --ms-selected-popover-max-height: calc(32 * var(--ms-rem));
510
+ --ms-selected-popover-border: 1px solid var(--ms-selected-popover-border-color);
511
+ --ms-selected-popover-border-radius: var(--ms-border-radius-lg);
512
+ --ms-selected-popover-box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
513
+
514
+ /* Popover Header */
515
+ --ms-selected-popover-header-padding: calc(0.8 * var(--ms-rem)) calc(1.2 * var(--ms-rem));
516
+ --ms-selected-popover-header-bg: color-mix(in srgb, var(--ms-accent-color) 10%, transparent);
517
+ --ms-selected-popover-header-border-bottom: 1px solid var(--ms-selected-popover-header-border-color);
518
+ --ms-selected-popover-header-font-size: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
519
+ --ms-selected-popover-header-font-weight: var(--base-font-weight-semibold, 600);
520
+ --ms-selected-popover-header-color: var(--ms-text-color-1);
521
+
522
+ /* ==========================================================================
523
+ POPOVER CLOSE BUTTON
524
+ ========================================================================== */
525
+ --ms-popover-close-size: calc(2.4 * var(--ms-rem));
526
+ --ms-selected-popover-close-bg: transparent;
527
+ --ms-selected-popover-close-color: var(--ms-text-color-3);
528
+ --ms-selected-popover-close-font-size: calc(var(--base-font-size-xl, 2) * var(--ms-rem));
529
+ --ms-selected-popover-close-border-radius: var(--ms-border-radius-sm);
530
+ --ms-selected-popover-close-bg-hover: color-mix(in srgb, var(--ms-accent-color) 20%, transparent);
531
+ --ms-selected-popover-close-color-hover: var(--ms-accent-color);
532
+ --ms-selected-popover-close-icon-size: calc(1.4 * var(--ms-rem));
533
+
534
+ /* ==========================================================================
535
+ POPOVER BODY
536
+ ========================================================================== */
537
+ --ms-selected-popover-body-gap: calc(0.4 * var(--ms-rem));
538
+ --ms-selected-popover-body-padding: calc(0.8 * var(--ms-rem));
539
+ --ms-selected-popover-body-max-height: calc(28.8 * var(--ms-rem));
540
+
541
+ /* ==========================================================================
542
+ TYPOGRAPHY SCALE
543
+ ========================================================================== */
544
+ /* Font Sizes (unitless multipliers × --ms-rem) */
545
+ --ms-font-size-2xs: calc(var(--base-font-size-2xs, 1) * var(--ms-rem));
546
+ --ms-font-size-xs: calc(var(--base-font-size-xs, 1.2) * var(--ms-rem));
547
+ --ms-font-size-sm: calc(var(--base-font-size-sm, 1.4) * var(--ms-rem));
548
+ --ms-font-size-base: calc(var(--base-font-size-base, 1.6) * var(--ms-rem));
549
+ --ms-font-size-lg: calc(var(--base-font-size-lg, 1.8) * var(--ms-rem));
550
+
551
+ /* Font Weights */
552
+ --ms-font-weight-normal: var(--base-font-weight-normal, 400);
553
+ --ms-font-weight-medium: var(--base-font-weight-medium, 500);
554
+ --ms-font-weight-semibold: var(--base-font-weight-semibold, 600);
555
+
556
+ /* Line Heights */
557
+ --ms-line-height-none: 1;
558
+ --ms-line-height-tight: var(--base-line-height-tight, 1.25);
559
+ --ms-line-height-normal: var(--base-line-height-normal, 1.5);
560
+ --ms-line-height-relaxed: var(--base-line-height-relaxed, 1.75);
561
+
562
+ /* ==========================================================================
563
+ BORDER RADIUS SCALE
564
+ ========================================================================== */
565
+ --ms-border-radius-sm: calc(var(--base-border-radius-sm, 0.4) * var(--ms-rem));
566
+ --ms-border-radius-md: calc(var(--base-border-radius-md, 0.6) * var(--ms-rem));
567
+ --ms-border-radius-lg: calc(var(--base-border-radius-lg, 0.8) * var(--ms-rem));
568
+ --ms-border-radius: var(--ms-border-radius-md);
569
+
570
+ /* ==========================================================================
571
+ SPACING & SIZING
572
+ ========================================================================== */
573
+ --ms-spacing-xs: calc(0.4 * var(--ms-rem));
574
+ --ms-spacing-sm: calc(0.8 * var(--ms-rem));
575
+ --ms-spacing-md: calc(1.2 * var(--ms-rem));
576
+ --ms-spacing-lg: calc(1.6 * var(--ms-rem));
577
+
578
+ /* ==========================================================================
579
+ TRANSITIONS & EFFECTS
580
+ ========================================================================== */
581
+ --ms-transition-fast: 150ms;
582
+ --ms-transition-normal: 200ms;
583
+ --ms-easing-snappy: cubic-bezier(0.4, 0, 0.2, 1);
584
+
585
+ /* ==========================================================================
586
+ OPACITY VALUES
587
+ ========================================================================== */
588
+ --ms-placeholder-opacity: 0.6;
589
+ --ms-disabled-input-opacity: 0.6;
590
+
591
+ /* ==========================================================================
592
+ SCROLLBAR
593
+ ========================================================================== */
594
+ --ms-scrollbar-width: 8px;
595
+ --ms-scrollbar-track-bg: transparent;
596
+ --ms-scrollbar-thumb-bg: var(--ms-border-color);
597
+ --ms-scrollbar-thumb-bg-hover: var(--ms-text-color-3);
598
+ --ms-scrollbar-thumb-border-radius: 4px;
599
+ }