tyrell-components 1.0.0-RC12 → 1.0.0-RC13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +1 -0
  2. package/css/tyrell-colors-static.css +316 -0
  3. package/css/tyrell-theme.css +1454 -0
  4. package/css/tyrell.css +108 -423
  5. package/dist/tyrell-colors-static.css +316 -0
  6. package/dist/tyrell-theme.css +1454 -0
  7. package/dist/tyrell.css +108 -423
  8. package/dist/tyrell.js +1 -1
  9. package/lib/components/button.d.ts +7 -0
  10. package/lib/components/button.d.ts.map +1 -1
  11. package/lib/components/button.js +12 -1
  12. package/lib/components/button.js.map +1 -1
  13. package/lib/components/calendar-month.d.ts +17 -0
  14. package/lib/components/calendar-month.d.ts.map +1 -1
  15. package/lib/components/calendar-month.js +121 -7
  16. package/lib/components/calendar-month.js.map +1 -1
  17. package/lib/components/calendar.d.ts +3 -1
  18. package/lib/components/calendar.d.ts.map +1 -1
  19. package/lib/components/calendar.js +19 -9
  20. package/lib/components/calendar.js.map +1 -1
  21. package/lib/components/checkbox.d.ts +4 -3
  22. package/lib/components/checkbox.d.ts.map +1 -1
  23. package/lib/components/checkbox.js +23 -35
  24. package/lib/components/checkbox.js.map +1 -1
  25. package/lib/components/copy.d.ts +4 -3
  26. package/lib/components/copy.d.ts.map +1 -1
  27. package/lib/components/copy.js +22 -21
  28. package/lib/components/copy.js.map +1 -1
  29. package/lib/components/date-picker.d.ts +12 -1
  30. package/lib/components/date-picker.d.ts.map +1 -1
  31. package/lib/components/date-picker.js +122 -32
  32. package/lib/components/date-picker.js.map +1 -1
  33. package/lib/components/input.d.ts +3 -2
  34. package/lib/components/input.d.ts.map +1 -1
  35. package/lib/components/input.js +24 -21
  36. package/lib/components/input.js.map +1 -1
  37. package/lib/components/modal.d.ts.map +1 -1
  38. package/lib/components/modal.js +22 -3
  39. package/lib/components/modal.js.map +1 -1
  40. package/lib/components/option.d.ts +0 -11
  41. package/lib/components/option.d.ts.map +1 -1
  42. package/lib/components/option.js +4 -103
  43. package/lib/components/option.js.map +1 -1
  44. package/lib/components/popup.d.ts.map +1 -1
  45. package/lib/components/popup.js +36 -2
  46. package/lib/components/popup.js.map +1 -1
  47. package/lib/components/radio.d.ts +5 -2
  48. package/lib/components/radio.d.ts.map +1 -1
  49. package/lib/components/radio.js +16 -5
  50. package/lib/components/radio.js.map +1 -1
  51. package/lib/components/select.d.ts +119 -9
  52. package/lib/components/select.d.ts.map +1 -1
  53. package/lib/components/select.js +426 -58
  54. package/lib/components/select.js.map +1 -1
  55. package/lib/components/selected-tags.d.ts +19 -6
  56. package/lib/components/selected-tags.d.ts.map +1 -1
  57. package/lib/components/selected-tags.js +43 -7
  58. package/lib/components/selected-tags.js.map +1 -1
  59. package/lib/components/switch.d.ts +4 -3
  60. package/lib/components/switch.d.ts.map +1 -1
  61. package/lib/components/switch.js +17 -29
  62. package/lib/components/switch.js.map +1 -1
  63. package/lib/components/tabs.d.ts.map +1 -1
  64. package/lib/components/tabs.js +180 -25
  65. package/lib/components/tabs.js.map +1 -1
  66. package/lib/components/tag.js +1 -1
  67. package/lib/components/tag.js.map +1 -1
  68. package/lib/components/tooltip.d.ts +4 -2
  69. package/lib/components/tooltip.d.ts.map +1 -1
  70. package/lib/components/tooltip.js +109 -70
  71. package/lib/components/tooltip.js.map +1 -1
  72. package/lib/components/wizard.d.ts.map +1 -1
  73. package/lib/components/wizard.js +22 -3
  74. package/lib/components/wizard.js.map +1 -1
  75. package/lib/index.d.ts +2 -1
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js +2 -1
  78. package/lib/index.js.map +1 -1
  79. package/lib/styles/button.d.ts +36 -6
  80. package/lib/styles/button.d.ts.map +1 -1
  81. package/lib/styles/button.js +239 -36
  82. package/lib/styles/button.js.map +1 -1
  83. package/lib/styles/calendar-month.d.ts +3 -1
  84. package/lib/styles/calendar-month.d.ts.map +1 -1
  85. package/lib/styles/calendar-month.js +64 -9
  86. package/lib/styles/calendar-month.js.map +1 -1
  87. package/lib/styles/calendar-navigation.d.ts +1 -1
  88. package/lib/styles/calendar-navigation.d.ts.map +1 -1
  89. package/lib/styles/calendar-navigation.js +1 -1
  90. package/lib/styles/checkbox.d.ts +3 -1
  91. package/lib/styles/checkbox.d.ts.map +1 -1
  92. package/lib/styles/checkbox.js +33 -55
  93. package/lib/styles/checkbox.js.map +1 -1
  94. package/lib/styles/copy.d.ts +3 -1
  95. package/lib/styles/copy.d.ts.map +1 -1
  96. package/lib/styles/copy.js +29 -6
  97. package/lib/styles/copy.js.map +1 -1
  98. package/lib/styles/custom-scrollbar.d.ts +1 -1
  99. package/lib/styles/custom-scrollbar.d.ts.map +1 -1
  100. package/lib/styles/custom-scrollbar.js +2 -2
  101. package/lib/styles/date-picker.d.ts +3 -1
  102. package/lib/styles/date-picker.d.ts.map +1 -1
  103. package/lib/styles/date-picker.js +53 -99
  104. package/lib/styles/date-picker.js.map +1 -1
  105. package/lib/styles/file-upload.d.ts +1 -1
  106. package/lib/styles/file-upload.d.ts.map +1 -1
  107. package/lib/styles/file-upload.js +3 -3
  108. package/lib/styles/input.d.ts +3 -1
  109. package/lib/styles/input.d.ts.map +1 -1
  110. package/lib/styles/input.js +67 -123
  111. package/lib/styles/input.js.map +1 -1
  112. package/lib/styles/multiselect.d.ts +3 -1
  113. package/lib/styles/multiselect.d.ts.map +1 -1
  114. package/lib/styles/multiselect.js +26 -2
  115. package/lib/styles/multiselect.js.map +1 -1
  116. package/lib/styles/option.d.ts +1 -1
  117. package/lib/styles/option.d.ts.map +1 -1
  118. package/lib/styles/option.js +0 -51
  119. package/lib/styles/option.js.map +1 -1
  120. package/lib/styles/radio.d.ts +3 -1
  121. package/lib/styles/radio.d.ts.map +1 -1
  122. package/lib/styles/radio.js +24 -21
  123. package/lib/styles/radio.js.map +1 -1
  124. package/lib/styles/scroll-container.d.ts +1 -1
  125. package/lib/styles/scroll-container.d.ts.map +1 -1
  126. package/lib/styles/select-base.d.ts +9 -0
  127. package/lib/styles/select-base.d.ts.map +1 -0
  128. package/lib/styles/select-base.js +973 -0
  129. package/lib/styles/select-base.js.map +1 -0
  130. package/lib/styles/select.d.ts +3 -3
  131. package/lib/styles/select.d.ts.map +1 -1
  132. package/lib/styles/select.js +98 -30
  133. package/lib/styles/select.js.map +1 -1
  134. package/lib/styles/step.d.ts +1 -1
  135. package/lib/styles/step.d.ts.map +1 -1
  136. package/lib/styles/switch.d.ts +3 -1
  137. package/lib/styles/switch.d.ts.map +1 -1
  138. package/lib/styles/switch.js +25 -10
  139. package/lib/styles/switch.js.map +1 -1
  140. package/lib/styles/tab.d.ts +1 -1
  141. package/lib/styles/tab.d.ts.map +1 -1
  142. package/lib/styles/tabs.d.ts +1 -1
  143. package/lib/styles/tabs.d.ts.map +1 -1
  144. package/lib/styles/tabs.js +71 -1
  145. package/lib/styles/tabs.js.map +1 -1
  146. package/lib/styles/tag.d.ts.map +1 -1
  147. package/lib/styles/tag.js +4 -1
  148. package/lib/styles/tag.js.map +1 -1
  149. package/lib/styles/textarea.d.ts +1 -1
  150. package/lib/styles/textarea.d.ts.map +1 -1
  151. package/lib/styles/textarea.js +5 -5
  152. package/lib/styles/tooltip.d.ts +4 -2
  153. package/lib/styles/tooltip.d.ts.map +1 -1
  154. package/lib/styles/tooltip.js +4 -119
  155. package/lib/styles/tooltip.js.map +1 -1
  156. package/lib/styles/wizard.d.ts +1 -1
  157. package/lib/styles/wizard.d.ts.map +1 -1
  158. package/lib/styles/wizard.js +18 -6
  159. package/lib/styles/wizard.js.map +1 -1
  160. package/lib/types/common.d.ts +1 -1
  161. package/lib/types/common.d.ts.map +1 -1
  162. package/lib/types/common.js +3 -1
  163. package/lib/types/common.js.map +1 -1
  164. package/lib/utils/icons.d.ts +10 -0
  165. package/lib/utils/icons.d.ts.map +1 -0
  166. package/lib/utils/icons.js +10 -0
  167. package/lib/utils/icons.js.map +1 -0
  168. package/lib/utils/loader-registry.d.ts +2 -2
  169. package/lib/utils/loader-registry.js +2 -2
  170. package/lib/utils/positioning.d.ts +31 -0
  171. package/lib/utils/positioning.d.ts.map +1 -1
  172. package/lib/utils/positioning.js +22 -3
  173. package/lib/utils/positioning.js.map +1 -1
  174. package/lib/version.d.ts +1 -1
  175. package/lib/version.js +1 -1
  176. package/package.json +7 -4
  177. package/css/tyrell-brand.css +0 -1015
  178. package/dist/tyrell-brand.css +0 -1015
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-base.js","sourceRoot":"","sources":["../../src/styles/select-base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;2CAM2C;AAC3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CACtB,EAAE;QACA,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,GAAG,CAAC,KAAK;YAC7E,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,IAAI;QACjD,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI;YAClD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;IAC/B,OAAO;iBACQ,CAAC;oCACkB,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;0BACjC,CAAC,CAAC,EAAE,CAAC;uCACQ,CAAC,CAAC,EAAE,CAAC;;iBAE3B,CAAC;qBACG,CAAC,CAAC,EAAE,CAAC;0BACA,CAAC,CAAC,SAAS,CAAC;uCACC,CAAC,CAAC,SAAS,CAAC;;iBAElC,CAAC;qBACG,CAAC,CAAC,QAAQ,CAAC;0BACN,CAAC,CAAC,OAAO,CAAC;uCACG,CAAC,CAAC,OAAO,CAAC;;CAEhD,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA65B9B,qBAAqB;;;EAGrB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CAC5E,CAAC"}
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Select Component Styles
3
- * Layered over the shared multiselect styles (popup, mobile modal, search).
3
+ * Layered over the shared select-field styles (popup, mobile modal, search).
4
4
  *
5
5
  * Skins:
6
- * - default FIELD: the base .multiselect-stub already carries the form-field
6
+ * - default FIELD: the base .select-stub already carries the form-field
7
7
  * look (width 100%, --ty-input-* tokens) — only text treatment added here
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.multiselect-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.multiselect-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.multiselect-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 background: var(--ty-bg-primary-soft);\n color: var(--ty-text-primary);\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.multiselect-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.multiselect-stub .dropdown-placeholder.placeholder-shown {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n}\n.multiselect-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.multiselect-stub slot[name=\"selected\"] {\n display: none;\n}\n.multiselect-stub.has-clone slot[name=\"selected\"] {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n}\n.multiselect-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.multiselect-stub ::slotted([slot=\"start\"]),\n.multiselect-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.multiselect-stub.compact .dropdown-placeholder {\n flex-grow: 0;\n color: var(--ty-text);\n}\n\n/* Trigger stays visible while the popup is open (multiselect hides it) */\n.dropdown-wrapper:has(.dropdown-chevron.open) .multiselect-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 width: auto;\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\n/* Clear (x) button \u2014 normal flex child of .select-stub, not absolutely\n positioned like .dropdown-chevron: it just takes its own space in the\n row, no padding-right gutter math needed. Lives in the trigger slot's\n fallback content, so it's automatically absent under slot=\"trigger\". */\n.select-clear {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n padding: 0;\n border: none;\n background: none;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n cursor: pointer;\n border-radius: var(--ty-radius-sm);\n transition: var(--ty-local-transition, all 0.15s ease);\n}\n.select-clear[hidden] {\n display: none;\n}\n.select-clear:hover {\n /* Destructive utility action \u2014 neutral at rest, warns danger-red on\n hover regardless of the field's own flavor. */\n color: var(--ty-color-danger);\n background-color: var(--ty-bg-danger-soft);\n}\n.select-clear svg {\n width: 100%;\n height: 100%;\n}\n\n/* Selection text (field skin): single line, ellipsis, input colors.\n flex-basis 0, not auto \u2014 .select-stub is flex-wrap:wrap, and auto's\n hypothetical size is the FULL untruncated text width (wrap-line\n assignment happens before shrinking), which pushed fixed-size siblings\n (.select-clear) onto a second line even though the text visibly had\n room after truncating. 0 makes this item contribute ~nothing to the\n line-fit check up front; grow/shrink + overflow:hidden still truncate\n it identically. */\n.select-stub .dropdown-placeholder {\n font-style: normal;\n flex: 1 1 0%;\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 flex-basis: auto (not the field skin's 0%) \u2014 content-hugging needs its\n natural content width as the starting point; 0% would collapse it since\n grow is also 0 here (nothing left to expand it back out). */\n.select-stub.compact .dropdown-placeholder {\n flex: 0 1 auto;\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. The header's OWN surface/border is\n part of the floating panel's chrome, not a form field \u2014 --ty-surface-\n floating/--ty-floating-border, matching .dropdown-options below it (same\n reasoning as the base-panel fix: --ty-input-* is deliberately faint for\n resting form fields and read as a missing/mismatched edge here). */\n.dropdown-header {\n background: var(--ty-surface-floating);\n border: 1px solid var(--ty-floating-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(--ty-floating-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(--ty-floating-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(--ty-floating-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(--ty-floating-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,isOAoOxB,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,YAAY,miUAwSxB,CAAC"}
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * Select Component Styles
3
- * Layered over the shared multiselect styles (popup, mobile modal, search).
3
+ * Layered over the shared select-field styles (popup, mobile modal, search).
4
4
  *
5
5
  * Skins:
6
- * - default FIELD: the base .multiselect-stub already carries the form-field
6
+ * - default FIELD: the base .select-stub already carries the form-field
7
7
  * look (width 100%, --ty-input-* tokens) — only text treatment added here
8
8
  * - .compact: content-hugging trigger for toolbars, count badge
9
9
  * - .custom-trigger (slot="trigger"): all chrome stripped
10
10
  */
11
11
  export const selectStyles = `
12
12
  /* ===== COMPACT skin: hugs content (field skin = base styles) ===== */
13
- .multiselect-stub.compact {
13
+ .select-stub.compact {
14
14
  display: inline-flex;
15
15
  flex-wrap: nowrap;
16
16
  width: auto;
@@ -20,15 +20,16 @@ export const selectStyles = `
20
20
  }
21
21
 
22
22
  /* Consumer-provided trigger (slot="trigger"): no chrome at all */
23
- .multiselect-stub.custom-trigger {
23
+ .select-stub.custom-trigger {
24
24
  display: inline-block;
25
+ width: auto;
25
26
  border: none;
26
27
  background: none;
27
28
  padding: 0;
28
29
  min-height: 0;
29
30
  border-radius: 0;
30
31
  }
31
- .multiselect-stub.custom-trigger:hover {
32
+ .select-stub.custom-trigger:hover {
32
33
  border: none;
33
34
  }
34
35
 
@@ -41,8 +42,10 @@ export const selectStyles = `
41
42
  height: 1.25rem;
42
43
  padding: 0 0.375rem;
43
44
  border-radius: 9999px;
44
- background: var(--ty-bg-primary-soft);
45
- color: var(--ty-text-primary);
45
+ /* --ty-text-primary never existed as a token — this silently fell back
46
+ to inherited/unset color. Now follows the select's own flavor. */
47
+ background: color-mix(in oklab, var(--select-accent, var(--ty-color-primary)) 15%, transparent);
48
+ color: var(--select-accent-bold, var(--ty-color-primary-strong));
46
49
  font-size: var(--ty-font-xs);
47
50
  font-weight: var(--ty-font-semibold);
48
51
  font-style: normal;
@@ -50,10 +53,51 @@ export const selectStyles = `
50
53
  .select-count[hidden] {
51
54
  display: none;
52
55
  }
53
- /* Selection text (field skin): single line, ellipsis, input colors */
54
- .multiselect-stub .dropdown-placeholder {
56
+
57
+ /* Clear (x) button — normal flex child of .select-stub, not absolutely
58
+ positioned like .dropdown-chevron: it just takes its own space in the
59
+ row, no padding-right gutter math needed. Lives in the trigger slot's
60
+ fallback content, so it's automatically absent under slot="trigger". */
61
+ .select-clear {
62
+ flex-shrink: 0;
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ width: 1rem;
67
+ height: 1rem;
68
+ padding: 0;
69
+ border: none;
70
+ background: none;
71
+ color: var(--input-placeholder, var(--ty-input-placeholder));
72
+ cursor: pointer;
73
+ border-radius: var(--ty-radius-sm);
74
+ transition: var(--ty-local-transition, all 0.15s ease);
75
+ }
76
+ .select-clear[hidden] {
77
+ display: none;
78
+ }
79
+ .select-clear:hover {
80
+ /* Destructive utility action — neutral at rest, warns danger-red on
81
+ hover regardless of the field's own flavor. */
82
+ color: var(--ty-color-danger);
83
+ background-color: var(--ty-bg-danger-soft);
84
+ }
85
+ .select-clear svg {
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+
90
+ /* Selection text (field skin): single line, ellipsis, input colors.
91
+ flex-basis 0, not auto — .select-stub is flex-wrap:wrap, and auto's
92
+ hypothetical size is the FULL untruncated text width (wrap-line
93
+ assignment happens before shrinking), which pushed fixed-size siblings
94
+ (.select-clear) onto a second line even though the text visibly had
95
+ room after truncating. 0 makes this item contribute ~nothing to the
96
+ line-fit check up front; grow/shrink + overflow:hidden still truncate
97
+ it identically. */
98
+ .select-stub .dropdown-placeholder {
55
99
  font-style: normal;
56
- flex: 1 1 auto;
100
+ flex: 1 1 0%;
57
101
  min-width: 0;
58
102
  overflow: hidden;
59
103
  text-overflow: ellipsis;
@@ -62,45 +106,48 @@ export const selectStyles = `
62
106
  }
63
107
 
64
108
  /* Empty state: muted placeholder color */
65
- .multiselect-stub .dropdown-placeholder.placeholder-shown {
109
+ .select-stub .dropdown-placeholder.placeholder-shown {
66
110
  color: var(--input-placeholder, var(--ty-input-placeholder));
67
111
  }
68
- .multiselect-stub .dropdown-placeholder[hidden] {
112
+ .select-stub .dropdown-placeholder[hidden] {
69
113
  display: none;
70
114
  }
71
115
 
72
116
  /* Single-select display clone (slot="selected"): the selected ty-option
73
117
  projected into the stub — its own :host([cloned]) styling strips the
74
118
  list-row chrome; here it just takes the text's flex slot. */
75
- .multiselect-stub slot[name="selected"] {
119
+ .select-stub slot[name="selected"] {
76
120
  display: none;
77
121
  }
78
- .multiselect-stub.has-clone slot[name="selected"] {
122
+ .select-stub.has-clone slot[name="selected"] {
79
123
  display: block;
80
124
  flex: 1 1 auto;
81
125
  min-width: 0;
82
126
  overflow: hidden;
83
127
  }
84
- .multiselect-stub.compact.has-clone slot[name="selected"] {
128
+ .select-stub.compact.has-clone slot[name="selected"] {
85
129
  flex: 0 1 auto;
86
130
  }
87
131
 
88
132
  /* start/end slot content (icons etc.) — spacing comes from the stub's flex
89
133
  gap; muted like ty-input adornments. end sits before the chevron. */
90
- .multiselect-stub ::slotted([slot="start"]),
91
- .multiselect-stub ::slotted([slot="end"]) {
134
+ .select-stub ::slotted([slot="start"]),
135
+ .select-stub ::slotted([slot="end"]) {
92
136
  flex-shrink: 0;
93
137
  color: var(--ty-text-soft);
94
138
  }
95
139
 
96
- /* Compact skin: the text IS the trigger label — no grow, regular text color */
97
- .multiselect-stub.compact .dropdown-placeholder {
98
- flex-grow: 0;
140
+ /* Compact skin: the text IS the trigger label — no grow, regular text color.
141
+ flex-basis: auto (not the field skin's 0%) — content-hugging needs its
142
+ natural content width as the starting point; 0% would collapse it since
143
+ grow is also 0 here (nothing left to expand it back out). */
144
+ .select-stub.compact .dropdown-placeholder {
145
+ flex: 0 1 auto;
99
146
  color: var(--ty-text);
100
147
  }
101
148
 
102
- /* Trigger stays visible while the popup is open (multiselect hides it) */
103
- .dropdown-wrapper:has(.dropdown-chevron.open) .multiselect-stub {
149
+ /* Trigger stays visible while the popup is open (the popup hides it) */
150
+ .dropdown-wrapper:has(.dropdown-chevron.open) .select-stub {
104
151
  opacity: 1;
105
152
  pointer-events: auto;
106
153
  }
@@ -114,10 +161,14 @@ export const selectStyles = `
114
161
 
115
162
  /* Card-style header: the search input keeps its own bordered-field look
116
163
  (base styles) and sits inset in the panel, TagPicker-style — no divider,
117
- whitespace separates it from the list. */
164
+ whitespace separates it from the list. The header's OWN surface/border is
165
+ part of the floating panel's chrome, not a form field — --ty-surface-
166
+ floating/--ty-floating-border, matching .dropdown-options below it (same
167
+ reasoning as the base-panel fix: --ty-input-* is deliberately faint for
168
+ resting form fields and read as a missing/mismatched edge here). */
118
169
  .dropdown-header {
119
- background: var(--input-bg, var(--ty-input-bg));
120
- border: 1px solid var(--input-border, var(--ty-input-border));
170
+ background: var(--ty-surface-floating);
171
+ border: 1px solid var(--ty-floating-border);
121
172
  border-bottom: none;
122
173
  border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;
123
174
  padding: var(--ty-spacing-2) var(--ty-spacing-2) var(--ty-spacing-1);
@@ -128,7 +179,7 @@ export const selectStyles = `
128
179
  .dropdown-dialog.position-above .dropdown-header {
129
180
  margin-top: 0;
130
181
  border-top: none;
131
- border-bottom: 1px solid var(--input-border, var(--ty-input-border));
182
+ border-bottom: 1px solid var(--ty-floating-border);
132
183
  border-radius: 0 0 var(--ty-radius-lg) var(--ty-radius-lg);
133
184
  padding: var(--ty-spacing-1) var(--ty-spacing-2) var(--ty-spacing-2);
134
185
  }
@@ -149,11 +200,28 @@ export const selectStyles = `
149
200
  height: 100%;
150
201
  }
151
202
 
152
- /* Mobile header: flex row, icon flows inline before the input */
203
+ /* Mobile header: flex row, icon flows inline before the input. Same 32x32
204
+ footprint as .mobile-close-button (18px glyph centered in the box, not a
205
+ bare 18px glyph flush at the edge) so the row has two matching bookends —
206
+ a bare icon on one side and a 32px circle on the other read as lopsided
207
+ even with equal flex gap on both sides. Matching them also centers the
208
+ search input's flex:1 fill symmetrically between the two. Fixed white +
209
+ 18px glyph, same reasoning as .mobile-header-label — this sits on the
210
+ dark ::backdrop blur in both themes, not a theme surface. */
153
211
  .dropdown-mode-mobile .mobile-header-content .dropdown-search-icon {
154
212
  position: static;
155
213
  transform: none;
156
214
  flex-shrink: 0;
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ width: 32px;
219
+ height: 32px;
220
+ color: #ffffff;
221
+ }
222
+ .dropdown-mode-mobile .mobile-header-content .dropdown-search-icon svg {
223
+ width: 18px;
224
+ height: 18px;
157
225
  }
158
226
 
159
227
  /* Search input: bordered field from base styles; just size + icon room */
@@ -181,7 +249,7 @@ export const selectStyles = `
181
249
  display: none;
182
250
  }
183
251
  .dropdown-header[hidden] ~ .dropdown-options-wrapper .dropdown-options {
184
- border-top: 1px solid var(--input-border, var(--ty-input-border));
252
+ border-top: 1px solid var(--ty-floating-border);
185
253
  border-radius: var(--ty-radius-lg);
186
254
  }
187
255
  .mobile-search-input[hidden],
@@ -210,7 +278,7 @@ export const selectStyles = `
210
278
  box-shadow: none;
211
279
  }
212
280
  .dropdown-dialog.position-above .dropdown-options {
213
- border-top: 1px solid var(--input-border, var(--ty-input-border));
281
+ border-top: 1px solid var(--ty-floating-border);
214
282
  border-bottom: none;
215
283
  border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;
216
284
  }
@@ -224,7 +292,7 @@ export const selectStyles = `
224
292
  box-shadow: none;
225
293
  }
226
294
  .dropdown-dialog.position-above .dropdown-loading {
227
- border-top: 1px solid var(--input-border, var(--ty-input-border));
295
+ border-top: 1px solid var(--ty-floating-border);
228
296
  border-bottom: none;
229
297
  border-radius: var(--ty-radius-lg) var(--ty-radius-lg) 0 0;
230
298
  }
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoO3B,CAAC"}
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/styles/select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwS3B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Step Component Styles
3
3
  */
4
- export declare const stepStyles = "\n:host {\n width: var(--ty-wizard-width, 100%);\n height: calc(var(--ty-wizard-height, 700px) - var(--ty-wizard-indicators-height, 120px));\n display: block;\n box-sizing: border-box;\n flex-shrink: 0;\n transition: opacity var(--ty-wizard-transition-duration, 400ms) var(--ty-wizard-transition-easing, ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition-duration: 0ms !important;\n }\n}\n\n.step-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.step-panel {\n width: 100%;\n height: 100%;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.step-panel.ty-custom-scroll {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.step-panel.ty-custom-scroll::-webkit-scrollbar {\n display: none;\n}\n\n.step-wrapper:hover .ty-scrollbar-track-y.has-overflow {\n opacity: 1;\n}\n\n\n/* ===================================== */\n/* Custom Scrollbar - Vertical Track */\n/* ===================================== */\n\n.ty-scrollbar-track-y {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-y.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-y.has-overflow:hover,\n.ty-scrollbar-track-y.has-overflow.scrolling,\n.ty-scrollbar-track-y.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-y::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-y:hover::before,\n.ty-scrollbar-track-y.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-y {\n position: absolute;\n right: 0;\n width: 100%;\n min-height: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-y:hover,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-y:active,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Custom Scrollbar - Horizontal Track */\n/* ===================================== */\n\n.ty-scrollbar-track-x {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-x.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-x.has-overflow:hover,\n.ty-scrollbar-track-x.has-overflow.scrolling,\n.ty-scrollbar-track-x.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-x::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-x:hover::before,\n.ty-scrollbar-track-x.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-x {\n position: absolute;\n bottom: 0;\n height: 100%;\n min-width: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-x:hover,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-x:active,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Touch devices - hide custom scrollbar */\n/* ===================================== */\n\n@media (pointer: coarse) and (hover: none) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x {\n display: none !important;\n }\n}\n\n/* Respect reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x,\n .ty-scrollbar-thumb-y,\n .ty-scrollbar-thumb-x {\n transition-duration: 0ms !important;\n }\n}\n\n";
4
+ export declare const stepStyles = "\n:host {\n width: var(--ty-wizard-width, 100%);\n height: calc(var(--ty-wizard-height, 700px) - var(--ty-wizard-indicators-height, 120px));\n display: block;\n box-sizing: border-box;\n flex-shrink: 0;\n transition: opacity var(--ty-wizard-transition-duration, 400ms) var(--ty-wizard-transition-easing, ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition-duration: 0ms !important;\n }\n}\n\n.step-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.step-panel {\n width: 100%;\n height: 100%;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.step-panel.ty-custom-scroll {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.step-panel.ty-custom-scroll::-webkit-scrollbar {\n display: none;\n}\n\n.step-wrapper:hover .ty-scrollbar-track-y.has-overflow {\n opacity: 1;\n}\n\n\n/* ===================================== */\n/* Custom Scrollbar - Vertical Track */\n/* ===================================== */\n\n.ty-scrollbar-track-y {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-y.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-y.has-overflow:hover,\n.ty-scrollbar-track-y.has-overflow.scrolling,\n.ty-scrollbar-track-y.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-y::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-y:hover::before,\n.ty-scrollbar-track-y.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-y {\n position: absolute;\n right: 0;\n width: 100%;\n min-height: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: var(--ty-local-transition, background 0.15s ease-out);\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-y:hover,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-y:active,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Custom Scrollbar - Horizontal Track */\n/* ===================================== */\n\n.ty-scrollbar-track-x {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-x.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-x.has-overflow:hover,\n.ty-scrollbar-track-x.has-overflow.scrolling,\n.ty-scrollbar-track-x.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-x::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-x:hover::before,\n.ty-scrollbar-track-x.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-x {\n position: absolute;\n bottom: 0;\n height: 100%;\n min-width: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: var(--ty-local-transition, background 0.15s ease-out);\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-x:hover,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-x:active,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Touch devices - hide custom scrollbar */\n/* ===================================== */\n\n@media (pointer: coarse) and (hover: none) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x {\n display: none !important;\n }\n}\n\n/* Respect reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x,\n .ty-scrollbar-thumb-y,\n .ty-scrollbar-thumb-x {\n transition-duration: 0ms !important;\n }\n}\n\n";
5
5
  //# sourceMappingURL=step.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/styles/step.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,UAAU,uiKA4CtB,CAAC"}
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/styles/step.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,UAAU,+lKA4CtB,CAAC"}
@@ -5,5 +5,7 @@
5
5
  * Reuses input-container/error-message rules from input styles for label
6
6
  * and error layout consistency.
7
7
  */
8
- export declare const switchStyles = "\n\n:host {\n display: block;\n font-family: var(--ty-font-sans);\n width: 100%;\n}\n\n:host([size=\"xl\"]) {\n font-size: 20px;\n}\n\n\n:host([size=\"xs\"]) {\n font-size: 12px;\n}\n\n\n:host([size=\"sm\"]) {\n font-size: 14px;\n}\n\n:host([size=\"lg\"]) {\n font-size: 18px;\n}\n\n.input-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ===== LABEL STYLING ===== */\n\n.ty-field-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: 6px;\n padding-left: 12px;\n display: flex;\n align-items: center;\n}\n\n/* Required indicator - using SVG icon */\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: var(--ty-color-danger);\n width: 12px;\n height: 12px;\n margin-left: 4px;\n vertical-align: middle;\n}\n\n.required-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* ===== INPUT WRAPPER WITH SLOTS ===== */\n\n.input-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* No gap by default */\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-base);\n background: var(--input-bg, var(--input-bg, var(--ty-input-bg)));\n transition: all 0.15s ease-in-out;\n \n /* Default size (md) */\n min-height: 40px;\n padding: 0 12px;\n}\n\n/* Wrapper states */\n.input-wrapper:hover:not(.disabled) {\n border-color: var(--input-border-hover, var(--ty-input-border-hover));\n}\n\n.input-wrapper.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n.input-wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--input-disabled-bg, var(--ty-input-disabled-bg));\n border-color: var(--input-disabled-border, var(--ty-input-disabled-border));\n}\n\n/* ===== SLOT STYLING ===== */\n\n/* Style slotted content directly (no wrappers needed) */\n::slotted([slot=\"start\"]),\n::slotted([slot=\"end\"]) {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--ty-color-text-soft);\n}\n\n/* Password reveal toggle (rendered for type=\"password\") */\n.password-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n transition: color 0.15s ease-in-out;\n}\n.password-toggle:hover {\n color: var(--input-color, var(--ty-input-color));\n}\n.password-toggle:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n.password-toggle svg {\n width: 1rem;\n height: 1rem;\n}\n\n/* Icon sizing for slotted icons */\n::slotted(ty-icon) {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n}\n\n/* ===== ERROR MESSAGE STYLING ===== */\n\n.error-message {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n color: var(--ty-color-danger);\n margin-top: 4px;\n padding-left: 12px;\n}\n\n/* Error state for wrapper */\n.input-wrapper.error {\n border-color: var(--ty-color-danger);\n background: var(--ty-bg-danger-soft);\n}\n\n.input-wrapper.error.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== INPUT BASE STYLING ===== */\n\ninput {\n /* Reset and base styles \u2014 Linear-paired typography */\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n color: var(--input-color, var(--ty-input-color));\n font-family: inherit;\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-normal);\n padding: 0;\n margin: 0;\n}\n\n/* Remove number input spinner arrows */\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=\"number\"] {\n -moz-appearance: textfield;\n}\n\n/* Disabled state */\ninput:disabled {\n cursor: not-allowed;\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n}\n\n/* Placeholder styling */\ninput::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n font-weight: 400;\n}\n\n/* ===== SIZE MODIFIERS ===== */\n\n/* Extra Small */\n.input-wrapper.xs {\n min-height: 32px;\n padding: 0 8px;\n border-radius: var(--ty-input-radius-xs, var(--ty-radius-base));\n}\n\n.input-wrapper.xs input {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n}\n\n/* Small */\n.input-wrapper.sm {\n min-height: 36px;\n padding: 0 10px;\n border-radius: var(--ty-input-radius-sm, var(--ty-radius-base));\n}\n\n.input-wrapper.sm input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Medium (default) */\n.input-wrapper.md {\n min-height: 40px;\n padding: 0 12px;\n border-radius: var(--ty-input-radius-md, var(--ty-radius-base));\n}\n\n.input-wrapper.md input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Large */\n.input-wrapper.lg {\n min-height: 44px;\n padding: 0 14px;\n border-radius: var(--ty-input-radius-lg, var(--ty-radius-base));\n}\n\n.input-wrapper.lg input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n}\n\n/* Extra Large */\n.input-wrapper.xl {\n min-height: 48px;\n padding: 0 16px;\n border-radius: var(--ty-input-radius-xl, var(--ty-radius-base));\n}\n\n.input-wrapper.xl input {\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n}\n\n/* ===== SEMANTIC FLAVOR MODIFIERS ===== */\n\n/* Primary */\n.input-wrapper.primary {\n border-color: var(--ty-input-primary-border, var(--ty-color-primary));\n}\n\n.input-wrapper.primary:hover:not(.disabled) {\n border-color: var(--ty-color-primary-bold);\n}\n\n.input-wrapper.primary.focused {\n border-color: var(--ty-color-primary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);\n}\n\n/* Secondary */\n.input-wrapper.secondary {\n border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));\n}\n\n.input-wrapper.secondary.focused {\n border-color: var(--ty-color-secondary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);\n}\n\n/* Success */\n.input-wrapper.success {\n border-color: var(--ty-input-success-border);\n}\n\n.input-wrapper.success:hover:not(.disabled) {\n border-color: var(--ty-color-success-bold);\n}\n\n.input-wrapper.success.focused {\n border-color: var(--ty-color-success-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);\n}\n\n/* Danger */\n.input-wrapper.danger {\n border-color: var(--ty-input-danger-border);\n}\n\n.input-wrapper.danger:hover:not(.disabled) {\n border-color: var(--ty-color-danger-bold);\n}\n\n.input-wrapper.danger.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);\n}\n\n/* Warning */\n.input-wrapper.warning {\n border-color: var(--ty-input-warning-border);\n}\n\n.input-wrapper.warning:hover:not(.disabled) {\n border-color: var(--ty-color-warning-bold);\n}\n\n.input-wrapper.warning.focused {\n border-color: var(--ty-color-warning-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);\n}\n\n/* Neutral (default) */\n.input-wrapper.neutral.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== ACCESSIBILITY ENHANCEMENTS ===== */\n\ninput:focus-visible {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .input-wrapper {\n border-width: 2px;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .input-wrapper {\n transition: none;\n }\n}\n\n/* ===== RESPONSIVE BEHAVIOR ===== */\n\n@media (max-width: 640px) {\n .input-wrapper.lg {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.lg input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n\n .input-wrapper.xl {\n min-height: 44px;\n padding: 0 14px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n }\n}\n\n@media (max-width: 480px) {\n .input-wrapper.xl {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n}\n\n\n/* Override input's :host so the switch sizes to its visual */\n:host {\n display: inline-flex;\n width: auto;\n vertical-align: middle;\n}\n\n/* ===== SWITCH CONTAINER (just the visual) ===== */\n.switch-container {\n display: inline-block;\n cursor: pointer;\n user-select: none;\n outline: none;\n vertical-align: middle;\n}\n\n.switch-container.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.switch-container:focus-visible .switch-track,\n.switch-container.focused .switch-track {\n box-shadow: 0 0 0 3px var(--ty-input-shadow-focus);\n}\n\n/* ===== TRACK ===== */\n.switch-track {\n position: relative;\n flex-shrink: 0;\n width: 36px;\n height: 20px;\n border-radius: 999px;\n background: var(--ty-color-neutral-soft, var(--ty-input-border));\n transition: background-color 0.18s ease-in-out;\n box-sizing: border-box;\n}\n\n/* ===== THUMB ===== */\n.switch-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: transform 0.18s ease-in-out, background-color 0.18s ease-in-out;\n}\n\n/* ===== CHECKED STATE ===== */\n.switch-container[aria-checked=\"true\"] .switch-track {\n background: var(--ty-color-primary);\n}\n\n.switch-container[aria-checked=\"true\"] .switch-thumb {\n transform: translateX(16px);\n}\n\n/* ===== SIZE VARIANTS ===== */\n.switch-container.xs .switch-track { width: 26px; height: 14px; }\n.switch-container.xs .switch-thumb { width: 10px; height: 10px; }\n.switch-container.xs[aria-checked=\"true\"] .switch-thumb { transform: translateX(12px); }\n\n.switch-container.sm .switch-track { width: 30px; height: 16px; }\n.switch-container.sm .switch-thumb { width: 12px; height: 12px; }\n.switch-container.sm[aria-checked=\"true\"] .switch-thumb { transform: translateX(14px); }\n\n/* md is default \u2014 already set above */\n\n.switch-container.lg .switch-track { width: 44px; height: 24px; }\n.switch-container.lg .switch-thumb { width: 20px; height: 20px; }\n.switch-container.lg[aria-checked=\"true\"] .switch-thumb { transform: translateX(20px); }\n\n.switch-container.xl .switch-track { width: 52px; height: 28px; }\n.switch-container.xl .switch-thumb { width: 24px; height: 24px; }\n.switch-container.xl[aria-checked=\"true\"] .switch-thumb { transform: translateX(24px); }\n\n/* ===== FLAVOR VARIANTS (checked-state colors) ===== */\n.switch-container.primary[aria-checked=\"true\"] .switch-track { background: var(--ty-color-primary); }\n.switch-container.secondary[aria-checked=\"true\"] .switch-track { background: var(--ty-color-secondary); }\n.switch-container.success[aria-checked=\"true\"] .switch-track { background: var(--ty-color-success); }\n.switch-container.danger[aria-checked=\"true\"] .switch-track { background: var(--ty-color-danger); }\n.switch-container.warning[aria-checked=\"true\"] .switch-track { background: var(--ty-color-warning); }\n.switch-container.neutral[aria-checked=\"true\"] .switch-track { background: var(--ty-color-neutral); }\n\n";
8
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
9
+ export declare const switchCustomFlavorCss: (base: string) => string;
10
+ export declare const switchStyles: string;
9
11
  //# sourceMappingURL=switch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/styles/switch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,YAAY,uvYA0FxB,CAAC"}
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/styles/switch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsBH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,WAAkC,CAAC;AAErF,eAAO,MAAM,YAAY,QAuFxB,CAAC"}
@@ -5,7 +5,25 @@
5
5
  * Reuses input-container/error-message rules from input styles for label
6
6
  * and error layout consistency.
7
7
  */
8
+ import { FLAVORS } from "../types/common.js";
8
9
  import { inputStyles } from "./input.js";
10
+ /* Flavor rules only set --switch-track; the single checked-state rule below
11
+ consumes it. The var doubles as the per-instance override API:
12
+ `ty-switch { --switch-track: … }` (outer-document host rules beat :host).
13
+ Optional fallback flavor `fb` is used for custom flavors so missing
14
+ tokens degrade to neutral instead of an unstyled track. */
15
+ const switchFlavor = (f, fb) => {
16
+ const tok = (s) => fb
17
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${fb}${s}))`
18
+ : `var(--ty-color-${f}${s})`;
19
+ return `
20
+ :host([flavor="${f}"]) { --switch-track: ${tok("")}; }
21
+ :host([flavor="${f}+"]) { --switch-track: ${tok("-strong")}; }
22
+ :host([flavor="${f}-"]) { --switch-track: ${tok("-soft")}; }
23
+ `;
24
+ };
25
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
26
+ export const switchCustomFlavorCss = (base) => switchFlavor(base, "neutral");
9
27
  export const switchStyles = `
10
28
  ${inputStyles}
11
29
 
@@ -43,7 +61,7 @@ ${inputStyles}
43
61
  height: 20px;
44
62
  border-radius: 999px;
45
63
  background: var(--ty-color-neutral-soft, var(--ty-input-border));
46
- transition: background-color 0.18s ease-in-out;
64
+ transition: var(--ty-local-transition, background-color 0.18s ease-in-out);
47
65
  box-sizing: border-box;
48
66
  }
49
67
 
@@ -57,12 +75,14 @@ ${inputStyles}
57
75
  border-radius: 50%;
58
76
  background: white;
59
77
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
60
- transition: transform 0.18s ease-in-out, background-color 0.18s ease-in-out;
78
+ transition: var(--ty-local-transition, transform 0.18s ease-in-out, background-color 0.18s ease-in-out);
61
79
  }
62
80
 
63
81
  /* ===== CHECKED STATE ===== */
82
+ /* Default (no flavor attribute) is primary — defaults don't reflect to the
83
+ host attribute, so the base rule's fallback carries the default look. */
64
84
  .switch-container[aria-checked="true"] .switch-track {
65
- background: var(--ty-color-primary);
85
+ background: var(--switch-track, var(--ty-color-primary));
66
86
  }
67
87
 
68
88
  .switch-container[aria-checked="true"] .switch-thumb {
@@ -88,13 +108,8 @@ ${inputStyles}
88
108
  .switch-container.xl .switch-thumb { width: 24px; height: 24px; }
89
109
  .switch-container.xl[aria-checked="true"] .switch-thumb { transform: translateX(24px); }
90
110
 
91
- /* ===== FLAVOR VARIANTS (checked-state colors) ===== */
92
- .switch-container.primary[aria-checked="true"] .switch-track { background: var(--ty-color-primary); }
93
- .switch-container.secondary[aria-checked="true"] .switch-track { background: var(--ty-color-secondary); }
94
- .switch-container.success[aria-checked="true"] .switch-track { background: var(--ty-color-success); }
95
- .switch-container.danger[aria-checked="true"] .switch-track { background: var(--ty-color-danger); }
96
- .switch-container.warning[aria-checked="true"] .switch-track { background: var(--ty-color-warning); }
97
- .switch-container.neutral[aria-checked="true"] .switch-track { background: var(--ty-color-neutral); }
111
+ /* ===== FLAVOR VARIANTS (set --switch-track, consumed above) ===== */
112
+ ${FLAVORS.map((f) => switchFlavor(f)).join("")}
98
113
 
99
114
  `;
100
115
  //# sourceMappingURL=switch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/styles/switch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG;EAC1B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFZ,CAAC"}
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/styles/switch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;6DAI6D;AAC7D,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC9C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CACxB,EAAE;QACA,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI;QACvD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,OAAO;iBACQ,CAAC,0BAA0B,GAAG,CAAC,EAAE,CAAC;iBAClC,CAAC,0BAA0B,GAAG,CAAC,SAAS,CAAC;iBACzC,CAAC,0BAA0B,GAAG,CAAC,OAAO,CAAC;CACvD,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG;EAC1B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoFX,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;CAE7C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Tab Component Styles
3
3
  */
4
- export declare const tabStyles = "\n:host {\n width: var(--tabs-width, 100%);\n height: calc(var(--tabs-height, 400px) - var(--buttons-height, 48px));\n display: block;\n box-sizing: border-box;\n flex-shrink: 0;\n transition: opacity var(--transition-duration, 400ms) var(--transition-easing, ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition-duration: 0ms !important;\n }\n}\n\n.tab-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.tab-panel {\n width: 100%;\n height: 100%;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.tab-panel.ty-custom-scroll {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.tab-panel.ty-custom-scroll::-webkit-scrollbar {\n display: none;\n}\n\n/* Show scrollbar on hover */\n.tab-wrapper:hover .ty-scrollbar-track-y.has-overflow {\n opacity: 1;\n}\n\n\n/* ===================================== */\n/* Custom Scrollbar - Vertical Track */\n/* ===================================== */\n\n.ty-scrollbar-track-y {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-y.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-y.has-overflow:hover,\n.ty-scrollbar-track-y.has-overflow.scrolling,\n.ty-scrollbar-track-y.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-y::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-y:hover::before,\n.ty-scrollbar-track-y.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-y {\n position: absolute;\n right: 0;\n width: 100%;\n min-height: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-y:hover,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-y:active,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Custom Scrollbar - Horizontal Track */\n/* ===================================== */\n\n.ty-scrollbar-track-x {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-x.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-x.has-overflow:hover,\n.ty-scrollbar-track-x.has-overflow.scrolling,\n.ty-scrollbar-track-x.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-x::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-x:hover::before,\n.ty-scrollbar-track-x.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-x {\n position: absolute;\n bottom: 0;\n height: 100%;\n min-width: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: background 0.15s ease-out;\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-x:hover,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-x:active,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Touch devices - hide custom scrollbar */\n/* ===================================== */\n\n@media (pointer: coarse) and (hover: none) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x {\n display: none !important;\n }\n}\n\n/* Respect reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x,\n .ty-scrollbar-thumb-y,\n .ty-scrollbar-thumb-x {\n transition-duration: 0ms !important;\n }\n}\n\n";
4
+ export declare const tabStyles = "\n:host {\n width: var(--tabs-width, 100%);\n height: calc(var(--tabs-height, 400px) - var(--buttons-height, 48px));\n display: block;\n box-sizing: border-box;\n flex-shrink: 0;\n transition: opacity var(--transition-duration, 400ms) var(--transition-easing, ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition-duration: 0ms !important;\n }\n}\n\n.tab-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.tab-panel {\n width: 100%;\n height: 100%;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.tab-panel.ty-custom-scroll {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.tab-panel.ty-custom-scroll::-webkit-scrollbar {\n display: none;\n}\n\n/* Show scrollbar on hover */\n.tab-wrapper:hover .ty-scrollbar-track-y.has-overflow {\n opacity: 1;\n}\n\n\n/* ===================================== */\n/* Custom Scrollbar - Vertical Track */\n/* ===================================== */\n\n.ty-scrollbar-track-y {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-y.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-y.has-overflow:hover,\n.ty-scrollbar-track-y.has-overflow.scrolling,\n.ty-scrollbar-track-y.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-y::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-y:hover::before,\n.ty-scrollbar-track-y.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-y {\n position: absolute;\n right: 0;\n width: 100%;\n min-height: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: var(--ty-local-transition, background 0.15s ease-out);\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-y:hover,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-y:active,\n.ty-scrollbar-track-y.dragging .ty-scrollbar-thumb-y {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Custom Scrollbar - Horizontal Track */\n/* ===================================== */\n\n.ty-scrollbar-track-x {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--ty-scrollbar-width, 8px);\n z-index: 3;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.25s ease-out;\n cursor: pointer;\n}\n\n.ty-scrollbar-track-x.has-overflow {\n pointer-events: auto;\n}\n\n.ty-scrollbar-track-x.has-overflow:hover,\n.ty-scrollbar-track-x.has-overflow.scrolling,\n.ty-scrollbar-track-x.dragging {\n opacity: 1;\n}\n\n.ty-scrollbar-track-x::before {\n content: '';\n position: absolute;\n inset: 0;\n background: var(--ty-scrollbar-track, transparent);\n border-radius: var(--ty-scrollbar-radius, 4px);\n opacity: 0;\n transition: opacity 0.15s ease-out;\n}\n\n.ty-scrollbar-track-x:hover::before,\n.ty-scrollbar-track-x.dragging::before {\n opacity: 1;\n background: var(--ty-scrollbar-track-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 8%, transparent));\n}\n\n.ty-scrollbar-thumb-x {\n position: absolute;\n bottom: 0;\n height: 100%;\n min-width: var(--ty-scrollbar-thumb-min-height, 30px);\n background: var(--ty-scrollbar-thumb, color-mix(in oklab, var(--ty-color-neutral-bold) 40%, transparent));\n border-radius: var(--ty-scrollbar-radius, 4px);\n transition: var(--ty-local-transition, background 0.15s ease-out);\n box-sizing: border-box;\n border: 1px solid transparent;\n}\n\n.ty-scrollbar-thumb-x:hover,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-hover, color-mix(in oklab, var(--ty-color-neutral-bold) 55%, transparent));\n}\n\n.ty-scrollbar-thumb-x:active,\n.ty-scrollbar-track-x.dragging .ty-scrollbar-thumb-x {\n background: var(--ty-scrollbar-thumb-active, color-mix(in oklab, var(--ty-color-neutral-bold) 70%, transparent));\n}\n\n/* ===================================== */\n/* Touch devices - hide custom scrollbar */\n/* ===================================== */\n\n@media (pointer: coarse) and (hover: none) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x {\n display: none !important;\n }\n}\n\n/* Respect reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .ty-scrollbar-track-y,\n .ty-scrollbar-track-x,\n .ty-scrollbar-thumb-y,\n .ty-scrollbar-thumb-x {\n transition-duration: 0ms !important;\n }\n}\n\n";
5
5
  //# sourceMappingURL=tab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tab.d.ts","sourceRoot":"","sources":["../../src/styles/tab.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,SAAS,qhKA6CrB,CAAC"}
1
+ {"version":3,"file":"tab.d.ts","sourceRoot":"","sources":["../../src/styles/tab.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,SAAS,6kKA6CrB,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: var(--ty-local-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,yrLAiPtB,CAAC"}
@@ -107,7 +107,7 @@ export const tabsStyles = `
107
107
  cursor: pointer;
108
108
  font: inherit;
109
109
  color: var(--ty-text-soft);
110
- transition: color 200ms, background-color 200ms;
110
+ transition: var(--ty-local-transition, color 200ms, background-color 200ms);
111
111
  white-space: nowrap;
112
112
  display: inline-flex;
113
113
  align-items: center;
@@ -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 */