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,50 +1,8 @@
1
1
  /**
2
- * TySelectedOptions Web Component
3
- *
4
- * Out-of-band chip display for a picker (ty-select).
5
- * The picker owns the value + form submission; this element just renders the
6
- * selected values as dismissible <ty-tag> chips, anywhere in the layout.
7
- *
8
- * Pairs with any element that exposes a comma-joined `value` string and emits a
9
- * bubbling `change` event. Labels/flavors are read from the picker's matching
10
- * option (`[value="..."]`), so chips stay rich without duplicating data.
11
- *
12
- * If the picker also emits `open`/`close` (ty-select does), the chips hide
13
- * for the duration — the picker's own popup is independently sized/
14
- * positioned and can otherwise visually collide with this row.
15
- *
16
- * Also registered as `ty-selected-tags` — the original tag name, kept
17
- * working indefinitely for backward compatibility. `ty-selected-options` is
18
- * the name going forward: it names the element by what it's driven by
19
- * (a picker's selected `ty-option`s), not by the chip primitive it happens
20
- * to render with.
21
- *
22
- * @example
23
- * ```html
24
- * <ty-select id="robots">
25
- * <ty-option value="bobo" flavor="primary">Bobo Robot</ty-option>
26
- * </ty-select>
27
- * <ty-selected-options for="robots"></ty-selected-options>
28
- * ```
29
- *
30
- * Custom chips via a <template> child. Placeholders {value}, {label}, {flavor}
31
- * and any {data-*} attribute of the matching option are interpolated into
32
- * attributes and text — on cloned DOM nodes, never via innerHTML (no injection).
33
- *
34
- * @example
35
- * ```html
36
- * <ty-select id="team">
37
- * <ty-option value="ivan" data-avatar="/avatars/ivan.png">Ivan</ty-option>
38
- * </ty-select>
39
- * <ty-selected-options for="team">
40
- * <template>
41
- * <ty-tag flavor="{flavor}" dismissible>
42
- * <img slot="start" src="{data-avatar}" class="w-4 h-4 rounded-full">
43
- * {label}
44
- * </ty-tag>
45
- * </template>
46
- * </ty-selected-options>
47
- * ```
2
+ * TySelectedOptions - out-of-band dismissible <ty-tag> chips for a picker's selection.
3
+ * Pairs with any element exposing a comma-joined `value` + bubbling `change`; labels
4
+ * and flavors are read from the picker's matching option (`[value="..."]`). Custom chips
5
+ * come from an optional <template> child, stamped onto cloned nodes (never innerHTML).
48
6
  */
49
7
  export declare class TySelectedOptions extends HTMLElement {
50
8
  static get observedAttributes(): string[];
@@ -53,7 +11,7 @@ export declare class TySelectedOptions extends HTMLElement {
53
11
  private _childObserver;
54
12
  private _pickerObserver;
55
13
  private _lastTemplate;
56
- private _restoreDisplay;
14
+ private _pickerOpen;
57
15
  private _onPickerOpen;
58
16
  private _onPickerClose;
59
17
  connectedCallback(): void;
@@ -90,4 +48,3 @@ export declare class TySelectedOptions extends HTMLElement {
90
48
  /** Remove a value from the picker; picker re-emits change → chips re-render. */
91
49
  private deselect;
92
50
  }
93
- //# sourceMappingURL=selected-tags.d.ts.map
@@ -1,286 +1,198 @@
1
- /**
2
- * TySelectedOptions Web Component
3
- *
4
- * Out-of-band chip display for a picker (ty-select).
5
- * The picker owns the value + form submission; this element just renders the
6
- * selected values as dismissible <ty-tag> chips, anywhere in the layout.
7
- *
8
- * Pairs with any element that exposes a comma-joined `value` string and emits a
9
- * bubbling `change` event. Labels/flavors are read from the picker's matching
10
- * option (`[value="..."]`), so chips stay rich without duplicating data.
11
- *
12
- * If the picker also emits `open`/`close` (ty-select does), the chips hide
13
- * for the duration — the picker's own popup is independently sized/
14
- * positioned and can otherwise visually collide with this row.
15
- *
16
- * Also registered as `ty-selected-tags` — the original tag name, kept
17
- * working indefinitely for backward compatibility. `ty-selected-options` is
18
- * the name going forward: it names the element by what it's driven by
19
- * (a picker's selected `ty-option`s), not by the chip primitive it happens
20
- * to render with.
21
- *
22
- * @example
23
- * ```html
24
- * <ty-select id="robots">
25
- * <ty-option value="bobo" flavor="primary">Bobo Robot</ty-option>
26
- * </ty-select>
27
- * <ty-selected-options for="robots"></ty-selected-options>
28
- * ```
29
- *
30
- * Custom chips via a <template> child. Placeholders {value}, {label}, {flavor}
31
- * and any {data-*} attribute of the matching option are interpolated into
32
- * attributes and text — on cloned DOM nodes, never via innerHTML (no injection).
33
- *
34
- * @example
35
- * ```html
36
- * <ty-select id="team">
37
- * <ty-option value="ivan" data-avatar="/avatars/ivan.png">Ivan</ty-option>
38
- * </ty-select>
39
- * <ty-selected-options for="team">
40
- * <template>
41
- * <ty-tag flavor="{flavor}" dismissible>
42
- * <img slot="start" src="{data-avatar}" class="w-4 h-4 rounded-full">
43
- * {label}
44
- * </ty-tag>
45
- * </template>
46
- * </ty-selected-options>
47
- * ```
48
- */
49
- /** Split a comma-joined picker value into clean values. */
50
1
  function parseValues(raw) {
51
- return raw.split(',').map(s => s.trim()).filter(Boolean);
2
+ return raw.split(',').map(s => s.trim()).filter(Boolean);
52
3
  }
53
- /** Replace {key} placeholders from ctx; unknown keys are left as-is. */
54
4
  function interpolate(text, ctx) {
55
- return text.replace(/\{([\w-]+)\}/g, (match, key) => ctx[key] ?? match);
5
+ return text.replace(/\{([\w-]+)\}/g, (match, key) => ctx[key] ?? match);
56
6
  }
57
7
  export class TySelectedOptions extends HTMLElement {
58
- constructor() {
59
- super(...arguments);
60
- this._picker = null;
61
- this._onChange = () => this.renderChips();
62
- this._childObserver = null;
63
- this._pickerObserver = null;
64
- this._lastTemplate = null;
65
- // While the linked picker's own popup is open, its independently-sized,
66
- // independently-positioned dropdown can visually collide with this chip
67
- // row (it's a separate element, placed wherever the consumer wants it —
68
- // there's no layout relationship to enforce). Hiding the chips for the
69
- // duration sidesteps that instead of trying to out-z-index or reflow
70
- // around an overlay whose size/position we don't control.
71
- this._restoreDisplay = 'contents';
72
- this._onPickerOpen = () => {
73
- this._restoreDisplay = this.style.display || 'contents';
74
- this.style.display = 'none';
75
- };
76
- this._onPickerClose = () => {
77
- this.style.display = this._restoreDisplay;
78
- };
79
- }
80
- static get observedAttributes() {
81
- return ['for'];
82
- }
83
- connectedCallback() {
84
- // Chips participate directly in the parent layout (flex gap, wrap, etc.)
85
- if (!this.style.display)
86
- this.style.display = 'contents';
87
- this.bind();
88
- this.renderChips();
89
- // During HTML parsing we connect BEFORE our <template> child is parsed —
90
- // re-render when it arrives so server-rendered pages get templated chips.
91
- // renderChips re-appends the SAME template node, so its own mutations
92
- // don't change template() identity → no re-render loop.
93
- this._childObserver = new MutationObserver(() => {
94
- const template = this.template();
95
- if (template !== this._lastTemplate) {
96
- this.renderChips();
97
- }
98
- });
99
- this._childObserver.observe(this, { childList: true });
100
- }
101
- disconnectedCallback() {
102
- this.unbind();
103
- this._childObserver?.disconnect();
104
- this._childObserver = null;
105
- }
106
- attributeChangedCallback() {
107
- if (!this.isConnected)
108
- return;
109
- this.bind();
110
- this.renderChips();
111
- }
112
- /** Resolve the picker: `for` id, else the previous element sibling. */
113
- resolvePicker() {
114
- const id = this.getAttribute('for');
115
- const el = id
116
- ? document.getElementById(id)
117
- : this.previousElementSibling;
118
- return el ?? null;
119
- }
120
- bind() {
121
- const next = this.resolvePicker();
122
- if (next === this._picker)
123
- return;
124
- this.unbind();
125
- this._picker = next;
126
- this._picker?.addEventListener('change', this._onChange);
127
- this._picker?.addEventListener('open', this._onPickerOpen);
128
- this._picker?.addEventListener('close', this._onPickerClose);
129
- // The picker stamps `selected` onto its options ASYNC after connect
130
- // (rAF init) and on external option swaps — neither fires `change`.
131
- // Watch the picker's subtree so initial values render as chips too.
132
- if (this._picker) {
133
- this._pickerObserver = new MutationObserver(() => this.renderChips());
134
- this._pickerObserver.observe(this._picker, {
135
- childList: true,
136
- subtree: true,
137
- attributes: true,
138
- attributeFilter: ['selected'],
139
- });
140
- }
141
- }
142
- unbind() {
143
- this._picker?.removeEventListener('change', this._onChange);
144
- this._picker?.removeEventListener('open', this._onPickerOpen);
145
- this._picker?.removeEventListener('close', this._onPickerClose);
146
- this._pickerObserver?.disconnect();
147
- this._pickerObserver = null;
148
- this._picker = null;
149
- // Don't leave chips hidden if the picker is swapped/removed mid-open.
150
- this.style.display = this._restoreDisplay;
151
- }
152
- values() {
153
- return parseValues(this._picker?.value ?? '');
154
- }
155
- /** The optional chip template (direct child only). */
156
- template() {
157
- return this.querySelector(':scope > template');
158
- }
159
- /**
160
- * Interpolation context for a value: value, label, flavor plus every
161
- * data-* attribute of the picker's matching option.
162
- */
163
- context(value) {
164
- const opt = this._picker?.querySelector(`[value="${CSS.escape(value)}"]`);
165
- const ctx = {
166
- value,
167
- // label attribute wins (native <option label> semantics)
168
- label: opt?.getAttribute('label') || opt?.textContent?.trim() || value,
169
- flavor: opt?.getAttribute('flavor') ?? '',
170
- };
171
- if (opt) {
172
- for (const attr of Array.from(opt.attributes)) {
173
- if (attr.name.startsWith('data-'))
174
- ctx[attr.name] = attr.value;
175
- }
176
- }
177
- return ctx;
178
- }
179
- /**
180
- * The template's blueprint fragment. HTML-parsed templates carry children in
181
- * .content; framework-rendered ones (DOM-created by React/Replicant/etc.)
182
- * carry them as regular childNodes — support both.
183
- */
184
- templateSource(template) {
185
- if (template.content.firstElementChild)
186
- return template.content;
187
- const frag = document.createDocumentFragment();
188
- template.childNodes.forEach(n => frag.appendChild(n.cloneNode(true)));
189
- return frag;
190
- }
191
- /**
192
- * Stamp the template for one value: clone, interpolate placeholders in
193
- * attributes and text nodes, wire dismiss. Attribute values that were a
194
- * single unresolved placeholder are removed (e.g. flavor="{flavor}" with
195
- * no flavor on the option).
196
- */
197
- stampTemplate(template, value) {
198
- const ctx = this.context(value);
199
- const clone = this.templateSource(template).cloneNode(true);
200
- const walker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);
201
- for (let node = walker.nextNode(); node; node = walker.nextNode()) {
202
- if (node.nodeType === Node.TEXT_NODE) {
203
- if (node.textContent?.includes('{')) {
204
- node.textContent = interpolate(node.textContent, ctx);
205
- }
206
- }
207
- else {
208
- const el = node;
209
- for (const attr of Array.from(el.attributes)) {
210
- if (!attr.value.includes('{'))
211
- continue;
212
- const resolved = interpolate(attr.value, ctx);
213
- // Single-placeholder attribute that is empty OR unresolved → drop it
214
- // (e.g. flavor="{flavor}" with no flavor, name="{data-icon}" with no data-icon)
215
- if (/^\{[\w-]+\}$/.test(attr.value) && (resolved === '' || resolved === attr.value)) {
216
- el.removeAttribute(attr.name);
217
- }
218
- else {
219
- el.setAttribute(attr.name, resolved);
220
- }
221
- }
222
- }
223
- }
224
- // Dismiss anywhere inside the stamped chip deselects this value
225
- for (const el of Array.from(clone.children)) {
226
- el.addEventListener('dismiss', (e) => {
227
- e.stopPropagation();
228
- this.deselect(value);
229
- });
230
- }
231
- return clone;
232
- }
233
- /** Default chip when no template is provided. */
234
- defaultChip(value) {
235
- const ctx = this.context(value);
236
- const tag = document.createElement('ty-tag');
237
- tag.setAttribute('value', value);
238
- tag.setAttribute('dismissible', 'true');
239
- if (ctx.flavor)
240
- tag.setAttribute('flavor', ctx.flavor);
241
- tag.textContent = ctx.label;
242
- tag.addEventListener('dismiss', () => this.deselect(value));
243
- return tag;
244
- }
245
- renderChips() {
246
- const template = this.template();
247
- this._lastTemplate = template;
248
- if (!this._picker) {
249
- this.replaceChildren(...(template ? [template] : []));
250
- return;
251
- }
252
- const frag = document.createDocumentFragment();
253
- // Template survives re-renders - it is part of our light DOM
254
- if (template)
255
- frag.appendChild(template);
256
- for (const value of this.values()) {
257
- frag.appendChild(template ? this.stampTemplate(template, value) : this.defaultChip(value));
258
- }
259
- this.replaceChildren(frag);
260
- }
261
- /** Remove a value from the picker; picker re-emits change → chips re-render. */
262
- deselect(value) {
263
- if (!this._picker)
264
- return;
265
- const picker = this._picker;
266
- if (typeof picker.deselectValue === 'function') {
267
- // ty-select path — fires a proper change event (chips re-render via listener)
268
- picker.deselectValue(value);
269
- }
270
- else {
271
- // Generic picker fallback — value setters usually don't emit change
272
- picker.value = this.values().filter(v => v !== value).join(',');
273
- this.renderChips();
274
- }
275
- }
8
+ constructor() {
9
+ super(...arguments);
10
+ this._picker = null;
11
+ this._onChange = () => this.renderChips();
12
+ this._childObserver = null;
13
+ this._pickerObserver = null;
14
+ this._lastTemplate = null;
15
+ this._pickerOpen = false;
16
+ this._onPickerOpen = () => {
17
+ this._pickerOpen = true;
18
+ };
19
+ this._onPickerClose = () => {
20
+ this._pickerOpen = false;
21
+ this.renderChips();
22
+ };
23
+ }
24
+ static get observedAttributes() {
25
+ return ['for'];
26
+ }
27
+ connectedCallback() {
28
+ if (!this.style.display)
29
+ this.style.display = 'contents';
30
+ this.bind();
31
+ this.renderChips();
32
+ if (document.readyState === 'loading') {
33
+ document.addEventListener('DOMContentLoaded', () => { if (this.isConnected)
34
+ this.renderChips(); }, { once: true });
35
+ }
36
+ this._childObserver = new MutationObserver(() => {
37
+ const template = this.template();
38
+ if (template !== this._lastTemplate) {
39
+ this.renderChips();
40
+ }
41
+ });
42
+ this._childObserver.observe(this, { childList: true });
43
+ }
44
+ disconnectedCallback() {
45
+ this.unbind();
46
+ this._childObserver?.disconnect();
47
+ this._childObserver = null;
48
+ }
49
+ attributeChangedCallback() {
50
+ if (!this.isConnected)
51
+ return;
52
+ this.bind();
53
+ this.renderChips();
54
+ }
55
+ resolvePicker() {
56
+ const id = this.getAttribute('for');
57
+ const el = id
58
+ ? document.getElementById(id)
59
+ : this.previousElementSibling;
60
+ return el ?? null;
61
+ }
62
+ bind() {
63
+ const next = this.resolvePicker();
64
+ if (next === this._picker)
65
+ return;
66
+ this.unbind();
67
+ this._picker = next;
68
+ this._picker?.addEventListener('change', this._onChange);
69
+ this._picker?.addEventListener('open', this._onPickerOpen);
70
+ this._picker?.addEventListener('close', this._onPickerClose);
71
+ if (this._picker) {
72
+ this._pickerObserver = new MutationObserver(() => this.renderChips());
73
+ this._pickerObserver.observe(this._picker, {
74
+ childList: true,
75
+ subtree: true,
76
+ attributes: true,
77
+ attributeFilter: ['selected'],
78
+ });
79
+ }
80
+ }
81
+ unbind() {
82
+ this._picker?.removeEventListener('change', this._onChange);
83
+ this._picker?.removeEventListener('open', this._onPickerOpen);
84
+ this._picker?.removeEventListener('close', this._onPickerClose);
85
+ this._pickerObserver?.disconnect();
86
+ this._pickerObserver = null;
87
+ this._picker = null;
88
+ this._pickerOpen = false;
89
+ }
90
+ values() {
91
+ return parseValues(this._picker?.value ?? '');
92
+ }
93
+ template() {
94
+ return this.querySelector(':scope > template');
95
+ }
96
+ context(value) {
97
+ const opt = this._picker?.querySelector(`[value="${CSS.escape(value)}"]`);
98
+ const ctx = {
99
+ value,
100
+ label: opt?.getAttribute('label') || opt?.textContent?.trim() || value,
101
+ flavor: opt?.getAttribute('flavor') ?? '',
102
+ };
103
+ if (opt) {
104
+ for (const attr of Array.from(opt.attributes)) {
105
+ if (attr.name.startsWith('data-'))
106
+ ctx[attr.name] = attr.value;
107
+ }
108
+ }
109
+ return ctx;
110
+ }
111
+ templateSource(template) {
112
+ if (template.content.hasChildNodes())
113
+ return template.content;
114
+ const frag = document.createDocumentFragment();
115
+ template.childNodes.forEach(n => frag.appendChild(n.cloneNode(true)));
116
+ return frag;
117
+ }
118
+ stampTemplate(template, value) {
119
+ const ctx = this.context(value);
120
+ const clone = this.templateSource(template).cloneNode(true);
121
+ const walker = document.createTreeWalker(clone, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);
122
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
123
+ if (node.nodeType === Node.TEXT_NODE) {
124
+ if (node.textContent?.includes('{')) {
125
+ node.textContent = interpolate(node.textContent, ctx);
126
+ }
127
+ }
128
+ else {
129
+ const el = node;
130
+ for (const attr of Array.from(el.attributes)) {
131
+ if (!attr.value.includes('{'))
132
+ continue;
133
+ const resolved = interpolate(attr.value, ctx);
134
+ if (/^\{[\w-]+\}$/.test(attr.value) && (resolved === '' || resolved === attr.value)) {
135
+ el.removeAttribute(attr.name);
136
+ }
137
+ else {
138
+ el.setAttribute(attr.name, resolved);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ for (const el of Array.from(clone.children)) {
144
+ el.addEventListener('dismiss', (e) => {
145
+ e.stopPropagation();
146
+ this.deselect(value);
147
+ });
148
+ }
149
+ return clone;
150
+ }
151
+ defaultChip(value) {
152
+ const ctx = this.context(value);
153
+ const tag = document.createElement('ty-tag');
154
+ tag.setAttribute('value', value);
155
+ tag.setAttribute('dismissible', 'true');
156
+ if (ctx.flavor)
157
+ tag.setAttribute('flavor', ctx.flavor);
158
+ tag.textContent = ctx.label;
159
+ tag.addEventListener('dismiss', () => this.deselect(value));
160
+ return tag;
161
+ }
162
+ renderChips() {
163
+ if (this._pickerOpen)
164
+ return;
165
+ const template = this.template();
166
+ this._lastTemplate = template;
167
+ if (!this._picker) {
168
+ this.replaceChildren(...(template ? [template] : []));
169
+ return;
170
+ }
171
+ const frag = document.createDocumentFragment();
172
+ if (template)
173
+ frag.appendChild(template);
174
+ for (const value of this.values()) {
175
+ frag.appendChild(template ? this.stampTemplate(template, value) : this.defaultChip(value));
176
+ }
177
+ this.replaceChildren(frag);
178
+ }
179
+ deselect(value) {
180
+ if (!this._picker)
181
+ return;
182
+ const picker = this._picker;
183
+ if (typeof picker.deselectValue === 'function') {
184
+ picker.deselectValue(value);
185
+ }
186
+ else {
187
+ picker.value = this.values().filter(v => v !== value).join(',');
188
+ this.renderChips();
189
+ }
190
+ }
276
191
  }
277
192
  if (!customElements.get('ty-selected-options')) {
278
- customElements.define('ty-selected-options', TySelectedOptions);
193
+ customElements.define('ty-selected-options', TySelectedOptions);
279
194
  }
280
- // Original tag name — kept working indefinitely. A constructor can only
281
- // register once, hence the subclass (see ty-modal/ty-dialog for precedent).
282
195
  if (!customElements.get('ty-selected-tags')) {
283
- customElements.define('ty-selected-tags', class TySelectedTags extends TySelectedOptions {
284
- });
196
+ customElements.define('ty-selected-tags', class TySelectedTags extends TySelectedOptions {
197
+ });
285
198
  }
286
- //# sourceMappingURL=selected-tags.js.map
@@ -1,8 +1,4 @@
1
- /**
2
- * Step Component
3
- *
4
- * Individual wizard step panel with custom scrollbar via CustomScrollbar utility.
5
- */
1
+ /** Individual wizard step panel with custom scrollbar via CustomScrollbar utility. */
6
2
  export type StepStatus = 'completed' | 'active' | 'pending' | 'error';
7
3
  export interface StepAttributes {
8
4
  id: string | null;
@@ -23,4 +19,3 @@ export declare class TyStep extends HTMLElement {
23
19
  private _destroyScrollbar;
24
20
  resetScroll(): void;
25
21
  }
26
- //# sourceMappingURL=step.d.ts.map