tyrell-components 1.0.0-TC33 → 1.0.0-TC35

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.
Files changed (46) hide show
  1. package/css/tyrell-brand.css +101 -6
  2. package/dist/tyrell-brand.css +101 -6
  3. package/dist/tyrell.js +1 -1
  4. package/lib/components/button.d.ts +7 -0
  5. package/lib/components/button.d.ts.map +1 -1
  6. package/lib/components/button.js +12 -1
  7. package/lib/components/button.js.map +1 -1
  8. package/lib/components/option.d.ts +0 -11
  9. package/lib/components/option.d.ts.map +1 -1
  10. package/lib/components/option.js +4 -103
  11. package/lib/components/option.js.map +1 -1
  12. package/lib/components/popup.d.ts.map +1 -1
  13. package/lib/components/popup.js +22 -2
  14. package/lib/components/popup.js.map +1 -1
  15. package/lib/components/select.d.ts +8 -0
  16. package/lib/components/select.d.ts.map +1 -1
  17. package/lib/components/select.js +56 -7
  18. package/lib/components/select.js.map +1 -1
  19. package/lib/components/tabs.d.ts.map +1 -1
  20. package/lib/components/tabs.js +162 -23
  21. package/lib/components/tabs.js.map +1 -1
  22. package/lib/styles/button.d.ts.map +1 -1
  23. package/lib/styles/button.js +57 -14
  24. package/lib/styles/button.js.map +1 -1
  25. package/lib/styles/option.d.ts +1 -1
  26. package/lib/styles/option.d.ts.map +1 -1
  27. package/lib/styles/option.js +0 -51
  28. package/lib/styles/option.js.map +1 -1
  29. package/lib/styles/select-base.d.ts.map +1 -1
  30. package/lib/styles/select-base.js +51 -35
  31. package/lib/styles/select-base.js.map +1 -1
  32. package/lib/styles/select.d.ts +1 -1
  33. package/lib/styles/select.d.ts.map +1 -1
  34. package/lib/styles/select.js +18 -1
  35. package/lib/styles/select.js.map +1 -1
  36. package/lib/styles/tabs.d.ts +1 -1
  37. package/lib/styles/tabs.d.ts.map +1 -1
  38. package/lib/styles/tabs.js +70 -0
  39. package/lib/styles/tabs.js.map +1 -1
  40. package/lib/styles/wizard.d.ts +1 -1
  41. package/lib/styles/wizard.d.ts.map +1 -1
  42. package/lib/styles/wizard.js +15 -3
  43. package/lib/styles/wizard.js.map +1 -1
  44. package/lib/version.d.ts +1 -1
  45. package/lib/version.js +1 -1
  46. package/package.json +5 -2
@@ -28,9 +28,9 @@ const tokenRef = (prefix, f, suffix, fb) => fb
28
28
  const solidFlavor = (f, fb) => {
29
29
  const solid = (suffix) => tokenRef('--ty-solid', f, suffix, fb);
30
30
  return `
31
- button.solid.${f} { --_ring: ${tokenRef('--ty-color', f, '', fb)}; background: var(--ty-button-bg, ${solid('')}); color: var(--ty-button-color, ${solid('-fg')}); }
32
- button.solid.${f}.tone-plus { background: var(--ty-button-bg, ${solid('-strong')}); }
33
- button.solid.${f}.tone-minus { background: var(--ty-button-bg, ${solid('-soft')}); }
31
+ button.solid.${f} { --_ring: ${tokenRef('--ty-color', f, '', fb)}; background: var(--ty-button-bg, var(--_muted-solid-bg, ${solid('')})); color: var(--ty-button-color, var(--_muted-solid-fg, ${solid('-fg')})); }
32
+ button.solid.${f}.tone-plus { background: var(--ty-button-bg, var(--_muted-solid-bg, ${solid('-strong')})); color: var(--ty-button-color, var(--_muted-solid-fg, ${solid('-strong-fg')})); }
33
+ button.solid.${f}.tone-minus { background: var(--ty-button-bg, var(--_muted-solid-bg, ${solid('-soft')})); color: var(--ty-button-color, var(--_muted-solid-fg, ${solid('-soft-fg')})); }
34
34
  button.solid.${f}:hover:not(:disabled) { background: var(--ty-button-bg-hover, ${solid('-hover')}); }
35
35
  button.solid.${f}:active:not(:disabled) { background: ${solid('-active')}; }
36
36
  `;
@@ -39,16 +39,16 @@ const outlinedFlavor = (f, fb) => {
39
39
  const color = (suffix) => tokenRef('--ty-color', f, suffix, fb);
40
40
  return `
41
41
  button.outlined.${f} {
42
- color: var(--ty-button-color, ${color('')});
43
- border-color: var(--ty-button-border, ${color('')});
42
+ color: var(--ty-button-color, var(--_muted-outlined-line, ${color('')}));
43
+ border-color: var(--ty-button-border, var(--_muted-outlined-line, ${color('')}));
44
44
  }
45
45
  button.outlined.${f}.tone-plus {
46
- color: var(--ty-button-color, ${color('-strong')});
47
- border-color: var(--ty-button-border, ${color('-strong')});
46
+ color: var(--ty-button-color, var(--_muted-outlined-line, ${color('-strong')}));
47
+ border-color: var(--ty-button-border, var(--_muted-outlined-line, ${color('-strong')}));
48
48
  }
49
49
  button.outlined.${f}.tone-minus {
50
- color: var(--ty-button-color, ${color('-soft')});
51
- border-color: var(--ty-button-border, ${color('-soft')});
50
+ color: var(--ty-button-color, var(--_muted-outlined-line, ${color('-soft')}));
51
+ border-color: var(--ty-button-border, var(--_muted-outlined-line, ${color('-soft')}));
52
52
  }
53
53
  button.outlined.${f}:hover:not(:disabled) {
54
54
  background: var(--ty-button-bg-hover, ${tokenRef('--ty-bg', f, '-soft', fb)});
@@ -58,9 +58,9 @@ button.outlined.${f}:hover:not(:disabled) {
58
58
  const ghostFlavor = (f, fb) => {
59
59
  const color = (suffix) => tokenRef('--ty-color', f, suffix, fb);
60
60
  return `
61
- button.ghost.${f} { color: var(--ty-button-color, ${color('')}); }
62
- button.ghost.${f}.tone-plus { color: var(--ty-button-color, ${color('-strong')}); }
63
- button.ghost.${f}.tone-minus { color: var(--ty-button-color, ${color('-soft')}); }
61
+ button.ghost.${f} { color: var(--ty-button-color, var(--_muted-ghost-fg, ${color('')})); }
62
+ button.ghost.${f}.tone-plus { color: var(--ty-button-color, var(--_muted-ghost-fg, ${color('-strong')})); }
63
+ button.ghost.${f}.tone-minus { color: var(--ty-button-color, var(--_muted-ghost-fg, ${color('-soft')})); }
64
64
  button.ghost.${f}:hover:not(:disabled) {
65
65
  background: var(--ty-button-bg-hover, ${tokenRef('--ty-bg', f, '-soft', fb)});
66
66
  }
@@ -252,6 +252,49 @@ button.action.lg ::slotted(ty-icon) { height: 1.125rem; width: 1.125rem; }
252
252
  button.action.xl { height: 2.5rem; width: 2.5rem; }
253
253
  button.action.xl ::slotted(ty-icon) { height: 1.25rem; width: 1.25rem; }
254
254
 
255
+ /* ===== MUTED =====
256
+ Show the neutral tokens at rest instead of the flavor color; reveal the
257
+ real flavor on interaction. Implemented as a fallback tier the flavor
258
+ rules above already read (--_muted-*), which sits behind the public
259
+ --ty-button-{bg,color,border} override slots and ahead of the flavor's
260
+ own token — so a custom brand color still wins, muted or not. Unsetting
261
+ --_muted-* on interaction falls the var() chain through to whatever's
262
+ next (the user's override, or the real flavor color).
263
+ Hover reveal is gated to real pointers (touch has no hover); :active /
264
+ :focus-visible cover the tap case so touch still gets the color on press. */
265
+
266
+ button.muted {
267
+ --_muted-solid-bg: var(--ty-solid-neutral);
268
+ --_muted-solid-fg: var(--ty-solid-neutral-fg);
269
+ --_muted-outlined-line: var(--ty-color-neutral);
270
+ --_muted-ghost-fg: var(--ty-color-neutral);
271
+ }
272
+ button.muted.tone-plus {
273
+ --_muted-solid-bg: var(--ty-solid-neutral-strong);
274
+ --_muted-outlined-line: var(--ty-color-neutral-strong);
275
+ --_muted-ghost-fg: var(--ty-color-neutral-strong);
276
+ }
277
+ button.muted.tone-minus {
278
+ --_muted-solid-bg: var(--ty-solid-neutral-soft);
279
+ --_muted-outlined-line: var(--ty-color-neutral-soft);
280
+ --_muted-ghost-fg: var(--ty-color-neutral-soft);
281
+ }
282
+ @media (hover: hover) and (pointer: fine) {
283
+ button.muted:hover:not(:disabled) {
284
+ --_muted-solid-bg: unset;
285
+ --_muted-solid-fg: unset;
286
+ --_muted-outlined-line: unset;
287
+ --_muted-ghost-fg: unset;
288
+ }
289
+ }
290
+ button.muted:active:not(:disabled),
291
+ button.muted:focus-visible:not(:disabled) {
292
+ --_muted-solid-bg: unset;
293
+ --_muted-solid-fg: unset;
294
+ --_muted-outlined-line: unset;
295
+ --_muted-ghost-fg: unset;
296
+ }
297
+
255
298
  /* ===== PILL ===== */
256
299
 
257
300
  button.pill {
@@ -293,8 +336,8 @@ button.solid {
293
336
  background: var(--ty-button-bg, var(--ty-solid-neutral));
294
337
  color: var(--ty-button-color, var(--ty-solid-neutral-fg));
295
338
  }
296
- button.solid.tone-plus { background: var(--ty-button-bg, var(--ty-solid-neutral-strong)); }
297
- button.solid.tone-minus { background: var(--ty-button-bg, var(--ty-solid-neutral-soft)); }
339
+ button.solid.tone-plus { background: var(--ty-button-bg, var(--ty-solid-neutral-strong)); color: var(--ty-button-color, var(--ty-solid-neutral-strong-fg)); }
340
+ button.solid.tone-minus { background: var(--ty-button-bg, var(--ty-solid-neutral-soft)); color: var(--ty-button-color, var(--ty-solid-neutral-soft-fg)); }
298
341
  button.solid:hover:not(:disabled) { background: var(--ty-button-bg-hover, var(--ty-solid-neutral-hover)); }
299
342
  button.solid:active:not(:disabled) { background: var(--ty-solid-neutral-active); }
300
343
 
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/styles/button.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/styles/button.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  * Option Component Styles
3
3
  * PORTED FROM: clj/ty/components/option.css
4
4
  */
5
- export declare const optionStyles = "\n/* Ty Option Component Styles */\n\n.option-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ty-spacing-2);\n box-sizing: border-box;\n width: 100%;\n\n /* Ensure content is clickable */\n cursor: pointer;\n user-select: none;\n\n /* Smooth transitions */\n transition: var(--ty-transition-all);\n\n /* Text styling \u2014 Linear-paired typography */\n color: var(--ty-text);\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 padding: var(--ty-spacing-2) var(--ty-spacing-3);\n border-radius: var(--ty-radius-md);\n}\n\n:host([cloned]) .option-content {\n padding: 0px;\n background: transparent;\n}\n\n.option-content:hover {\n background: var(--ty-bg-neutral-soft);\n}\n\n.option-content[highlighted] {\n background: var(--ty-bg-neutral-soft);\n color: var(--ty-text-strong);\n font-weight: var(--ty-font-semibold);\n}\n\n/* Selected: quiet \u2014 bolder text color only, no background slab, no weight change */\n.option-content[selected] {\n background: transparent;\n color: var(--ty-text-bold);\n}\n\n/* Lucide check \u2014 right-aligned, visible only on selected options */\n.option-check {\n display: none;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n margin-left: auto;\n color: var(--ty-color-primary);\n}\n\n.option-content[selected] .option-check {\n display: block;\n}\n\n/* Never show the check on the copy cloned into the select's trigger field */\n:host([cloned]) .option-check {\n display: none;\n}\n\n.option-content[selected]:hover {\n background: var(--ty-bg-neutral-soft);\n}\n\n.option-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.option-clear-btn {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n border: none;\n border-radius: 50%;\n cursor: pointer;\n padding: 0;\n transition: all 150ms ease;\n opacity: 0.9;\n}\n\n.option-clear-btn:hover {\n background: rgba(0, 0, 0, 0.7);\n opacity: 1;\n transform: scale(1.05);\n}\n\n.option-clear-btn:active {\n background: rgba(0, 0, 0, 0.85);\n transform: scale(0.95);\n}\n\n.option-clear-btn svg {\n width: 16px;\n height: 16px;\n color: #ffffff;\n stroke-width: 2.5;\n}\n\n.option-content[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.option-content[hidden] {}\n\n/* Ensure nested elements inherit proper styling */\n.option-content * {\n pointer-events: none;\n}\n\n/* CRITICAL: Re-enable pointer events on clear button */\n.option-clear-btn {\n pointer-events: auto !important;\n}\n\n.option-clear-btn * {\n pointer-events: none;\n}\n";
5
+ export declare const optionStyles = "\n/* Ty Option Component Styles */\n\n.option-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ty-spacing-2);\n box-sizing: border-box;\n width: 100%;\n\n /* Ensure content is clickable */\n cursor: pointer;\n user-select: none;\n\n /* Smooth transitions */\n transition: var(--ty-transition-all);\n\n /* Text styling \u2014 Linear-paired typography */\n color: var(--ty-text);\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 padding: var(--ty-spacing-2) var(--ty-spacing-3);\n border-radius: var(--ty-radius-md);\n}\n\n:host([cloned]) .option-content {\n padding: 0px;\n background: transparent;\n}\n\n.option-content:hover {\n background: var(--ty-bg-neutral-soft);\n}\n\n.option-content[highlighted] {\n background: var(--ty-bg-neutral-soft);\n color: var(--ty-text-strong);\n font-weight: var(--ty-font-semibold);\n}\n\n/* Selected: quiet \u2014 bolder text color only, no background slab, no weight change */\n.option-content[selected] {\n background: transparent;\n color: var(--ty-text-bold);\n}\n\n/* Lucide check \u2014 right-aligned, visible only on selected options */\n.option-check {\n display: none;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n margin-left: auto;\n color: var(--ty-color-primary);\n}\n\n.option-content[selected] .option-check {\n display: block;\n}\n\n/* Never show the check on the copy cloned into the select's trigger field */\n:host([cloned]) .option-check {\n display: none;\n}\n\n.option-content[selected]:hover {\n background: var(--ty-bg-neutral-soft);\n}\n\n.option-content[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.option-content[hidden] {}\n\n/* Ensure nested elements inherit proper styling */\n.option-content * {\n pointer-events: none;\n}\n";
6
6
  //# sourceMappingURL=option.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"option.d.ts","sourceRoot":"","sources":["../../src/styles/option.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,YAAY,4vFAsIxB,CAAA"}
1
+ {"version":3,"file":"option.d.ts","sourceRoot":"","sources":["../../src/styles/option.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,YAAY,62DAmFxB,CAAA"}
@@ -74,48 +74,6 @@ export const optionStyles = `
74
74
  background: var(--ty-bg-neutral-soft);
75
75
  }
76
76
 
77
- .option-text {
78
- flex: 1;
79
- min-width: 0;
80
- overflow: hidden;
81
- text-overflow: ellipsis;
82
- white-space: nowrap;
83
- }
84
-
85
- .option-clear-btn {
86
- flex-shrink: 0;
87
- width: 28px;
88
- height: 28px;
89
- display: flex;
90
- align-items: center;
91
- justify-content: center;
92
- background: rgba(0, 0, 0, 0.5);
93
- border: none;
94
- border-radius: 50%;
95
- cursor: pointer;
96
- padding: 0;
97
- transition: all 150ms ease;
98
- opacity: 0.9;
99
- }
100
-
101
- .option-clear-btn:hover {
102
- background: rgba(0, 0, 0, 0.7);
103
- opacity: 1;
104
- transform: scale(1.05);
105
- }
106
-
107
- .option-clear-btn:active {
108
- background: rgba(0, 0, 0, 0.85);
109
- transform: scale(0.95);
110
- }
111
-
112
- .option-clear-btn svg {
113
- width: 16px;
114
- height: 16px;
115
- color: #ffffff;
116
- stroke-width: 2.5;
117
- }
118
-
119
77
  .option-content[disabled] {
120
78
  opacity: 0.5;
121
79
  cursor: not-allowed;
@@ -127,14 +85,5 @@ export const optionStyles = `
127
85
  .option-content * {
128
86
  pointer-events: none;
129
87
  }
130
-
131
- /* CRITICAL: Re-enable pointer events on clear button */
132
- .option-clear-btn {
133
- pointer-events: auto !important;
134
- }
135
-
136
- .option-clear-btn * {
137
- pointer-events: none;
138
- }
139
88
  `;
140
89
  //# sourceMappingURL=option.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"option.js","sourceRoot":"","sources":["../../src/styles/option.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsI3B,CAAA"}
1
+ {"version":3,"file":"option.js","sourceRoot":"","sources":["../../src/styles/option.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmF3B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-base.d.ts","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAAkC,CAAC;AAErF,eAAO,MAAM,gBAAgB,QAq3B5B,CAAC"}
1
+ {"version":3,"file":"select-base.d.ts","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAAkC,CAAC;AAErF,eAAO,MAAM,gBAAgB,QAq4B5B,CAAC"}
@@ -496,12 +496,17 @@ export const selectBaseStyles = `
496
496
  right: 0;
497
497
  bottom: 0;
498
498
  width: 100vw;
499
- height: 100vh;
499
+ height: 100dvh; /* dvh, not vh — shrinks with the on-screen keyboard so the
500
+ dialog never sits partly behind it */
500
501
  max-width: 100vw;
501
- max-height: 100vh;
502
+ max-height: 100dvh;
502
503
  margin: 0;
503
504
  padding: 0;
504
- padding-top: 10vh; /* Position content from top */
505
+ padding-top: 6dvh; /* Sit higher than the old 10vh, but 4dvh left the
506
+ floating label with no headroom — it sits above
507
+ .mobile-search-header via position:absolute, so it
508
+ needs room inside this padding, not just inside the
509
+ content box, or it crowds the very top of the screen */
505
510
  border: none;
506
511
  background: transparent; /* Backdrop handles background */
507
512
  /* Note: Don't set display - browser controls <dialog> visibility */
@@ -522,7 +527,9 @@ export const selectBaseStyles = `
522
527
 
523
528
  /* Native dialog backdrop with blur */
524
529
  .dropdown-mode-mobile .mobile-dialog::backdrop {
525
- background: rgba(0, 0, 0, 0.5);
530
+ background: rgba(0, 0, 0, 0.65); /* was 0.5 — needed more depth to reliably
531
+ carry white header text/icons over a
532
+ light page blurred behind it */
526
533
  backdrop-filter: blur(8px);
527
534
  -webkit-backdrop-filter: blur(8px);
528
535
  }
@@ -534,7 +541,7 @@ export const selectBaseStyles = `
534
541
  width: calc(100% - 32px); /* Side margins */
535
542
  max-width: 400px; /* Constrained width like dropdown */
536
543
  min-height: 200px;
537
- max-height: calc(90vh - 10vh);
544
+ max-height: 90dvh; /* leaves room below the 6dvh padding-top, shrinks with keyboard */
538
545
  opacity: 0;
539
546
  transform: scale(0.95);
540
547
  transition:
@@ -567,64 +574,73 @@ export const selectBaseStyles = `
567
574
  align-items: center;
568
575
  gap: 12px;
569
576
  width: 100%;
570
- }
571
-
572
- /* Header for non-searchable (label + close button) */
573
- .dropdown-mode-mobile .mobile-header-nosearch {
574
- flex-shrink: 0;
575
- display: flex;
576
- align-items: center;
577
+ /* When search is disabled, updateSearchVisibility() hides the icon+input
578
+ (see select.ts) but leaves the close button as the row's only child —
579
+ without this it falls back to flex-start and strands the button on the
580
+ left. Harmless when search IS shown: the input's flex:1 already
581
+ consumes all remaining space, so justify-content never gets a say. */
577
582
  justify-content: flex-end;
578
- margin-bottom: 16px;
579
- padding: 0;
580
- background: transparent;
581
- position: relative;
582
- min-height: 40px;
583
583
  }
584
584
 
585
585
  .dropdown-mode-mobile .mobile-header-label {
586
586
  position: absolute;
587
587
  bottom: 100%;
588
- left: 6px;
589
- margin-bottom: 4px;
590
- font-size: var(--ty-font-lg);
591
- line-height: var(--ty-leading-lg);
592
- letter-spacing: var(--ty-tracking-lg);
593
- font-weight: 700;
594
- color: var(--ty-color-neutral);
588
+ left: 2px;
589
+ margin-bottom: 8px; /* was 4px — too tight against the search row */
590
+ font-size: var(--ty-font-base); /* was --ty-font-lg — read as oversized/heavy paired with 700 */
591
+ line-height: var(--ty-leading-base);
592
+ letter-spacing: var(--ty-tracking-base);
593
+ font-weight: 600; /* was 700 — 700 at font-lg read as clunky */
594
+ /* This sits on the dialog's ::backdrop (rgba(0,0,0,.65) + blur) — a fixed
595
+ DARK overlay regardless of theme, not the theme's own surface color.
596
+ A theme-toggling token (light mode → black) fights that: black text on
597
+ a dark blurred backdrop is the wrong combination. Fixed white, same
598
+ reasoning as ty-tooltip's deliberately theme-independent default in
599
+ tyrell.css — this element's job is to pop against a dark backdrop in
600
+ both themes, not to track the page's light/dark state. */
601
+ color: #ffffff;
595
602
  pointer-events: none;
596
603
  }
597
604
 
598
- /* Close button - circular with border (matches dropdown.ts) */
605
+ /* Close button — borderless ghost icon button (was a bordered circle badge,
606
+ which read as a heavy, disconnected "chip" next to the plain search icon).
607
+ Matches ty-button's ghost treatment: transparent at rest, soft neutral
608
+ fill on hover/active, no border ever. */
599
609
  .dropdown-mode-mobile .mobile-close-button {
600
610
  flex-shrink: 0;
601
- width: 36px;
602
- height: 36px;
611
+ width: 32px;
612
+ height: 32px;
603
613
  display: flex;
604
614
  align-items: center;
605
615
  justify-content: center;
606
- background: var(--ty-surface-floating);
607
- border: 2px solid var(--mobile-border-color);
616
+ background: transparent;
617
+ border: none;
608
618
  border-radius: 50%;
609
- color: var(--ty-text-strong);
619
+ /* Same reasoning as .mobile-header-label: fixed white, not a theme token —
620
+ this sits on the dark ::backdrop blur in both themes, never on a theme
621
+ surface. */
622
+ color: #ffffff;
610
623
  cursor: pointer;
611
624
  transition: var(--ty-transition-all);
612
625
  padding: 0;
613
626
  }
614
627
 
628
+ /* Hover/active fills also go fixed-white-tinted rather than theme neutral —
629
+ --ty-bg-neutral-soft is a LIGHT fill in light mode, which would swallow
630
+ the white icon it's meant to sit behind. */
615
631
  .dropdown-mode-mobile .mobile-close-button:hover {
616
- background: var(--ty-bg-neutral);
617
- border-color: var(--ty-border);
618
- color: var(--ty-text-strong);
632
+ background: rgba(255, 255, 255, 0.15);
633
+ color: #ffffff;
619
634
  }
620
635
 
621
636
  .dropdown-mode-mobile .mobile-close-button:active {
622
637
  transform: scale(0.9);
638
+ background: rgba(255, 255, 255, 0.25);
623
639
  }
624
640
 
625
641
  .dropdown-mode-mobile .mobile-close-button svg {
626
- width: 24px;
627
- height: 24px;
642
+ width: 18px;
643
+ height: 18px;
628
644
  }
629
645
 
630
646
  /* Mobile search input (matches dropdown.ts) */
@@ -1 +1 @@
1
- {"version":3,"file":"select-base.js","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select-base.js","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  * - .compact: content-hugging trigger for toolbars, count badge
9
9
  * - .custom-trigger (slot="trigger"): all chrome stripped
10
10
  */
11
- export declare const selectStyles = "\n/* ===== COMPACT skin: hugs content (field skin = base styles) ===== */\n.select-stub.compact {\n display: inline-flex;\n flex-wrap: nowrap;\n width: auto;\n gap: 0.5rem;\n /* extra right padding = room for the absolutely-positioned chevron */\n padding: 0.5rem 2.25rem 0.5rem 0.875rem;\n}\n\n/* Consumer-provided trigger (slot=\"trigger\"): no chrome at all */\n.select-stub.custom-trigger {\n display: inline-block;\n border: none;\n background: none;\n padding: 0;\n min-height: 0;\n border-radius: 0;\n}\n.select-stub.custom-trigger:hover {\n border: none;\n}\n\n.select-count {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 0.375rem;\n border-radius: 9999px;\n /* --ty-text-primary never existed as a token \u2014 this silently fell back\n to inherited/unset color. Now follows the select's own flavor. */\n background: color-mix(in oklab, var(--select-accent, var(--ty-color-primary)) 15%, transparent);\n color: var(--select-accent-bold, var(--ty-color-primary-strong));\n font-size: var(--ty-font-xs);\n font-weight: var(--ty-font-semibold);\n font-style: normal;\n}\n.select-count[hidden] {\n display: none;\n}\n/* Selection text (field skin): single line, ellipsis, input colors */\n.select-stub .dropdown-placeholder {\n font-style: normal;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--input-color, var(--ty-input-color));\n}\n\n/* Empty state: muted placeholder color */\n.select-stub .dropdown-placeholder.placeholder-shown {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n}\n.select-stub .dropdown-placeholder[hidden] {\n display: none;\n}\n\n/* Single-select display clone (slot=\"selected\"): the selected ty-option\n projected into the stub \u2014 its own :host([cloned]) styling strips the\n list-row chrome; here it just takes the text's flex slot. */\n.select-stub slot[name=\"selected\"] {\n display: none;\n}\n.select-stub.has-clone slot[name=\"selected\"] {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n}\n.select-stub.compact.has-clone slot[name=\"selected\"] {\n flex: 0 1 auto;\n}\n\n/* start/end slot content (icons etc.) \u2014 spacing comes from the stub's flex\n gap; muted like ty-input adornments. end sits before the chevron. */\n.select-stub ::slotted([slot=\"start\"]),\n.select-stub ::slotted([slot=\"end\"]) {\n flex-shrink: 0;\n color: var(--ty-text-soft);\n}\n\n/* Compact skin: the text IS the trigger label \u2014 no grow, regular text color */\n.select-stub.compact .dropdown-placeholder {\n flex-grow: 0;\n color: var(--ty-text);\n}\n\n/* Trigger stays visible while the popup is open (the popup hides it) */\n.dropdown-wrapper:has(.dropdown-chevron.open) .select-stub {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ===== One-panel popup: search header fused with the options list ===== */\n\n/* Single unified shadow around the whole panel (header + list as one silhouette) */\n.dropdown-dialog.open {\n filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.14)) drop-shadow(0 2px 6px rgba(0, 0, 0, 0.08));\n}\n\n/* Card-style header: the search input keeps its own bordered-field look\n (base styles) and sits inset in the panel, TagPicker-style \u2014 no divider,\n whitespace separates it from the list. */\n.dropdown-header {\n background: var(--input-bg, var(--ty-input-bg));\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n padding: var(--ty-spacing-2) var(--ty-spacing-2) var(--ty-spacing-1);\n}\n.dropdown-dialog.position-below .dropdown-header {\n margin-bottom: 0;\n}\n.dropdown-dialog.position-above .dropdown-header {\n margin-top: 0;\n border-top: none;\n border-bottom: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n padding: var(--ty-spacing-1) var(--ty-spacing-2) var(--ty-spacing-2);\n}\n\n/* Magnifier adornment inside the search field (header padding + field inset) */\n.dropdown-search-icon {\n position: absolute;\n top: 50%;\n left: calc(var(--ty-spacing-2) + var(--ty-spacing-3));\n transform: translateY(-50%);\n width: 1rem;\n height: 1rem;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n pointer-events: none;\n}\n.dropdown-search-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Mobile header: flex row, icon flows inline before the input */\n.dropdown-mode-mobile .mobile-header-content .dropdown-search-icon {\n position: static;\n transform: none;\n flex-shrink: 0;\n}\n\n/* Search input: bordered field from base styles; just size + icon room */\n.dropdown-search-input {\n min-height: 2.25rem;\n padding-right: var(--ty-spacing-2);\n /* room for the magnifier adornment */\n padding-left: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));\n}\n/* Trigger already has a chevron - no second one inside the search row */\n.dropdown-search-chevron {\n display: none;\n}\n\n/* With the search row hidden nothing inside is focusable, so the <dialog>\n itself receives focus on open \u2014 suppress its UA focus ring */\n.dropdown-dialog:focus,\n.dropdown-dialog:focus-visible {\n outline: none;\n}\n\n/* Search row hidden ('auto' below threshold / searchable=\"false\"):\n the options panel owns the whole silhouette */\n.dropdown-header[hidden] {\n display: none;\n}\n.dropdown-header[hidden] ~ .dropdown-options-wrapper .dropdown-options {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-lg);\n}\n.mobile-search-input[hidden],\n.mobile-header-content .dropdown-search-icon[hidden] {\n display: none;\n}\n\n/* Options: vertical list rows fused under the search header.\n No own shadow/animation - the panel appears as one via dialog opacity. */\n.dropdown-options {\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: stretch;\n gap: 0;\n /* Card-style list: rounded rows sit inset from the panel edges */\n padding: var(--ty-spacing-1);\n border-top: none;\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n box-shadow: none;\n transform: none;\n transition: none;\n /* ~9-10 visible rows before scrolling (custom scrollbar, native hidden) */\n max-height: 24rem;\n}\n.dropdown-dialog.position-below .dropdown-options {\n box-shadow: none;\n}\n.dropdown-dialog.position-above .dropdown-options {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n}\n\n/* Loading panel continues the fused silhouette exactly like .dropdown-options \u2014\n the base layer styles it as a floating card (radius + shadow), which left a\n see-through gap under the search header while loading. */\n.dropdown-loading {\n border-top: none;\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n box-shadow: none;\n}\n.dropdown-dialog.position-above .dropdown-loading {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n}\n\n/* Selection tick lives inside ty-option (lucide check on [selected]) */\n\n/* Mobile modal: same vertical list */\n.dropdown-mode-mobile .section-content ::slotted(ty-option) {\n display: block;\n width: 100%;\n}\n";
11
+ export declare const selectStyles = "\n/* ===== COMPACT skin: hugs content (field skin = base styles) ===== */\n.select-stub.compact {\n display: inline-flex;\n flex-wrap: nowrap;\n width: auto;\n gap: 0.5rem;\n /* extra right padding = room for the absolutely-positioned chevron */\n padding: 0.5rem 2.25rem 0.5rem 0.875rem;\n}\n\n/* Consumer-provided trigger (slot=\"trigger\"): no chrome at all */\n.select-stub.custom-trigger {\n display: inline-block;\n border: none;\n background: none;\n padding: 0;\n min-height: 0;\n border-radius: 0;\n}\n.select-stub.custom-trigger:hover {\n border: none;\n}\n\n.select-count {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 0.375rem;\n border-radius: 9999px;\n /* --ty-text-primary never existed as a token \u2014 this silently fell back\n to inherited/unset color. Now follows the select's own flavor. */\n background: color-mix(in oklab, var(--select-accent, var(--ty-color-primary)) 15%, transparent);\n color: var(--select-accent-bold, var(--ty-color-primary-strong));\n font-size: var(--ty-font-xs);\n font-weight: var(--ty-font-semibold);\n font-style: normal;\n}\n.select-count[hidden] {\n display: none;\n}\n/* Selection text (field skin): single line, ellipsis, input colors */\n.select-stub .dropdown-placeholder {\n font-style: normal;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--input-color, var(--ty-input-color));\n}\n\n/* Empty state: muted placeholder color */\n.select-stub .dropdown-placeholder.placeholder-shown {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n}\n.select-stub .dropdown-placeholder[hidden] {\n display: none;\n}\n\n/* Single-select display clone (slot=\"selected\"): the selected ty-option\n projected into the stub \u2014 its own :host([cloned]) styling strips the\n list-row chrome; here it just takes the text's flex slot. */\n.select-stub slot[name=\"selected\"] {\n display: none;\n}\n.select-stub.has-clone slot[name=\"selected\"] {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n}\n.select-stub.compact.has-clone slot[name=\"selected\"] {\n flex: 0 1 auto;\n}\n\n/* start/end slot content (icons etc.) \u2014 spacing comes from the stub's flex\n gap; muted like ty-input adornments. end sits before the chevron. */\n.select-stub ::slotted([slot=\"start\"]),\n.select-stub ::slotted([slot=\"end\"]) {\n flex-shrink: 0;\n color: var(--ty-text-soft);\n}\n\n/* Compact skin: the text IS the trigger label \u2014 no grow, regular text color */\n.select-stub.compact .dropdown-placeholder {\n flex-grow: 0;\n color: var(--ty-text);\n}\n\n/* Trigger stays visible while the popup is open (the popup hides it) */\n.dropdown-wrapper:has(.dropdown-chevron.open) .select-stub {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ===== One-panel popup: search header fused with the options list ===== */\n\n/* Single unified shadow around the whole panel (header + list as one silhouette) */\n.dropdown-dialog.open {\n filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.14)) drop-shadow(0 2px 6px rgba(0, 0, 0, 0.08));\n}\n\n/* Card-style header: the search input keeps its own bordered-field look\n (base styles) and sits inset in the panel, TagPicker-style \u2014 no divider,\n whitespace separates it from the list. */\n.dropdown-header {\n background: var(--input-bg, var(--ty-input-bg));\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n padding: var(--ty-spacing-2) var(--ty-spacing-2) var(--ty-spacing-1);\n}\n.dropdown-dialog.position-below .dropdown-header {\n margin-bottom: 0;\n}\n.dropdown-dialog.position-above .dropdown-header {\n margin-top: 0;\n border-top: none;\n border-bottom: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n padding: var(--ty-spacing-1) var(--ty-spacing-2) var(--ty-spacing-2);\n}\n\n/* Magnifier adornment inside the search field (header padding + field inset) */\n.dropdown-search-icon {\n position: absolute;\n top: 50%;\n left: calc(var(--ty-spacing-2) + var(--ty-spacing-3));\n transform: translateY(-50%);\n width: 1rem;\n height: 1rem;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n pointer-events: none;\n}\n.dropdown-search-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* Mobile header: flex row, icon flows inline before the input. Same 32x32\n footprint as .mobile-close-button (18px glyph centered in the box, not a\n bare 18px glyph flush at the edge) so the row has two matching bookends \u2014\n a bare icon on one side and a 32px circle on the other read as lopsided\n even with equal flex gap on both sides. Matching them also centers the\n search input's flex:1 fill symmetrically between the two. Fixed white +\n 18px glyph, same reasoning as .mobile-header-label \u2014 this sits on the\n dark ::backdrop blur in both themes, not a theme surface. */\n.dropdown-mode-mobile .mobile-header-content .dropdown-search-icon {\n position: static;\n transform: none;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n color: #ffffff;\n}\n.dropdown-mode-mobile .mobile-header-content .dropdown-search-icon svg {\n width: 18px;\n height: 18px;\n}\n\n/* Search input: bordered field from base styles; just size + icon room */\n.dropdown-search-input {\n min-height: 2.25rem;\n padding-right: var(--ty-spacing-2);\n /* room for the magnifier adornment */\n padding-left: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));\n}\n/* Trigger already has a chevron - no second one inside the search row */\n.dropdown-search-chevron {\n display: none;\n}\n\n/* With the search row hidden nothing inside is focusable, so the <dialog>\n itself receives focus on open \u2014 suppress its UA focus ring */\n.dropdown-dialog:focus,\n.dropdown-dialog:focus-visible {\n outline: none;\n}\n\n/* Search row hidden ('auto' below threshold / searchable=\"false\"):\n the options panel owns the whole silhouette */\n.dropdown-header[hidden] {\n display: none;\n}\n.dropdown-header[hidden] ~ .dropdown-options-wrapper .dropdown-options {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-lg);\n}\n.mobile-search-input[hidden],\n.mobile-header-content .dropdown-search-icon[hidden] {\n display: none;\n}\n\n/* Options: vertical list rows fused under the search header.\n No own shadow/animation - the panel appears as one via dialog opacity. */\n.dropdown-options {\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: stretch;\n gap: 0;\n /* Card-style list: rounded rows sit inset from the panel edges */\n padding: var(--ty-spacing-1);\n border-top: none;\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n box-shadow: none;\n transform: none;\n transition: none;\n /* ~9-10 visible rows before scrolling (custom scrollbar, native hidden) */\n max-height: 24rem;\n}\n.dropdown-dialog.position-below .dropdown-options {\n box-shadow: none;\n}\n.dropdown-dialog.position-above .dropdown-options {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n}\n\n/* Loading panel continues the fused silhouette exactly like .dropdown-options \u2014\n the base layer styles it as a floating card (radius + shadow), which left a\n see-through gap under the search header while loading. */\n.dropdown-loading {\n border-top: none;\n border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);\n box-shadow: none;\n}\n.dropdown-dialog.position-above .dropdown-loading {\n border-top: 1px solid var(--input-border, var(--ty-input-border));\n border-bottom: none;\n border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;\n}\n\n/* Selection tick lives inside ty-option (lucide check on [selected]) */\n\n/* Mobile modal: same vertical list */\n.dropdown-mode-mobile .section-content ::slotted(ty-option) {\n display: block;\n width: 100%;\n}\n";
12
12
  //# sourceMappingURL=select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,YAAY,m3OAsOxB,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,YAAY,unQAuPxB,CAAC"}
@@ -151,11 +151,28 @@ export const selectStyles = `
151
151
  height: 100%;
152
152
  }
153
153
 
154
- /* Mobile header: flex row, icon flows inline before the input */
154
+ /* Mobile header: flex row, icon flows inline before the input. Same 32x32
155
+ footprint as .mobile-close-button (18px glyph centered in the box, not a
156
+ bare 18px glyph flush at the edge) so the row has two matching bookends —
157
+ a bare icon on one side and a 32px circle on the other read as lopsided
158
+ even with equal flex gap on both sides. Matching them also centers the
159
+ search input's flex:1 fill symmetrically between the two. Fixed white +
160
+ 18px glyph, same reasoning as .mobile-header-label — this sits on the
161
+ dark ::backdrop blur in both themes, not a theme surface. */
155
162
  .dropdown-mode-mobile .mobile-header-content .dropdown-search-icon {
156
163
  position: static;
157
164
  transform: none;
158
165
  flex-shrink: 0;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ width: 32px;
170
+ height: 32px;
171
+ color: #ffffff;
172
+ }
173
+ .dropdown-mode-mobile .mobile-header-content .dropdown-search-icon svg {
174
+ width: 18px;
175
+ height: 18px;
159
176
  }
160
177
 
161
178
  /* Search input: bordered field from base styles; just size + icon room */
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsO3B,CAAC"}
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuP3B,CAAC"}
@@ -9,5 +9,5 @@
9
9
  * - Responsive design with prefers-reduced-motion support
10
10
  * - Fully customizable via CSS Parts (::part)
11
11
  */
12
- export declare const tabsStyles = "\n:host {\n display: block;\n width: var(--tabs-width, 100%);\n height: var(--tabs-height, 400px);\n box-sizing: border-box;\n}\n\n.tabs-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n position: relative;\n box-sizing: border-box;\n}\n\n/* Bottom placement reverses the order */\n.tabs-container[data-placement=\"bottom\"] {\n flex-direction: column-reverse;\n}\n\n/* ===================================== */\n/* Tab Buttons Container */\n/* Expose as CSS Part for full styling control */\n/* ===================================== */\n\n.tab-buttons {\n display: flex;\n gap: 0;\n flex-shrink: 0;\n position: relative;\n /* For absolute positioned marker */\n \n /* Default minimal styling - customize via ::part(buttons-container) */\n border-bottom: 1px solid var(--ty-border);\n background: transparent;\n}\n\n/* Bottom placement moves border to top */\n.tabs-container[data-placement=\"bottom\"] .tab-buttons {\n border-bottom: none;\n border-top: 1px solid var(--ty-border);\n}\n\n/* ===================================== */\n/* Marker Wrapper */\n/* Expose as CSS Part for custom marker styling */\n/* ===================================== */\n\n.marker-wrapper {\n position: absolute;\n z-index: 0;\n /* Behind buttons */\n pointer-events: none;\n /* Don't block clicks */\n transition: left var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n width var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n height var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n top var(--transition-duration, 300ms) var(--transition-easing, ease-in-out);\n}\n\n/* Default marker - simple underline */\n.default-marker {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 2px;\n width: 100%;\n background: var(--ty-color-primary);\n pointer-events: none;\n}\n\n/* Hide default marker when custom marker is slotted */\n.marker-wrapper:has(::slotted([slot=\"marker\"])) .default-marker {\n display: none;\n}\n\n/* User's marker element fills the wrapper */\n::slotted([slot=\"marker\"]) {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n}\n\n/* ===================================== */\n/* Tab Buttons */\n/* ===================================== */\n\n.tab-button {\n min-width: 120px;\n padding: 6px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n font: inherit;\n color: var(--ty-text-soft);\n transition: color 200ms, background-color 200ms;\n white-space: nowrap;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: var(--ty-font-bold);\n font-size: var(--ty-font-sm);\n position: relative;\n /* Establish stacking context */\n z-index: 10;\n /* Above marker */\n}\n\n.tab-button[aria-selected=true] {\n color: var(--ty-text-strong);\n}\n\n.tab-button[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.tab-button:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: -2px;\n}\n\n/* ===================================== */\n/* Panels Viewport */\n/* Expose as CSS Part for panels container styling */\n/* ===================================== */\n\n.panels-viewport {\n position: relative;\n flex: 1;\n overflow: hidden;\n /* Critical: hides off-screen panels */\n min-height: 0;\n /* Allows flex child to shrink */\n}\n\n/* ===================================== */\n/* Panels Wrapper (slides horizontally) */\n/* ===================================== */\n\n.panels-wrapper {\n display: flex;\n height: 100%;\n transition: transform var(--transition-duration, 300ms) var(--transition-easing, ease-in-out);\n}\n\n/* Respect user's motion preferences */\n@media (prefers-reduced-motion: reduce) {\n .panels-wrapper {\n transition-duration: 0ms !important;\n }\n\n .marker-wrapper {\n transition-duration: 0ms !important;\n }\n}\n\n/* ===================================== */\n/* Slotted Tab Panels */\n/* ===================================== */\n\n::slotted(ty-tab) {\n width: var(--tabs-width, 100%);\n height: 100%;\n flex-shrink: 0;\n}\n";
12
+ export declare const tabsStyles = "\n:host {\n display: block;\n width: var(--tabs-width, 100%);\n height: var(--tabs-height, 400px);\n box-sizing: border-box;\n}\n\n.tabs-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n position: relative;\n box-sizing: border-box;\n}\n\n/* Bottom placement reverses the order */\n.tabs-container[data-placement=\"bottom\"] {\n flex-direction: column-reverse;\n}\n\n/* ===================================== */\n/* Tab Buttons Container */\n/* Expose as CSS Part for full styling control */\n/* ===================================== */\n\n.tab-buttons {\n display: flex;\n gap: 0;\n flex-shrink: 0;\n position: relative;\n /* For absolute positioned marker */\n \n /* Default minimal styling - customize via ::part(buttons-container) */\n border-bottom: 1px solid var(--ty-border);\n background: transparent;\n}\n\n/* Bottom placement moves border to top */\n.tabs-container[data-placement=\"bottom\"] .tab-buttons {\n border-bottom: none;\n border-top: 1px solid var(--ty-border);\n}\n\n/* ===================================== */\n/* Marker Wrapper */\n/* Expose as CSS Part for custom marker styling */\n/* ===================================== */\n\n.marker-wrapper {\n position: absolute;\n z-index: 0;\n /* Behind buttons */\n pointer-events: none;\n /* Don't block clicks */\n transition: left var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n width var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n height var(--transition-duration, 300ms) var(--transition-easing, ease-in-out),\n top var(--transition-duration, 300ms) var(--transition-easing, ease-in-out);\n}\n\n/* Default marker - simple underline */\n.default-marker {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 2px;\n width: 100%;\n background: var(--ty-color-primary);\n pointer-events: none;\n}\n\n/* Hide default marker when custom marker is slotted */\n.marker-wrapper:has(::slotted([slot=\"marker\"])) .default-marker {\n display: none;\n}\n\n/* User's marker element fills the wrapper */\n::slotted([slot=\"marker\"]) {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n}\n\n/* ===================================== */\n/* Tab Buttons */\n/* ===================================== */\n\n.tab-button {\n min-width: 120px;\n padding: 6px 12px;\n border: none;\n background: transparent;\n cursor: pointer;\n font: inherit;\n color: var(--ty-text-soft);\n transition: color 200ms, background-color 200ms;\n white-space: nowrap;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: var(--ty-font-bold);\n font-size: var(--ty-font-sm);\n position: relative;\n /* Establish stacking context */\n z-index: 10;\n /* Above marker */\n}\n\n.tab-button[aria-selected=true] {\n color: var(--ty-text-strong);\n}\n\n.tab-button[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.tab-button:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: -2px;\n}\n\n.tab-button.overflow-hidden {\n display: none;\n}\n\n/* ===================================== */\n/* Overflow \"more\" trigger + menu */\n/* ===================================== */\n\n.tab-overflow-trigger {\n flex-shrink: 0;\n width: 40px;\n min-width: 40px;\n padding: 6px;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--ty-text-soft);\n font-size: 18px;\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 10;\n}\n\n.tab-overflow-trigger:hover {\n color: var(--ty-text-strong);\n}\n\n.tab-overflow-trigger:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: -2px;\n}\n\n.tab-overflow-menu {\n display: flex;\n flex-direction: column;\n min-width: 160px;\n max-height: 300px;\n overflow-y: auto;\n padding: var(--ty-spacing-2, 4px);\n background: var(--ty-surface-floating);\n border-radius: var(--ty-radius-md);\n box-shadow: var(--ty-shadow-md, 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1));\n}\n\n.tab-overflow-item {\n padding: var(--ty-spacing-2, 6px) var(--ty-spacing-3, 12px);\n border: none;\n background: transparent;\n text-align: left;\n cursor: pointer;\n border-radius: var(--ty-radius-md);\n color: var(--ty-text);\n font: inherit;\n font-size: var(--ty-font-sm);\n white-space: nowrap;\n}\n\n.tab-overflow-item:hover {\n background: var(--ty-bg-neutral-soft);\n color: var(--ty-text-strong);\n}\n\n.tab-overflow-item[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ===================================== */\n/* Panels Viewport */\n/* Expose as CSS Part for panels container styling */\n/* ===================================== */\n\n.panels-viewport {\n position: relative;\n flex: 1;\n overflow: hidden;\n /* Critical: hides off-screen panels */\n min-height: 0;\n /* Allows flex child to shrink */\n}\n\n/* ===================================== */\n/* Panels Wrapper (slides horizontally) */\n/* ===================================== */\n\n.panels-wrapper {\n display: flex;\n height: 100%;\n transition: transform var(--transition-duration, 300ms) var(--transition-easing, ease-in-out);\n}\n\n/* Respect user's motion preferences */\n@media (prefers-reduced-motion: reduce) {\n .panels-wrapper {\n transition-duration: 0ms !important;\n }\n\n .marker-wrapper {\n transition-duration: 0ms !important;\n }\n}\n\n/* ===================================== */\n/* Slotted Tab Panels */\n/* ===================================== */\n\n::slotted(ty-tab) {\n width: var(--tabs-width, 100%);\n height: 100%;\n flex-shrink: 0;\n}\n";
13
13
  //# sourceMappingURL=tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/styles/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,UAAU,2mIA2KtB,CAAC"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/styles/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,UAAU,6pLAiPtB,CAAC"}
@@ -136,6 +136,76 @@ export const tabsStyles = `
136
136
  outline-offset: -2px;
137
137
  }
138
138
 
139
+ .tab-button.overflow-hidden {
140
+ display: none;
141
+ }
142
+
143
+ /* ===================================== */
144
+ /* Overflow "more" trigger + menu */
145
+ /* ===================================== */
146
+
147
+ .tab-overflow-trigger {
148
+ flex-shrink: 0;
149
+ width: 40px;
150
+ min-width: 40px;
151
+ padding: 6px;
152
+ border: none;
153
+ background: transparent;
154
+ cursor: pointer;
155
+ color: var(--ty-text-soft);
156
+ font-size: 18px;
157
+ line-height: 1;
158
+ display: inline-flex;
159
+ align-items: center;
160
+ justify-content: center;
161
+ position: relative;
162
+ z-index: 10;
163
+ }
164
+
165
+ .tab-overflow-trigger:hover {
166
+ color: var(--ty-text-strong);
167
+ }
168
+
169
+ .tab-overflow-trigger:focus-visible {
170
+ outline: 2px solid var(--ty-color-primary);
171
+ outline-offset: -2px;
172
+ }
173
+
174
+ .tab-overflow-menu {
175
+ display: flex;
176
+ flex-direction: column;
177
+ min-width: 160px;
178
+ max-height: 300px;
179
+ overflow-y: auto;
180
+ padding: var(--ty-spacing-2, 4px);
181
+ background: var(--ty-surface-floating);
182
+ border-radius: var(--ty-radius-md);
183
+ box-shadow: var(--ty-shadow-md, 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1));
184
+ }
185
+
186
+ .tab-overflow-item {
187
+ padding: var(--ty-spacing-2, 6px) var(--ty-spacing-3, 12px);
188
+ border: none;
189
+ background: transparent;
190
+ text-align: left;
191
+ cursor: pointer;
192
+ border-radius: var(--ty-radius-md);
193
+ color: var(--ty-text);
194
+ font: inherit;
195
+ font-size: var(--ty-font-sm);
196
+ white-space: nowrap;
197
+ }
198
+
199
+ .tab-overflow-item:hover {
200
+ background: var(--ty-bg-neutral-soft);
201
+ color: var(--ty-text-strong);
202
+ }
203
+
204
+ .tab-overflow-item[disabled] {
205
+ opacity: 0.5;
206
+ cursor: not-allowed;
207
+ }
208
+
139
209
  /* ===================================== */
140
210
  /* Panels Viewport */
141
211
  /* Expose as CSS Part for panels container styling */
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/styles/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2KzB,CAAC"}
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/styles/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiPzB,CAAC"}