tyrell-components 1.0.0-RC13 → 1.0.0-RC14

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 (355) hide show
  1. package/README.md +1 -1
  2. package/css/tyrell-theme.css +167 -178
  3. package/css/tyrell.css +19 -0
  4. package/dist/tyrell-theme.css +167 -178
  5. package/dist/tyrell.css +19 -0
  6. package/dist/tyrell.js +1 -1
  7. package/lib/base/ty-component.d.ts +20 -10
  8. package/lib/base/ty-component.js +21 -144
  9. package/lib/components/button.d.ts +2 -16
  10. package/lib/components/button.js +0 -36
  11. package/lib/components/calendar-month.d.ts +2 -48
  12. package/lib/components/calendar-month.js +4 -166
  13. package/lib/components/calendar-navigation.d.ts +3 -48
  14. package/lib/components/calendar-navigation.js +3 -126
  15. package/lib/components/calendar.d.ts +3 -80
  16. package/lib/components/calendar.js +8 -230
  17. package/lib/components/checkbox.d.ts +4 -71
  18. package/lib/components/checkbox.js +7 -151
  19. package/lib/components/copy.d.ts +3 -56
  20. package/lib/components/copy.js +1 -120
  21. package/lib/components/date-picker.d.ts +13 -162
  22. package/lib/components/date-picker.js +41 -592
  23. package/lib/components/file-upload.d.ts +9 -15
  24. package/lib/components/file-upload.js +19 -41
  25. package/lib/components/icon.d.ts +3 -24
  26. package/lib/components/icon.js +1 -90
  27. package/lib/components/input.d.ts +7 -107
  28. package/lib/components/input.js +5 -193
  29. package/lib/components/modal.d.ts +17 -26
  30. package/lib/components/modal.js +57 -201
  31. package/lib/components/option.d.ts +2 -9
  32. package/lib/components/option.js +0 -48
  33. package/lib/components/popup.d.ts +2 -17
  34. package/lib/components/popup.js +8 -139
  35. package/lib/components/radio.d.ts +3 -23
  36. package/lib/components/radio.js +10 -65
  37. package/lib/components/resize-observer.d.ts +3 -30
  38. package/lib/components/resize-observer.js +12 -46
  39. package/lib/components/scroll-container.d.ts +2 -12
  40. package/lib/components/scroll-container.js +3 -46
  41. package/lib/components/select.d.ts +22 -153
  42. package/lib/components/select.js +33 -590
  43. package/lib/components/selected-tags.d.ts +4 -47
  44. package/lib/components/selected-tags.js +1 -95
  45. package/lib/components/step.d.ts +1 -6
  46. package/lib/components/step.js +0 -6
  47. package/lib/components/switch.d.ts +0 -11
  48. package/lib/components/switch.js +2 -36
  49. package/lib/components/tab.d.ts +1 -6
  50. package/lib/components/tab.js +0 -7
  51. package/lib/components/tabs.d.ts +5 -63
  52. package/lib/components/tabs.js +20 -283
  53. package/lib/components/tag.d.ts +2 -36
  54. package/lib/components/tag.js +5 -105
  55. package/lib/components/textarea.d.ts +6 -86
  56. package/lib/components/textarea.js +2 -173
  57. package/lib/components/tooltip.d.ts +3 -11
  58. package/lib/components/tooltip.js +24 -160
  59. package/lib/components/wizard.d.ts +6 -54
  60. package/lib/components/wizard.js +15 -228
  61. package/lib/icons/fontawesome/brands.d.ts +0 -1
  62. package/lib/icons/fontawesome/brands.js +0 -8
  63. package/lib/icons/fontawesome/regular.d.ts +0 -1
  64. package/lib/icons/fontawesome/regular.js +0 -8
  65. package/lib/icons/fontawesome/solid.d.ts +0 -1
  66. package/lib/icons/fontawesome/solid.js +0 -8
  67. package/lib/icons/heroicons/micro.d.ts +0 -1
  68. package/lib/icons/heroicons/micro.js +0 -8
  69. package/lib/icons/heroicons/mini.d.ts +0 -1
  70. package/lib/icons/heroicons/mini.js +0 -8
  71. package/lib/icons/heroicons/outline.d.ts +0 -1
  72. package/lib/icons/heroicons/outline.js +0 -8
  73. package/lib/icons/heroicons/solid.d.ts +0 -1
  74. package/lib/icons/heroicons/solid.js +0 -8
  75. package/lib/icons/lucide.d.ts +0 -1
  76. package/lib/icons/lucide.js +0 -1872
  77. package/lib/icons/material/filled.d.ts +0 -1
  78. package/lib/icons/material/filled.js +0 -10
  79. package/lib/icons/material/outlined.d.ts +0 -1
  80. package/lib/icons/material/outlined.js +0 -10
  81. package/lib/icons/material/round.d.ts +0 -1
  82. package/lib/icons/material/round.js +0 -10
  83. package/lib/icons/material/sharp.d.ts +0 -1
  84. package/lib/icons/material/sharp.js +0 -10
  85. package/lib/icons/material/two-tone.d.ts +0 -1
  86. package/lib/icons/material/two-tone.js +0 -10
  87. package/lib/index.d.ts +0 -1
  88. package/lib/index.js +0 -20
  89. package/lib/styles/button.d.ts +2 -20
  90. package/lib/styles/button.js +22 -122
  91. package/lib/styles/calendar-month.d.ts +1 -5
  92. package/lib/styles/calendar-month.js +4 -61
  93. package/lib/styles/calendar-navigation.d.ts +2 -6
  94. package/lib/styles/calendar-navigation.js +2 -27
  95. package/lib/styles/calendar.d.ts +1 -2
  96. package/lib/styles/calendar.js +1 -14
  97. package/lib/styles/checkbox.d.ts +0 -1
  98. package/lib/styles/checkbox.js +1 -23
  99. package/lib/styles/copy.d.ts +0 -1
  100. package/lib/styles/copy.js +2 -17
  101. package/lib/styles/custom-scrollbar.d.ts +1 -2
  102. package/lib/styles/custom-scrollbar.js +3 -18
  103. package/lib/styles/date-picker.d.ts +1 -5
  104. package/lib/styles/date-picker.js +35 -39
  105. package/lib/styles/file-upload.d.ts +1 -2
  106. package/lib/styles/file-upload.js +1 -16
  107. package/lib/styles/icon.d.ts +2 -6
  108. package/lib/styles/icon.js +7 -21
  109. package/lib/styles/input.d.ts +1 -6
  110. package/lib/styles/input.js +5 -54
  111. package/lib/styles/modal.d.ts +1 -2
  112. package/lib/styles/modal.js +21 -23
  113. package/lib/styles/option.d.ts +2 -6
  114. package/lib/styles/option.js +17 -12
  115. package/lib/styles/popup.d.ts +1 -2
  116. package/lib/styles/popup.js +26 -30
  117. package/lib/styles/radio.d.ts +0 -1
  118. package/lib/styles/radio.js +2 -16
  119. package/lib/styles/resize-observer.d.ts +1 -2
  120. package/lib/styles/resize-observer.js +0 -7
  121. package/lib/styles/scroll-container.d.ts +1 -2
  122. package/lib/styles/scroll-container.js +0 -19
  123. package/lib/styles/select-base.d.ts +0 -1
  124. package/lib/styles/select-base.js +68 -79
  125. package/lib/styles/select.d.ts +1 -2
  126. package/lib/styles/select.js +7 -15
  127. package/lib/styles/step.d.ts +1 -2
  128. package/lib/styles/step.js +0 -4
  129. package/lib/styles/switch.d.ts +0 -1
  130. package/lib/styles/switch.js +2 -20
  131. package/lib/styles/tab.d.ts +1 -2
  132. package/lib/styles/tab.js +0 -5
  133. package/lib/styles/tabs.d.ts +3 -11
  134. package/lib/styles/tabs.js +10 -48
  135. package/lib/styles/tag.d.ts +1 -5
  136. package/lib/styles/tag.js +2 -31
  137. package/lib/styles/textarea.d.ts +1 -2
  138. package/lib/styles/textarea.js +2 -45
  139. package/lib/styles/tooltip.d.ts +0 -1
  140. package/lib/styles/tooltip.js +0 -10
  141. package/lib/styles/wizard.d.ts +5 -21
  142. package/lib/styles/wizard.js +8 -88
  143. package/lib/types/common.d.ts +0 -2
  144. package/lib/types/common.js +0 -12
  145. package/lib/utils/calendar-utils.d.ts +4 -21
  146. package/lib/utils/calendar-utils.js +4 -177
  147. package/lib/utils/custom-scrollbar.d.ts +6 -20
  148. package/lib/utils/custom-scrollbar.js +1 -45
  149. package/lib/utils/flavor-sheet.d.ts +0 -1
  150. package/lib/utils/flavor-sheet.js +0 -23
  151. package/lib/utils/icon-registry.d.ts +0 -2
  152. package/lib/utils/icon-registry.js +1 -107
  153. package/lib/utils/icons.d.ts +0 -1
  154. package/lib/utils/icons.js +0 -9
  155. package/lib/utils/loader-registry.d.ts +0 -1
  156. package/lib/utils/loader-registry.js +0 -32
  157. package/lib/utils/locale.d.ts +2 -23
  158. package/lib/utils/locale.js +0 -86
  159. package/lib/utils/mobile.d.ts +0 -1
  160. package/lib/utils/mobile.js +0 -17
  161. package/lib/utils/number-format.d.ts +6 -3
  162. package/lib/utils/number-format.js +11 -67
  163. package/lib/utils/positioning.d.ts +50 -7
  164. package/lib/utils/positioning.js +52 -62
  165. package/lib/utils/property-capture.d.ts +5 -27
  166. package/lib/utils/property-capture.js +0 -108
  167. package/lib/utils/property-manager.d.ts +0 -1
  168. package/lib/utils/property-manager.js +0 -70
  169. package/lib/utils/resize-observer.d.ts +0 -1
  170. package/lib/utils/resize-observer.js +0 -36
  171. package/lib/utils/scroll-lock.d.ts +4 -11
  172. package/lib/utils/scroll-lock.js +0 -107
  173. package/lib/utils/styles.d.ts +0 -1
  174. package/lib/utils/styles.js +0 -24
  175. package/lib/version.d.ts +1 -2
  176. package/lib/version.js +1 -11
  177. package/package.json +2 -2
  178. package/lib/base/ty-component.d.ts.map +0 -1
  179. package/lib/base/ty-component.js.map +0 -1
  180. package/lib/components/button.d.ts.map +0 -1
  181. package/lib/components/button.js.map +0 -1
  182. package/lib/components/calendar-month.d.ts.map +0 -1
  183. package/lib/components/calendar-month.js.map +0 -1
  184. package/lib/components/calendar-navigation.d.ts.map +0 -1
  185. package/lib/components/calendar-navigation.js.map +0 -1
  186. package/lib/components/calendar.d.ts.map +0 -1
  187. package/lib/components/calendar.js.map +0 -1
  188. package/lib/components/checkbox.d.ts.map +0 -1
  189. package/lib/components/checkbox.js.map +0 -1
  190. package/lib/components/copy.d.ts.map +0 -1
  191. package/lib/components/copy.js.map +0 -1
  192. package/lib/components/date-picker.d.ts.map +0 -1
  193. package/lib/components/date-picker.js.map +0 -1
  194. package/lib/components/file-upload.d.ts.map +0 -1
  195. package/lib/components/file-upload.js.map +0 -1
  196. package/lib/components/icon.d.ts.map +0 -1
  197. package/lib/components/icon.js.map +0 -1
  198. package/lib/components/input.d.ts.map +0 -1
  199. package/lib/components/input.js.map +0 -1
  200. package/lib/components/modal.d.ts.map +0 -1
  201. package/lib/components/modal.js.map +0 -1
  202. package/lib/components/option.d.ts.map +0 -1
  203. package/lib/components/option.js.map +0 -1
  204. package/lib/components/popup.d.ts.map +0 -1
  205. package/lib/components/popup.js.map +0 -1
  206. package/lib/components/radio.d.ts.map +0 -1
  207. package/lib/components/radio.js.map +0 -1
  208. package/lib/components/resize-observer.d.ts.map +0 -1
  209. package/lib/components/resize-observer.js.map +0 -1
  210. package/lib/components/scroll-container.d.ts.map +0 -1
  211. package/lib/components/scroll-container.js.map +0 -1
  212. package/lib/components/select.d.ts.map +0 -1
  213. package/lib/components/select.js.map +0 -1
  214. package/lib/components/selected-tags.d.ts.map +0 -1
  215. package/lib/components/selected-tags.js.map +0 -1
  216. package/lib/components/step.d.ts.map +0 -1
  217. package/lib/components/step.js.map +0 -1
  218. package/lib/components/switch.d.ts.map +0 -1
  219. package/lib/components/switch.js.map +0 -1
  220. package/lib/components/tab.d.ts.map +0 -1
  221. package/lib/components/tab.js.map +0 -1
  222. package/lib/components/tabs.d.ts.map +0 -1
  223. package/lib/components/tabs.js.map +0 -1
  224. package/lib/components/tag.d.ts.map +0 -1
  225. package/lib/components/tag.js.map +0 -1
  226. package/lib/components/textarea.d.ts.map +0 -1
  227. package/lib/components/textarea.js.map +0 -1
  228. package/lib/components/tooltip.d.ts.map +0 -1
  229. package/lib/components/tooltip.js.map +0 -1
  230. package/lib/components/wizard.d.ts.map +0 -1
  231. package/lib/components/wizard.js.map +0 -1
  232. package/lib/icons/fontawesome/brands.d.ts.map +0 -1
  233. package/lib/icons/fontawesome/brands.js.map +0 -1
  234. package/lib/icons/fontawesome/regular.d.ts.map +0 -1
  235. package/lib/icons/fontawesome/regular.js.map +0 -1
  236. package/lib/icons/fontawesome/solid.d.ts.map +0 -1
  237. package/lib/icons/fontawesome/solid.js.map +0 -1
  238. package/lib/icons/heroicons/micro.d.ts.map +0 -1
  239. package/lib/icons/heroicons/micro.js.map +0 -1
  240. package/lib/icons/heroicons/mini.d.ts.map +0 -1
  241. package/lib/icons/heroicons/mini.js.map +0 -1
  242. package/lib/icons/heroicons/outline.d.ts.map +0 -1
  243. package/lib/icons/heroicons/outline.js.map +0 -1
  244. package/lib/icons/heroicons/solid.d.ts.map +0 -1
  245. package/lib/icons/heroicons/solid.js.map +0 -1
  246. package/lib/icons/lucide.d.ts.map +0 -1
  247. package/lib/icons/lucide.js.map +0 -1
  248. package/lib/icons/material/filled.d.ts.map +0 -1
  249. package/lib/icons/material/filled.js.map +0 -1
  250. package/lib/icons/material/outlined.d.ts.map +0 -1
  251. package/lib/icons/material/outlined.js.map +0 -1
  252. package/lib/icons/material/round.d.ts.map +0 -1
  253. package/lib/icons/material/round.js.map +0 -1
  254. package/lib/icons/material/sharp.d.ts.map +0 -1
  255. package/lib/icons/material/sharp.js.map +0 -1
  256. package/lib/icons/material/two-tone.d.ts.map +0 -1
  257. package/lib/icons/material/two-tone.js.map +0 -1
  258. package/lib/index.d.ts.map +0 -1
  259. package/lib/index.js.map +0 -1
  260. package/lib/styles/button.d.ts.map +0 -1
  261. package/lib/styles/button.js.map +0 -1
  262. package/lib/styles/calendar-month.d.ts.map +0 -1
  263. package/lib/styles/calendar-month.js.map +0 -1
  264. package/lib/styles/calendar-navigation.d.ts.map +0 -1
  265. package/lib/styles/calendar-navigation.js.map +0 -1
  266. package/lib/styles/calendar.d.ts.map +0 -1
  267. package/lib/styles/calendar.js.map +0 -1
  268. package/lib/styles/checkbox.d.ts.map +0 -1
  269. package/lib/styles/checkbox.js.map +0 -1
  270. package/lib/styles/copy.d.ts.map +0 -1
  271. package/lib/styles/copy.js.map +0 -1
  272. package/lib/styles/custom-scrollbar.d.ts.map +0 -1
  273. package/lib/styles/custom-scrollbar.js.map +0 -1
  274. package/lib/styles/date-picker.d.ts.map +0 -1
  275. package/lib/styles/date-picker.js.map +0 -1
  276. package/lib/styles/file-upload.d.ts.map +0 -1
  277. package/lib/styles/file-upload.js.map +0 -1
  278. package/lib/styles/icon.d.ts.map +0 -1
  279. package/lib/styles/icon.js.map +0 -1
  280. package/lib/styles/input.d.ts.map +0 -1
  281. package/lib/styles/input.js.map +0 -1
  282. package/lib/styles/modal.d.ts.map +0 -1
  283. package/lib/styles/modal.js.map +0 -1
  284. package/lib/styles/multiselect.d.ts +0 -8
  285. package/lib/styles/multiselect.d.ts.map +0 -1
  286. package/lib/styles/multiselect.js +0 -849
  287. package/lib/styles/multiselect.js.map +0 -1
  288. package/lib/styles/option.d.ts.map +0 -1
  289. package/lib/styles/option.js.map +0 -1
  290. package/lib/styles/popup.d.ts.map +0 -1
  291. package/lib/styles/popup.js.map +0 -1
  292. package/lib/styles/radio.d.ts.map +0 -1
  293. package/lib/styles/radio.js.map +0 -1
  294. package/lib/styles/resize-observer.d.ts.map +0 -1
  295. package/lib/styles/resize-observer.js.map +0 -1
  296. package/lib/styles/scroll-container.d.ts.map +0 -1
  297. package/lib/styles/scroll-container.js.map +0 -1
  298. package/lib/styles/select-base.d.ts.map +0 -1
  299. package/lib/styles/select-base.js.map +0 -1
  300. package/lib/styles/select.d.ts.map +0 -1
  301. package/lib/styles/select.js.map +0 -1
  302. package/lib/styles/step.d.ts.map +0 -1
  303. package/lib/styles/step.js.map +0 -1
  304. package/lib/styles/switch.d.ts.map +0 -1
  305. package/lib/styles/switch.js.map +0 -1
  306. package/lib/styles/tab.d.ts.map +0 -1
  307. package/lib/styles/tab.js.map +0 -1
  308. package/lib/styles/tabs.d.ts.map +0 -1
  309. package/lib/styles/tabs.js.map +0 -1
  310. package/lib/styles/tag.d.ts.map +0 -1
  311. package/lib/styles/tag.js.map +0 -1
  312. package/lib/styles/textarea.d.ts.map +0 -1
  313. package/lib/styles/textarea.js.map +0 -1
  314. package/lib/styles/tooltip.d.ts.map +0 -1
  315. package/lib/styles/tooltip.js.map +0 -1
  316. package/lib/styles/wizard.d.ts.map +0 -1
  317. package/lib/styles/wizard.js.map +0 -1
  318. package/lib/types/common.d.ts.map +0 -1
  319. package/lib/types/common.js.map +0 -1
  320. package/lib/utils/calendar-utils.d.ts.map +0 -1
  321. package/lib/utils/calendar-utils.js.map +0 -1
  322. package/lib/utils/custom-scrollbar.d.ts.map +0 -1
  323. package/lib/utils/custom-scrollbar.js.map +0 -1
  324. package/lib/utils/flavor-sheet.d.ts.map +0 -1
  325. package/lib/utils/flavor-sheet.js.map +0 -1
  326. package/lib/utils/icon-registry.d.ts.map +0 -1
  327. package/lib/utils/icon-registry.js.map +0 -1
  328. package/lib/utils/icons.d.ts.map +0 -1
  329. package/lib/utils/icons.js.map +0 -1
  330. package/lib/utils/loader-registry.d.ts.map +0 -1
  331. package/lib/utils/loader-registry.js.map +0 -1
  332. package/lib/utils/locale.d.ts.map +0 -1
  333. package/lib/utils/locale.js.map +0 -1
  334. package/lib/utils/mobile.d.ts.map +0 -1
  335. package/lib/utils/mobile.js.map +0 -1
  336. package/lib/utils/number-format.d.ts.map +0 -1
  337. package/lib/utils/number-format.js.map +0 -1
  338. package/lib/utils/parse-boolean.d.ts +0 -39
  339. package/lib/utils/parse-boolean.d.ts.map +0 -1
  340. package/lib/utils/parse-boolean.js +0 -58
  341. package/lib/utils/parse-boolean.js.map +0 -1
  342. package/lib/utils/positioning.d.ts.map +0 -1
  343. package/lib/utils/positioning.js.map +0 -1
  344. package/lib/utils/property-capture.d.ts.map +0 -1
  345. package/lib/utils/property-capture.js.map +0 -1
  346. package/lib/utils/property-manager.d.ts.map +0 -1
  347. package/lib/utils/property-manager.js.map +0 -1
  348. package/lib/utils/resize-observer.d.ts.map +0 -1
  349. package/lib/utils/resize-observer.js.map +0 -1
  350. package/lib/utils/scroll-lock.d.ts.map +0 -1
  351. package/lib/utils/scroll-lock.js.map +0 -1
  352. package/lib/utils/styles.d.ts.map +0 -1
  353. package/lib/utils/styles.js.map +0 -1
  354. package/lib/version.d.ts.map +0 -1
  355. 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