tyrell-components 1.0.0-RC10

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