tyrell-components 1.0.0-RC6

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/css/tyrell.css +1783 -0
  4. package/dist/tyrell.css +1783 -0
  5. package/dist/tyrell.js +2 -0
  6. package/lib/base/ty-component.d.ts +133 -0
  7. package/lib/base/ty-component.d.ts.map +1 -0
  8. package/lib/base/ty-component.js +297 -0
  9. package/lib/base/ty-component.js.map +1 -0
  10. package/lib/components/button.d.ts +126 -0
  11. package/lib/components/button.d.ts.map +1 -0
  12. package/lib/components/button.js +244 -0
  13. package/lib/components/button.js.map +1 -0
  14. package/lib/components/calendar-month.d.ts +132 -0
  15. package/lib/components/calendar-month.d.ts.map +1 -0
  16. package/lib/components/calendar-month.js +440 -0
  17. package/lib/components/calendar-month.js.map +1 -0
  18. package/lib/components/calendar-navigation.d.ts +137 -0
  19. package/lib/components/calendar-navigation.d.ts.map +1 -0
  20. package/lib/components/calendar-navigation.js +366 -0
  21. package/lib/components/calendar-navigation.js.map +1 -0
  22. package/lib/components/calendar.d.ts +166 -0
  23. package/lib/components/calendar.d.ts.map +1 -0
  24. package/lib/components/calendar.js +774 -0
  25. package/lib/components/calendar.js.map +1 -0
  26. package/lib/components/checkbox.d.ts +189 -0
  27. package/lib/components/checkbox.d.ts.map +1 -0
  28. package/lib/components/checkbox.js +400 -0
  29. package/lib/components/checkbox.js.map +1 -0
  30. package/lib/components/copy.d.ts +180 -0
  31. package/lib/components/copy.d.ts.map +1 -0
  32. package/lib/components/copy.js +393 -0
  33. package/lib/components/copy.js.map +1 -0
  34. package/lib/components/date-picker.d.ts +379 -0
  35. package/lib/components/date-picker.d.ts.map +1 -0
  36. package/lib/components/date-picker.js +1586 -0
  37. package/lib/components/date-picker.js.map +1 -0
  38. package/lib/components/dropdown.d.ts +402 -0
  39. package/lib/components/dropdown.d.ts.map +1 -0
  40. package/lib/components/dropdown.js +1552 -0
  41. package/lib/components/dropdown.js.map +1 -0
  42. package/lib/components/icon.d.ts +118 -0
  43. package/lib/components/icon.d.ts.map +1 -0
  44. package/lib/components/icon.js +245 -0
  45. package/lib/components/icon.js.map +1 -0
  46. package/lib/components/input.d.ts +270 -0
  47. package/lib/components/input.d.ts.map +1 -0
  48. package/lib/components/input.js +721 -0
  49. package/lib/components/input.js.map +1 -0
  50. package/lib/components/modal.d.ts +58 -0
  51. package/lib/components/modal.d.ts.map +1 -0
  52. package/lib/components/modal.js +473 -0
  53. package/lib/components/modal.js.map +1 -0
  54. package/lib/components/multiselect.d.ts +397 -0
  55. package/lib/components/multiselect.d.ts.map +1 -0
  56. package/lib/components/multiselect.js +1580 -0
  57. package/lib/components/multiselect.js.map +1 -0
  58. package/lib/components/option.d.ts +66 -0
  59. package/lib/components/option.d.ts.map +1 -0
  60. package/lib/components/option.js +314 -0
  61. package/lib/components/option.js.map +1 -0
  62. package/lib/components/popup.d.ts +43 -0
  63. package/lib/components/popup.d.ts.map +1 -0
  64. package/lib/components/popup.js +380 -0
  65. package/lib/components/popup.js.map +1 -0
  66. package/lib/components/radio.d.ts +198 -0
  67. package/lib/components/radio.d.ts.map +1 -0
  68. package/lib/components/radio.js +437 -0
  69. package/lib/components/radio.js.map +1 -0
  70. package/lib/components/resize-observer.d.ts +48 -0
  71. package/lib/components/resize-observer.d.ts.map +1 -0
  72. package/lib/components/resize-observer.js +108 -0
  73. package/lib/components/resize-observer.js.map +1 -0
  74. package/lib/components/scroll-container.d.ts +51 -0
  75. package/lib/components/scroll-container.d.ts.map +1 -0
  76. package/lib/components/scroll-container.js +239 -0
  77. package/lib/components/scroll-container.js.map +1 -0
  78. package/lib/components/step.d.ts +26 -0
  79. package/lib/components/step.d.ts.map +1 -0
  80. package/lib/components/step.js +75 -0
  81. package/lib/components/step.js.map +1 -0
  82. package/lib/components/switch.d.ts +111 -0
  83. package/lib/components/switch.d.ts.map +1 -0
  84. package/lib/components/switch.js +240 -0
  85. package/lib/components/switch.js.map +1 -0
  86. package/lib/components/tab.d.ts +23 -0
  87. package/lib/components/tab.d.ts.map +1 -0
  88. package/lib/components/tab.js +76 -0
  89. package/lib/components/tab.js.map +1 -0
  90. package/lib/components/tabs.d.ts +93 -0
  91. package/lib/components/tabs.d.ts.map +1 -0
  92. package/lib/components/tabs.js +653 -0
  93. package/lib/components/tabs.js.map +1 -0
  94. package/lib/components/tag.d.ts +144 -0
  95. package/lib/components/tag.d.ts.map +1 -0
  96. package/lib/components/tag.js +316 -0
  97. package/lib/components/tag.js.map +1 -0
  98. package/lib/components/textarea.d.ts +241 -0
  99. package/lib/components/textarea.d.ts.map +1 -0
  100. package/lib/components/textarea.js +585 -0
  101. package/lib/components/textarea.js.map +1 -0
  102. package/lib/components/tooltip.d.ts +40 -0
  103. package/lib/components/tooltip.d.ts.map +1 -0
  104. package/lib/components/tooltip.js +439 -0
  105. package/lib/components/tooltip.js.map +1 -0
  106. package/lib/components/wizard.d.ts +86 -0
  107. package/lib/components/wizard.d.ts.map +1 -0
  108. package/lib/components/wizard.js +636 -0
  109. package/lib/components/wizard.js.map +1 -0
  110. package/lib/icons/fontawesome/brands.d.ts +557 -0
  111. package/lib/icons/fontawesome/brands.d.ts.map +1 -0
  112. package/lib/icons/fontawesome/brands.js +557 -0
  113. package/lib/icons/fontawesome/brands.js.map +1 -0
  114. package/lib/icons/fontawesome/regular.d.ts +281 -0
  115. package/lib/icons/fontawesome/regular.d.ts.map +1 -0
  116. package/lib/icons/fontawesome/regular.js +281 -0
  117. package/lib/icons/fontawesome/regular.js.map +1 -0
  118. package/lib/icons/fontawesome/solid.d.ts +1992 -0
  119. package/lib/icons/fontawesome/solid.d.ts.map +1 -0
  120. package/lib/icons/fontawesome/solid.js +1992 -0
  121. package/lib/icons/fontawesome/solid.js.map +1 -0
  122. package/lib/icons/heroicons/micro.d.ts +324 -0
  123. package/lib/icons/heroicons/micro.d.ts.map +1 -0
  124. package/lib/icons/heroicons/micro.js +1032 -0
  125. package/lib/icons/heroicons/micro.js.map +1 -0
  126. package/lib/icons/heroicons/mini.d.ts +332 -0
  127. package/lib/icons/heroicons/mini.d.ts.map +1 -0
  128. package/lib/icons/heroicons/mini.js +1038 -0
  129. package/lib/icons/heroicons/mini.js.map +1 -0
  130. package/lib/icons/heroicons/outline.d.ts +332 -0
  131. package/lib/icons/heroicons/outline.d.ts.map +1 -0
  132. package/lib/icons/heroicons/outline.js +993 -0
  133. package/lib/icons/heroicons/outline.js.map +1 -0
  134. package/lib/icons/heroicons/solid.d.ts +332 -0
  135. package/lib/icons/heroicons/solid.d.ts.map +1 -0
  136. package/lib/icons/heroicons/solid.js +1063 -0
  137. package/lib/icons/heroicons/solid.js.map +1 -0
  138. package/lib/icons/lucide.d.ts +1872 -0
  139. package/lib/icons/lucide.d.ts.map +1 -0
  140. package/lib/icons/lucide.js +28212 -0
  141. package/lib/icons/lucide.js.map +1 -0
  142. package/lib/icons/material/filled.d.ts +2180 -0
  143. package/lib/icons/material/filled.d.ts.map +1 -0
  144. package/lib/icons/material/filled.js +14003 -0
  145. package/lib/icons/material/filled.js.map +1 -0
  146. package/lib/icons/material/outlined.d.ts +2142 -0
  147. package/lib/icons/material/outlined.d.ts.map +1 -0
  148. package/lib/icons/material/outlined.js +14545 -0
  149. package/lib/icons/material/outlined.js.map +1 -0
  150. package/lib/icons/material/round.d.ts +2147 -0
  151. package/lib/icons/material/round.d.ts.map +1 -0
  152. package/lib/icons/material/round.js +14779 -0
  153. package/lib/icons/material/round.js.map +1 -0
  154. package/lib/icons/material/sharp.d.ts +2147 -0
  155. package/lib/icons/material/sharp.d.ts.map +1 -0
  156. package/lib/icons/material/sharp.js +14189 -0
  157. package/lib/icons/material/sharp.js.map +1 -0
  158. package/lib/icons/material/two-tone.d.ts +2185 -0
  159. package/lib/icons/material/two-tone.d.ts.map +1 -0
  160. package/lib/icons/material/two-tone.js +17152 -0
  161. package/lib/icons/material/two-tone.js.map +1 -0
  162. package/lib/index.d.ts +78 -0
  163. package/lib/index.d.ts.map +1 -0
  164. package/lib/index.js +71 -0
  165. package/lib/index.js.map +1 -0
  166. package/lib/styles/button.d.ts +14 -0
  167. package/lib/styles/button.d.ts.map +1 -0
  168. package/lib/styles/button.js +457 -0
  169. package/lib/styles/button.js.map +1 -0
  170. package/lib/styles/calendar-month.d.ts +6 -0
  171. package/lib/styles/calendar-month.d.ts.map +1 -0
  172. package/lib/styles/calendar-month.js +275 -0
  173. package/lib/styles/calendar-month.js.map +1 -0
  174. package/lib/styles/calendar-navigation.d.ts +6 -0
  175. package/lib/styles/calendar-navigation.d.ts.map +1 -0
  176. package/lib/styles/calendar-navigation.js +143 -0
  177. package/lib/styles/calendar-navigation.js.map +1 -0
  178. package/lib/styles/calendar.d.ts +6 -0
  179. package/lib/styles/calendar.d.ts.map +1 -0
  180. package/lib/styles/calendar.js +28 -0
  181. package/lib/styles/calendar.js.map +1 -0
  182. package/lib/styles/checkbox.d.ts +9 -0
  183. package/lib/styles/checkbox.d.ts.map +1 -0
  184. package/lib/styles/checkbox.js +19 -0
  185. package/lib/styles/checkbox.js.map +1 -0
  186. package/lib/styles/copy.d.ts +7 -0
  187. package/lib/styles/copy.d.ts.map +1 -0
  188. package/lib/styles/copy.js +94 -0
  189. package/lib/styles/copy.js.map +1 -0
  190. package/lib/styles/custom-scrollbar.d.ts +6 -0
  191. package/lib/styles/custom-scrollbar.d.ts.map +1 -0
  192. package/lib/styles/custom-scrollbar.js +157 -0
  193. package/lib/styles/custom-scrollbar.js.map +1 -0
  194. package/lib/styles/date-picker.d.ts +6 -0
  195. package/lib/styles/date-picker.d.ts.map +1 -0
  196. package/lib/styles/date-picker.js +435 -0
  197. package/lib/styles/date-picker.js.map +1 -0
  198. package/lib/styles/dropdown.d.ts +12 -0
  199. package/lib/styles/dropdown.d.ts.map +1 -0
  200. package/lib/styles/dropdown.js +983 -0
  201. package/lib/styles/dropdown.js.map +1 -0
  202. package/lib/styles/icon.d.ts +6 -0
  203. package/lib/styles/icon.d.ts.map +1 -0
  204. package/lib/styles/icon.js +241 -0
  205. package/lib/styles/icon.js.map +1 -0
  206. package/lib/styles/input.d.ts +7 -0
  207. package/lib/styles/input.d.ts.map +1 -0
  208. package/lib/styles/input.js +685 -0
  209. package/lib/styles/input.js.map +1 -0
  210. package/lib/styles/modal.d.ts +8 -0
  211. package/lib/styles/modal.d.ts.map +1 -0
  212. package/lib/styles/modal.js +134 -0
  213. package/lib/styles/modal.js.map +1 -0
  214. package/lib/styles/multiselect.d.ts +6 -0
  215. package/lib/styles/multiselect.d.ts.map +1 -0
  216. package/lib/styles/multiselect.js +774 -0
  217. package/lib/styles/multiselect.js.map +1 -0
  218. package/lib/styles/option.d.ts +6 -0
  219. package/lib/styles/option.d.ts.map +1 -0
  220. package/lib/styles/option.js +116 -0
  221. package/lib/styles/option.js.map +1 -0
  222. package/lib/styles/popup.d.ts +8 -0
  223. package/lib/styles/popup.d.ts.map +1 -0
  224. package/lib/styles/popup.js +95 -0
  225. package/lib/styles/popup.js.map +1 -0
  226. package/lib/styles/radio.d.ts +8 -0
  227. package/lib/styles/radio.d.ts.map +1 -0
  228. package/lib/styles/radio.js +160 -0
  229. package/lib/styles/radio.js.map +1 -0
  230. package/lib/styles/resize-observer.d.ts +6 -0
  231. package/lib/styles/resize-observer.d.ts.map +1 -0
  232. package/lib/styles/resize-observer.js +18 -0
  233. package/lib/styles/resize-observer.js.map +1 -0
  234. package/lib/styles/scroll-container.d.ts +6 -0
  235. package/lib/styles/scroll-container.d.ts.map +1 -0
  236. package/lib/styles/scroll-container.js +198 -0
  237. package/lib/styles/scroll-container.js.map +1 -0
  238. package/lib/styles/step.d.ts +5 -0
  239. package/lib/styles/step.d.ts.map +1 -0
  240. package/lib/styles/step.js +50 -0
  241. package/lib/styles/step.js.map +1 -0
  242. package/lib/styles/switch.d.ts +9 -0
  243. package/lib/styles/switch.d.ts.map +1 -0
  244. package/lib/styles/switch.js +100 -0
  245. package/lib/styles/switch.js.map +1 -0
  246. package/lib/styles/tab.d.ts +5 -0
  247. package/lib/styles/tab.d.ts.map +1 -0
  248. package/lib/styles/tab.js +51 -0
  249. package/lib/styles/tab.js.map +1 -0
  250. package/lib/styles/tabs.d.ts +13 -0
  251. package/lib/styles/tabs.d.ts.map +1 -0
  252. package/lib/styles/tabs.js +184 -0
  253. package/lib/styles/tabs.js.map +1 -0
  254. package/lib/styles/tag.d.ts +6 -0
  255. package/lib/styles/tag.d.ts.map +1 -0
  256. package/lib/styles/tag.js +420 -0
  257. package/lib/styles/tag.js.map +1 -0
  258. package/lib/styles/textarea.d.ts +6 -0
  259. package/lib/styles/textarea.d.ts.map +1 -0
  260. package/lib/styles/textarea.js +350 -0
  261. package/lib/styles/textarea.js.map +1 -0
  262. package/lib/styles/tooltip.d.ts +9 -0
  263. package/lib/styles/tooltip.d.ts.map +1 -0
  264. package/lib/styles/tooltip.js +136 -0
  265. package/lib/styles/tooltip.js.map +1 -0
  266. package/lib/styles/wizard.d.ts +25 -0
  267. package/lib/styles/wizard.d.ts.map +1 -0
  268. package/lib/styles/wizard.js +325 -0
  269. package/lib/styles/wizard.js.map +1 -0
  270. package/lib/types/common.d.ts +143 -0
  271. package/lib/types/common.d.ts.map +1 -0
  272. package/lib/types/common.js +5 -0
  273. package/lib/types/common.js.map +1 -0
  274. package/lib/utils/calendar-utils.d.ts +176 -0
  275. package/lib/utils/calendar-utils.d.ts.map +1 -0
  276. package/lib/utils/calendar-utils.js +370 -0
  277. package/lib/utils/calendar-utils.js.map +1 -0
  278. package/lib/utils/custom-scrollbar.d.ts +82 -0
  279. package/lib/utils/custom-scrollbar.d.ts.map +1 -0
  280. package/lib/utils/custom-scrollbar.js +320 -0
  281. package/lib/utils/custom-scrollbar.js.map +1 -0
  282. package/lib/utils/icon-registry.d.ts +78 -0
  283. package/lib/utils/icon-registry.d.ts.map +1 -0
  284. package/lib/utils/icon-registry.js +304 -0
  285. package/lib/utils/icon-registry.js.map +1 -0
  286. package/lib/utils/locale.d.ts +136 -0
  287. package/lib/utils/locale.d.ts.map +1 -0
  288. package/lib/utils/locale.js +213 -0
  289. package/lib/utils/locale.js.map +1 -0
  290. package/lib/utils/mobile.d.ts +14 -0
  291. package/lib/utils/mobile.d.ts.map +1 -0
  292. package/lib/utils/mobile.js +21 -0
  293. package/lib/utils/mobile.js.map +1 -0
  294. package/lib/utils/number-format.d.ts +83 -0
  295. package/lib/utils/number-format.d.ts.map +1 -0
  296. package/lib/utils/number-format.js +143 -0
  297. package/lib/utils/number-format.js.map +1 -0
  298. package/lib/utils/parse-boolean.d.ts +39 -0
  299. package/lib/utils/parse-boolean.d.ts.map +1 -0
  300. package/lib/utils/parse-boolean.js +58 -0
  301. package/lib/utils/parse-boolean.js.map +1 -0
  302. package/lib/utils/positioning.d.ts +143 -0
  303. package/lib/utils/positioning.d.ts.map +1 -0
  304. package/lib/utils/positioning.js +308 -0
  305. package/lib/utils/positioning.js.map +1 -0
  306. package/lib/utils/property-capture.d.ts +132 -0
  307. package/lib/utils/property-capture.d.ts.map +1 -0
  308. package/lib/utils/property-capture.js +152 -0
  309. package/lib/utils/property-capture.js.map +1 -0
  310. package/lib/utils/property-manager.d.ts +90 -0
  311. package/lib/utils/property-manager.d.ts.map +1 -0
  312. package/lib/utils/property-manager.js +197 -0
  313. package/lib/utils/property-manager.js.map +1 -0
  314. package/lib/utils/resize-observer.d.ts +42 -0
  315. package/lib/utils/resize-observer.d.ts.map +1 -0
  316. package/lib/utils/resize-observer.js +71 -0
  317. package/lib/utils/resize-observer.js.map +1 -0
  318. package/lib/utils/scroll-lock.d.ts +79 -0
  319. package/lib/utils/scroll-lock.d.ts.map +1 -0
  320. package/lib/utils/scroll-lock.js +197 -0
  321. package/lib/utils/scroll-lock.js.map +1 -0
  322. package/lib/utils/styles.d.ts +27 -0
  323. package/lib/utils/styles.d.ts.map +1 -0
  324. package/lib/utils/styles.js +53 -0
  325. package/lib/utils/styles.js.map +1 -0
  326. package/lib/version.d.ts +8 -0
  327. package/lib/version.d.ts.map +1 -0
  328. package/lib/version.js +11 -0
  329. package/lib/version.js.map +1 -0
  330. package/package.json +159 -0
@@ -0,0 +1,983 @@
1
+ /**
2
+ * Dropdown Component Styles
3
+ *
4
+ * ARCHITECTURE:
5
+ * - Shared styles: Apply to both desktop and mobile
6
+ * - Desktop styles: Scoped under .dropdown-mode-desktop
7
+ * - Mobile styles: Scoped under .dropdown-mode-mobile
8
+ *
9
+ * This prevents CSS conflicts between desktop dialog and mobile modal implementations.
10
+ */
11
+ import { customScrollbarStyles } from "./custom-scrollbar.js";
12
+ export const dropdownStyles = `
13
+ /* ==================== SHARED STYLES ==================== */
14
+ /* These apply to BOTH desktop and mobile modes */
15
+
16
+ :host {
17
+ display: block;
18
+ width: auto;
19
+ min-width: 200px;
20
+ }
21
+
22
+ :host {
23
+ --mobile-border-color: var(--ty-border, #5858587d);
24
+ }
25
+
26
+ .dropdown-container {
27
+ display: flex;
28
+ flex-direction: column;
29
+ width: 100%;
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ /* Label styling */
34
+ .dropdown-label {
35
+ font-size: 14px;
36
+ font-weight: 500;
37
+ color: var(--ty-label-color);
38
+ margin-bottom: 6px;
39
+ line-height: 1.25;
40
+ padding-left: 12px;
41
+ }
42
+
43
+ .required-icon {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ color: #ef4444;
47
+ width: 12px;
48
+ height: 12px;
49
+ vertical-align: middle;
50
+ margin-left: 4px;
51
+ }
52
+
53
+ .dropdown-wrapper {
54
+ position: relative;
55
+ display: block;
56
+ width: 100%;
57
+ }
58
+
59
+ /* ==================== DESKTOP MODE STYLES ==================== */
60
+ /* All styles scoped under .dropdown-mode-desktop */
61
+
62
+ /* Stub (trigger button) */
63
+ .dropdown-mode-desktop .dropdown-stub {
64
+ width: 100%;
65
+ cursor: pointer;
66
+ box-sizing: border-box;
67
+ position: relative;
68
+ display: flex;
69
+ align-items: center;
70
+ background: var(--input-bg, var(--ty-input-bg));
71
+ color: var(--input-color, var(--ty-input-color));
72
+ border: 1px solid var(--input-border, var(--ty-input-border));
73
+ border-radius: var(--ty-radius-md);
74
+ font-family: var(--ty-font-sans);
75
+ font-size: var(--ty-font-sm);
76
+ line-height: var(--ty-leading-sm);
77
+ letter-spacing: var(--ty-tracking-sm);
78
+ font-weight: var(--ty-font-normal);
79
+ min-height: var(--ty-size-md);
80
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
81
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
82
+ transition: var(--ty-transition-all), opacity 0.2s ease;
83
+ outline: none;
84
+ }
85
+
86
+ .dropdown-mode-desktop .dropdown-stub:hover {
87
+ border-color: var(--input-border-hover, var(--ty-input-border-hover));
88
+ }
89
+
90
+ .dropdown-mode-desktop .dropdown-stub[disabled] {
91
+ background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));
92
+ color: var(--input-disabled-color, var(--ty-input-disabled-color));
93
+ cursor: not-allowed;
94
+ opacity: 0.6;
95
+ }
96
+
97
+ .dropdown-mode-desktop .dropdown-stub:focus {
98
+ border-color: var(--input-border-hover, var(--ty-input-border-hover));
99
+ }
100
+
101
+ /* Hide stub when dropdown is open */
102
+ .dropdown-mode-desktop .dropdown-wrapper:has(.dropdown-chevron.open) .dropdown-stub {
103
+ opacity: 0;
104
+ pointer-events: none;
105
+ }
106
+
107
+ /* Size variants */
108
+ .dropdown-mode-desktop .dropdown-stub.xs {
109
+ min-height: var(--ty-size-xs);
110
+ font-size: var(--ty-font-xs);
111
+ line-height: var(--ty-leading-xs);
112
+ letter-spacing: var(--ty-tracking-xs);
113
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
114
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
115
+ }
116
+
117
+ .dropdown-mode-desktop .dropdown-stub.sm {
118
+ min-height: var(--ty-size-sm);
119
+ font-size: var(--ty-font-sm);
120
+ line-height: var(--ty-leading-sm);
121
+ letter-spacing: var(--ty-tracking-sm);
122
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
123
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
124
+ }
125
+
126
+ .dropdown-mode-desktop .dropdown-stub.md {
127
+ min-height: var(--ty-size-md);
128
+ font-size: var(--ty-font-sm);
129
+ line-height: var(--ty-leading-sm);
130
+ letter-spacing: var(--ty-tracking-sm);
131
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
132
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
133
+ }
134
+
135
+ .dropdown-mode-desktop .dropdown-stub.lg {
136
+ min-height: var(--ty-size-lg);
137
+ font-size: var(--ty-font-base);
138
+ line-height: var(--ty-leading-base);
139
+ letter-spacing: var(--ty-tracking-base);
140
+ padding: var(--ty-spacing-3) var(--ty-spacing-4);
141
+ padding-right: calc(var(--ty-spacing-4) + 1rem + var(--ty-spacing-3));
142
+ }
143
+
144
+ .dropdown-mode-desktop .dropdown-stub.xl {
145
+ min-height: var(--ty-size-xl);
146
+ font-size: var(--ty-font-lg);
147
+ line-height: var(--ty-leading-lg);
148
+ letter-spacing: var(--ty-tracking-lg);
149
+ padding: var(--ty-spacing-4) var(--ty-spacing-5);
150
+ padding-right: calc(var(--ty-spacing-5) + 1rem + var(--ty-spacing-4));
151
+ }
152
+
153
+ /* Clearable adjustments */
154
+ .dropdown-mode-desktop .dropdown-stub.xs.clearable.has-selection {
155
+ padding-right: calc(var(--ty-spacing-2) + 2rem + var(--ty-spacing-2));
156
+ }
157
+
158
+ .dropdown-mode-desktop .dropdown-stub.sm.clearable.has-selection {
159
+ padding-right: calc(var(--ty-spacing-2) + 2rem + var(--ty-spacing-2));
160
+ }
161
+
162
+ .dropdown-mode-desktop .dropdown-stub.md.clearable.has-selection {
163
+ padding-right: calc(var(--ty-spacing-3) + 2rem + var(--ty-spacing-3));
164
+ }
165
+
166
+ .dropdown-mode-desktop .dropdown-stub.lg.clearable.has-selection {
167
+ padding-right: calc(var(--ty-spacing-4) + 2rem + var(--ty-spacing-4));
168
+ }
169
+
170
+ .dropdown-mode-desktop .dropdown-stub.xl.clearable.has-selection {
171
+ padding-right: calc(var(--ty-spacing-5) + 2rem + var(--ty-spacing-5));
172
+ }
173
+
174
+ /* Start-slot icon (leading content inside the stub trigger) */
175
+ .dropdown-mode-desktop .dropdown-stub ::slotted([slot="start"]),
176
+ .dropdown-mode-mobile .dropdown-stub ::slotted([slot="start"]) {
177
+ display: flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ flex-shrink: 0;
181
+ margin-right: 0.5rem;
182
+ color: var(--ty-color-text-soft);
183
+ }
184
+
185
+ .dropdown-mode-desktop .dropdown-stub ::slotted(ty-icon[slot="start"]),
186
+ .dropdown-mode-mobile .dropdown-stub ::slotted(ty-icon[slot="start"]) {
187
+ width: 1em;
188
+ height: 1em;
189
+ }
190
+
191
+ /* Placeholder */
192
+ .dropdown-mode-desktop .dropdown-placeholder {
193
+ color: var(--input-placeholder, var(--ty-input-placeholder));
194
+ font-weight: var(--ty-font-light);
195
+ font-size: var(--ty-font-sm);
196
+ line-height: var(--ty-leading-sm);
197
+ letter-spacing: var(--ty-tracking-sm);
198
+ font-style: italic;
199
+ pointer-events: none;
200
+ }
201
+
202
+ .dropdown-mode-desktop .dropdown-stub.has-selection .dropdown-placeholder {
203
+ display: none;
204
+ }
205
+
206
+ /* Selected content */
207
+ .dropdown-mode-desktop .dropdown-stub slot[name="selected"] {
208
+ display: block;
209
+ }
210
+
211
+ .dropdown-mode-desktop .dropdown-stub.has-selection slot[name="selected"] {
212
+ width: 100%;
213
+ }
214
+
215
+ .dropdown-mode-desktop .dropdown-stub slot[name="selected"] * {
216
+ display: block;
217
+ width: 100%;
218
+ padding: 0;
219
+ margin: 0;
220
+ border: none;
221
+ background: none;
222
+ color: inherit;
223
+ font: inherit;
224
+ line-height: inherit;
225
+ outline: none;
226
+ appearance: none;
227
+ }
228
+
229
+ /* Chevron */
230
+ .dropdown-mode-desktop .dropdown-chevron {
231
+ position: absolute;
232
+ top: 50%;
233
+ right: var(--ty-spacing-3);
234
+ transform: translateY(-50%);
235
+ width: 1rem;
236
+ height: 1rem;
237
+ color: var(--input-placeholder, var(--ty-input-placeholder));
238
+ transition: var(--ty-transition-transform);
239
+ pointer-events: none;
240
+ }
241
+
242
+ .dropdown-mode-desktop .dropdown-chevron.open {
243
+ transform: translateY(-50%) rotate(180deg);
244
+ }
245
+
246
+ .dropdown-mode-desktop .dropdown-chevron svg {
247
+ width: 100%;
248
+ height: 100%;
249
+ }
250
+
251
+ /* Clear button */
252
+ .dropdown-mode-desktop .dropdown-clear-btn {
253
+ position: absolute;
254
+ top: 50%;
255
+ right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
256
+ transform: translateY(-50%);
257
+ width: 1rem;
258
+ height: 1rem;
259
+ padding: 0;
260
+ border: none;
261
+ background: none;
262
+ color: var(--input-placeholder, var(--ty-input-placeholder));
263
+ cursor: pointer;
264
+ transition: var(--ty-transition-colors);
265
+ display: none;
266
+ }
267
+
268
+ .dropdown-mode-desktop .dropdown-clear-btn:hover {
269
+ color: var(--ty-color-danger);
270
+ }
271
+
272
+ .dropdown-mode-desktop .dropdown-clear-btn:active {
273
+ transform: translateY(-50%) scale(0.9);
274
+ }
275
+
276
+ .dropdown-mode-desktop .dropdown-clear-btn svg {
277
+ width: 100%;
278
+ height: 100%;
279
+ display: block;
280
+ }
281
+
282
+ /* Dialog */
283
+ .dropdown-mode-desktop .dropdown-dialog {
284
+ position: fixed;
285
+ width: var(--dropdown-width, 200px);
286
+ max-width: 100vw;
287
+ margin: 0;
288
+ padding: 0;
289
+ border: none;
290
+ background: transparent;
291
+ box-sizing: border-box;
292
+ padding: var(--dropdown-padding, 20px);
293
+ opacity: 0;
294
+ transition: opacity 400ms ease;
295
+ transform: translate(var(--dropdown-offset-x, 0px), var(--dropdown-offset-y, 0px));
296
+ top: -1000px;
297
+ left: -1000px;
298
+ }
299
+
300
+ /* When opened via showModal(), apply flex layout and direction */
301
+ .dropdown-mode-desktop .dropdown-dialog[open] {
302
+ display: flex;
303
+ flex-direction: column;
304
+ }
305
+
306
+ .dropdown-mode-desktop .dropdown-dialog.position-below {
307
+ left: var(--dropdown-x);
308
+ top: var(--dropdown-y);
309
+ }
310
+
311
+ .dropdown-mode-desktop .dropdown-dialog.position-above {
312
+ left: var(--dropdown-x);
313
+ bottom: var(--dropdown-y);
314
+ top: auto;
315
+ flex-direction: column-reverse;
316
+ }
317
+
318
+ .dropdown-mode-desktop .dropdown-dialog.position-above .dropdown-header {
319
+ margin-top: 4px;
320
+ }
321
+
322
+ .dropdown-mode-desktop .dropdown-dialog.position-below .dropdown-header {
323
+ margin-bottom: 4px;
324
+ }
325
+
326
+ .dropdown-mode-desktop .dropdown-dialog.position-below .dropdown-options {
327
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1), var(--ty-shadow-md);
328
+ }
329
+
330
+ .dropdown-mode-desktop .dropdown-dialog.open {
331
+ display: flex;
332
+ opacity: 1;
333
+ }
334
+
335
+ .dropdown-mode-desktop .dropdown-dialog.open .dropdown-options {
336
+ opacity: 1;
337
+ transform: translateY(0) scale(1);
338
+ }
339
+
340
+ .dropdown-mode-desktop .dropdown-dialog::backdrop {
341
+ background: transparent;
342
+ }
343
+
344
+ /* Dialog header */
345
+ .dropdown-mode-desktop .dropdown-header {
346
+ display: flex;
347
+ align-items: center;
348
+ gap: var(--ty-spacing-2);
349
+ position: relative;
350
+ }
351
+
352
+ .dropdown-mode-desktop .dropdown-search-input {
353
+ width: 100%;
354
+ min-width: 0;
355
+ box-sizing: border-box;
356
+ background: var(--input-bg, var(--ty-input-bg));
357
+ color: var(--input-color, var(--ty-input-color));
358
+ border: 1px solid var(--input-border, var(--ty-input-border));
359
+ border-radius: var(--ty-radius-md);
360
+ font-family: var(--ty-font-sans);
361
+ font-size: var(--ty-font-sm);
362
+ line-height: var(--ty-leading-sm);
363
+ letter-spacing: var(--ty-tracking-sm);
364
+ font-weight: var(--ty-font-normal);
365
+ min-height: var(--ty-size-md);
366
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
367
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
368
+ transition: var(--ty-transition-all);
369
+ outline: none;
370
+ }
371
+
372
+ .dropdown-mode-desktop .dropdown-search-input:focus {
373
+ border-color: var(--input-border-focus, var(--ty-input-border-focus));
374
+ box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));
375
+ }
376
+
377
+ .dropdown-mode-desktop .dropdown-search-input:disabled {
378
+ background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));
379
+ color: var(--input-disabled-color, var(--ty-input-disabled-color));
380
+ cursor: not-allowed;
381
+ opacity: 0.6;
382
+ }
383
+
384
+ .dropdown-mode-desktop .dropdown-search-input::placeholder {
385
+ color: var(--input-placeholder, var(--ty-input-placeholder));
386
+ }
387
+
388
+ /* Search input sizes */
389
+ .dropdown-mode-desktop .dropdown-search-input.xs {
390
+ min-height: var(--ty-size-xs);
391
+ font-size: var(--ty-font-xs);
392
+ line-height: var(--ty-leading-xs);
393
+ letter-spacing: var(--ty-tracking-xs);
394
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
395
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
396
+ }
397
+
398
+ .dropdown-mode-desktop .dropdown-search-input.sm {
399
+ min-height: var(--ty-size-sm);
400
+ font-size: var(--ty-font-sm);
401
+ line-height: var(--ty-leading-sm);
402
+ letter-spacing: var(--ty-tracking-sm);
403
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
404
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
405
+ }
406
+
407
+ .dropdown-mode-desktop .dropdown-search-input.md {
408
+ min-height: var(--ty-size-md);
409
+ font-size: var(--ty-font-sm);
410
+ line-height: var(--ty-leading-sm);
411
+ letter-spacing: var(--ty-tracking-sm);
412
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
413
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
414
+ }
415
+
416
+ .dropdown-mode-desktop .dropdown-search-input.lg {
417
+ min-height: var(--ty-size-lg);
418
+ font-size: var(--ty-font-base);
419
+ line-height: var(--ty-leading-base);
420
+ letter-spacing: var(--ty-tracking-base);
421
+ padding: var(--ty-spacing-3) var(--ty-spacing-4);
422
+ padding-right: calc(var(--ty-spacing-4) + 1rem + var(--ty-spacing-3));
423
+ }
424
+
425
+ .dropdown-mode-desktop .dropdown-search-input.xl {
426
+ min-height: var(--ty-size-xl);
427
+ font-size: var(--ty-font-lg);
428
+ line-height: var(--ty-leading-lg);
429
+ letter-spacing: var(--ty-tracking-lg);
430
+ padding: var(--ty-spacing-4) var(--ty-spacing-5);
431
+ padding-right: calc(var(--ty-spacing-5) + 1rem + var(--ty-spacing-4));
432
+ }
433
+
434
+ .dropdown-mode-desktop .dropdown-search-chevron {
435
+ position: absolute;
436
+ top: 50%;
437
+ right: var(--ty-spacing-3);
438
+ transform: translateY(-50%);
439
+ width: 1rem;
440
+ height: 1rem;
441
+ color: var(--input-placeholder, var(--ty-input-placeholder));
442
+ transition: var(--ty-transition-transform);
443
+ pointer-events: none;
444
+ }
445
+
446
+ .dropdown-mode-desktop .dropdown-search-chevron.open {
447
+ transform: translateY(-50%) rotate(180deg);
448
+ }
449
+
450
+ .dropdown-mode-desktop .dropdown-search-chevron svg {
451
+ width: 100%;
452
+ height: 100%;
453
+ }
454
+
455
+ /* Options container */
456
+ .dropdown-mode-desktop .dropdown-options {
457
+ opacity: 0;
458
+ background: var(--input-bg, var(--ty-input-bg));
459
+ border: 1px solid var(--input-border, var(--ty-input-border));
460
+ border-radius: var(--ty-radius-lg);
461
+ max-height: 16rem;
462
+ width: 100%;
463
+ max-width: 100%;
464
+ overflow-x: hidden;
465
+ overflow-y: auto;
466
+ scroll-behavior: smooth;
467
+ box-sizing: border-box;
468
+ position: relative;
469
+ box-shadow:
470
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1),
471
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
472
+ transform: translateY(-20px) scale(0.90);
473
+ transition:
474
+ opacity 100ms cubic-bezier(0.16, 1, 0.3, 1),
475
+ transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
476
+
477
+ }
478
+
479
+ /* Hide native scrollbar only when custom scrollbar is active */
480
+ .dropdown-mode-desktop .dropdown-options.ty-custom-scroll {
481
+ scrollbar-width: none;
482
+ -ms-overflow-style: none;
483
+ }
484
+
485
+ .dropdown-mode-desktop .dropdown-options.ty-custom-scroll::-webkit-scrollbar {
486
+ display: none;
487
+ }
488
+
489
+ /* Options wrapper - positioned container for scrollbar track */
490
+ .dropdown-mode-desktop .dropdown-options-wrapper {
491
+ position: relative;
492
+ }
493
+
494
+ /* Show custom scrollbar on hover over options */
495
+ .dropdown-mode-desktop .dropdown-options-wrapper:hover .ty-scrollbar-track-y.has-overflow {
496
+ opacity: 1;
497
+ }
498
+
499
+ /* Option elements */
500
+ .dropdown-mode-desktop .dropdown-options ::slotted(option) {
501
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
502
+ color: var(--input-color, var(--ty-input-color));
503
+ cursor: pointer;
504
+ transition:
505
+ var(--ty-transition-colors),
506
+ transform 150ms cubic-bezier(0.16, 1, 0.3, 1);
507
+ border: none;
508
+ background: none;
509
+ font-size: inherit;
510
+ font-family: inherit;
511
+ width: 100%;
512
+ text-align: left;
513
+ box-sizing: border-box;
514
+ transform: translateX(0);
515
+ }
516
+
517
+ .dropdown-mode-desktop .dropdown-options ::slotted(option:hover) {
518
+ background-color: var(--ty-bg-neutral-soft);
519
+ }
520
+
521
+ .dropdown-mode-desktop .dropdown-options ::slotted(option[highlighted]) {
522
+ background-color: var(--ty-bg-primary-soft);
523
+ color: var(--ty-color-primary-mild);
524
+ }
525
+
526
+ .dropdown-mode-desktop .dropdown-options ::slotted(option[selected]) {
527
+ background-color: var(--ty-color-primary);
528
+ color: #ffffff;
529
+ }
530
+
531
+ .dropdown-mode-desktop .dropdown-options ::slotted(option[hidden]),
532
+ .dropdown-mode-desktop .dropdown-options ::slotted(ty-option[hidden]),
533
+ .dropdown-mode-desktop .dropdown-options ::slotted(ty-tag[hidden]) {
534
+ display: none;
535
+ }
536
+
537
+ /* ==================== MOBILE MODE STYLES ==================== */
538
+ /* All styles scoped under .dropdown-mode-mobile */
539
+ /* Floating modal design (centered card with backdrop) */
540
+
541
+ /* Stub (trigger button) - same as desktop but scoped */
542
+ .dropdown-mode-mobile .dropdown-stub {
543
+ width: 100%;
544
+ cursor: pointer;
545
+ box-sizing: border-box;
546
+ position: relative;
547
+ display: flex;
548
+ align-items: center;
549
+ background: var(--input-bg, var(--ty-input-bg));
550
+ color: var(--input-color, var(--ty-input-color));
551
+ border: 1px solid var(--input-border, var(--ty-input-border));
552
+ border-radius: var(--ty-radius-md);
553
+ font-family: var(--ty-font-sans);
554
+ font-size: var(--ty-font-sm);
555
+ line-height: var(--ty-leading-sm);
556
+ letter-spacing: var(--ty-tracking-sm);
557
+ font-weight: var(--ty-font-normal);
558
+ min-height: var(--ty-size-md);
559
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
560
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
561
+ transition: var(--ty-transition-all);
562
+ outline: none;
563
+ }
564
+
565
+ .dropdown-mode-mobile .dropdown-stub:hover {
566
+ border-color: var(--input-border-hover, var(--ty-input-border-hover));
567
+ }
568
+
569
+ .dropdown-mode-mobile .dropdown-stub[disabled] {
570
+ background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));
571
+ color: var(--input-disabled-color, var(--ty-input-disabled-color));
572
+ cursor: not-allowed;
573
+ opacity: 0.6;
574
+ }
575
+
576
+ /* Size variants */
577
+ .dropdown-mode-mobile .dropdown-stub.xs {
578
+ min-height: var(--ty-size-xs);
579
+ font-size: var(--ty-font-xs);
580
+ line-height: var(--ty-leading-xs);
581
+ letter-spacing: var(--ty-tracking-xs);
582
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
583
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
584
+ }
585
+
586
+ .dropdown-mode-mobile .dropdown-stub.sm {
587
+ min-height: var(--ty-size-sm);
588
+ font-size: var(--ty-font-sm);
589
+ line-height: var(--ty-leading-sm);
590
+ letter-spacing: var(--ty-tracking-sm);
591
+ padding: var(--ty-spacing-1) var(--ty-spacing-2);
592
+ padding-right: calc(var(--ty-spacing-2) + 1rem + var(--ty-spacing-1));
593
+ }
594
+
595
+ .dropdown-mode-mobile .dropdown-stub.md {
596
+ min-height: var(--ty-size-md);
597
+ font-size: var(--ty-font-sm);
598
+ line-height: var(--ty-leading-sm);
599
+ letter-spacing: var(--ty-tracking-sm);
600
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
601
+ padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
602
+ }
603
+
604
+ .dropdown-mode-mobile .dropdown-stub.lg {
605
+ min-height: var(--ty-size-lg);
606
+ font-size: var(--ty-font-base);
607
+ line-height: var(--ty-leading-base);
608
+ letter-spacing: var(--ty-tracking-base);
609
+ padding: var(--ty-spacing-3) var(--ty-spacing-4);
610
+ padding-right: calc(var(--ty-spacing-4) + 1rem + var(--ty-spacing-3));
611
+ }
612
+
613
+ .dropdown-mode-mobile .dropdown-stub.xl {
614
+ min-height: var(--ty-size-xl);
615
+ font-size: var(--ty-font-lg);
616
+ line-height: var(--ty-leading-lg);
617
+ letter-spacing: var(--ty-tracking-lg);
618
+ padding: var(--ty-spacing-4) var(--ty-spacing-5);
619
+ padding-right: calc(var(--ty-spacing-5) + 1rem + var(--ty-spacing-4));
620
+ }
621
+
622
+ /* Placeholder */
623
+ .dropdown-mode-mobile .dropdown-placeholder {
624
+ color: var(--input-placeholder, var(--ty-input-placeholder));
625
+ font-weight: var(--ty-font-light);
626
+ font-size: var(--ty-font-sm);
627
+ line-height: var(--ty-leading-sm);
628
+ letter-spacing: var(--ty-tracking-sm);
629
+ font-style: italic;
630
+ pointer-events: none;
631
+ }
632
+
633
+ .dropdown-mode-mobile .dropdown-stub.has-selection .dropdown-placeholder {
634
+ display: none;
635
+ }
636
+
637
+ /* Selected content */
638
+ .dropdown-mode-mobile .dropdown-stub slot[name="selected"] {
639
+ display: block;
640
+ }
641
+
642
+ .dropdown-mode-mobile .dropdown-stub.has-selection slot[name="selected"] {
643
+ width: 100%;
644
+ }
645
+
646
+ .dropdown-mode-mobile .dropdown-stub slot[name="selected"] * {
647
+ display: block;
648
+ width: 100%;
649
+ padding: 0;
650
+ margin: 0;
651
+ border: none;
652
+ background: none;
653
+ color: inherit;
654
+ font: inherit;
655
+ line-height: inherit;
656
+ outline: none;
657
+ appearance: none;
658
+ }
659
+
660
+ /* Chevron */
661
+ .dropdown-mode-mobile .dropdown-chevron {
662
+ position: absolute;
663
+ top: 50%;
664
+ right: var(--ty-spacing-3);
665
+ transform: translateY(-50%);
666
+ width: 1rem;
667
+ height: 1rem;
668
+ color: var(--input-placeholder, var(--ty-input-placeholder));
669
+ transition: var(--ty-transition-transform);
670
+ pointer-events: none;
671
+ }
672
+
673
+ .dropdown-mode-mobile .dropdown-chevron svg {
674
+ width: 100%;
675
+ height: 100%;
676
+ }
677
+
678
+ /* Mobile dialog - full screen overlay with centered floating card */
679
+ .dropdown-mode-mobile .mobile-dialog {
680
+ position: fixed;
681
+ top: 0;
682
+ left: 0;
683
+ right: 0;
684
+ bottom: 0;
685
+ width: 100vw;
686
+ height: 100vh;
687
+ max-width: 100vw;
688
+ max-height: 100vh;
689
+ margin: 0;
690
+ padding: 0;
691
+ padding-top: 10vh;
692
+ border: none;
693
+ background: transparent;
694
+ align-items: flex-start;
695
+ justify-content: center;
696
+ opacity: 0;
697
+ transition: opacity 300ms ease;
698
+ }
699
+
700
+ /* When opened via showModal(), add flex layout */
701
+ .dropdown-mode-mobile .mobile-dialog[open] {
702
+ display: flex;
703
+ }
704
+
705
+ .dropdown-mode-mobile .mobile-dialog.open {
706
+ opacity: 1;
707
+ }
708
+
709
+ /* Native dialog backdrop with blur */
710
+ .dropdown-mode-mobile .mobile-dialog::backdrop {
711
+ background: rgba(0, 0, 0, 0.5);
712
+ backdrop-filter: blur(8px);
713
+ -webkit-backdrop-filter: blur(8px);
714
+ }
715
+
716
+ /* Mobile content container - floating card */
717
+ .dropdown-mode-mobile .mobile-dialog-content {
718
+ position: relative;
719
+ display: flex;
720
+ flex-direction: column;
721
+ width: calc(100% - 32px);
722
+ max-width: 400px;
723
+ min-height: 200px;
724
+ max-height: calc(90vh - 10vh);
725
+ opacity: 0;
726
+ transform: scale(0.95);
727
+ transition:
728
+ opacity 300ms cubic-bezier(0.16, 1, 0.3, 1),
729
+ transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
730
+ }
731
+
732
+ .dropdown-mode-mobile .mobile-dialog.open .mobile-dialog-content {
733
+ opacity: 1;
734
+ transform: scale(1);
735
+ }
736
+
737
+ /* Mobile search header - label floats above, search + close below */
738
+ .dropdown-mode-mobile .mobile-search-header {
739
+ flex-shrink: 0;
740
+ display: flex;
741
+ flex-direction: column;
742
+ margin-bottom: 16px;
743
+ padding: 0;
744
+ background: transparent;
745
+ position: relative;
746
+ }
747
+
748
+ .dropdown-mode-mobile .mobile-header-content {
749
+ display: flex;
750
+ align-items: center;
751
+ gap: 12px;
752
+ width: 100%;
753
+ }
754
+
755
+ /* Header for non-searchable (label + close button) */
756
+ .dropdown-mode-mobile .mobile-header-nosearch {
757
+ flex-shrink: 0;
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: flex-end;
761
+ margin-bottom: 16px;
762
+ padding: 0;
763
+ background: transparent;
764
+ position: relative;
765
+ min-height: 40px;
766
+ }
767
+
768
+ .dropdown-mode-mobile .mobile-header-label {
769
+ position: absolute;
770
+ bottom: 100%;
771
+ left: 6px;
772
+ margin-bottom: 4px;
773
+ font-size: var(--ty-font-lg);
774
+ line-height: var(--ty-leading-lg);
775
+ letter-spacing: var(--ty-tracking-lg);
776
+ font-weight: 700;
777
+ color: var(--ty-color-neutral);
778
+ pointer-events: none;
779
+ }
780
+
781
+ /* Close button - circular with border */
782
+ .dropdown-mode-mobile .mobile-close-button {
783
+ flex-shrink: 0;
784
+ width: 36px;
785
+ height: 36px;
786
+ display: flex;
787
+ align-items: center;
788
+ justify-content: center;
789
+ background: var(--ty-surface-floating);
790
+ border: 2px solid var(--mobile-border-color);
791
+ border-radius: 50%;
792
+ color: var(--ty-text-strong);
793
+ cursor: pointer;
794
+ transition: var(--ty-transition-all);
795
+ padding: 0;
796
+ }
797
+
798
+ .dropdown-mode-mobile .mobile-close-button:hover {
799
+ background: var(--ty-bg-neutral);
800
+ border-color: var(--ty-border);
801
+ color: var(--ty-text-strong);
802
+ }
803
+
804
+ .dropdown-mode-mobile .mobile-close-button:active {
805
+ transform: scale(0.9);
806
+ }
807
+
808
+ .dropdown-mode-mobile .mobile-close-button svg {
809
+ width: 24px;
810
+ height: 24px;
811
+ }
812
+
813
+ /* Mobile search input */
814
+ .dropdown-mode-mobile .mobile-search-input {
815
+ flex: 1;
816
+ min-width: 0;
817
+ box-sizing: border-box;
818
+ background: var(--ty-surface-floating);
819
+ color: var(--ty-text);
820
+ border: 1px solid var(--ty-border-soft);
821
+ border-radius: var(--ty-radius-md);
822
+ font-family: var(--ty-font-sans);
823
+ font-size: var(--ty-font-sm);
824
+ line-height: var(--ty-leading-sm);
825
+ letter-spacing: var(--ty-tracking-sm);
826
+ font-weight: var(--ty-font-normal);
827
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
828
+ height: 40px;
829
+ transition: var(--ty-transition-all);
830
+ outline: none;
831
+ border: 2px solid;
832
+ border-color: var(--mobile-border-color);
833
+ }
834
+
835
+ .dropdown-mode-mobile .mobile-search-input::placeholder {
836
+ color: var(--ty-text-faint);
837
+ }
838
+
839
+ /* Mobile options container - floating card with elevation */
840
+ .dropdown-mode-mobile .mobile-options-container {
841
+ position: relative;
842
+ flex: 1;
843
+ overflow-y: auto;
844
+ overflow-x: hidden;
845
+ -webkit-overflow-scrolling: touch;
846
+ background: var(--ty-surface-floating); /* Floating card background */
847
+ border-radius: var(--ty-radius-lg);
848
+ border: 1px solid var(--ty-border-soft);
849
+ box-shadow:
850
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1),
851
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
852
+ border: 2px solid;
853
+ border-color: var(--mobile-border-color);
854
+ }
855
+
856
+ /* Hide scrollbar but keep functionality */
857
+ .dropdown-mode-mobile .mobile-options-container {
858
+ scrollbar-width: none; /* Firefox */
859
+ -ms-overflow-style: none; /* IE/Edge */
860
+ }
861
+
862
+ .dropdown-mode-mobile .mobile-options-container::-webkit-scrollbar {
863
+ display: none; /* Chrome, Safari, Opera */
864
+ }
865
+
866
+ /* Mobile option styling - native <option> only */
867
+ .dropdown-mode-mobile .mobile-options-container ::slotted(option) {
868
+ display: block;
869
+ padding: var(--ty-spacing-2) var(--ty-spacing-3);
870
+ margin: 2px 8px;
871
+ color: var(--ty-text);
872
+ cursor: pointer;
873
+ transition: var(--ty-transition-all);
874
+ border: none;
875
+ background: transparent;
876
+ font-size: var(--ty-font-sm);
877
+ line-height: var(--ty-leading-sm);
878
+ letter-spacing: var(--ty-tracking-sm);
879
+ font-family: inherit;
880
+ width: calc(100% - 16px);
881
+ text-align: left;
882
+ box-sizing: border-box;
883
+ border-radius: var(--ty-radius-sm);
884
+ min-height: 36px;
885
+ }
886
+
887
+ .dropdown-mode-mobile .mobile-options-container ::slotted(option:active) {
888
+ background-color: var(--ty-bg-neutral-soft);
889
+ }
890
+
891
+ .dropdown-mode-mobile .mobile-options-container ::slotted(option[highlighted]) {
892
+ background-color: var(--ty-bg-primary-soft);
893
+ color: var(--ty-color-primary-mild);
894
+ }
895
+
896
+ .dropdown-mode-mobile .mobile-options-container ::slotted(option[selected]) {
897
+ background: var(--ty-bg-primary);
898
+ color: var(--ty-color-primary-strong);
899
+ }
900
+
901
+ .dropdown-mode-mobile .mobile-options-container ::slotted(option[hidden]),
902
+ .dropdown-mode-mobile .mobile-options-container ::slotted(ty-option[hidden]),
903
+ .dropdown-mode-mobile .mobile-options-container ::slotted(ty-tag[hidden]) {
904
+ display: none;
905
+ }
906
+
907
+ /* ==================== FLAVOR VARIANTS ==================== */
908
+ /* Apply to both modes */
909
+
910
+ :host([flavor="primary"]) .dropdown-stub,
911
+ :host([flavor="primary"]) .dropdown-search-input {
912
+ border-color: var(--ty-color-primary);
913
+ }
914
+
915
+ :host([flavor="primary"]) .dropdown-stub:hover,
916
+ :host([flavor="primary"]) .dropdown-search-input:focus {
917
+ border-color: var(--ty-color-primary-mild);
918
+ box-shadow: 0 0 0 3px var(--ty-color-primary-faint);
919
+ }
920
+
921
+ :host([flavor="secondary"]) .dropdown-stub,
922
+ :host([flavor="secondary"]) .dropdown-search-input {
923
+ border-color: var(--ty-color-secondary);
924
+ }
925
+
926
+ :host([flavor="secondary"]) .dropdown-stub:hover,
927
+ :host([flavor="secondary"]) .dropdown-search-input:focus {
928
+ border-color: var(--ty-color-secondary-mild);
929
+ box-shadow: 0 0 0 3px var(--ty-color-secondary-faint);
930
+ }
931
+
932
+ :host([flavor="success"]) .dropdown-stub,
933
+ :host([flavor="success"]) .dropdown-search-input {
934
+ border-color: var(--ty-color-success);
935
+ }
936
+
937
+ :host([flavor="success"]) .dropdown-stub:hover,
938
+ :host([flavor="success"]) .dropdown-search-input:focus {
939
+ border-color: var(--ty-color-success-mild);
940
+ box-shadow: 0 0 0 3px var(--ty-color-success-faint);
941
+ }
942
+
943
+ :host([flavor="danger"]) .dropdown-stub,
944
+ :host([flavor="danger"]) .dropdown-search-input {
945
+ border-color: var(--ty-color-danger);
946
+ }
947
+
948
+ :host([flavor="danger"]) .dropdown-stub:hover,
949
+ :host([flavor="danger"]) .dropdown-search-input:focus {
950
+ border-color: var(--ty-color-danger-mild);
951
+ box-shadow: 0 0 0 3px var(--ty-color-danger-faint);
952
+ }
953
+
954
+ :host([flavor="warning"]) .dropdown-stub,
955
+ :host([flavor="warning"]) .dropdown-search-input {
956
+ border-color: var(--ty-color-warning);
957
+ }
958
+
959
+ :host([flavor="warning"]) .dropdown-stub:hover,
960
+ :host([flavor="warning"]) .dropdown-search-input:focus {
961
+ border-color: var(--ty-color-warning-mild);
962
+ box-shadow: 0 0 0 3px var(--ty-color-warning-faint);
963
+ }
964
+
965
+ /* ==================== READONLY STATE ==================== */
966
+
967
+ :host([readonly]) .dropdown-chevron {
968
+ display: none;
969
+ }
970
+
971
+ :host([readonly]) .dropdown-stub {
972
+ padding-right: var(--ty-spacing-3);
973
+ }
974
+
975
+ :host([readonly]) .dropdown-stub,
976
+ :host([readonly]) .dropdown-stub slot[name="selected"] {
977
+ cursor: initial;
978
+ }
979
+
980
+ /* Custom scrollbar styles */
981
+ ${customScrollbarStyles}
982
+ `;
983
+ //# sourceMappingURL=dropdown.js.map