tyrell-components 1.0.0-RC13 → 1.0.0-RC15

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 (358) hide show
  1. package/README.md +10 -2
  2. package/css/tyrell-theme.css +192 -180
  3. package/css/tyrell.css +23 -0
  4. package/dist/tyrell-colors-static.css +1 -316
  5. package/dist/tyrell-theme.css +1 -1454
  6. package/dist/tyrell.css +1 -1371
  7. package/dist/tyrell.js +1 -1
  8. package/lib/base/ty-component.d.ts +20 -10
  9. package/lib/base/ty-component.js +196 -319
  10. package/lib/components/button.d.ts +3 -17
  11. package/lib/components/button.js +261 -295
  12. package/lib/components/calendar-month.d.ts +4 -50
  13. package/lib/components/calendar-month.js +443 -582
  14. package/lib/components/calendar-navigation.d.ts +3 -48
  15. package/lib/components/calendar-navigation.js +239 -362
  16. package/lib/components/calendar.d.ts +8 -83
  17. package/lib/components/calendar.js +616 -829
  18. package/lib/components/checkbox.d.ts +5 -72
  19. package/lib/components/checkbox.js +273 -416
  20. package/lib/components/copy.d.ts +4 -57
  21. package/lib/components/copy.js +280 -397
  22. package/lib/components/date-picker.d.ts +21 -163
  23. package/lib/components/date-picker.js +1143 -1674
  24. package/lib/components/file-upload.d.ts +9 -15
  25. package/lib/components/file-upload.js +404 -426
  26. package/lib/components/icon.d.ts +3 -24
  27. package/lib/components/icon.js +141 -230
  28. package/lib/components/input.d.ts +8 -108
  29. package/lib/components/input.js +593 -784
  30. package/lib/components/modal.d.ts +17 -26
  31. package/lib/components/modal.js +340 -484
  32. package/lib/components/option.d.ts +2 -9
  33. package/lib/components/option.js +168 -216
  34. package/lib/components/popup.d.ts +2 -17
  35. package/lib/components/popup.js +249 -380
  36. package/lib/components/radio.d.ts +5 -25
  37. package/lib/components/radio.js +407 -461
  38. package/lib/components/resize-observer.d.ts +3 -30
  39. package/lib/components/resize-observer.js +69 -103
  40. package/lib/components/scroll-container.d.ts +2 -12
  41. package/lib/components/scroll-container.js +293 -338
  42. package/lib/components/select.d.ts +87 -159
  43. package/lib/components/select.js +1609 -2090
  44. package/lib/components/selected-tags.d.ts +5 -48
  45. package/lib/components/selected-tags.js +188 -276
  46. package/lib/components/step.d.ts +1 -6
  47. package/lib/components/step.js +62 -68
  48. package/lib/components/switch.d.ts +1 -12
  49. package/lib/components/switch.js +214 -247
  50. package/lib/components/tab.d.ts +1 -6
  51. package/lib/components/tab.js +62 -69
  52. package/lib/components/tabs.d.ts +6 -63
  53. package/lib/components/tabs.js +545 -777
  54. package/lib/components/tag.d.ts +3 -37
  55. package/lib/components/tag.js +236 -335
  56. package/lib/components/textarea.d.ts +7 -87
  57. package/lib/components/textarea.js +457 -627
  58. package/lib/components/tooltip.d.ts +3 -11
  59. package/lib/components/tooltip.js +307 -443
  60. package/lib/components/wizard.d.ts +6 -54
  61. package/lib/components/wizard.js +405 -618
  62. package/lib/icons/fontawesome/brands.d.ts +0 -1
  63. package/lib/icons/fontawesome/brands.js +0 -8
  64. package/lib/icons/fontawesome/regular.d.ts +0 -1
  65. package/lib/icons/fontawesome/regular.js +0 -8
  66. package/lib/icons/fontawesome/solid.d.ts +0 -1
  67. package/lib/icons/fontawesome/solid.js +0 -8
  68. package/lib/icons/heroicons/micro.d.ts +0 -1
  69. package/lib/icons/heroicons/micro.js +392 -400
  70. package/lib/icons/heroicons/mini.d.ts +0 -1
  71. package/lib/icons/heroicons/mini.js +382 -390
  72. package/lib/icons/heroicons/outline.d.ts +0 -1
  73. package/lib/icons/heroicons/outline.js +337 -345
  74. package/lib/icons/heroicons/solid.d.ts +0 -1
  75. package/lib/icons/heroicons/solid.js +407 -415
  76. package/lib/icons/lucide.d.ts +0 -1
  77. package/lib/icons/lucide.js +24479 -26351
  78. package/lib/icons/material/filled.d.ts +0 -1
  79. package/lib/icons/material/filled.js +9653 -9663
  80. package/lib/icons/material/outlined.d.ts +0 -1
  81. package/lib/icons/material/outlined.js +10271 -10281
  82. package/lib/icons/material/round.d.ts +0 -1
  83. package/lib/icons/material/round.js +10495 -10505
  84. package/lib/icons/material/sharp.d.ts +0 -1
  85. package/lib/icons/material/sharp.js +9905 -9915
  86. package/lib/icons/material/two-tone.d.ts +0 -1
  87. package/lib/icons/material/two-tone.js +12792 -12802
  88. package/lib/index.d.ts +0 -1
  89. package/lib/index.js +21 -41
  90. package/lib/styles/button.d.ts +2 -20
  91. package/lib/styles/button.js +202 -404
  92. package/lib/styles/calendar-month.d.ts +1 -5
  93. package/lib/styles/calendar-month.js +127 -244
  94. package/lib/styles/calendar-navigation.d.ts +2 -6
  95. package/lib/styles/calendar-navigation.js +64 -104
  96. package/lib/styles/calendar.d.ts +1 -2
  97. package/lib/styles/calendar.js +9 -22
  98. package/lib/styles/checkbox.d.ts +0 -1
  99. package/lib/styles/checkbox.js +45 -94
  100. package/lib/styles/copy.d.ts +0 -1
  101. package/lib/styles/copy.js +67 -106
  102. package/lib/styles/custom-scrollbar.d.ts +1 -2
  103. package/lib/styles/custom-scrollbar.js +80 -115
  104. package/lib/styles/date-picker.d.ts +1 -5
  105. package/lib/styles/date-picker.js +261 -335
  106. package/lib/styles/field-size.d.ts +6 -0
  107. package/lib/styles/field-size.js +91 -0
  108. package/lib/styles/file-upload.d.ts +1 -2
  109. package/lib/styles/file-upload.js +143 -188
  110. package/lib/styles/icon.d.ts +2 -6
  111. package/lib/styles/icon.js +92 -170
  112. package/lib/styles/input.d.ts +1 -6
  113. package/lib/styles/input.js +125 -290
  114. package/lib/styles/modal.d.ts +1 -2
  115. package/lib/styles/modal.js +71 -108
  116. package/lib/styles/option.d.ts +2 -6
  117. package/lib/styles/option.js +49 -64
  118. package/lib/styles/popup.d.ts +1 -2
  119. package/lib/styles/popup.js +42 -77
  120. package/lib/styles/radio.d.ts +0 -1
  121. package/lib/styles/radio.js +69 -110
  122. package/lib/styles/resize-observer.d.ts +1 -2
  123. package/lib/styles/resize-observer.js +2 -12
  124. package/lib/styles/scroll-container.d.ts +1 -2
  125. package/lib/styles/scroll-container.js +100 -149
  126. package/lib/styles/select-base.d.ts +0 -1
  127. package/lib/styles/select-base.js +597 -785
  128. package/lib/styles/select.d.ts +1 -2
  129. package/lib/styles/select.js +140 -236
  130. package/lib/styles/step.d.ts +1 -2
  131. package/lib/styles/step.js +22 -33
  132. package/lib/styles/switch.d.ts +0 -1
  133. package/lib/styles/switch.js +34 -73
  134. package/lib/styles/tab.d.ts +1 -2
  135. package/lib/styles/tab.js +22 -34
  136. package/lib/styles/tabs.d.ts +3 -11
  137. package/lib/styles/tabs.js +190 -222
  138. package/lib/styles/tag.d.ts +1 -5
  139. package/lib/styles/tag.js +136 -218
  140. package/lib/styles/textarea.d.ts +1 -2
  141. package/lib/styles/textarea.js +210 -319
  142. package/lib/styles/tooltip.d.ts +0 -1
  143. package/lib/styles/tooltip.js +3 -13
  144. package/lib/styles/wizard.d.ts +5 -21
  145. package/lib/styles/wizard.js +170 -306
  146. package/lib/types/common.d.ts +2 -2
  147. package/lib/types/common.js +6 -17
  148. package/lib/utils/calendar-utils.d.ts +4 -21
  149. package/lib/utils/calendar-utils.js +100 -273
  150. package/lib/utils/custom-scrollbar.d.ts +6 -20
  151. package/lib/utils/custom-scrollbar.js +273 -317
  152. package/lib/utils/flavor-sheet.d.ts +0 -1
  153. package/lib/utils/flavor-sheet.js +14 -37
  154. package/lib/utils/icon-registry.d.ts +0 -2
  155. package/lib/utils/icon-registry.js +137 -243
  156. package/lib/utils/icons.d.ts +0 -1
  157. package/lib/utils/icons.js +0 -9
  158. package/lib/utils/loader-registry.d.ts +0 -1
  159. package/lib/utils/loader-registry.js +3 -35
  160. package/lib/utils/locale.d.ts +2 -23
  161. package/lib/utils/locale.js +34 -120
  162. package/lib/utils/mobile.d.ts +0 -1
  163. package/lib/utils/mobile.js +1 -18
  164. package/lib/utils/number-format.d.ts +6 -3
  165. package/lib/utils/number-format.js +54 -110
  166. package/lib/utils/positioning.d.ts +50 -7
  167. package/lib/utils/positioning.js +224 -234
  168. package/lib/utils/property-capture.d.ts +5 -27
  169. package/lib/utils/property-capture.js +36 -144
  170. package/lib/utils/property-manager.d.ts +0 -1
  171. package/lib/utils/property-manager.js +126 -196
  172. package/lib/utils/resize-observer.d.ts +0 -1
  173. package/lib/utils/resize-observer.js +23 -59
  174. package/lib/utils/scroll-lock.d.ts +4 -11
  175. package/lib/utils/scroll-lock.js +65 -172
  176. package/lib/utils/styles.d.ts +0 -1
  177. package/lib/utils/styles.js +17 -41
  178. package/lib/version.d.ts +1 -2
  179. package/lib/version.js +1 -11
  180. package/package.json +4 -4
  181. package/lib/base/ty-component.d.ts.map +0 -1
  182. package/lib/base/ty-component.js.map +0 -1
  183. package/lib/components/button.d.ts.map +0 -1
  184. package/lib/components/button.js.map +0 -1
  185. package/lib/components/calendar-month.d.ts.map +0 -1
  186. package/lib/components/calendar-month.js.map +0 -1
  187. package/lib/components/calendar-navigation.d.ts.map +0 -1
  188. package/lib/components/calendar-navigation.js.map +0 -1
  189. package/lib/components/calendar.d.ts.map +0 -1
  190. package/lib/components/calendar.js.map +0 -1
  191. package/lib/components/checkbox.d.ts.map +0 -1
  192. package/lib/components/checkbox.js.map +0 -1
  193. package/lib/components/copy.d.ts.map +0 -1
  194. package/lib/components/copy.js.map +0 -1
  195. package/lib/components/date-picker.d.ts.map +0 -1
  196. package/lib/components/date-picker.js.map +0 -1
  197. package/lib/components/file-upload.d.ts.map +0 -1
  198. package/lib/components/file-upload.js.map +0 -1
  199. package/lib/components/icon.d.ts.map +0 -1
  200. package/lib/components/icon.js.map +0 -1
  201. package/lib/components/input.d.ts.map +0 -1
  202. package/lib/components/input.js.map +0 -1
  203. package/lib/components/modal.d.ts.map +0 -1
  204. package/lib/components/modal.js.map +0 -1
  205. package/lib/components/option.d.ts.map +0 -1
  206. package/lib/components/option.js.map +0 -1
  207. package/lib/components/popup.d.ts.map +0 -1
  208. package/lib/components/popup.js.map +0 -1
  209. package/lib/components/radio.d.ts.map +0 -1
  210. package/lib/components/radio.js.map +0 -1
  211. package/lib/components/resize-observer.d.ts.map +0 -1
  212. package/lib/components/resize-observer.js.map +0 -1
  213. package/lib/components/scroll-container.d.ts.map +0 -1
  214. package/lib/components/scroll-container.js.map +0 -1
  215. package/lib/components/select.d.ts.map +0 -1
  216. package/lib/components/select.js.map +0 -1
  217. package/lib/components/selected-tags.d.ts.map +0 -1
  218. package/lib/components/selected-tags.js.map +0 -1
  219. package/lib/components/step.d.ts.map +0 -1
  220. package/lib/components/step.js.map +0 -1
  221. package/lib/components/switch.d.ts.map +0 -1
  222. package/lib/components/switch.js.map +0 -1
  223. package/lib/components/tab.d.ts.map +0 -1
  224. package/lib/components/tab.js.map +0 -1
  225. package/lib/components/tabs.d.ts.map +0 -1
  226. package/lib/components/tabs.js.map +0 -1
  227. package/lib/components/tag.d.ts.map +0 -1
  228. package/lib/components/tag.js.map +0 -1
  229. package/lib/components/textarea.d.ts.map +0 -1
  230. package/lib/components/textarea.js.map +0 -1
  231. package/lib/components/tooltip.d.ts.map +0 -1
  232. package/lib/components/tooltip.js.map +0 -1
  233. package/lib/components/wizard.d.ts.map +0 -1
  234. package/lib/components/wizard.js.map +0 -1
  235. package/lib/icons/fontawesome/brands.d.ts.map +0 -1
  236. package/lib/icons/fontawesome/brands.js.map +0 -1
  237. package/lib/icons/fontawesome/regular.d.ts.map +0 -1
  238. package/lib/icons/fontawesome/regular.js.map +0 -1
  239. package/lib/icons/fontawesome/solid.d.ts.map +0 -1
  240. package/lib/icons/fontawesome/solid.js.map +0 -1
  241. package/lib/icons/heroicons/micro.d.ts.map +0 -1
  242. package/lib/icons/heroicons/micro.js.map +0 -1
  243. package/lib/icons/heroicons/mini.d.ts.map +0 -1
  244. package/lib/icons/heroicons/mini.js.map +0 -1
  245. package/lib/icons/heroicons/outline.d.ts.map +0 -1
  246. package/lib/icons/heroicons/outline.js.map +0 -1
  247. package/lib/icons/heroicons/solid.d.ts.map +0 -1
  248. package/lib/icons/heroicons/solid.js.map +0 -1
  249. package/lib/icons/lucide.d.ts.map +0 -1
  250. package/lib/icons/lucide.js.map +0 -1
  251. package/lib/icons/material/filled.d.ts.map +0 -1
  252. package/lib/icons/material/filled.js.map +0 -1
  253. package/lib/icons/material/outlined.d.ts.map +0 -1
  254. package/lib/icons/material/outlined.js.map +0 -1
  255. package/lib/icons/material/round.d.ts.map +0 -1
  256. package/lib/icons/material/round.js.map +0 -1
  257. package/lib/icons/material/sharp.d.ts.map +0 -1
  258. package/lib/icons/material/sharp.js.map +0 -1
  259. package/lib/icons/material/two-tone.d.ts.map +0 -1
  260. package/lib/icons/material/two-tone.js.map +0 -1
  261. package/lib/index.d.ts.map +0 -1
  262. package/lib/index.js.map +0 -1
  263. package/lib/styles/button.d.ts.map +0 -1
  264. package/lib/styles/button.js.map +0 -1
  265. package/lib/styles/calendar-month.d.ts.map +0 -1
  266. package/lib/styles/calendar-month.js.map +0 -1
  267. package/lib/styles/calendar-navigation.d.ts.map +0 -1
  268. package/lib/styles/calendar-navigation.js.map +0 -1
  269. package/lib/styles/calendar.d.ts.map +0 -1
  270. package/lib/styles/calendar.js.map +0 -1
  271. package/lib/styles/checkbox.d.ts.map +0 -1
  272. package/lib/styles/checkbox.js.map +0 -1
  273. package/lib/styles/copy.d.ts.map +0 -1
  274. package/lib/styles/copy.js.map +0 -1
  275. package/lib/styles/custom-scrollbar.d.ts.map +0 -1
  276. package/lib/styles/custom-scrollbar.js.map +0 -1
  277. package/lib/styles/date-picker.d.ts.map +0 -1
  278. package/lib/styles/date-picker.js.map +0 -1
  279. package/lib/styles/file-upload.d.ts.map +0 -1
  280. package/lib/styles/file-upload.js.map +0 -1
  281. package/lib/styles/icon.d.ts.map +0 -1
  282. package/lib/styles/icon.js.map +0 -1
  283. package/lib/styles/input.d.ts.map +0 -1
  284. package/lib/styles/input.js.map +0 -1
  285. package/lib/styles/modal.d.ts.map +0 -1
  286. package/lib/styles/modal.js.map +0 -1
  287. package/lib/styles/multiselect.d.ts +0 -8
  288. package/lib/styles/multiselect.d.ts.map +0 -1
  289. package/lib/styles/multiselect.js +0 -849
  290. package/lib/styles/multiselect.js.map +0 -1
  291. package/lib/styles/option.d.ts.map +0 -1
  292. package/lib/styles/option.js.map +0 -1
  293. package/lib/styles/popup.d.ts.map +0 -1
  294. package/lib/styles/popup.js.map +0 -1
  295. package/lib/styles/radio.d.ts.map +0 -1
  296. package/lib/styles/radio.js.map +0 -1
  297. package/lib/styles/resize-observer.d.ts.map +0 -1
  298. package/lib/styles/resize-observer.js.map +0 -1
  299. package/lib/styles/scroll-container.d.ts.map +0 -1
  300. package/lib/styles/scroll-container.js.map +0 -1
  301. package/lib/styles/select-base.d.ts.map +0 -1
  302. package/lib/styles/select-base.js.map +0 -1
  303. package/lib/styles/select.d.ts.map +0 -1
  304. package/lib/styles/select.js.map +0 -1
  305. package/lib/styles/step.d.ts.map +0 -1
  306. package/lib/styles/step.js.map +0 -1
  307. package/lib/styles/switch.d.ts.map +0 -1
  308. package/lib/styles/switch.js.map +0 -1
  309. package/lib/styles/tab.d.ts.map +0 -1
  310. package/lib/styles/tab.js.map +0 -1
  311. package/lib/styles/tabs.d.ts.map +0 -1
  312. package/lib/styles/tabs.js.map +0 -1
  313. package/lib/styles/tag.d.ts.map +0 -1
  314. package/lib/styles/tag.js.map +0 -1
  315. package/lib/styles/textarea.d.ts.map +0 -1
  316. package/lib/styles/textarea.js.map +0 -1
  317. package/lib/styles/tooltip.d.ts.map +0 -1
  318. package/lib/styles/tooltip.js.map +0 -1
  319. package/lib/styles/wizard.d.ts.map +0 -1
  320. package/lib/styles/wizard.js.map +0 -1
  321. package/lib/types/common.d.ts.map +0 -1
  322. package/lib/types/common.js.map +0 -1
  323. package/lib/utils/calendar-utils.d.ts.map +0 -1
  324. package/lib/utils/calendar-utils.js.map +0 -1
  325. package/lib/utils/custom-scrollbar.d.ts.map +0 -1
  326. package/lib/utils/custom-scrollbar.js.map +0 -1
  327. package/lib/utils/flavor-sheet.d.ts.map +0 -1
  328. package/lib/utils/flavor-sheet.js.map +0 -1
  329. package/lib/utils/icon-registry.d.ts.map +0 -1
  330. package/lib/utils/icon-registry.js.map +0 -1
  331. package/lib/utils/icons.d.ts.map +0 -1
  332. package/lib/utils/icons.js.map +0 -1
  333. package/lib/utils/loader-registry.d.ts.map +0 -1
  334. package/lib/utils/loader-registry.js.map +0 -1
  335. package/lib/utils/locale.d.ts.map +0 -1
  336. package/lib/utils/locale.js.map +0 -1
  337. package/lib/utils/mobile.d.ts.map +0 -1
  338. package/lib/utils/mobile.js.map +0 -1
  339. package/lib/utils/number-format.d.ts.map +0 -1
  340. package/lib/utils/number-format.js.map +0 -1
  341. package/lib/utils/parse-boolean.d.ts +0 -39
  342. package/lib/utils/parse-boolean.d.ts.map +0 -1
  343. package/lib/utils/parse-boolean.js +0 -58
  344. package/lib/utils/parse-boolean.js.map +0 -1
  345. package/lib/utils/positioning.d.ts.map +0 -1
  346. package/lib/utils/positioning.js.map +0 -1
  347. package/lib/utils/property-capture.d.ts.map +0 -1
  348. package/lib/utils/property-capture.js.map +0 -1
  349. package/lib/utils/property-manager.d.ts.map +0 -1
  350. package/lib/utils/property-manager.js.map +0 -1
  351. package/lib/utils/resize-observer.d.ts.map +0 -1
  352. package/lib/utils/resize-observer.js.map +0 -1
  353. package/lib/utils/scroll-lock.d.ts.map +0 -1
  354. package/lib/utils/scroll-lock.js.map +0 -1
  355. package/lib/utils/styles.d.ts.map +0 -1
  356. package/lib/utils/styles.js.map +0 -1
  357. package/lib/version.d.ts.map +0 -1
  358. package/lib/version.js.map +0 -1
@@ -1,849 +0,0 @@
1
- /**
2
- * Multiselect Component Styles
3
- * PORTED FROM: clj/ty/components/multiselect.css
4
- */
5
- import { FLAVORS } from "../types/common.js";
6
- import { customScrollbarStyles } from "./custom-scrollbar.js";
7
- /* Flavor rules only set --select-accent (border) and --select-accent-bold
8
- (hover border); the .multiselect-stub rules below consume them. Doubles
9
- as the per-instance override API: `ty-select { --select-accent: … }`.
10
- Neutral is skipped — it IS the default unstyled chrome (--ty-input-*
11
- tokens), same convention as ty-input/ty-date-picker. Fallback flavor `fb`
12
- is used for custom flavors so missing tokens degrade to neutral. */
13
- const selectFlavor = (f, fb) => {
14
- const c = (s) => fb
15
- ? s
16
- ? `var(--ty-color-${f}${s}, var(--ty-color-${f}, var(--ty-color-${fb}${s})))`
17
- : `var(--ty-color-${f}, var(--ty-color-${fb}))`
18
- : `var(--ty-color-${f}${s})`;
19
- return `
20
- :host([flavor="${f}"]) { --select-accent: var(--ty-input-${f}-border, ${c("")}); --select-accent-bold: ${c("-bold")}; }
21
- :host([flavor="${f}+"]) { --select-accent: ${c("-strong")}; --select-accent-bold: ${c("-strong")}; }
22
- :host([flavor="${f}-"]) { --select-accent: ${c("-soft")}; --select-accent-bold: ${c("")}; }
23
- `;
24
- };
25
- /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
26
- export const selectCustomFlavorCss = (base) => selectFlavor(base, "neutral");
27
- export const multiselectStyles = `
28
- /* Multiselect-specific styles extending dropdown base styles */
29
-
30
- :host {
31
- --mobile-border-color: var(--ty-border, #5858587d);
32
- }
33
-
34
- /* ===== DIALOG POSITIONING SUPPORT ===== */
35
-
36
- .dropdown-dialog {
37
- position: fixed;
38
- width: var(--dropdown-width, 200px);
39
- max-width: 100vw;
40
- margin: 0;
41
- padding: 0;
42
- border: none;
43
- background: transparent;
44
- box-sizing: border-box;
45
- padding: var(--dropdown-padding, 20px);
46
- /* Modal handles z-index automatically */
47
-
48
- /* Hidden by default */
49
- opacity: 0;
50
- transition: opacity 400ms ease;
51
-
52
- transform: translate(var(--dropdown-offset-x, 0px), var(--dropdown-offset-y, 0px));
53
- top: -1000px;
54
- left: -1000px;
55
- }
56
-
57
- /* When opened via showModal(), apply flex layout and direction */
58
- .dropdown-dialog[open] {
59
- display: flex;
60
- flex-direction: column;
61
- }
62
-
63
- /* Direction-based positioning with CSS classes */
64
- .dropdown-dialog.position-below {
65
- left: var(--dropdown-x);
66
- top: var(--dropdown-y);
67
- }
68
-
69
- .dropdown-dialog.position-above {
70
- left: var(--dropdown-x);
71
- bottom: var(--dropdown-y);
72
- top: auto;
73
- flex-direction: column-reverse;
74
- }
75
-
76
- .dropdown-dialog.position-above .dropdown-header {
77
- margin-top: 4px;
78
- }
79
-
80
- .dropdown-dialog.position-below .dropdown-header {
81
- margin-bottom: 4px;
82
- }
83
-
84
- .dropdown-dialog.position-below .dropdown-options {
85
- /* Optional: Add upward-pointing shadow for below positioning */
86
- 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);
87
- }
88
-
89
- /* Animate when .open class is added */
90
- .dropdown-dialog.open {
91
- opacity: 1;
92
- }
93
-
94
- .dropdown-dialog.open .dropdown-options {
95
- opacity: 1;
96
- transform: translateY(0) scale(1);
97
- }
98
-
99
- .dropdown-dialog::backdrop {
100
- background: transparent;
101
- }
102
-
103
- /* ===== DIALOG HEADER ===== */
104
-
105
- .dropdown-header {
106
- display: flex;
107
- align-items: center;
108
- gap: var(--ty-spacing-2);
109
- position: relative;
110
- }
111
-
112
- .dropdown-search-input {
113
- width: 100%;
114
- min-width: 0;
115
- box-sizing: border-box;
116
- background: var(--input-bg, var(--ty-input-bg));
117
- color: var(--input-color, var(--ty-input-color));
118
- border: 1px solid var(--input-border, var(--ty-input-border));
119
- border-radius: var(--ty-radius-md);
120
- font-family: var(--ty-font-sans);
121
- font-size: var(--ty-font-sm);
122
- line-height: var(--ty-leading-sm);
123
- letter-spacing: var(--ty-tracking-sm);
124
- font-weight: var(--ty-font-normal);
125
- min-height: var(--ty-size-md);
126
- padding: var(--ty-spacing-2) var(--ty-spacing-3);
127
- padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));
128
- transition: var(--ty-transition-all);
129
- outline: none;
130
- }
131
-
132
- .dropdown-search-input:focus {
133
- border-color: var(--input-border-focus, var(--ty-input-border-focus));
134
- box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));
135
- }
136
-
137
- .dropdown-search-input:disabled {
138
- background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));
139
- color: var(--input-disabled-color, var(--ty-input-disabled-color));
140
- cursor: not-allowed;
141
- opacity: 0.6;
142
- }
143
-
144
- .dropdown-search-input::placeholder {
145
- color: var(--input-placeholder, var(--ty-input-placeholder));
146
- }
147
-
148
- .dropdown-search-chevron {
149
- position: absolute;
150
- top: 50%;
151
- right: var(--ty-spacing-3);
152
- transform: translateY(-50%);
153
- width: 1rem;
154
- height: 1rem;
155
- color: var(--input-placeholder, var(--ty-input-placeholder));
156
- transition: var(--ty-transition-transform);
157
- pointer-events: none;
158
- }
159
-
160
- .dropdown-search-chevron.open {
161
- transform: translateY(-50%) rotate(180deg);
162
- }
163
-
164
- .dropdown-search-chevron svg {
165
- width: 100%;
166
- height: 100%;
167
- }
168
-
169
- /* ===== MULTISELECT-SPECIFIC STYLES ===== */
170
-
171
- /* Multiselect stub modifications */
172
- .multiselect-stub {
173
- min-height: 2.5rem;
174
- display: flex;
175
- flex-wrap: wrap;
176
- gap: 0.25rem;
177
- align-items: center;
178
- padding: 0.5rem 2.5rem 0.5rem 0.75rem;
179
- /* Transitions - includes opacity for open state */
180
- transition: var(--ty-transition-all), opacity 0.2s ease;
181
- outline: none;
182
- background: var(--input-bg, var(--ty-input-bg));
183
- color: var(--input-color, var(--ty-input-color));
184
- border: 1px solid var(--select-accent, var(--input-border, var(--ty-input-border)));
185
- border-radius: var(--ty-radius-md);
186
- font-family: var(--ty-font-sans);
187
- font-size: var(--ty-font-sm);
188
- line-height: var(--ty-leading-sm);
189
- letter-spacing: var(--ty-tracking-sm);
190
- cursor: pointer;
191
- position: relative;
192
- width: 100%;
193
- box-sizing: border-box;
194
- }
195
-
196
- .multiselect-stub:hover {
197
- border-color: var(--select-accent-bold, var(--input-border-hover, var(--ty-input-border-hover)));
198
- }
199
-
200
- .multiselect-stub[disabled] {
201
- background-color: var(--input-disabled-bg, var(--ty-input-disabled-bg));
202
- color: var(--input-disabled-color, var(--ty-input-disabled-color));
203
- cursor: not-allowed;
204
- opacity: 0.6;
205
- }
206
-
207
- /* Hide stub when dropdown is open */
208
- .dropdown-wrapper:has(.dropdown-chevron.open) .multiselect-stub {
209
- opacity: 0;
210
- pointer-events: none;
211
- }
212
-
213
- /* Hide stub chips when mobile dialog is open (let modal show them) */
214
- .dropdown-mode-mobile .dropdown-wrapper:has(.mobile-dialog[open]) .multiselect-chips {
215
- display: none;
216
- }
217
-
218
- /* When tags are present, reduce padding to make room */
219
- .multiselect-stub.has-tags {
220
- padding: 0.25rem 2.5rem 0.25rem 0.5rem;
221
- width: 100%;
222
- }
223
-
224
- .multiselect-stub.has-tags slot[name="selected"] {
225
- display: flex;
226
- flex-wrap: wrap;
227
- gap: 0.25rem;
228
- }
229
-
230
- /* ===== CHEVRON INDICATOR ===== */
231
-
232
- .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-chevron.open {
245
- transform: translateY(-50%) rotate(180deg);
246
- }
247
-
248
- .dropdown-chevron svg {
249
- width: 100%;
250
- height: 100%;
251
- }
252
-
253
-
254
- /* Tags container */
255
- .multiselect-chips {
256
- display: flex;
257
- flex-wrap: wrap;
258
- gap: 0.5rem;
259
- align-items: center;
260
- min-width: 0;
261
- }
262
-
263
- .dropdown-placeholder {
264
- flex-grow: 1;
265
- color: var(--input-placeholder, var(--ty-input-placeholder, #9ca3af));
266
- font-size: var(--ty-font-sm);
267
- line-height: var(--ty-leading-sm);
268
- letter-spacing: var(--ty-tracking-sm);
269
- font-weight: var(--ty-font-light);
270
- font-style: italic;
271
- }
272
-
273
- /* Placeholder styling when tags are present */
274
- .dropdown-placeholder.hidden {
275
- display: none;
276
- }
277
-
278
- /* Options area styling - Override for multiselect */
279
- .dropdown-options {
280
- opacity: 0;
281
- background: var(--input-bg, var(--ty-input-bg));
282
- border: 1px solid var(--input-border, var(--ty-input-border));
283
- border-radius: var(--ty-radius-lg);
284
- max-height: 16rem;
285
- width: 100%;
286
- max-width: 100%;
287
- overflow-x: hidden;
288
- overflow-y: auto;
289
- scroll-behavior: smooth;
290
- box-sizing: border-box;
291
- position: relative;
292
- box-shadow:
293
- 0 20px 25px -5px rgba(0, 0, 0, 0.1),
294
- 0 10px 10px -5px rgba(0, 0, 0, 0.04);
295
-
296
- /* Animation properties */
297
- transform: translateY(-8px) scale(0.95);
298
- transition:
299
- opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),
300
- transform 200ms cubic-bezier(0.16, 1, 0.3, 1);
301
-
302
- /* Multiselect-specific: flex wrap for tags */
303
- display: flex;
304
- flex-wrap: wrap;
305
- padding: 0.5rem;
306
- gap: 0.5rem;
307
-
308
- }
309
-
310
- /* Hide native scrollbar only when custom scrollbar is active */
311
- .dropdown-options.ty-custom-scroll {
312
- scrollbar-width: none;
313
- -ms-overflow-style: none;
314
- }
315
-
316
- .dropdown-options.ty-custom-scroll::-webkit-scrollbar {
317
- display: none;
318
- }
319
-
320
- /* Options wrapper - positioned container for scrollbar track */
321
- .dropdown-options-wrapper {
322
- position: relative;
323
- }
324
-
325
- /* Show custom scrollbar on hover */
326
- .dropdown-options-wrapper:hover .ty-scrollbar-track-y.has-overflow {
327
- opacity: 1;
328
- }
329
-
330
- /* Make ty-tags in dropdown clickable with pointer cursor */
331
- .dropdown-options ty-tag {
332
- user-select: none;
333
- transition: transform 0.1s ease;
334
- }
335
-
336
- .dropdown-options ty-tag:hover {
337
- transform: scale(1.02);
338
- }
339
-
340
- .dropdown-options ty-tag:active {
341
- transform: scale(0.98);
342
- }
343
-
344
- /* Visual feedback for selected tags in options */
345
- .dropdown-options ty-tag[selected] {
346
- opacity: 0.5;
347
- }
348
-
349
- /* Ensure ty-tag components in multiselect have proper sizing */
350
- .multiselect-chips ty-tag {
351
- max-width: 150px;
352
- }
353
-
354
- /* Responsive adjustments */
355
- @media (max-width: 640px) {
356
- .multiselect-chips ty-tag {
357
- max-width: 100px;
358
- }
359
- }
360
-
361
-
362
- /* Ensure proper spacing in container layouts */
363
- .multiselect-container {
364
- display: flex;
365
- flex-direction: column;
366
- gap: 0.25rem;
367
- }
368
-
369
- /* ===== DROPDOWN WRAPPER & LABEL ===== */
370
-
371
- .dropdown-wrapper {
372
- position: relative;
373
- display: block;
374
- width: 100%;
375
- }
376
-
377
- .ty-field-label {
378
- font-size: var(--ty-font-sm);
379
- line-height: var(--ty-leading-sm);
380
- letter-spacing: var(--ty-tracking-sm);
381
- font-weight: var(--ty-font-medium);
382
- color: var(--ty-label-color);
383
- margin-bottom: 6px;
384
- padding-left: 12px;
385
- display: flex;
386
- align-items: center;
387
- }
388
-
389
- /* Required indicator - using SVG icon */
390
- .required-icon {
391
- display: inline-flex;
392
- align-items: center;
393
- color: #ef4444;
394
- width: 12px;
395
- height: 12px;
396
- vertical-align: middle;
397
- margin-left: 4px;
398
- }
399
-
400
- .required-icon svg {
401
- width: 100%;
402
- height: 100%;
403
- }
404
-
405
- :host([disabled]) .multiselect-container {
406
- pointer-events: none;
407
- }
408
-
409
- /* ============================================================================
410
- MOBILE MODAL STYLES
411
- ============================================================================ */
412
-
413
- .dropdown-mode-mobile .mobile-dialog {
414
- position: fixed;
415
- top: 0;
416
- left: 0;
417
- right: 0;
418
- bottom: 0;
419
- width: 100vw;
420
- height: 100vh;
421
- max-width: 100vw;
422
- max-height: 100vh;
423
- margin: 0;
424
- padding: 0;
425
- padding-top: 10vh; /* Position content from top */
426
- border: none;
427
- background: transparent; /* Backdrop handles background */
428
- /* Note: Don't set display - browser controls <dialog> visibility */
429
- align-items: flex-start;
430
- justify-content: center;
431
- opacity: 0;
432
- transition: opacity 300ms ease;
433
- }
434
-
435
- /* When opened via showModal(), add flex layout */
436
- .dropdown-mode-mobile .mobile-dialog[open] {
437
- display: flex;
438
- }
439
-
440
- .dropdown-mode-mobile .mobile-dialog.open {
441
- opacity: 1;
442
- }
443
-
444
- /* Native dialog backdrop with blur */
445
- .dropdown-mode-mobile .mobile-dialog::backdrop {
446
- background: rgba(0, 0, 0, 0.5);
447
- backdrop-filter: blur(8px);
448
- -webkit-backdrop-filter: blur(8px);
449
- }
450
-
451
- .dropdown-mode-mobile .mobile-dialog-content {
452
- position: relative;
453
- display: flex;
454
- flex-direction: column;
455
- width: calc(100% - 32px); /* Side margins */
456
- max-width: 400px; /* Constrained width like dropdown */
457
- min-height: 200px;
458
- max-height: calc(90vh - 10vh);
459
- opacity: 0;
460
- transform: scale(0.95);
461
- transition:
462
- opacity 300ms cubic-bezier(0.16, 1, 0.3, 1),
463
- transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
464
- }
465
-
466
- .dropdown-mode-mobile .mobile-dialog.open .mobile-dialog-content {
467
- opacity: 1;
468
- transform: scale(1);
469
- }
470
-
471
- .dropdown-mode-mobile .mobile-search-input:focus {
472
- border-color: var(--ty-border);
473
- }
474
-
475
- /* Mobile search header - label floats above, search + close below */
476
- .dropdown-mode-mobile .mobile-search-header {
477
- flex-shrink: 0;
478
- display: flex;
479
- flex-direction: column;
480
- margin-bottom: 16px;
481
- padding: 0;
482
- background: transparent;
483
- position: relative;
484
- }
485
-
486
- .dropdown-mode-mobile .mobile-header-content {
487
- display: flex;
488
- align-items: center;
489
- gap: 12px;
490
- width: 100%;
491
- }
492
-
493
- /* Header for non-searchable (label + close button) */
494
- .dropdown-mode-mobile .mobile-header-nosearch {
495
- flex-shrink: 0;
496
- display: flex;
497
- align-items: center;
498
- justify-content: flex-end;
499
- margin-bottom: 16px;
500
- padding: 0;
501
- background: transparent;
502
- position: relative;
503
- min-height: 40px;
504
- }
505
-
506
- .dropdown-mode-mobile .mobile-header-label {
507
- position: absolute;
508
- bottom: 100%;
509
- left: 6px;
510
- margin-bottom: 4px;
511
- font-size: var(--ty-font-lg);
512
- line-height: var(--ty-leading-lg);
513
- letter-spacing: var(--ty-tracking-lg);
514
- font-weight: 700;
515
- color: var(--ty-color-neutral);
516
- pointer-events: none;
517
- }
518
-
519
- /* Close button - circular with border (matches dropdown.ts) */
520
- .dropdown-mode-mobile .mobile-close-button {
521
- flex-shrink: 0;
522
- width: 36px;
523
- height: 36px;
524
- display: flex;
525
- align-items: center;
526
- justify-content: center;
527
- background: var(--ty-surface-floating);
528
- border: 2px solid var(--mobile-border-color);
529
- border-radius: 50%;
530
- color: var(--ty-text-strong);
531
- cursor: pointer;
532
- transition: var(--ty-transition-all);
533
- padding: 0;
534
- }
535
-
536
- .dropdown-mode-mobile .mobile-close-button:hover {
537
- background: var(--ty-bg-neutral);
538
- border-color: var(--ty-border);
539
- color: var(--ty-text-strong);
540
- }
541
-
542
- .dropdown-mode-mobile .mobile-close-button:active {
543
- transform: scale(0.9);
544
- }
545
-
546
- .dropdown-mode-mobile .mobile-close-button svg {
547
- width: 24px;
548
- height: 24px;
549
- }
550
-
551
- /* Mobile search input (matches dropdown.ts) */
552
- .dropdown-mode-mobile .mobile-search-input {
553
- flex: 1;
554
- min-width: 0;
555
- box-sizing: border-box;
556
- background: var(--ty-surface-floating);
557
- color: var(--ty-text);
558
- border: 2px solid;
559
- border-color: var(--mobile-border-color);
560
- border-radius: var(--ty-radius-md);
561
- font-family: var(--ty-font-sans);
562
- font-size: var(--ty-font-sm);
563
- line-height: var(--ty-leading-sm);
564
- letter-spacing: var(--ty-tracking-sm);
565
- font-weight: var(--ty-font-normal);
566
- padding: var(--ty-spacing-2) var(--ty-spacing-3);
567
- height: 40px;
568
- transition: var(--ty-transition-all);
569
- outline: none;
570
- }
571
-
572
- .dropdown-mode-mobile .mobile-search-input::placeholder {
573
- color: var(--ty-text-faint);
574
- }
575
-
576
- .dropdown-mode-mobile .mobile-search-input:focus {
577
- border-color: var(--ty-border);
578
- }
579
-
580
- /* ============================================================================
581
- MOBILE BODY & SECTIONS - UPDATED STRUCTURE
582
- ============================================================================ */
583
-
584
- /* Mobile body - contains both sections */
585
- .dropdown-mode-mobile .mobile-body {
586
- position: relative;
587
- display: flex;
588
- flex-direction: column;
589
- height: var(--body-height, 350px);
590
- max-height: 350px;
591
- overflow: hidden;
592
- background: var(--ty-surface-floating);
593
- border-radius: var(--ty-radius-lg);
594
- box-shadow:
595
- 0 20px 25px -5px rgba(0, 0, 0, 0.1),
596
- 0 10px 10px -5px rgba(0, 0, 0, 0.04);
597
- border: 2px solid;
598
- border-color: var(--mobile-border-color);
599
- }
600
-
601
- /* ===== SECTION HEADERS - Labels, not buttons ===== */
602
-
603
- .dropdown-mode-mobile .section-header {
604
- display: flex;
605
- align-items: center;
606
- justify-content: space-between;
607
- height: 36px;
608
- flex-shrink: 0;
609
- padding: 0 16px;
610
- font-size: 11px;
611
- font-weight: 600;
612
- text-transform: uppercase;
613
- letter-spacing: 0.06em;
614
- color: var(--ty-text-bold);
615
- background: transparent;
616
- cursor: default;
617
- user-select: none;
618
- }
619
-
620
- .dropdown-mode-mobile .section-header .section-title {
621
- flex: 1;
622
- }
623
-
624
- .dropdown-mode-mobile .section-header .section-count {
625
- font-weight: 500;
626
- color: var(--ty-text-faint);
627
- margin-left: 0.25rem;
628
- }
629
-
630
- /* ===== SELECTED STRIP - pinned, capped height, collapses when empty ===== */
631
-
632
- .dropdown-mode-mobile .mobile-selected-section {
633
- display: flex;
634
- flex-direction: column;
635
- background: var(--ty-input-bg);
636
- overflow: hidden;
637
- flex: 0 0 auto;
638
- max-height: 40%;
639
- transition: max-height 200ms cubic-bezier(0.4, 0, 0.2, 1);
640
- }
641
-
642
- /* Empty: collapse to header only */
643
- .dropdown-mode-mobile .mobile-selected-section[data-empty="true"] {
644
- max-height: 36px;
645
- flex: 0 0 36px;
646
- }
647
-
648
- .dropdown-mode-mobile .mobile-selected-section .section-content {
649
- flex: 1;
650
- min-height: 0;
651
- overflow-y: auto;
652
- overscroll-behavior: contain;
653
- padding: 0.75rem 1rem;
654
- display: flex;
655
- flex-wrap: wrap;
656
- gap: 0.5rem;
657
- align-content: flex-start;
658
- /* Soft fade at bottom edge — hints at scrollable overflow */
659
- -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 12px), transparent);
660
- mask-image: linear-gradient(to bottom, black calc(100% - 12px), transparent);
661
- }
662
-
663
- /* ===== AVAILABLE LIST - takes remaining space ===== */
664
-
665
- .dropdown-mode-mobile .mobile-available-section {
666
- display: flex;
667
- flex-direction: column;
668
- background: var(--ty-input-bg);
669
- overflow: hidden;
670
- flex: 1 1 auto;
671
- min-height: 0;
672
- }
673
-
674
- .dropdown-mode-mobile .mobile-available-section .section-content {
675
- flex: 1;
676
- min-height: 0;
677
- overflow-y: auto;
678
- overscroll-behavior: contain;
679
- padding: 0.75rem 1rem;
680
- display: flex;
681
- flex-wrap: wrap;
682
- gap: 0.5rem;
683
- align-content: flex-start;
684
- }
685
-
686
- /* ===== EMPTY STATES =====
687
- Selected strip collapses (no text needed).
688
- Available shows the empty message only when there are zero tags total. */
689
-
690
- .dropdown-mode-mobile .empty-state {
691
- display: none;
692
- width: 100%;
693
- padding: 2rem 1rem;
694
- text-align: center;
695
- color: var(--ty-text-faint);
696
- font-size: var(--ty-font-sm);
697
- line-height: var(--ty-leading-sm);
698
- letter-spacing: var(--ty-tracking-sm);
699
- font-style: italic;
700
- }
701
-
702
- .dropdown-mode-mobile .mobile-available-section[data-empty="true"] .empty-state {
703
- display: block;
704
- }
705
-
706
- .dropdown-mode-mobile .mobile-selected-section[data-empty="true"] .section-content,
707
- .dropdown-mode-mobile .mobile-available-section[data-empty="true"] slot {
708
- display: none;
709
- }
710
-
711
- /* ===== TAG STYLING IN MOBILE ===== */
712
-
713
- .dropdown-mode-mobile .section-content ::slotted(ty-tag) {
714
- cursor: pointer;
715
- user-select: none;
716
- transition: transform 0.1s ease;
717
- margin: 2px 0; /* Vertical spacing like dropdown options */
718
- /* Fade + scale entry — replays on each (re)insertion when a tag moves
719
- between selected and available slots */
720
- animation: ty-multiselect-tag-enter 180ms cubic-bezier(0.16, 1, 0.3, 1);
721
- }
722
-
723
- @media (hover: hover) {
724
- .dropdown-mode-mobile .section-content ::slotted(ty-tag:hover) {
725
- transform: scale(1.02);
726
- }
727
- }
728
-
729
- .dropdown-mode-mobile .section-content ::slotted(ty-tag:active) {
730
- transform: scale(0.96);
731
- }
732
-
733
- /* Dimmed appearance for hidden filtered tags */
734
- .dropdown-mode-mobile .section-content ::slotted(ty-tag[hidden]) {
735
- display: none !important;
736
- }
737
-
738
- @keyframes ty-multiselect-tag-enter {
739
- from { opacity: 0; transform: scale(0.85); }
740
- to { opacity: 1; transform: scale(1); }
741
- }
742
-
743
- @media (prefers-reduced-motion: reduce) {
744
- .dropdown-mode-mobile .section-content ::slotted(ty-tag) {
745
- animation: none;
746
- }
747
- }
748
-
749
- /* ==================== LOADING STATE ====================
750
- Spinner overlay shown inside the options area while the parent
751
- (external-search mode) is fetching. Search input stays usable.
752
-
753
- Carries its own surface so it stays visible even when the host
754
- has restyled the popup with a transparent or unusual background.
755
- Override with --ty-loader-bg / --ty-loader-radius / --ty-loader-border.
756
- */
757
- .dropdown-loading {
758
- display: none;
759
- align-items: center;
760
- justify-content: center;
761
- gap: var(--ty-spacing-2);
762
- padding: var(--ty-spacing-4) var(--ty-spacing-3);
763
- color: var(--ty-text-soft);
764
- font-size: var(--ty-font-sm);
765
- min-height: 4rem;
766
- /* Match the .dropdown-options popup look — same background, border, radius, shadow */
767
- background: var(--ty-loader-bg, var(--input-bg, var(--ty-input-bg)));
768
- border: 1px solid var(--ty-loader-border, var(--input-border, var(--ty-input-border)));
769
- border-radius: var(--ty-loader-radius, var(--ty-radius-lg));
770
- 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));
771
- box-sizing: border-box;
772
- }
773
-
774
- .dropdown-options-wrapper.loading .dropdown-loading {
775
- display: flex;
776
- }
777
-
778
- /* Slot is transparent for layout — fallback (spinner + text) and user-provided
779
- slotted content both act as direct flex children of .dropdown-loading. */
780
- .dropdown-loading > slot[name="loading"] {
781
- display: contents;
782
- }
783
-
784
- /* Mobile: full-screen dialog is the surface — drop the card chrome,
785
- stack vertically, scale up so it feels native to a fullscreen view.
786
- Slotted content adapts automatically since the slot is display:contents. */
787
- .dropdown-mode-mobile .dropdown-loading {
788
- background: transparent;
789
- border: none;
790
- box-shadow: none;
791
- flex: 1;
792
- flex-direction: column;
793
- gap: var(--ty-spacing-3);
794
- padding: var(--ty-spacing-8) var(--ty-spacing-4);
795
- min-height: 12rem;
796
- }
797
-
798
- .dropdown-mode-mobile .dropdown-loading-spinner {
799
- width: 2rem;
800
- height: 2rem;
801
- }
802
-
803
- .dropdown-mode-mobile .dropdown-loading-text {
804
- font-size: var(--ty-font-base);
805
- }
806
-
807
- .dropdown-options-wrapper.loading .dropdown-options,
808
- .dropdown-options-wrapper.loading > slot#options-slot,
809
- .dropdown-options-wrapper.loading .empty-state {
810
- display: none;
811
- }
812
-
813
- .dropdown-loading-spinner {
814
- display: inline-flex;
815
- align-items: center;
816
- justify-content: center;
817
- width: 1.125rem;
818
- height: 1.125rem;
819
- flex-shrink: 0;
820
- animation: ty-multiselect-spin 0.7s linear infinite;
821
- color: var(--ty-color-primary);
822
- }
823
-
824
- .dropdown-loading-spinner svg {
825
- width: 100%;
826
- height: 100%;
827
- }
828
-
829
- .dropdown-loading-text {
830
- color: var(--ty-text-soft);
831
- }
832
-
833
- @keyframes ty-multiselect-spin {
834
- to { transform: rotate(360deg); }
835
- }
836
-
837
- @media (prefers-reduced-motion: reduce) {
838
- .dropdown-loading-spinner {
839
- animation-duration: 1.6s;
840
- }
841
- }
842
-
843
- /* Custom scrollbar styles */
844
- ${customScrollbarStyles}
845
-
846
- /* ===== FLAVOR VARIANTS (set --select-accent*, consumed above) ===== */
847
- ${FLAVORS.filter((f) => f !== "neutral").map((f) => selectFlavor(f)).join("")}
848
- `;
849
- //# sourceMappingURL=multiselect.js.map