@tessera-ui/core 0.4.1 → 0.5.0

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 (600) hide show
  1. package/README.md +21 -12
  2. package/dist/components/index.js +1 -1
  3. package/dist/components/{p-O8aQgWRZ.js → p-2ydrBbXU.js} +2 -2
  4. package/dist/components/p-A0saON5E.js +2 -0
  5. package/dist/components/p-B046Q9mB.js +2 -0
  6. package/dist/components/{p-C7JaUlNB.js → p-B4_cDa1A.js} +2 -2
  7. package/dist/components/{p-BdzH6wlc.js → p-BCv5H01l.js} +2 -2
  8. package/dist/components/p-BGnwokOT.js +2 -0
  9. package/dist/components/p-BMu62WKn.js +2 -0
  10. package/dist/components/p-BT1uIgln.js +2 -0
  11. package/dist/components/p-BUWioFPq.js +2 -0
  12. package/dist/components/{p-v-L32wKy.js → p-BdeYJARM.js} +2 -2
  13. package/dist/components/{p-DhQ7X_TL.js → p-BnX1KON4.js} +2 -2
  14. package/dist/components/{p-DwJ7Jt3k.js → p-BsX7YKf7.js} +2 -2
  15. package/dist/components/p-BzSptDZ8.js +2 -0
  16. package/dist/components/p-C4C_ntgI.js +2 -0
  17. package/dist/components/p-C4jvuley.js +2 -0
  18. package/dist/components/{p-BP-fZfRb.js → p-CGcBFblJ.js} +2 -2
  19. package/dist/components/p-CJvp9tpd.js +2 -0
  20. package/dist/components/{p-DD986daz.js → p-COpYtD-7.js} +2 -2
  21. package/dist/components/{p-C8wd1644.js → p-CV-_3uEV.js} +2 -2
  22. package/dist/components/p-CXpxj5LF.js +2 -0
  23. package/dist/components/{p-CEQXPxzU.js → p-Ccf23RDb.js} +2 -2
  24. package/dist/components/{p-SopsdO_f.js → p-Ccpbt1Ou.js} +2 -2
  25. package/dist/components/{p-DMPxu5Po.js → p-CgLMjfKE.js} +2 -2
  26. package/dist/components/p-D2rKVDAH.js +2 -0
  27. package/dist/components/{p-zveaarwa.js → p-D33ZtGZF.js} +2 -2
  28. package/dist/components/{p-Fot2uNwg.js → p-DHBR8Qn_.js} +2 -2
  29. package/dist/components/{p-faVXXwqR.js → p-DOtFbUdh.js} +2 -2
  30. package/dist/components/{p-BjiDgszq.js → p-DelBi-6m.js} +2 -2
  31. package/dist/components/{p-Cy_Ad-Jy.js → p-DgbNUE6a.js} +2 -2
  32. package/dist/components/{p-DTAVTqnc.js → p-I5_iFNxb.js} +2 -2
  33. package/dist/components/p-IZ8R1wr2.js +2 -0
  34. package/dist/components/{p-B_NL55YI.js → p-LcG5Mdyq.js} +2 -2
  35. package/dist/components/{p-BcoU0ISN.js → p-XuOQBHK0.js} +2 -2
  36. package/dist/components/p-_EbBBIv1.js +2 -0
  37. package/dist/components/p-_vCbug8y.js +2 -0
  38. package/dist/components/{p-B0ZXNFSa.js → p-b-zWbmXM.js} +2 -2
  39. package/dist/components/{p-DwUH8YQW.js → p-e-hrdd0t.js} +2 -2
  40. package/dist/components/p-gtluIo4p.js +2 -0
  41. package/dist/components/p-o-GUod2W.js +2 -0
  42. package/dist/components/{p-DooMF1E0.js → p-w9y5VC-3.js} +2 -2
  43. package/dist/components/ts-accordion-item.js +1 -1
  44. package/dist/components/ts-accordion.js +1 -1
  45. package/dist/components/ts-alert.js +1 -1
  46. package/dist/components/ts-avatar.js +1 -1
  47. package/dist/components/ts-badge.js +1 -1
  48. package/dist/components/ts-banner.js +1 -1
  49. package/dist/components/ts-breadcrumb-item.js +1 -1
  50. package/dist/components/ts-breadcrumb.js +1 -1
  51. package/dist/components/ts-button.js +1 -1
  52. package/dist/components/ts-card.js +1 -1
  53. package/dist/components/ts-checkbox.js +1 -1
  54. package/dist/components/ts-chip.js +1 -1
  55. package/dist/components/ts-container.js +1 -1
  56. package/dist/components/ts-date-picker.js +1 -1
  57. package/dist/components/ts-dialog.js +1 -1
  58. package/dist/components/ts-divider.js +1 -1
  59. package/dist/components/ts-drawer.js +1 -1
  60. package/dist/components/ts-empty-state.js +1 -1
  61. package/dist/components/ts-file-upload.js +1 -1
  62. package/dist/components/ts-grid.js +1 -1
  63. package/dist/components/ts-icon.js +1 -1
  64. package/dist/components/ts-input.js +1 -1
  65. package/dist/components/ts-menu-item.js +1 -1
  66. package/dist/components/ts-menu.js +1 -1
  67. package/dist/components/ts-modal.js +1 -1
  68. package/dist/components/ts-nav-item.js +1 -1
  69. package/dist/components/ts-nav.js +1 -1
  70. package/dist/components/ts-pagination.js +1 -1
  71. package/dist/components/ts-popover.js +1 -1
  72. package/dist/components/ts-progress.js +1 -1
  73. package/dist/components/ts-radio.js +1 -1
  74. package/dist/components/ts-row.js +1 -1
  75. package/dist/components/ts-select.js +1 -1
  76. package/dist/components/ts-skeleton.js +1 -1
  77. package/dist/components/ts-slider.js +1 -1
  78. package/dist/components/ts-spacer.js +1 -1
  79. package/dist/components/ts-spinner.js +1 -1
  80. package/dist/components/ts-stack.js +1 -1
  81. package/dist/components/ts-step.js +1 -1
  82. package/dist/components/ts-stepper.js +1 -1
  83. package/dist/components/ts-switch-group.js +1 -1
  84. package/dist/components/ts-switch-option.js +1 -1
  85. package/dist/components/ts-tab-panel.js +1 -1
  86. package/dist/components/ts-table.js +1 -1
  87. package/dist/components/ts-tabs.js +1 -1
  88. package/dist/components/ts-textarea.js +1 -1
  89. package/dist/components/ts-toast.js +1 -1
  90. package/dist/components/ts-toggle.js +1 -1
  91. package/dist/components/ts-toolbar.js +1 -1
  92. package/dist/components/ts-tooltip.js +1 -1
  93. package/dist/components/ts-tree-item.js +1 -1
  94. package/dist/components/ts-tree.js +1 -1
  95. package/package.json +24 -3
  96. package/dist/cjs/aria-CeYIvz3U.js.map +0 -1
  97. package/dist/cjs/index-Bel_x2OU.js.map +0 -1
  98. package/dist/cjs/index.cjs.js.map +0 -1
  99. package/dist/cjs/loader.cjs.js.map +0 -1
  100. package/dist/cjs/lucide-B1gCqJ3G.js.map +0 -1
  101. package/dist/cjs/tessera-ui.cjs.js.map +0 -1
  102. package/dist/cjs/ts-accordion-item.cjs.entry.js.map +0 -1
  103. package/dist/cjs/ts-accordion.cjs.entry.js.map +0 -1
  104. package/dist/cjs/ts-alert.cjs.entry.js.map +0 -1
  105. package/dist/cjs/ts-avatar.cjs.entry.js.map +0 -1
  106. package/dist/cjs/ts-badge.cjs.entry.js.map +0 -1
  107. package/dist/cjs/ts-banner.cjs.entry.js.map +0 -1
  108. package/dist/cjs/ts-breadcrumb-item.cjs.entry.js.map +0 -1
  109. package/dist/cjs/ts-breadcrumb.cjs.entry.js.map +0 -1
  110. package/dist/cjs/ts-button.cjs.entry.js.map +0 -1
  111. package/dist/cjs/ts-card.cjs.entry.js.map +0 -1
  112. package/dist/cjs/ts-checkbox.cjs.entry.js.map +0 -1
  113. package/dist/cjs/ts-chip.cjs.entry.js.map +0 -1
  114. package/dist/cjs/ts-container.cjs.entry.js.map +0 -1
  115. package/dist/cjs/ts-date-picker.cjs.entry.js.map +0 -1
  116. package/dist/cjs/ts-dialog.cjs.entry.js.map +0 -1
  117. package/dist/cjs/ts-divider.cjs.entry.js.map +0 -1
  118. package/dist/cjs/ts-drawer.cjs.entry.js.map +0 -1
  119. package/dist/cjs/ts-empty-state.cjs.entry.js.map +0 -1
  120. package/dist/cjs/ts-file-upload.cjs.entry.js.map +0 -1
  121. package/dist/cjs/ts-grid.cjs.entry.js.map +0 -1
  122. package/dist/cjs/ts-icon-CfbhgAgr.js.map +0 -1
  123. package/dist/cjs/ts-icon.cjs.entry.js.map +0 -1
  124. package/dist/cjs/ts-input.cjs.entry.js.map +0 -1
  125. package/dist/cjs/ts-menu-item.cjs.entry.js.map +0 -1
  126. package/dist/cjs/ts-menu.cjs.entry.js.map +0 -1
  127. package/dist/cjs/ts-modal.cjs.entry.js.map +0 -1
  128. package/dist/cjs/ts-nav-item.cjs.entry.js.map +0 -1
  129. package/dist/cjs/ts-nav.cjs.entry.js.map +0 -1
  130. package/dist/cjs/ts-pagination.cjs.entry.js.map +0 -1
  131. package/dist/cjs/ts-popover.cjs.entry.js.map +0 -1
  132. package/dist/cjs/ts-progress.cjs.entry.js.map +0 -1
  133. package/dist/cjs/ts-radio.cjs.entry.js.map +0 -1
  134. package/dist/cjs/ts-row.cjs.entry.js.map +0 -1
  135. package/dist/cjs/ts-select.cjs.entry.js.map +0 -1
  136. package/dist/cjs/ts-skeleton.cjs.entry.js.map +0 -1
  137. package/dist/cjs/ts-slider.cjs.entry.js.map +0 -1
  138. package/dist/cjs/ts-spacer.cjs.entry.js.map +0 -1
  139. package/dist/cjs/ts-spinner.cjs.entry.js.map +0 -1
  140. package/dist/cjs/ts-stack.cjs.entry.js.map +0 -1
  141. package/dist/cjs/ts-step.cjs.entry.js.map +0 -1
  142. package/dist/cjs/ts-stepper.cjs.entry.js.map +0 -1
  143. package/dist/cjs/ts-switch-group.cjs.entry.js.map +0 -1
  144. package/dist/cjs/ts-switch-option.cjs.entry.js.map +0 -1
  145. package/dist/cjs/ts-tab-panel.cjs.entry.js.map +0 -1
  146. package/dist/cjs/ts-table.cjs.entry.js.map +0 -1
  147. package/dist/cjs/ts-tabs.cjs.entry.js.map +0 -1
  148. package/dist/cjs/ts-textarea.cjs.entry.js.map +0 -1
  149. package/dist/cjs/ts-toast.cjs.entry.js.map +0 -1
  150. package/dist/cjs/ts-toggle.cjs.entry.js.map +0 -1
  151. package/dist/cjs/ts-toolbar.cjs.entry.js.map +0 -1
  152. package/dist/cjs/ts-tooltip.cjs.entry.js.map +0 -1
  153. package/dist/cjs/ts-tree-item.cjs.entry.js.map +0 -1
  154. package/dist/cjs/ts-tree.cjs.entry.js.map +0 -1
  155. package/dist/collection/components/accordion/accordion-item.js.map +0 -1
  156. package/dist/collection/components/accordion/accordion-item.stories.js +0 -4
  157. package/dist/collection/components/accordion/accordion-item.stories.js.map +0 -1
  158. package/dist/collection/components/accordion/accordion.js.map +0 -1
  159. package/dist/collection/components/accordion/accordion.stories.js +0 -90
  160. package/dist/collection/components/accordion/accordion.stories.js.map +0 -1
  161. package/dist/collection/components/alert/alert.js.map +0 -1
  162. package/dist/collection/components/alert/alert.stories.js +0 -128
  163. package/dist/collection/components/alert/alert.stories.js.map +0 -1
  164. package/dist/collection/components/avatar/avatar.js.map +0 -1
  165. package/dist/collection/components/avatar/avatar.stories.js +0 -138
  166. package/dist/collection/components/avatar/avatar.stories.js.map +0 -1
  167. package/dist/collection/components/badge/badge.js.map +0 -1
  168. package/dist/collection/components/badge/badge.stories.js +0 -193
  169. package/dist/collection/components/badge/badge.stories.js.map +0 -1
  170. package/dist/collection/components/banner/banner.js.map +0 -1
  171. package/dist/collection/components/banner/banner.stories.js +0 -92
  172. package/dist/collection/components/banner/banner.stories.js.map +0 -1
  173. package/dist/collection/components/breadcrumb/breadcrumb-item.js.map +0 -1
  174. package/dist/collection/components/breadcrumb/breadcrumb-item.stories.js +0 -4
  175. package/dist/collection/components/breadcrumb/breadcrumb-item.stories.js.map +0 -1
  176. package/dist/collection/components/breadcrumb/breadcrumb.js.map +0 -1
  177. package/dist/collection/components/breadcrumb/breadcrumb.stories.js +0 -88
  178. package/dist/collection/components/breadcrumb/breadcrumb.stories.js.map +0 -1
  179. package/dist/collection/components/button/button.js.map +0 -1
  180. package/dist/collection/components/button/button.stories.js +0 -219
  181. package/dist/collection/components/button/button.stories.js.map +0 -1
  182. package/dist/collection/components/card/card.js.map +0 -1
  183. package/dist/collection/components/card/card.stories.js +0 -221
  184. package/dist/collection/components/card/card.stories.js.map +0 -1
  185. package/dist/collection/components/checkbox/checkbox.js.map +0 -1
  186. package/dist/collection/components/checkbox/checkbox.stories.js +0 -90
  187. package/dist/collection/components/checkbox/checkbox.stories.js.map +0 -1
  188. package/dist/collection/components/chip/chip.js.map +0 -1
  189. package/dist/collection/components/chip/chip.stories.js +0 -139
  190. package/dist/collection/components/chip/chip.stories.js.map +0 -1
  191. package/dist/collection/components/container/container.js.map +0 -1
  192. package/dist/collection/components/container/container.stories.js +0 -138
  193. package/dist/collection/components/container/container.stories.js.map +0 -1
  194. package/dist/collection/components/date-picker/date-picker.js.map +0 -1
  195. package/dist/collection/components/date-picker/date-picker.stories.js +0 -119
  196. package/dist/collection/components/date-picker/date-picker.stories.js.map +0 -1
  197. package/dist/collection/components/dialog/dialog.js.map +0 -1
  198. package/dist/collection/components/dialog/dialog.stories.js +0 -147
  199. package/dist/collection/components/dialog/dialog.stories.js.map +0 -1
  200. package/dist/collection/components/divider/divider.js.map +0 -1
  201. package/dist/collection/components/divider/divider.stories.js +0 -94
  202. package/dist/collection/components/divider/divider.stories.js.map +0 -1
  203. package/dist/collection/components/drawer/drawer.js.map +0 -1
  204. package/dist/collection/components/drawer/drawer.stories.js +0 -143
  205. package/dist/collection/components/drawer/drawer.stories.js.map +0 -1
  206. package/dist/collection/components/empty-state/empty-state.js.map +0 -1
  207. package/dist/collection/components/empty-state/empty-state.stories.js +0 -113
  208. package/dist/collection/components/empty-state/empty-state.stories.js.map +0 -1
  209. package/dist/collection/components/file-upload/file-upload.js.map +0 -1
  210. package/dist/collection/components/file-upload/file-upload.stories.js +0 -107
  211. package/dist/collection/components/file-upload/file-upload.stories.js.map +0 -1
  212. package/dist/collection/components/grid/grid.js.map +0 -1
  213. package/dist/collection/components/grid/grid.stories.js +0 -134
  214. package/dist/collection/components/grid/grid.stories.js.map +0 -1
  215. package/dist/collection/components/icon/icon-registry.js.map +0 -1
  216. package/dist/collection/components/icon/icon.js.map +0 -1
  217. package/dist/collection/components/icon/icon.stories.js +0 -119
  218. package/dist/collection/components/icon/icon.stories.js.map +0 -1
  219. package/dist/collection/components/input/input.js.map +0 -1
  220. package/dist/collection/components/input/input.stories.js +0 -151
  221. package/dist/collection/components/input/input.stories.js.map +0 -1
  222. package/dist/collection/components/menu/menu-item.js.map +0 -1
  223. package/dist/collection/components/menu/menu-item.stories.js +0 -4
  224. package/dist/collection/components/menu/menu-item.stories.js.map +0 -1
  225. package/dist/collection/components/menu/menu.js.map +0 -1
  226. package/dist/collection/components/menu/menu.stories.js +0 -126
  227. package/dist/collection/components/menu/menu.stories.js.map +0 -1
  228. package/dist/collection/components/modal/modal.js.map +0 -1
  229. package/dist/collection/components/modal/modal.stories.js +0 -233
  230. package/dist/collection/components/modal/modal.stories.js.map +0 -1
  231. package/dist/collection/components/nav/nav-item.js.map +0 -1
  232. package/dist/collection/components/nav/nav-item.stories.js +0 -4
  233. package/dist/collection/components/nav/nav-item.stories.js.map +0 -1
  234. package/dist/collection/components/nav/nav.js.map +0 -1
  235. package/dist/collection/components/nav/nav.stories.js +0 -106
  236. package/dist/collection/components/nav/nav.stories.js.map +0 -1
  237. package/dist/collection/components/pagination/pagination.js.map +0 -1
  238. package/dist/collection/components/pagination/pagination.stories.js +0 -92
  239. package/dist/collection/components/pagination/pagination.stories.js.map +0 -1
  240. package/dist/collection/components/popover/popover.js.map +0 -1
  241. package/dist/collection/components/popover/popover.stories.js +0 -112
  242. package/dist/collection/components/popover/popover.stories.js.map +0 -1
  243. package/dist/collection/components/progress/progress.js.map +0 -1
  244. package/dist/collection/components/progress/progress.stories.js +0 -132
  245. package/dist/collection/components/progress/progress.stories.js.map +0 -1
  246. package/dist/collection/components/radio/radio.js.map +0 -1
  247. package/dist/collection/components/radio/radio.stories.js +0 -77
  248. package/dist/collection/components/radio/radio.stories.js.map +0 -1
  249. package/dist/collection/components/row/row.js.map +0 -1
  250. package/dist/collection/components/row/row.stories.js +0 -172
  251. package/dist/collection/components/row/row.stories.js.map +0 -1
  252. package/dist/collection/components/select/select.js.map +0 -1
  253. package/dist/collection/components/select/select.stories.js +0 -138
  254. package/dist/collection/components/select/select.stories.js.map +0 -1
  255. package/dist/collection/components/skeleton/skeleton.js.map +0 -1
  256. package/dist/collection/components/skeleton/skeleton.stories.js +0 -140
  257. package/dist/collection/components/skeleton/skeleton.stories.js.map +0 -1
  258. package/dist/collection/components/slider/slider.js.map +0 -1
  259. package/dist/collection/components/slider/slider.stories.js +0 -100
  260. package/dist/collection/components/slider/slider.stories.js.map +0 -1
  261. package/dist/collection/components/spacer/spacer.js.map +0 -1
  262. package/dist/collection/components/spacer/spacer.stories.js +0 -90
  263. package/dist/collection/components/spacer/spacer.stories.js.map +0 -1
  264. package/dist/collection/components/spinner/spinner.js.map +0 -1
  265. package/dist/collection/components/spinner/spinner.stories.js +0 -88
  266. package/dist/collection/components/spinner/spinner.stories.js.map +0 -1
  267. package/dist/collection/components/stack/stack.js.map +0 -1
  268. package/dist/collection/components/stack/stack.stories.js +0 -121
  269. package/dist/collection/components/stack/stack.stories.js.map +0 -1
  270. package/dist/collection/components/stepper/step.js.map +0 -1
  271. package/dist/collection/components/stepper/step.stories.js +0 -4
  272. package/dist/collection/components/stepper/step.stories.js.map +0 -1
  273. package/dist/collection/components/stepper/stepper.js.map +0 -1
  274. package/dist/collection/components/stepper/stepper.stories.js +0 -130
  275. package/dist/collection/components/stepper/stepper.stories.js.map +0 -1
  276. package/dist/collection/components/switch-group/switch-group.js.map +0 -1
  277. package/dist/collection/components/switch-group/switch-group.stories.js +0 -132
  278. package/dist/collection/components/switch-group/switch-group.stories.js.map +0 -1
  279. package/dist/collection/components/switch-group/switch-option.js.map +0 -1
  280. package/dist/collection/components/switch-group/switch-option.stories.js +0 -4
  281. package/dist/collection/components/switch-group/switch-option.stories.js.map +0 -1
  282. package/dist/collection/components/table/table.js.map +0 -1
  283. package/dist/collection/components/table/table.stories.js +0 -147
  284. package/dist/collection/components/table/table.stories.js.map +0 -1
  285. package/dist/collection/components/tabs/tab-panel.js.map +0 -1
  286. package/dist/collection/components/tabs/tab-panel.stories.js +0 -4
  287. package/dist/collection/components/tabs/tab-panel.stories.js.map +0 -1
  288. package/dist/collection/components/tabs/tabs.js.map +0 -1
  289. package/dist/collection/components/tabs/tabs.stories.js +0 -187
  290. package/dist/collection/components/tabs/tabs.stories.js.map +0 -1
  291. package/dist/collection/components/textarea/textarea.js.map +0 -1
  292. package/dist/collection/components/textarea/textarea.stories.js +0 -130
  293. package/dist/collection/components/textarea/textarea.stories.js.map +0 -1
  294. package/dist/collection/components/toast/toast.js.map +0 -1
  295. package/dist/collection/components/toast/toast.stories.js +0 -91
  296. package/dist/collection/components/toast/toast.stories.js.map +0 -1
  297. package/dist/collection/components/toggle/toggle.js.map +0 -1
  298. package/dist/collection/components/toggle/toggle.stories.js +0 -145
  299. package/dist/collection/components/toggle/toggle.stories.js.map +0 -1
  300. package/dist/collection/components/toolbar/toolbar.js.map +0 -1
  301. package/dist/collection/components/toolbar/toolbar.stories.js +0 -131
  302. package/dist/collection/components/toolbar/toolbar.stories.js.map +0 -1
  303. package/dist/collection/components/tooltip/tooltip.js.map +0 -1
  304. package/dist/collection/components/tooltip/tooltip.stories.js +0 -186
  305. package/dist/collection/components/tooltip/tooltip.stories.js.map +0 -1
  306. package/dist/collection/components/tree/tree-item.js.map +0 -1
  307. package/dist/collection/components/tree/tree-item.stories.js +0 -4
  308. package/dist/collection/components/tree/tree-item.stories.js.map +0 -1
  309. package/dist/collection/components/tree/tree.js.map +0 -1
  310. package/dist/collection/components/tree/tree.stories.js +0 -121
  311. package/dist/collection/components/tree/tree.stories.js.map +0 -1
  312. package/dist/collection/index.js.map +0 -1
  313. package/dist/collection/theme/tokens.js.map +0 -1
  314. package/dist/collection/types/index.js.map +0 -1
  315. package/dist/collection/utils/aria.js.map +0 -1
  316. package/dist/collection/utils/dom.js.map +0 -1
  317. package/dist/collection/utils/events.js.map +0 -1
  318. package/dist/components/index.js.map +0 -1
  319. package/dist/components/p-6RDSLDuS.js +0 -2
  320. package/dist/components/p-6RDSLDuS.js.map +0 -1
  321. package/dist/components/p-B0ZXNFSa.js.map +0 -1
  322. package/dist/components/p-BCgm2utU.js +0 -2
  323. package/dist/components/p-BCgm2utU.js.map +0 -1
  324. package/dist/components/p-BFN5hUo4.js +0 -2
  325. package/dist/components/p-BFN5hUo4.js.map +0 -1
  326. package/dist/components/p-BOxYojS-.js.map +0 -1
  327. package/dist/components/p-BP-fZfRb.js.map +0 -1
  328. package/dist/components/p-B_NL55YI.js.map +0 -1
  329. package/dist/components/p-BcoU0ISN.js.map +0 -1
  330. package/dist/components/p-BdzH6wlc.js.map +0 -1
  331. package/dist/components/p-BeErYjKz.js +0 -2
  332. package/dist/components/p-BeErYjKz.js.map +0 -1
  333. package/dist/components/p-BjiDgszq.js.map +0 -1
  334. package/dist/components/p-BjyTgfXe.js +0 -2
  335. package/dist/components/p-BjyTgfXe.js.map +0 -1
  336. package/dist/components/p-BlZHjan9.js +0 -2
  337. package/dist/components/p-BlZHjan9.js.map +0 -1
  338. package/dist/components/p-C7JaUlNB.js.map +0 -1
  339. package/dist/components/p-C8wd1644.js.map +0 -1
  340. package/dist/components/p-CEQXPxzU.js.map +0 -1
  341. package/dist/components/p-CGh7W07E.js +0 -2
  342. package/dist/components/p-CGh7W07E.js.map +0 -1
  343. package/dist/components/p-CHtE5caV.js +0 -2
  344. package/dist/components/p-CHtE5caV.js.map +0 -1
  345. package/dist/components/p-CSNeA_zh.js +0 -2
  346. package/dist/components/p-CSNeA_zh.js.map +0 -1
  347. package/dist/components/p-CbHlJvjF.js +0 -2
  348. package/dist/components/p-CbHlJvjF.js.map +0 -1
  349. package/dist/components/p-CkQOAizb.js +0 -2
  350. package/dist/components/p-CkQOAizb.js.map +0 -1
  351. package/dist/components/p-Cy_Ad-Jy.js.map +0 -1
  352. package/dist/components/p-DD986daz.js.map +0 -1
  353. package/dist/components/p-DFnNsZtI.js +0 -2
  354. package/dist/components/p-DFnNsZtI.js.map +0 -1
  355. package/dist/components/p-DMPxu5Po.js.map +0 -1
  356. package/dist/components/p-DMuI5d5r.js +0 -2
  357. package/dist/components/p-DMuI5d5r.js.map +0 -1
  358. package/dist/components/p-DPQ1o4MP.js +0 -2
  359. package/dist/components/p-DPQ1o4MP.js.map +0 -1
  360. package/dist/components/p-DTAVTqnc.js.map +0 -1
  361. package/dist/components/p-DhQ7X_TL.js.map +0 -1
  362. package/dist/components/p-DkpyRqHf.js.map +0 -1
  363. package/dist/components/p-DlB-KfKY.js +0 -2
  364. package/dist/components/p-DlB-KfKY.js.map +0 -1
  365. package/dist/components/p-DooMF1E0.js.map +0 -1
  366. package/dist/components/p-DwJ7Jt3k.js.map +0 -1
  367. package/dist/components/p-DwUH8YQW.js.map +0 -1
  368. package/dist/components/p-Fot2uNwg.js.map +0 -1
  369. package/dist/components/p-O8aQgWRZ.js.map +0 -1
  370. package/dist/components/p-SopsdO_f.js.map +0 -1
  371. package/dist/components/p-TFHAUMKT.js +0 -2
  372. package/dist/components/p-TFHAUMKT.js.map +0 -1
  373. package/dist/components/p-faVXXwqR.js.map +0 -1
  374. package/dist/components/p-lpqZSiIf.js.map +0 -1
  375. package/dist/components/p-mfB_pP4L.js +0 -2
  376. package/dist/components/p-mfB_pP4L.js.map +0 -1
  377. package/dist/components/p-v-L32wKy.js.map +0 -1
  378. package/dist/components/p-zveaarwa.js.map +0 -1
  379. package/dist/components/ts-accordion-item.js.map +0 -1
  380. package/dist/components/ts-accordion.js.map +0 -1
  381. package/dist/components/ts-alert.js.map +0 -1
  382. package/dist/components/ts-avatar.js.map +0 -1
  383. package/dist/components/ts-badge.js.map +0 -1
  384. package/dist/components/ts-banner.js.map +0 -1
  385. package/dist/components/ts-breadcrumb-item.js.map +0 -1
  386. package/dist/components/ts-breadcrumb.js.map +0 -1
  387. package/dist/components/ts-button.js.map +0 -1
  388. package/dist/components/ts-card.js.map +0 -1
  389. package/dist/components/ts-checkbox.js.map +0 -1
  390. package/dist/components/ts-chip.js.map +0 -1
  391. package/dist/components/ts-container.js.map +0 -1
  392. package/dist/components/ts-date-picker.js.map +0 -1
  393. package/dist/components/ts-dialog.js.map +0 -1
  394. package/dist/components/ts-divider.js.map +0 -1
  395. package/dist/components/ts-drawer.js.map +0 -1
  396. package/dist/components/ts-empty-state.js.map +0 -1
  397. package/dist/components/ts-file-upload.js.map +0 -1
  398. package/dist/components/ts-grid.js.map +0 -1
  399. package/dist/components/ts-icon.js.map +0 -1
  400. package/dist/components/ts-input.js.map +0 -1
  401. package/dist/components/ts-menu-item.js.map +0 -1
  402. package/dist/components/ts-menu.js.map +0 -1
  403. package/dist/components/ts-modal.js.map +0 -1
  404. package/dist/components/ts-nav-item.js.map +0 -1
  405. package/dist/components/ts-nav.js.map +0 -1
  406. package/dist/components/ts-pagination.js.map +0 -1
  407. package/dist/components/ts-popover.js.map +0 -1
  408. package/dist/components/ts-progress.js.map +0 -1
  409. package/dist/components/ts-radio.js.map +0 -1
  410. package/dist/components/ts-row.js.map +0 -1
  411. package/dist/components/ts-select.js.map +0 -1
  412. package/dist/components/ts-skeleton.js.map +0 -1
  413. package/dist/components/ts-slider.js.map +0 -1
  414. package/dist/components/ts-spacer.js.map +0 -1
  415. package/dist/components/ts-spinner.js.map +0 -1
  416. package/dist/components/ts-stack.js.map +0 -1
  417. package/dist/components/ts-step.js.map +0 -1
  418. package/dist/components/ts-stepper.js.map +0 -1
  419. package/dist/components/ts-switch-group.js.map +0 -1
  420. package/dist/components/ts-switch-option.js.map +0 -1
  421. package/dist/components/ts-tab-panel.js.map +0 -1
  422. package/dist/components/ts-table.js.map +0 -1
  423. package/dist/components/ts-tabs.js.map +0 -1
  424. package/dist/components/ts-textarea.js.map +0 -1
  425. package/dist/components/ts-toast.js.map +0 -1
  426. package/dist/components/ts-toggle.js.map +0 -1
  427. package/dist/components/ts-toolbar.js.map +0 -1
  428. package/dist/components/ts-tooltip.js.map +0 -1
  429. package/dist/components/ts-tree-item.js.map +0 -1
  430. package/dist/components/ts-tree.js.map +0 -1
  431. package/dist/components.json +0 -12678
  432. package/dist/esm/aria-lpqZSiIf.js.map +0 -1
  433. package/dist/esm/index-V8-ENixA.js.map +0 -1
  434. package/dist/esm/index.js.map +0 -1
  435. package/dist/esm/loader.js.map +0 -1
  436. package/dist/esm/lucide-BOxYojS-.js.map +0 -1
  437. package/dist/esm/tessera-ui.js.map +0 -1
  438. package/dist/esm/ts-accordion-item.entry.js.map +0 -1
  439. package/dist/esm/ts-accordion.entry.js.map +0 -1
  440. package/dist/esm/ts-alert.entry.js.map +0 -1
  441. package/dist/esm/ts-avatar.entry.js.map +0 -1
  442. package/dist/esm/ts-badge.entry.js.map +0 -1
  443. package/dist/esm/ts-banner.entry.js.map +0 -1
  444. package/dist/esm/ts-breadcrumb-item.entry.js.map +0 -1
  445. package/dist/esm/ts-breadcrumb.entry.js.map +0 -1
  446. package/dist/esm/ts-button.entry.js.map +0 -1
  447. package/dist/esm/ts-card.entry.js.map +0 -1
  448. package/dist/esm/ts-checkbox.entry.js.map +0 -1
  449. package/dist/esm/ts-chip.entry.js.map +0 -1
  450. package/dist/esm/ts-container.entry.js.map +0 -1
  451. package/dist/esm/ts-date-picker.entry.js.map +0 -1
  452. package/dist/esm/ts-dialog.entry.js.map +0 -1
  453. package/dist/esm/ts-divider.entry.js.map +0 -1
  454. package/dist/esm/ts-drawer.entry.js.map +0 -1
  455. package/dist/esm/ts-empty-state.entry.js.map +0 -1
  456. package/dist/esm/ts-file-upload.entry.js.map +0 -1
  457. package/dist/esm/ts-grid.entry.js.map +0 -1
  458. package/dist/esm/ts-icon-Jz9ioZag.js.map +0 -1
  459. package/dist/esm/ts-icon.entry.js.map +0 -1
  460. package/dist/esm/ts-input.entry.js.map +0 -1
  461. package/dist/esm/ts-menu-item.entry.js.map +0 -1
  462. package/dist/esm/ts-menu.entry.js.map +0 -1
  463. package/dist/esm/ts-modal.entry.js.map +0 -1
  464. package/dist/esm/ts-nav-item.entry.js.map +0 -1
  465. package/dist/esm/ts-nav.entry.js.map +0 -1
  466. package/dist/esm/ts-pagination.entry.js.map +0 -1
  467. package/dist/esm/ts-popover.entry.js.map +0 -1
  468. package/dist/esm/ts-progress.entry.js.map +0 -1
  469. package/dist/esm/ts-radio.entry.js.map +0 -1
  470. package/dist/esm/ts-row.entry.js.map +0 -1
  471. package/dist/esm/ts-select.entry.js.map +0 -1
  472. package/dist/esm/ts-skeleton.entry.js.map +0 -1
  473. package/dist/esm/ts-slider.entry.js.map +0 -1
  474. package/dist/esm/ts-spacer.entry.js.map +0 -1
  475. package/dist/esm/ts-spinner.entry.js.map +0 -1
  476. package/dist/esm/ts-stack.entry.js.map +0 -1
  477. package/dist/esm/ts-step.entry.js.map +0 -1
  478. package/dist/esm/ts-stepper.entry.js.map +0 -1
  479. package/dist/esm/ts-switch-group.entry.js.map +0 -1
  480. package/dist/esm/ts-switch-option.entry.js.map +0 -1
  481. package/dist/esm/ts-tab-panel.entry.js.map +0 -1
  482. package/dist/esm/ts-table.entry.js.map +0 -1
  483. package/dist/esm/ts-tabs.entry.js.map +0 -1
  484. package/dist/esm/ts-textarea.entry.js.map +0 -1
  485. package/dist/esm/ts-toast.entry.js.map +0 -1
  486. package/dist/esm/ts-toggle.entry.js.map +0 -1
  487. package/dist/esm/ts-toolbar.entry.js.map +0 -1
  488. package/dist/esm/ts-tooltip.entry.js.map +0 -1
  489. package/dist/esm/ts-tree-item.entry.js.map +0 -1
  490. package/dist/esm/ts-tree.entry.js.map +0 -1
  491. package/dist/tessera-ui/index.esm.js.map +0 -1
  492. package/dist/tessera-ui/p-0424cd55.entry.js.map +0 -1
  493. package/dist/tessera-ui/p-04522bf9.entry.js.map +0 -1
  494. package/dist/tessera-ui/p-04aa8b90.entry.js.map +0 -1
  495. package/dist/tessera-ui/p-080eaf89.entry.js.map +0 -1
  496. package/dist/tessera-ui/p-0ec061e5.entry.js.map +0 -1
  497. package/dist/tessera-ui/p-122e43b7.entry.js.map +0 -1
  498. package/dist/tessera-ui/p-16bb8ca8.entry.js.map +0 -1
  499. package/dist/tessera-ui/p-16fc632b.entry.js.map +0 -1
  500. package/dist/tessera-ui/p-1d73f6c9.entry.js.map +0 -1
  501. package/dist/tessera-ui/p-24305379.entry.js.map +0 -1
  502. package/dist/tessera-ui/p-25f77cc9.entry.js.map +0 -1
  503. package/dist/tessera-ui/p-35eb8496.entry.js.map +0 -1
  504. package/dist/tessera-ui/p-3aec66b4.entry.js.map +0 -1
  505. package/dist/tessera-ui/p-4277460b.entry.js.map +0 -1
  506. package/dist/tessera-ui/p-441310f7.entry.js.map +0 -1
  507. package/dist/tessera-ui/p-491e1a75.entry.js.map +0 -1
  508. package/dist/tessera-ui/p-50d092ce.entry.js.map +0 -1
  509. package/dist/tessera-ui/p-50efadf3.entry.js.map +0 -1
  510. package/dist/tessera-ui/p-53846d59.entry.js.map +0 -1
  511. package/dist/tessera-ui/p-56f2b070.entry.js.map +0 -1
  512. package/dist/tessera-ui/p-6760f922.entry.js.map +0 -1
  513. package/dist/tessera-ui/p-69bb11ed.entry.js.map +0 -1
  514. package/dist/tessera-ui/p-6d35a60c.entry.js.map +0 -1
  515. package/dist/tessera-ui/p-6ec285ad.entry.js.map +0 -1
  516. package/dist/tessera-ui/p-708d4eb5.entry.js.map +0 -1
  517. package/dist/tessera-ui/p-79ff8ceb.entry.js.map +0 -1
  518. package/dist/tessera-ui/p-7e531195.entry.js.map +0 -1
  519. package/dist/tessera-ui/p-7fa64f00.entry.js.map +0 -1
  520. package/dist/tessera-ui/p-829c4307.entry.js.map +0 -1
  521. package/dist/tessera-ui/p-91ccef3f.entry.js.map +0 -1
  522. package/dist/tessera-ui/p-9209e603.entry.js.map +0 -1
  523. package/dist/tessera-ui/p-97a9def7.entry.js.map +0 -1
  524. package/dist/tessera-ui/p-9b41b538.entry.js.map +0 -1
  525. package/dist/tessera-ui/p-9c0504fd.entry.js.map +0 -1
  526. package/dist/tessera-ui/p-BOxYojS-.js.map +0 -1
  527. package/dist/tessera-ui/p-StBQmS8h.js.map +0 -1
  528. package/dist/tessera-ui/p-V8-ENixA.js.map +0 -1
  529. package/dist/tessera-ui/p-a120b5d6.entry.js.map +0 -1
  530. package/dist/tessera-ui/p-a55a5695.entry.js.map +0 -1
  531. package/dist/tessera-ui/p-a83d903e.entry.js.map +0 -1
  532. package/dist/tessera-ui/p-adc807dc.entry.js.map +0 -1
  533. package/dist/tessera-ui/p-b09f202c.entry.js.map +0 -1
  534. package/dist/tessera-ui/p-b1182592.entry.js.map +0 -1
  535. package/dist/tessera-ui/p-b3f60955.entry.js.map +0 -1
  536. package/dist/tessera-ui/p-bb9ebbd8.entry.js.map +0 -1
  537. package/dist/tessera-ui/p-bce40715.entry.js.map +0 -1
  538. package/dist/tessera-ui/p-c35c7049.entry.js.map +0 -1
  539. package/dist/tessera-ui/p-c59ecffa.entry.js.map +0 -1
  540. package/dist/tessera-ui/p-d318774a.entry.js.map +0 -1
  541. package/dist/tessera-ui/p-d5cbadd6.entry.js.map +0 -1
  542. package/dist/tessera-ui/p-e1d2b141.entry.js.map +0 -1
  543. package/dist/tessera-ui/p-f0bf6408.entry.js.map +0 -1
  544. package/dist/tessera-ui/p-f639213a.entry.js.map +0 -1
  545. package/dist/tessera-ui/p-fd2376e0.entry.js.map +0 -1
  546. package/dist/tessera-ui/p-fef9a993.entry.js.map +0 -1
  547. package/dist/tessera-ui/p-lpqZSiIf.js.map +0 -1
  548. package/dist/tessera-ui/tessera-ui.esm.js.map +0 -1
  549. package/dist/types/components/accordion/accordion-item.stories.d.ts +0 -5
  550. package/dist/types/components/accordion/accordion.stories.d.ts +0 -21
  551. package/dist/types/components/alert/alert.stories.d.ts +0 -34
  552. package/dist/types/components/avatar/avatar.stories.d.ts +0 -51
  553. package/dist/types/components/badge/badge.stories.d.ts +0 -50
  554. package/dist/types/components/banner/banner.stories.d.ts +0 -40
  555. package/dist/types/components/breadcrumb/breadcrumb-item.stories.d.ts +0 -5
  556. package/dist/types/components/breadcrumb/breadcrumb.stories.d.ts +0 -20
  557. package/dist/types/components/button/button.stories.d.ts +0 -73
  558. package/dist/types/components/card/card.stories.d.ts +0 -46
  559. package/dist/types/components/checkbox/checkbox.stories.d.ts +0 -58
  560. package/dist/types/components/chip/chip.stories.d.ts +0 -54
  561. package/dist/types/components/container/container.stories.d.ts +0 -21
  562. package/dist/types/components/date-picker/date-picker.stories.d.ts +0 -62
  563. package/dist/types/components/dialog/dialog.stories.d.ts +0 -39
  564. package/dist/types/components/divider/divider.stories.d.ts +0 -33
  565. package/dist/types/components/drawer/drawer.stories.d.ts +0 -43
  566. package/dist/types/components/empty-state/empty-state.stories.d.ts +0 -37
  567. package/dist/types/components/file-upload/file-upload.stories.d.ts +0 -43
  568. package/dist/types/components/grid/grid.stories.d.ts +0 -30
  569. package/dist/types/components/icon/icon.stories.d.ts +0 -42
  570. package/dist/types/components/input/input.stories.d.ts +0 -77
  571. package/dist/types/components/menu/menu-item.stories.d.ts +0 -5
  572. package/dist/types/components/menu/menu.stories.d.ts +0 -36
  573. package/dist/types/components/modal/modal.stories.d.ts +0 -47
  574. package/dist/types/components/nav/nav-item.stories.d.ts +0 -5
  575. package/dist/types/components/nav/nav.stories.d.ts +0 -27
  576. package/dist/types/components/pagination/pagination.stories.d.ts +0 -42
  577. package/dist/types/components/popover/popover.stories.d.ts +0 -38
  578. package/dist/types/components/progress/progress.stories.d.ts +0 -59
  579. package/dist/types/components/radio/radio.stories.d.ts +0 -48
  580. package/dist/types/components/row/row.stories.d.ts +0 -52
  581. package/dist/types/components/select/select.stories.d.ts +0 -73
  582. package/dist/types/components/skeleton/skeleton.stories.d.ts +0 -44
  583. package/dist/types/components/slider/slider.stories.d.ts +0 -62
  584. package/dist/types/components/spacer/spacer.stories.d.ts +0 -28
  585. package/dist/types/components/spinner/spinner.stories.d.ts +0 -33
  586. package/dist/types/components/stack/stack.stories.d.ts +0 -28
  587. package/dist/types/components/stepper/step.stories.d.ts +0 -5
  588. package/dist/types/components/stepper/stepper.stories.d.ts +0 -36
  589. package/dist/types/components/switch-group/switch-group.stories.d.ts +0 -37
  590. package/dist/types/components/switch-group/switch-option.stories.d.ts +0 -5
  591. package/dist/types/components/table/table.stories.d.ts +0 -45
  592. package/dist/types/components/tabs/tab-panel.stories.d.ts +0 -5
  593. package/dist/types/components/tabs/tabs.stories.d.ts +0 -34
  594. package/dist/types/components/textarea/textarea.stories.d.ts +0 -88
  595. package/dist/types/components/toast/toast.stories.d.ts +0 -48
  596. package/dist/types/components/toggle/toggle.stories.d.ts +0 -46
  597. package/dist/types/components/toolbar/toolbar.stories.d.ts +0 -28
  598. package/dist/types/components/tooltip/tooltip.stories.d.ts +0 -43
  599. package/dist/types/components/tree/tree-item.stories.d.ts +0 -5
  600. package/dist/types/components/tree/tree.stories.d.ts +0 -21
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-toast.entry.js","sources":["src/components/toast/toast.css?tag=ts-toast&encapsulation=shadow","src/components/toast/toast.tsx"],"sourcesContent":["/* ==========================================================================\n ts-toast — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-toast-radius Border radius\n --ts-toast-shadow Box shadow\n --ts-toast-max-width Maximum width\n ========================================================================== */\n\n:host {\n display: block;\n position: fixed;\n z-index: var(--ts-z-toast, 9000);\n font-family: var(--ts-font-family-base);\n pointer-events: none;\n\n --ts-toast-radius: var(--ts-radius-xl);\n --ts-toast-shadow: var(--ts-shadow-lg);\n --ts-toast-max-width: 420px;\n}\n\n/* ---- Positions ---- */\n:host([position=\"top-right\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-end: var(--ts-spacing-4);\n}\n\n:host([position=\"top-left\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-start: var(--ts-spacing-4);\n}\n\n:host([position=\"bottom-right\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-end: var(--ts-spacing-4);\n}\n\n:host([position=\"bottom-left\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-start: var(--ts-spacing-4);\n}\n\n:host([position=\"top-center\"]) {\n inset-block-start: var(--ts-spacing-4);\n inset-inline-start: 50%;\n transform: translateX(-50%);\n}\n\n:host([position=\"bottom-center\"]) {\n inset-block-end: var(--ts-spacing-4);\n inset-inline-start: 50%;\n transform: translateX(-50%);\n}\n\n/* ---- Base ---- */\n.toast__base {\n display: flex;\n align-items: flex-start;\n gap: var(--ts-spacing-3);\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n border-radius: var(--ts-toast-radius);\n box-shadow: var(--ts-toast-shadow);\n max-inline-size: var(--ts-toast-max-width);\n pointer-events: auto;\n border: 1px solid transparent;\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-normal);\n animation: ts-toast-slide-in 0.3s ease-out;\n}\n\n@keyframes ts-toast-slide-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* ---- Variants ---- */\n:host([variant=\"info\"]) .toast__base {\n background-color: var(--ts-color-info-bg);\n border-color: var(--ts-color-info-border);\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"success\"]) .toast__base {\n background-color: var(--ts-color-success-bg);\n border-color: var(--ts-color-success-border);\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) .toast__base {\n background-color: var(--ts-color-warning-bg);\n border-color: var(--ts-color-warning-border);\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) .toast__base {\n background-color: var(--ts-color-danger-bg);\n border-color: var(--ts-color-danger-border);\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"neutral\"]) .toast__base {\n background-color: var(--ts-color-bg-subtle);\n border-color: var(--ts-color-border-subtle);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Icon ---- */\n.toast__icon {\n display: flex;\n align-items: center;\n font-size: 1.15em;\n flex-shrink: 0;\n margin-block-start: 1px;\n}\n\n/* ---- Message ---- */\n.toast__message {\n flex: 1;\n min-inline-size: 0;\n}\n\n/* ---- Action ---- */\n.toast__action {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.toast__action:empty {\n display: none;\n}\n\n/* ---- Close button ---- */\n.toast__close {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n inline-size: 1.5rem;\n block-size: 1.5rem;\n border: none;\n border-radius: var(--ts-radius-sm);\n background: transparent;\n color: currentColor;\n opacity: 0.6;\n cursor: pointer;\n font-size: 0.8em;\n transition: opacity var(--ts-transition-fast);\n padding: 0;\n line-height: 1;\n}\n\n.toast__close:hover {\n opacity: 1;\n}\n\n.toast__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n opacity: 1;\n}\n","import { Component, Prop, Event, State, h, Host, Watch, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\ntype TsToastVariant = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\ntype TsToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n\n/**\n * @slot - Default slot for message content.\n * @slot action - Optional action button.\n *\n * @part base - The toast container.\n * @part icon - The variant icon wrapper.\n * @part message - The message wrapper.\n * @part action - The action slot wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-toast',\n styleUrl: 'toast.css',\n shadow: true,\n})\nexport class TsToast {\n private autoCloseTimer?: ReturnType<typeof setTimeout>;\n\n /** The toast's visual variant. */\n @Prop({ reflect: true }) variant: TsToastVariant = 'info';\n\n /** Auto-dismiss duration in ms. Set 0 to disable. */\n @Prop() duration = 5000;\n\n /** Whether the toast shows a close button. */\n @Prop() dismissible = true;\n\n /** Whether the toast is visible. */\n @Prop({ reflect: true, mutable: true }) open = false;\n\n /** Position of the toast on screen. */\n @Prop({ reflect: true }) position: TsToastPosition = 'top-right';\n\n /** Emitted when the toast is dismissed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n @State() isVisible = false;\n\n @Watch('open')\n handleOpenChange(newValue: boolean): void {\n if (newValue) {\n this.isVisible = true;\n this.startAutoClose();\n } else {\n this.isVisible = false;\n this.clearAutoClose();\n }\n }\n\n connectedCallback(): void {\n if (this.open) {\n this.isVisible = true;\n this.startAutoClose();\n }\n }\n\n disconnectedCallback(): void {\n this.clearAutoClose();\n }\n\n /** Programmatically close the toast. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n this.isVisible = false;\n this.clearAutoClose();\n this.tsClose.emit();\n }\n\n /** Programmatically show the toast. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n private startAutoClose(): void {\n this.clearAutoClose();\n if (this.duration > 0) {\n this.autoCloseTimer = setTimeout(() => {\n this.close();\n }, this.duration);\n }\n }\n\n private clearAutoClose(): void {\n if (this.autoCloseTimer) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = undefined;\n }\n }\n\n private handleClose = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderIcon() {\n const icons: Record<string, string> = {\n info: '\\u2139',\n success: '\\u2713',\n warning: '\\u26A0',\n danger: '\\u2715',\n neutral: '\\u2139',\n };\n return <span class=\"toast__icon-symbol\" aria-hidden=\"true\">{icons[this.variant] || '\\u2139'}</span>;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n if (!this.isVisible) return null;\n\n const ariaLive = this.variant === 'danger' ? 'assertive' : 'polite';\n\n return (\n <Host\n class={{\n 'ts-toast': true,\n [`ts-toast--${this.variant}`]: true,\n [`ts-toast--${this.position}`]: true,\n 'ts-toast--open': this.isVisible,\n }}\n role=\"status\"\n aria-live={ariaLive}\n >\n <div class=\"toast__base\" part=\"base\">\n <div class=\"toast__icon\" part=\"icon\">\n {this.renderIcon()}\n </div>\n\n <div class=\"toast__message\" part=\"message\">\n <slot />\n </div>\n\n <div class=\"toast__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n\n {this.dismissible && (\n <button\n class=\"toast__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={this.handleClose}\n >\n \\u2715\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-toggle.entry.js","sources":["src/components/toggle/toggle.css?tag=ts-toggle&encapsulation=shadow","src/components/toggle/toggle.tsx"],"sourcesContent":["/* ==========================================================================\n ts-toggle — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-toggle-track-bg Unchecked track background\n --ts-toggle-track-bg-checked Checked track background\n --ts-toggle-thumb-bg Thumb background\n --ts-toggle-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: inline-block;\n font-family: var(--ts-font-family-base);\n\n --ts-toggle-track-bg: var(--ts-color-neutral-200);\n --ts-toggle-track-bg-checked: var(--ts-color-primary-600);\n --ts-toggle-thumb-bg: var(--ts-color-bg-elevated);\n --ts-toggle-focus-ring: var(--ts-focus-ring);\n}\n\n.toggle__base {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n cursor: pointer;\n outline: none;\n}\n\n.toggle__base:focus-visible .toggle__track {\n box-shadow: var(--ts-toggle-focus-ring);\n}\n\n:host(.ts-toggle--disabled) .toggle__base {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Track (M3 — outlined when unchecked) ---- */\n.toggle__track {\n position: relative;\n background-color: var(--ts-toggle-track-bg);\n border-radius: var(--ts-radius-full);\n border: 2px solid var(--ts-color-border-default);\n box-shadow: none;\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n flex-shrink: 0;\n}\n\n:host(.ts-toggle--checked) .toggle__track {\n background-color: var(--ts-toggle-track-bg-checked);\n border-color: var(--ts-toggle-track-bg-checked);\n box-shadow: none;\n}\n\n/* ---- Thumb ---- */\n.toggle__thumb {\n position: absolute;\n top: 50%;\n transform: translateY(-50%) scale(1);\n background-color: var(--ts-toggle-thumb-bg);\n border-radius: var(--ts-radius-full);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n transition:\n inset-inline-start var(--ts-transition-fast),\n transform var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n:host(.ts-toggle--checked) .toggle__thumb {\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .toggle__track { width: 32px; height: 18px; }\n:host([size=\"sm\"]) .toggle__thumb { width: 14px; height: 14px; inset-inline-start: 2px; }\n:host(.ts-toggle--checked[size=\"sm\"]) .toggle__thumb { inset-inline-start: 16px; }\n\n:host([size=\"md\"]) .toggle__track { width: 40px; height: 22px; }\n:host([size=\"md\"]) .toggle__thumb { width: 18px; height: 18px; inset-inline-start: 2px; }\n:host(.ts-toggle--checked[size=\"md\"]) .toggle__thumb { inset-inline-start: 20px; }\n\n:host([size=\"lg\"]) .toggle__track { width: 50px; height: 28px; }\n:host([size=\"lg\"]) .toggle__thumb { width: 24px; height: 24px; inset-inline-start: 2px; }\n:host(.ts-toggle--checked[size=\"lg\"]) .toggle__thumb { inset-inline-start: 24px; }\n\n/* ---- Label ---- */\n.toggle__label {\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n cursor: inherit;\n user-select: none;\n}\n\n:host([size=\"lg\"]) .toggle__label {\n font-size: var(--ts-font-size-md);\n}\n","import { Component, Prop, Event, h, Host, Element, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsToggleEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot - Default slot for the toggle label.\n *\n * @part base - The toggle container.\n * @part track - The toggle track.\n * @part thumb - The toggle thumb/knob.\n * @part label - The label wrapper.\n */\n@Component({\n tag: 'ts-toggle',\n styleUrl: 'toggle.css',\n shadow: true,\n})\nexport class TsToggle {\n @Element() hostEl!: HTMLElement;\n\n private inputId = generateId('ts-toggle');\n\n /** Whether the toggle is checked. */\n @Prop({ mutable: true, reflect: true }) checked = false;\n\n /** The toggle's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Renders the toggle as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Name for form submission. */\n @Prop() name?: string;\n\n /** Value for form submission. */\n @Prop() value?: string;\n\n /** Emitted when the toggle state changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsToggleEventDetail>;\n\n /** Programmatically toggle the checked state. */\n @Method()\n async toggle(): Promise<void> {\n if (!this.disabled) {\n this.checked = !this.checked;\n this.tsChange.emit({ checked: this.checked });\n }\n }\n\n private handleClick = (): void => {\n this.toggle();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.toggle();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-toggle': true,\n [`ts-toggle--${this.size}`]: true,\n 'ts-toggle--checked': this.checked,\n 'ts-toggle--disabled': this.disabled,\n }}\n >\n <div\n class=\"toggle__base\"\n part=\"base\"\n role=\"switch\"\n aria-checked={this.checked ? 'true' : 'false'}\n aria-disabled={this.disabled ? 'true' : undefined}\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"toggle__track\" part=\"track\">\n <div class=\"toggle__thumb\" part=\"thumb\" />\n </div>\n\n <label class=\"toggle__label\" part=\"label\" id={`${this.inputId}-label`}>\n <slot />\n </label>\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;;AAAA,MAAM,SAAS,GAAG,MAAM,CAAC,otEAAotE,CAAC;;MCkBjuE,QAAQ,GAAA,MAAA;;;;;;AAGX,IAAA,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC;;IAGD,OAAO,GAAG,KAAK;;IAG9B,IAAI,GAAW,IAAI;;IAGnB,QAAQ,GAAG,KAAK;;AAGjC,IAAA,IAAI;;AAGJ,IAAA,KAAK;;AAGqB,IAAA,QAAQ;;AAI1C,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO;AAC5B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;;IAIzC,WAAW,GAAG,MAAW;QAC/B,IAAI,CAAC,MAAM,EAAE;AACf,KAAC;AAEO,IAAA,aAAa,GAAG,CAAC,KAAoB,KAAU;AACrD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,EAAE;;AAEjB,KAAC;;IAGD,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,CAAC,cAAc,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;gBACjC,oBAAoB,EAAE,IAAI,CAAC,OAAO;gBAClC,qBAAqB,EAAE,IAAI,CAAC,QAAQ;AACrC,aAAA,EAAA,EAED,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,cAAc,EACpB,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,QAAQ,EAAA,cAAA,EACC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,EAAA,eAAA,EAC9B,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,EACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,SAAS,EAAE,IAAI,CAAC,aAAa,EAAA,EAE7B,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,EAAA,EACrC,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,GAAG,CACtC,EAEN,CAAA,CAAA,OAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAO,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,EAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA,MAAA,CAAQ,EAAA,EACnE,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACF,CACJ,CACD;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-toolbar.entry.js","sources":["src/components/toolbar/toolbar.css?tag=ts-toolbar&encapsulation=shadow","src/components/toolbar/toolbar.tsx"],"sourcesContent":["/* ==========================================================================\n ts-toolbar — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-toolbar-bg Background color\n --ts-toolbar-border-color Border color\n --ts-toolbar-padding Padding\n --ts-toolbar-gap Gap between items\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-toolbar-bg: var(--ts-color-bg-surface);\n --ts-toolbar-border-color: var(--ts-color-border-subtle);\n --ts-toolbar-padding: var(--ts-spacing-3);\n --ts-toolbar-gap: var(--ts-spacing-2);\n}\n\n.toolbar__base {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n padding-inline: var(--ts-toolbar-padding);\n padding-block: var(--ts-toolbar-padding);\n background-color: var(--ts-toolbar-bg);\n}\n\n/* ---- Variants ---- */\n:host([variant=\"bordered\"]) .toolbar__base {\n border-block-end: 1px solid var(--ts-toolbar-border-color);\n}\n\n:host([variant=\"elevated\"]) .toolbar__base {\n box-shadow: var(--ts-shadow-sm);\n border-radius: var(--ts-radius-md);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-2);\n padding-block: var(--ts-spacing-1);\n gap: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-3);\n padding-block: var(--ts-spacing-2);\n gap: var(--ts-spacing-2);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .toolbar__base {\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-3);\n gap: var(--ts-spacing-3);\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Layout sections ---- */\n.toolbar__start {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex-shrink: 0;\n}\n\n.toolbar__center {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex: 1;\n min-inline-size: 0;\n}\n\n.toolbar__end {\n display: flex;\n align-items: center;\n gap: var(--ts-toolbar-gap);\n flex-shrink: 0;\n margin-inline-start: auto;\n}\n\n.toolbar__start:empty,\n.toolbar__end:empty {\n display: none;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @slot - Default slot for toolbar items (center).\n * @slot start - Left/start-aligned items.\n * @slot end - Right/end-aligned items.\n *\n * @part base - The toolbar container.\n * @part start - The start slot wrapper.\n * @part center - The center/default slot wrapper.\n * @part end - The end slot wrapper.\n */\n@Component({\n tag: 'ts-toolbar',\n styleUrl: 'toolbar.css',\n shadow: true,\n})\nexport class TsToolbar {\n /** The toolbar variant style. */\n @Prop({ reflect: true }) variant: 'default' | 'bordered' | 'elevated' = 'default';\n\n /** The toolbar size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-toolbar': true,\n [`ts-toolbar--${this.variant}`]: true,\n [`ts-toolbar--${this.size}`]: true,\n }}\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n >\n <div class=\"toolbar__base\" part=\"base\">\n <div class=\"toolbar__start\" part=\"start\">\n <slot name=\"start\" />\n </div>\n\n <div class=\"toolbar__center\" part=\"center\">\n <slot />\n </div>\n\n <div class=\"toolbar__end\" part=\"end\">\n <slot name=\"end\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,GAAG,MAAM,CAAC,+7CAA+7C,CAAC;;MCkB78C,SAAS,GAAA,MAAA;;;;;IAEK,OAAO,GAAwC,SAAS;;IAGxD,IAAI,GAAW,IAAI;;IAG5C,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE;AACL,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,CAAC,eAAe,IAAI,CAAC,OAAO,CAAA,CAAE,GAAG,IAAI;AACrC,gBAAA,CAAC,eAAe,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,IAAI;AACnC,aAAA,EACD,IAAI,EAAC,SAAS,EAAA,kBAAA,EACG,YAAY,EAAA,EAE7B,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM,EAAA,EACpC,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,gBAAgB,EAAC,IAAI,EAAC,OAAO,EAAA,EACtC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,OAAO,EAAA,CAAG,CACjB,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,iBAAiB,EAAC,IAAI,EAAC,QAAQ,EAAA,EACxC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACJ,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,KAAK,EAAA,EAClC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,KAAK,EAAA,CAAG,CACf,CACF,CACD;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-tooltip.entry.js","sources":["src/components/tooltip/tooltip.css?tag=ts-tooltip&encapsulation=shadow","src/components/tooltip/tooltip.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tooltip — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-tooltip-bg Popup background\n --ts-tooltip-color Popup text color\n --ts-tooltip-radius Popup border radius\n ========================================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-tooltip-bg: var(--ts-ref-neutral-900);\n --ts-tooltip-color: #ffffff;\n --ts-tooltip-radius: var(--ts-shape-badge);\n}\n\n.tooltip__trigger {\n display: inline-block;\n}\n\n/* ---- Popup ---- */\n.tooltip__popup {\n position: absolute;\n z-index: var(--ts-z-tooltip);\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n background-color: var(--ts-tooltip-bg);\n color: var(--ts-tooltip-color);\n font-size: var(--ts-font-size-xs);\n font-weight: var(--ts-font-weight-medium);\n line-height: var(--ts-line-height-normal);\n border-radius: var(--ts-tooltip-radius);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n}\n\n.tooltip__popup--visible {\n opacity: 1;\n transform: scale(1);\n}\n\n/* ---- Placements ---- */\n.tooltip__popup--top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform-origin: bottom center;\n}\n.tooltip__popup--top,\n.tooltip__popup--top-start,\n.tooltip__popup--top-end {\n bottom: calc(100% + 8px);\n}\n.tooltip__popup--top { left: 50%; margin-left: -50%; }\n.tooltip__popup--top-start { inset-inline-start: 0; }\n.tooltip__popup--top-end { inset-inline-end: 0; }\n\n.tooltip__popup--bottom,\n.tooltip__popup--bottom-start,\n.tooltip__popup--bottom-end {\n top: calc(100% + 8px);\n}\n.tooltip__popup--bottom { left: 50%; margin-left: -50%; }\n.tooltip__popup--bottom-start { inset-inline-start: 0; }\n.tooltip__popup--bottom-end { inset-inline-end: 0; }\n\n.tooltip__popup--left,\n.tooltip__popup--left-start,\n.tooltip__popup--left-end {\n inset-inline-end: calc(100% + 8px);\n}\n.tooltip__popup--left { top: 50%; transform: translateY(-50%) scale(0.95); }\n.tooltip__popup--left.tooltip__popup--visible { transform: translateY(-50%) scale(1); }\n\n.tooltip__popup--right,\n.tooltip__popup--right-start,\n.tooltip__popup--right-end {\n inset-inline-start: calc(100% + 8px);\n}\n.tooltip__popup--right { top: 50%; transform: translateY(-50%) scale(0.95); }\n.tooltip__popup--right.tooltip__popup--visible { transform: translateY(-50%) scale(1); }\n\n/* ---- Arrow ---- */\n.tooltip__arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--ts-tooltip-bg);\n transform: rotate(45deg);\n}\n\n.tooltip__popup--top .tooltip__arrow,\n.tooltip__popup--top-start .tooltip__arrow,\n.tooltip__popup--top-end .tooltip__arrow {\n bottom: -4px;\n left: 50%;\n margin-left: -4px;\n}\n\n.tooltip__popup--bottom .tooltip__arrow,\n.tooltip__popup--bottom-start .tooltip__arrow,\n.tooltip__popup--bottom-end .tooltip__arrow {\n top: -4px;\n left: 50%;\n margin-left: -4px;\n}\n\n.tooltip__popup--left .tooltip__arrow {\n inset-inline-end: -4px;\n top: 50%;\n margin-top: -4px;\n}\n\n.tooltip__popup--right .tooltip__arrow {\n inset-inline-start: -4px;\n top: 50%;\n margin-top: -4px;\n}\n","import { Component, Prop, State, h, Host, Element, Method } from '@stencil/core';\nimport type { TsPlacement } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot - Default slot for the trigger element.\n *\n * @part base - The tooltip popup container.\n * @part arrow - The tooltip arrow element.\n */\n@Component({\n tag: 'ts-tooltip',\n styleUrl: 'tooltip.css',\n shadow: true,\n})\nexport class TsTooltip {\n @Element() hostEl!: HTMLElement;\n\n private tooltipId = generateId('ts-tooltip');\n\n /** The tooltip text content. */\n @Prop() content = '';\n\n /** Placement of the tooltip relative to the trigger. */\n @Prop({ reflect: true }) placement: TsPlacement = 'top';\n\n /** Delay in ms before showing the tooltip. */\n @Prop() showDelay = 200;\n\n /** Delay in ms before hiding the tooltip. */\n @Prop() hideDelay = 0;\n\n /** Disables the tooltip. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Whether the tooltip is currently visible. */\n @State() isVisible = false;\n\n private showTimeout?: ReturnType<typeof setTimeout>;\n private hideTimeout?: ReturnType<typeof setTimeout>;\n\n /** Programmatically show the tooltip. */\n @Method()\n async show(): Promise<void> {\n if (this.disabled) return;\n clearTimeout(this.hideTimeout);\n this.showTimeout = setTimeout(() => {\n this.isVisible = true;\n }, this.showDelay);\n }\n\n /** Programmatically hide the tooltip. */\n @Method()\n async hide(): Promise<void> {\n clearTimeout(this.showTimeout);\n this.hideTimeout = setTimeout(() => {\n this.isVisible = false;\n }, this.hideDelay);\n }\n\n disconnectedCallback(): void {\n clearTimeout(this.showTimeout);\n clearTimeout(this.hideTimeout);\n }\n\n private handleMouseEnter = (): void => {\n this.show();\n };\n\n private handleMouseLeave = (): void => {\n this.hide();\n };\n\n private handleFocusIn = (): void => {\n this.show();\n };\n\n private handleFocusOut = (): void => {\n this.hide();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.isVisible) {\n this.hide();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-tooltip': true,\n 'ts-tooltip--visible': this.isVisible,\n }}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onFocusin={this.handleFocusIn}\n onFocusout={this.handleFocusOut}\n onKeyDown={this.handleKeydown}\n >\n <span class=\"tooltip__trigger\" aria-describedby={this.isVisible ? this.tooltipId : undefined}>\n <slot />\n </span>\n\n <div\n class={{\n 'tooltip__popup': true,\n [`tooltip__popup--${this.placement}`]: true,\n 'tooltip__popup--visible': this.isVisible,\n }}\n part=\"base\"\n id={this.tooltipId}\n role=\"tooltip\"\n aria-hidden={!this.isVisible ? 'true' : undefined}\n >\n {this.content}\n <div class=\"tooltip__arrow\" part=\"arrow\" />\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-tree-item.entry.js","sources":["src/components/tree/tree-item.css?tag=ts-tree-item&encapsulation=shadow","src/components/tree/tree-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tree-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n outline: none;\n}\n\n.tree-item__base {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n min-block-size: var(--ts-tree-item-height, 2rem);\n padding-inline: var(--ts-spacing-2);\n padding-block: var(--ts-spacing-1);\n border-radius: var(--ts-radius-sm);\n cursor: pointer;\n user-select: none;\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-tight);\n color: var(--ts-color-text-primary);\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.tree-item__base:hover {\n background-color: var(--ts-color-bg-subtle);\n}\n\n:host(:focus-visible) .tree-item__base {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Selected ---- */\n:host([selected]) .tree-item__base {\n background-color: var(--ts-tree-active-bg, var(--ts-color-interactive-primary-subtle));\n color: var(--ts-color-interactive-primary);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .tree-item__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Chevron ---- */\n.tree-item__chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n inline-size: 1.25rem;\n block-size: 1.25rem;\n transition: transform var(--ts-transition-fast);\n}\n\n.tree-item__chevron svg {\n inline-size: 0.875rem;\n block-size: 0.875rem;\n}\n\n:host(.ts-tree-item--expanded) .tree-item__chevron {\n transform: rotate(90deg);\n}\n\n.tree-item__chevron--hidden {\n visibility: hidden;\n}\n\n/* ---- Icon ---- */\n.tree-item__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* ---- Label ---- */\n.tree-item__label {\n flex: 1;\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---- Children ---- */\n.tree-item__children {\n padding-inline-start: var(--ts-tree-indent, var(--ts-spacing-5));\n}\n\n.tree-item__children--collapsed {\n display: none;\n}\n","import { Component, Prop, Event, State, h, Host, Element, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for nested ts-tree-item children.\n * @slot label - Custom label content.\n *\n * @part base - The tree item container.\n * @part label - The label wrapper.\n * @part chevron - The expand/collapse chevron.\n * @part icon - The icon wrapper.\n */\n@Component({\n tag: 'ts-tree-item',\n styleUrl: 'tree-item.css',\n shadow: true,\n})\nexport class TsTreeItem {\n @Element() hostEl!: HTMLElement;\n\n /** The item label. */\n @Prop() label?: string;\n\n /** Whether the item is expanded (has children). */\n @Prop({ reflect: true, mutable: true }) expanded = false;\n\n /** Whether the item is selected. */\n @Prop({ reflect: true, mutable: true }) selected = false;\n\n /** Whether the item is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Optional Lucide icon name. */\n @Prop() icon?: string;\n\n /** Whether this item has slotted children (expandable). */\n @State() hasChildren = false;\n\n /** Emitted when expand/collapse is toggled. */\n @Event({ eventName: 'tsToggle' }) tsToggle!: EventEmitter<{ expanded: boolean }>;\n\n /** Emitted when the item is selected. */\n @Event({ eventName: 'tsSelect' }) tsSelect!: EventEmitter<{ selected: boolean; value: string }>;\n\n @Watch('expanded')\n onExpandedChange(): void {\n this.tsToggle.emit({ expanded: this.expanded });\n }\n\n componentDidLoad(): void {\n this.checkForChildren();\n }\n\n private checkForChildren(): void {\n const slot = this.hostEl.shadowRoot?.querySelector('slot:not([name])') as HTMLSlotElement;\n if (slot) {\n const assigned = slot.assignedElements();\n this.hasChildren = assigned.some(el => el.tagName === 'TS-TREE-ITEM');\n }\n }\n\n private handleToggle = (event: MouseEvent): void => {\n event.stopPropagation();\n if (this.disabled) return;\n this.expanded = !this.expanded;\n };\n\n private handleSelect = (): void => {\n if (this.disabled) return;\n const tree = this.hostEl.closest('ts-tree');\n if (tree && (tree as unknown as { selectable: boolean }).selectable) {\n this.selected = !this.selected;\n this.tsSelect.emit({ selected: this.selected, value: this.label || '' });\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.handleSelect();\n }\n };\n\n private handleSlotChange = (): void => {\n this.checkForChildren();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-tree-item': true,\n 'ts-tree-item--expanded': this.expanded,\n 'ts-tree-item--selected': this.selected,\n 'ts-tree-item--disabled': this.disabled,\n 'ts-tree-item--has-children': this.hasChildren,\n }}\n role=\"treeitem\"\n tabindex={this.disabled ? -1 : 0}\n aria-expanded={this.hasChildren ? String(this.expanded) : undefined}\n aria-selected={String(this.selected)}\n aria-disabled={this.disabled ? 'true' : undefined}\n onKeyDown={this.handleKeyDown}\n >\n <div class=\"tree-item__base\" part=\"base\" onClick={this.handleSelect}>\n <span\n class={{\n 'tree-item__chevron': true,\n 'tree-item__chevron--hidden': !this.hasChildren,\n }}\n part=\"chevron\"\n onClick={this.handleToggle}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </span>\n\n {this.icon && (\n <span class=\"tree-item__icon\" part=\"icon\" aria-hidden=\"true\">\n <ts-icon name={this.icon} size=\"sm\" />\n </span>\n )}\n\n <span class=\"tree-item__label\" part=\"label\">\n <slot name=\"label\">{this.label}</slot>\n </span>\n </div>\n\n <div\n class={{\n 'tree-item__children': true,\n 'tree-item__children--collapsed': !this.expanded,\n }}\n role=\"group\"\n >\n <slot onSlotchange={this.handleSlotChange} />\n </div>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-tree.entry.js","sources":["src/components/tree/tree.css?tag=ts-tree&encapsulation=shadow","src/components/tree/tree.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tree — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-tree-indent Indentation per level\n --ts-tree-item-height Item height\n --ts-tree-active-bg Active item background\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-tree-indent: var(--ts-spacing-5);\n --ts-tree-item-height: 2rem;\n --ts-tree-active-bg: var(--ts-color-interactive-primary-subtle);\n}\n\n.tree__base {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n","import { Component, Prop, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-tree-item children.\n *\n * @part base - The tree container.\n */\n@Component({\n tag: 'ts-tree',\n styleUrl: 'tree.css',\n shadow: true,\n})\nexport class TsTree {\n @Element() hostEl!: HTMLElement;\n\n /** Enable item selection mode. */\n @Prop({ reflect: true }) selectable = false;\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent): void {\n const items = this.getVisibleItems();\n if (items.length === 0) return;\n\n const focused = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(focused);\n if (currentIndex === -1) return;\n\n const currentItem = items[currentIndex] as HTMLTsTreeItemElement;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (currentIndex < items.length - 1) {\n items[currentIndex + 1].focus();\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (currentIndex > 0) {\n items[currentIndex - 1].focus();\n }\n break;\n case 'ArrowRight':\n event.preventDefault();\n if (currentItem && !currentItem.expanded) {\n currentItem.expanded = true;\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n if (currentItem && currentItem.expanded) {\n currentItem.expanded = false;\n }\n break;\n case 'Home':\n event.preventDefault();\n items[0].focus();\n break;\n case 'End':\n event.preventDefault();\n items[items.length - 1].focus();\n break;\n }\n }\n\n private getVisibleItems(): HTMLElement[] {\n const allItems = Array.from(this.hostEl.querySelectorAll('ts-tree-item'));\n return allItems.filter(item => {\n let parent = item.parentElement;\n while (parent && parent !== this.hostEl) {\n if (parent.tagName === 'TS-TREE-ITEM' && !(parent as HTMLTsTreeItemElement).expanded) {\n return false;\n }\n parent = parent.parentElement;\n }\n return true;\n }) as HTMLElement[];\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{ 'ts-tree': true }}\n role=\"tree\"\n >\n <div class=\"tree__base\" part=\"base\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n\ninterface HTMLTsTreeItemElement extends HTMLElement {\n expanded: boolean;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,MAAM,CAAC,yOAAyO,CAAC;;MCYpP,MAAM,GAAA,MAAA;;;;;;IAIQ,UAAU,GAAG,KAAK;AAG3C,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AAExB,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAA4B;QACrD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,IAAI,YAAY,KAAK,EAAE;YAAE;AAEzB,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAA0B;AAEhE,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;;gBAEjC;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,YAAY,GAAG,CAAC,EAAE;oBACpB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;;gBAEjC;AACF,YAAA,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AACxC,oBAAA,WAAW,CAAC,QAAQ,GAAG,IAAI;;gBAE7B;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,EAAE;AACvC,oBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;;gBAE9B;AACF,YAAA,KAAK,MAAM;gBACT,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;gBAChB;AACF,YAAA,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;gBAC/B;;;IAIE,eAAe,GAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACzE,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAG;AAC5B,YAAA,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa;YAC/B,OAAO,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;gBACvC,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,IAAI,CAAE,MAAgC,CAAC,QAAQ,EAAE;AACpF,oBAAA,OAAO,KAAK;;AAEd,gBAAA,MAAM,GAAG,MAAM,CAAC,aAAa;;AAE/B,YAAA,OAAO,IAAI;AACb,SAAC,CAAkB;;;IAIrB,MAAM,GAAA;QACJ,QACE,CAAA,CAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EACH,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAC1B,IAAI,EAAC,MAAM,EAAA,EAEX,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAC,YAAY,EAAC,IAAI,EAAC,MAAM,EAAA,EACjC,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAQ,CACJ,CACD;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["src/utils/dom.ts","src/utils/events.ts"],"sourcesContent":["/**\n * Tessera UI — DOM Utilities\n */\n\n/**\n * Get the closest Tessera UI host element from within a shadow tree.\n */\nexport function getHostElement(el: Element): HTMLElement | null {\n const root = el.getRootNode();\n if (root instanceof ShadowRoot) {\n return root.host as HTMLElement;\n }\n return null;\n}\n\n/**\n * Check if a slot has assigned content.\n */\nexport function hasSlotContent(el: HTMLElement, slotName?: string): boolean {\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n if (!slot) return false;\n const nodes = slot.assignedNodes({ flatten: true });\n return nodes.some(\n (node) =>\n node.nodeType === Node.ELEMENT_NODE ||\n (node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== '')\n );\n}\n\n/**\n * Debounce a function call.\n */\nexport function debounce<T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Clamp a number between min and max.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * Tessera UI — Event Utilities\n *\n * Helpers for consistent custom event dispatch across components.\n * All Tessera UI events bubble and are composed (cross shadow boundaries).\n */\n\nexport interface TsEventOptions<T> {\n detail: T;\n bubbles?: boolean;\n composed?: boolean;\n cancelable?: boolean;\n}\n\n/**\n * Create and dispatch a custom event from an element.\n * Returns true if the event was NOT cancelled.\n */\nexport function emitEvent<T>(\n el: HTMLElement,\n eventName: string,\n options: TsEventOptions<T>\n): boolean {\n const event = new CustomEvent<T>(eventName, {\n detail: options.detail,\n bubbles: options.bubbles ?? true,\n composed: options.composed ?? true,\n cancelable: options.cancelable ?? false,\n });\n\n return el.dispatchEvent(event);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG;AAEH;;AAEG;AASH;;AAEG;AACG,SAAU,cAAc,CAAC,EAAe,EAAE,QAAiB,EAAA;AAC/D,IAAA,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAA,WAAA,EAAc,QAAQ,CAAA,EAAA,CAAI,GAAG,kBAAkB;IAC3E,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,aAAa,CAAkB,QAAQ,CAAC;AACpE,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,KAAK;AACvB,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnD,IAAA,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,IAAI,KACH,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;AACnC,SAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CACxE;AACH;AAEA;;AAEG;AACG,SAAU,QAAQ,CACtB,EAAK,EACL,KAAa,EAAA;AAEb,IAAA,IAAI,KAAoC;AACxC,IAAA,OAAO,CAAC,GAAG,IAAmB,KAAI;QAChC,YAAY,CAAC,KAAK,CAAC;AACnB,QAAA,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC;AAC9C,KAAC;AACH;AAEA;;AAEG;SACa,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AAC3D,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;AAC5C;;ACjDA;;;;;AAKG;AASH;;;AAGG;SACa,SAAS,CACvB,EAAe,EACf,SAAiB,EACjB,OAA0B,EAAA;AAE1B,IAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAI,SAAS,EAAE;QAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;AACtB,QAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;AAChC,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;AAClC,QAAA,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;AACxC,KAAA,CAAC;AAEF,IAAA,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;AAChC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["inputCss","TsInput","inputEl","inputId","generateId","value","type","size","label","placeholder","helpText","error","required","disabled","readonly","maxlength","minlength","pattern","autocomplete","name","hasFocus","tsInput","tsChange","tsFocus","tsBlur","tsValidate","handleValueChange","newValue","oldValue","this","setFocus","focus","selectText","select","handleInput","event","target","previousValue","emit","handleChange","valid","checkValidity","message","validationMessage","handleFocus","handleBlur","render","hasError","labelId","helpId","errorId","h","Host","key","class","part","id","htmlFor","input__wrapper","ref","el","readOnly","autoComplete","undefined","onInput","onChange","onFocus","onBlur","role"],"sources":["src/components/input/input.css?tag=ts-input&encapsulation=shadow","src/components/input/input.tsx"],"sourcesContent":["/* ==========================================================================\n ts-input — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-input-bg Input background\n --ts-input-color Input text color\n --ts-input-border-color Default border color\n --ts-input-radius Border radius\n --ts-input-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-input-bg: var(--ts-color-neutral-50);\n --ts-input-color: var(--ts-color-text-primary);\n --ts-input-border-color: var(--ts-color-border-default);\n --ts-input-radius: var(--ts-radius-md);\n --ts-input-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.input__label {\n display: block;\n margin-bottom: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n.input__required {\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Wrapper ---- */\n.input__wrapper {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n border: 1px solid var(--ts-input-border-color);\n border-radius: var(--ts-input-radius);\n background-color: var(--ts-input-bg);\n box-shadow: none;\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast),\n background-color var(--ts-transition-fast);\n overflow: hidden;\n}\n\n.input__wrapper--focused {\n border-color: var(--ts-color-primary-500);\n box-shadow: var(--ts-input-focus-ring);\n}\n\n.input__wrapper--error {\n border-color: var(--ts-color-danger-500);\n}\n\n.input__wrapper--error.input__wrapper--focused {\n box-shadow: 0 0 0 3px var(--ts-color-focus-ring-danger);\n}\n\n.input__wrapper--disabled {\n background-color: var(--ts-color-bg-disabled);\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ---- Native Input ---- */\n.input__native {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n color: var(--ts-input-color);\n width: 100%;\n min-width: 0;\n}\n\n.input__native::placeholder {\n color: var(--ts-color-text-tertiary);\n}\n\n.input__native:disabled {\n cursor: not-allowed;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .input__wrapper {\n border-radius: var(--ts-radius-sm);\n}\n:host([size=\"sm\"]) .input__native {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .input__native {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .input__native {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .input__wrapper {\n border-radius: var(--ts-radius-lg);\n}\n:host([size=\"xl\"]) .input__native {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-xl);\n}\n\n/* ---- Prefix / Suffix ---- */\n.input__prefix,\n.input__suffix {\n display: inline-flex;\n align-items: center;\n color: var(--ts-color-text-tertiary);\n}\n\n.input__prefix {\n padding-inline-start: var(--ts-spacing-3);\n}\n\n.input__suffix {\n padding-inline-end: var(--ts-spacing-3);\n}\n\n.input__prefix:empty,\n.input__suffix:empty {\n display: none;\n}\n\n/* ---- Help & Error Text ---- */\n.input__help,\n.input__error {\n margin-top: var(--ts-spacing-1);\n font-size: var(--ts-font-size-xs);\n line-height: var(--ts-line-height-normal);\n}\n\n.input__help {\n color: var(--ts-color-text-tertiary);\n}\n\n.input__error {\n color: var(--ts-color-danger-600);\n font-weight: var(--ts-font-weight-medium);\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n Watch,\n h,\n Host,\n Element,\n Method,\n} from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsChangeEventDetail, TsValidationEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot prefix - Content before the input (e.g., icon or currency symbol).\n * @slot suffix - Content after the input (e.g., icon or clear button).\n * @slot help-text - Help text displayed below the input.\n *\n * @part base - The outer wrapper.\n * @part label - The label element.\n * @part input - The native input element.\n * @part prefix - The prefix slot wrapper.\n * @part suffix - The suffix slot wrapper.\n * @part help-text - The help text wrapper.\n * @part error-text - The error message wrapper.\n */\n@Component({\n tag: 'ts-input',\n styleUrl: 'input.css',\n shadow: true,\n})\nexport class TsInput {\n @Element() hostEl!: HTMLElement;\n\n private inputEl?: HTMLInputElement;\n private inputId = generateId('ts-input');\n\n /** The input's value. */\n @Prop({ mutable: true, reflect: true }) value = '';\n\n /** The input type. */\n @Prop({ reflect: true }) type:\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'search' = 'text';\n\n /** The input's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Label text displayed above the input. */\n @Prop() label?: string;\n\n /** Placeholder text. */\n @Prop() placeholder?: string;\n\n /** Help text displayed below the input. */\n @Prop() helpText?: string;\n\n /** Renders the input in an error state with an error message. */\n @Prop() error?: string;\n\n /** Makes the input required. */\n @Prop({ reflect: true }) required = false;\n\n /** Renders the input as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Renders the input as readonly. */\n @Prop({ reflect: true }) readonly = false;\n\n /** Maximum character length. */\n @Prop() maxlength?: number;\n\n /** Minimum character length. */\n @Prop() minlength?: number;\n\n /** Pattern for validation (regex string). */\n @Prop() pattern?: string;\n\n /** Autocomplete attribute. */\n @Prop() autocomplete?: string;\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Whether the input is currently focused. */\n @State() hasFocus = false;\n\n /** Emitted when the value changes (on input). */\n @Event({ eventName: 'tsInput' }) tsInput!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the value changes (on blur / commit). */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the input gains focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the input loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n /** Emitted on validation. */\n @Event({ eventName: 'tsValidate' }) tsValidate!: EventEmitter<TsValidationEventDetail>;\n\n @Watch('value')\n handleValueChange(newValue: string, oldValue: string): void {\n if (newValue !== oldValue && this.inputEl) {\n this.inputEl.value = newValue;\n }\n }\n\n /** Programmatically focus the input. */\n @Method()\n async setFocus(): Promise<void> {\n this.inputEl?.focus();\n }\n\n /** Programmatically select the input text. */\n @Method()\n async selectText(): Promise<void> {\n this.inputEl?.select();\n }\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n const previousValue = this.value;\n this.value = target.value;\n this.tsInput.emit({ value: this.value, previousValue });\n };\n\n private handleChange = (): void => {\n this.tsChange.emit({ value: this.value, previousValue: this.value });\n\n // Run native validation\n if (this.inputEl) {\n const valid = this.inputEl.checkValidity();\n this.tsValidate.emit({\n valid,\n message: this.inputEl.validationMessage,\n });\n }\n };\n\n private handleFocus = (): void => {\n this.hasFocus = true;\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.hasFocus = false;\n this.tsBlur.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasError = !!this.error;\n const labelId = `${this.inputId}-label`;\n const helpId = `${this.inputId}-help`;\n const errorId = `${this.inputId}-error`;\n\n return (\n <Host\n class={{\n 'ts-input': true,\n [`ts-input--${this.size}`]: true,\n 'ts-input--focused': this.hasFocus,\n 'ts-input--disabled': this.disabled,\n 'ts-input--error': hasError,\n }}\n >\n {this.label && (\n <label class=\"input__label\" part=\"label\" id={labelId} htmlFor={this.inputId}>\n {this.label}\n {this.required && <span class=\"input__required\" aria-hidden=\"true\"> *</span>}\n </label>\n )}\n\n <div\n class={{\n 'input__wrapper': true,\n 'input__wrapper--focused': this.hasFocus,\n 'input__wrapper--error': hasError,\n 'input__wrapper--disabled': this.disabled,\n }}\n part=\"base\"\n >\n <span class=\"input__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <input\n ref={(el) => (this.inputEl = el)}\n id={this.inputId}\n class=\"input__native\"\n part=\"input\"\n type={this.type}\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n maxlength={this.maxlength}\n minlength={this.minlength}\n pattern={this.pattern}\n autoComplete={this.autocomplete}\n name={this.name}\n aria-labelledby={this.label ? labelId : undefined}\n aria-describedby={hasError ? errorId : this.helpText ? helpId : undefined}\n aria-invalid={hasError ? 'true' : undefined}\n aria-required={this.required ? 'true' : undefined}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n\n <span class=\"input__suffix\" part=\"suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\n\n {hasError && (\n <div class=\"input__error\" part=\"error-text\" id={errorId} role=\"alert\">\n {this.error}\n </div>\n )}\n\n {!hasError && this.helpText && (\n <div class=\"input__help\" part=\"help-text\" id={helpId}>\n {this.helpText}\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["stepperCss","TsStepper","activeStep","orientation","linear","handleActiveStepChange","this","updateStepStates","componentDidLoad","steps","Array","from","hostEl","querySelectorAll","forEach","step","index","setAttribute","String","removeAttribute","length","render","h","Host","key","class","part","role"],"sources":["src/components/stepper/stepper.css?tag=ts-stepper&encapsulation=shadow","src/components/stepper/stepper.tsx"],"sourcesContent":["/* ==========================================================================\n ts-stepper — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-stepper-active-color Active step indicator color\n --ts-stepper-completed-color Completed step indicator color\n --ts-stepper-connector-color Connector line color\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-stepper-active-color: var(--ts-color-interactive-primary);\n --ts-stepper-completed-color: var(--ts-color-success-600);\n --ts-stepper-connector-color: var(--ts-color-border-default);\n}\n\n.stepper__container {\n display: flex;\n}\n\n/* ---- Horizontal ---- */\n:host([orientation=\"horizontal\"]) .stepper__container {\n flex-direction: row;\n align-items: flex-start;\n}\n\n/* ---- Vertical ---- */\n:host([orientation=\"vertical\"]) .stepper__container {\n flex-direction: column;\n}\n","import { Component, Prop, h, Host, Element, Watch } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-step children.\n *\n * @part container - The stepper container.\n */\n@Component({\n tag: 'ts-stepper',\n styleUrl: 'stepper.css',\n shadow: true,\n})\nexport class TsStepper {\n @Element() hostEl!: HTMLElement;\n\n /** The index of the currently active step (0-based). */\n @Prop({ reflect: true }) activeStep = 0;\n\n /** The layout orientation. */\n @Prop({ reflect: true }) orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /** If true, steps must be completed in order. */\n @Prop() linear = false;\n\n @Watch('activeStep')\n handleActiveStepChange(): void {\n this.updateStepStates();\n }\n\n componentDidLoad(): void {\n this.updateStepStates();\n }\n\n private updateStepStates(): void {\n const steps = Array.from(this.hostEl.querySelectorAll('ts-step'));\n steps.forEach((step, index) => {\n step.setAttribute('data-index', String(index));\n step.setAttribute('data-orientation', this.orientation);\n if (index === this.activeStep) {\n step.setAttribute('data-active', '');\n } else {\n step.removeAttribute('data-active');\n }\n if (this.linear && index > this.activeStep) {\n step.setAttribute('disabled', '');\n } else if (this.linear) {\n step.removeAttribute('disabled');\n }\n if (index < steps.length - 1) {\n step.setAttribute('data-has-connector', '');\n } else {\n step.removeAttribute('data-has-connector');\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-stepper': true,\n [`ts-stepper--${this.orientation}`]: true,\n }}\n >\n <div class=\"stepper__container\" part=\"container\" role=\"list\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"yDAAA,MAAMA,EAAa,IAAM,4b,MCYZC,EAAS,M,qDAIKC,WAAa,EAGbC,YAAyC,aAG1DC,OAAS,MAGjB,sBAAAC,GACEC,KAAKC,kB,CAGP,gBAAAC,GACEF,KAAKC,kB,CAGC,gBAAAA,GACN,MAAME,EAAQC,MAAMC,KAAKL,KAAKM,OAAOC,iBAAiB,YACtDJ,EAAMK,SAAQ,CAACC,EAAMC,KACnBD,EAAKE,aAAa,aAAcC,OAAOF,IACvCD,EAAKE,aAAa,mBAAoBX,KAAKH,aAC3C,GAAIa,IAAUV,KAAKJ,WAAY,CAC7Ba,EAAKE,aAAa,cAAe,G,KAC5B,CACLF,EAAKI,gBAAgB,c,CAEvB,GAAIb,KAAKF,QAAUY,EAAQV,KAAKJ,WAAY,CAC1Ca,EAAKE,aAAa,WAAY,G,MACzB,GAAIX,KAAKF,OAAQ,CACtBW,EAAKI,gBAAgB,W,CAEvB,GAAIH,EAAQP,EAAMW,OAAS,EAAG,CAC5BL,EAAKE,aAAa,qBAAsB,G,KACnC,CACLF,EAAKI,gBAAgB,qB,KAM3B,MAAAE,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,aAAc,KACd,CAAC,eAAenB,KAAKH,eAAgB,OAGvCmB,EAAA,OAAAE,IAAA,2CAAKC,MAAM,qBAAqBC,KAAK,YAAYC,KAAK,QACpDL,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["breadcrumbItemCss","TsBreadcrumbItem","href","current","separator","render","isLink","this","h","Host","key","class","part","undefined"],"sources":["src/components/breadcrumb/breadcrumb-item.css?tag=ts-breadcrumb-item&encapsulation=shadow","src/components/breadcrumb/breadcrumb-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-breadcrumb-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: contents;\n}\n\n.breadcrumb-item__li {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n}\n\n.breadcrumb-item__link {\n color: var(--ts-breadcrumb-link-color, var(--ts-color-interactive-primary));\n text-decoration: none;\n transition: color var(--ts-transition-fast);\n}\n\n.breadcrumb-item__link:hover {\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.breadcrumb-item__link:focus-visible {\n box-shadow: var(--ts-focus-ring);\n border-radius: var(--ts-radius-sm);\n outline: none;\n}\n\n.breadcrumb-item__text {\n color: var(--ts-color-text-primary);\n}\n\n:host(.ts-breadcrumb-item--current) .breadcrumb-item__text {\n font-weight: var(--ts-font-weight-semi);\n}\n\n.breadcrumb-item__separator {\n color: var(--ts-breadcrumb-separator-color, var(--ts-color-text-tertiary));\n margin-inline: var(--ts-spacing-1);\n user-select: none;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for label text.\n *\n * @part link - The anchor or span element.\n * @part separator - The separator element.\n */\n@Component({\n tag: 'ts-breadcrumb-item',\n styleUrl: 'breadcrumb-item.css',\n shadow: true,\n})\nexport class TsBreadcrumbItem {\n /** If set, renders as a link. */\n @Prop() href?: string;\n\n /** Marks this item as the current page. */\n @Prop({ reflect: true }) current = false;\n\n /** Separator character (set by parent ts-breadcrumb). */\n @Prop() separator?: string;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isLink = !!this.href && !this.current;\n\n return (\n <Host class={{ 'ts-breadcrumb-item': true, 'ts-breadcrumb-item--current': this.current }}>\n <li class=\"breadcrumb-item__li\">\n {isLink ? (\n <a href={this.href} part=\"link\" class=\"breadcrumb-item__link\">\n <slot />\n </a>\n ) : (\n <span\n part=\"link\"\n class=\"breadcrumb-item__text\"\n aria-current={this.current ? 'page' : undefined}\n >\n <slot />\n </span>\n )}\n {this.separator && (\n <span class=\"breadcrumb-item__separator\" part=\"separator\" aria-hidden=\"true\">\n {this.separator}\n </span>\n )}\n </li>\n </Host>\n );\n }\n}\n"],"mappings":"6CAAA,MAAMA,EAAoB,IAAM,0wB,MCanBC,EAAgB,M,yBAEnBC,KAGiBC,QAAU,MAG3BC,UAGR,MAAAC,GACE,MAAMC,IAAWC,KAAKL,OAASK,KAAKJ,QAEpC,OACEK,EAACC,EAAI,CAAAC,IAAA,2CAACC,MAAO,CAAE,qBAAsB,KAAM,8BAA+BJ,KAAKJ,UAC7EK,EAAA,MAAAE,IAAA,2CAAIC,MAAM,uBACPL,EACCE,EAAA,KAAGN,KAAMK,KAAKL,KAAMU,KAAK,OAAOD,MAAM,yBACpCH,EAAA,cAGFA,EAAA,QACEI,KAAK,OACLD,MAAM,wBAAuB,eACfJ,KAAKJ,QAAU,OAASU,WAEtCL,EAAA,cAGHD,KAAKH,WACJI,EAAA,QAAAE,IAAA,2CAAMC,MAAM,6BAA6BC,KAAK,YAAW,cAAa,QACnEL,KAAKH,Y","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["navCss","TsNav","variant","collapsed","render","h","Host","key","class","this","part","role"],"sources":["src/components/nav/nav.css?tag=ts-nav&encapsulation=shadow","src/components/nav/nav.tsx"],"sourcesContent":["/* ==========================================================================\n ts-nav — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-nav-bg Navigation background\n --ts-nav-active-bg Active item background\n --ts-nav-active-color Active item text color\n --ts-nav-width Sidebar width\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-nav-bg: transparent;\n --ts-nav-active-bg: var(--ts-color-interactive-primary-subtle);\n --ts-nav-active-color: var(--ts-color-interactive-primary);\n --ts-nav-width: 240px;\n}\n\n.nav__native {\n background-color: var(--ts-nav-bg);\n}\n\n.nav__list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n}\n\n/* ---- Sidebar variant ---- */\n:host([variant=\"sidebar\"]) .nav__list {\n flex-direction: column;\n gap: var(--ts-spacing-1);\n inline-size: var(--ts-nav-width);\n}\n\n:host([variant=\"sidebar\"][collapsed]) .nav__list {\n inline-size: auto;\n}\n\n/* ---- Horizontal variant ---- */\n:host([variant=\"horizontal\"]) .nav__list {\n flex-direction: row;\n gap: var(--ts-spacing-1);\n align-items: center;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-nav-item children.\n *\n * @part nav - The native nav element.\n * @part list - The list container.\n */\n@Component({\n tag: 'ts-nav',\n styleUrl: 'nav.css',\n shadow: true,\n})\nexport class TsNav {\n /** The navigation layout variant. */\n @Prop({ reflect: true }) variant: 'sidebar' | 'horizontal' = 'sidebar';\n\n /** Whether the sidebar nav is collapsed (icons only). */\n @Prop({ reflect: true }) collapsed = false;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-nav': true,\n [`ts-nav--${this.variant}`]: true,\n 'ts-nav--collapsed': this.collapsed,\n }}\n >\n <nav class=\"nav__native\" part=\"nav\" aria-label=\"Navigation\">\n <ul class=\"nav__list\" part=\"list\" role=\"list\">\n <slot />\n </ul>\n </nav>\n </Host>\n );\n }\n}\n"],"mappings":"kDAAA,MAAMA,EAAS,IAAM,0mB,MCaRC,EAAK,M,yBAESC,QAAoC,UAGpCC,UAAY,MAGrC,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,SAAU,KACV,CAAC,WAAWC,KAAKP,WAAY,KAC7B,oBAAqBO,KAAKN,YAG5BE,EAAA,OAAAE,IAAA,2CAAKC,MAAM,cAAcE,KAAK,MAAK,aAAY,cAC7CL,EAAA,MAAAE,IAAA,2CAAIC,MAAM,YAAYE,KAAK,OAAOC,KAAK,QACrCN,EAAA,QAAAE,IAAA,+C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["spinnerCss","TsSpinner","size","color","label","render","h","Host","key","class","this","role","part","viewBox","fill","xmlns","cx","cy","r","style","stroke","undefined"],"sources":["src/components/spinner/spinner.css?tag=ts-spinner&encapsulation=shadow","src/components/spinner/spinner.tsx"],"sourcesContent":["/* ==========================================================================\n ts-spinner — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-spinner-size Spinner dimensions\n --ts-spinner-color Spinning indicator color\n --ts-spinner-track-color Background track color\n ========================================================================== */\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --ts-spinner-size: 1.5rem;\n --ts-spinner-color: var(--ts-color-interactive-primary);\n --ts-spinner-track-color: var(--ts-color-neutral-200);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) { --ts-spinner-size: 0.875rem; }\n:host([size=\"sm\"]) { --ts-spinner-size: 1.125rem; }\n:host([size=\"md\"]) { --ts-spinner-size: 1.5rem; }\n:host([size=\"lg\"]) { --ts-spinner-size: 2rem; }\n:host([size=\"xl\"]) { --ts-spinner-size: 3rem; }\n\n/* ---- SVG ---- */\n.spinner__svg {\n width: var(--ts-spinner-size);\n height: var(--ts-spinner-size);\n animation: ts-spinner-rotate 0.75s linear infinite;\n}\n\n/* ---- Track ---- */\n.spinner__track {\n stroke: var(--ts-spinner-track-color);\n}\n\n/* ---- Indicator ---- */\n.spinner__indicator {\n stroke: var(--ts-spinner-color);\n}\n\n/* ---- Animation ---- */\n@keyframes ts-spinner-rotate {\n to {\n transform: rotate(360deg);\n }\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @part svg - The SVG element.\n * @part track - The background track circle.\n * @part indicator - The spinning indicator arc.\n */\n@Component({\n tag: 'ts-spinner',\n styleUrl: 'spinner.css',\n shadow: true,\n})\nexport class TsSpinner {\n /** The size of the spinner. */\n @Prop({ reflect: true }) size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n\n /** The color of the spinning indicator. */\n @Prop() color: string = 'currentColor';\n\n /** Accessible label for screen readers. */\n @Prop() label: string = 'Loading';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-spinner': true,\n [`ts-spinner--${this.size}`]: true,\n }}\n role=\"status\"\n aria-label={this.label}\n >\n <svg class=\"spinner__svg\" part=\"svg\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle\n class=\"spinner__track\"\n part=\"track\"\n cx=\"16\"\n cy=\"16\"\n r=\"13\"\n stroke-width=\"3\"\n />\n <circle\n class=\"spinner__indicator\"\n part=\"indicator\"\n cx=\"16\"\n cy=\"16\"\n r=\"13\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"20 61.68\"\n style={{ stroke: this.color !== 'currentColor' ? this.color : undefined }}\n />\n </svg>\n </Host>\n );\n }\n}\n"],"mappings":"kDAAA,MAAMA,EAAa,IAAM,qsB,MCYZC,EAAS,M,yBAEKC,KAAyC,KAG1DC,MAAgB,eAGhBC,MAAgB,UAGxB,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,aAAc,KACd,CAAC,eAAeC,KAAKR,QAAS,MAEhCS,KAAK,SAAQ,aACDD,KAAKN,OAEjBE,EAAA,OAAAE,IAAA,2CAAKC,MAAM,eAAeG,KAAK,MAAMC,QAAQ,YAAYC,KAAK,OAAOC,MAAM,8BACzET,EAAA,UAAAE,IAAA,2CACEC,MAAM,iBACNG,KAAK,QACLI,GAAG,KACHC,GAAG,KACHC,EAAE,KAAI,eACO,MAEfZ,EAAA,UAAAE,IAAA,2CACEC,MAAM,qBACNG,KAAK,YACLI,GAAG,KACHC,GAAG,KACHC,EAAE,KAAI,eACO,IAAG,iBACD,QAAO,mBACL,WACjBC,MAAO,CAAEC,OAAQV,KAAKP,QAAU,eAAiBO,KAAKP,MAAQkB,c","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["buttonCss","TsButton","variant","appearance","size","disabled","loading","block","type","href","target","tsClick","tsFocus","tsBlur","handleClick","event","this","preventDefault","stopPropagation","emit","handleFocus","handleBlur","renderSpinner","h","class","part","viewBox","fill","xmlns","cx","cy","r","stroke","render","isLink","Tag","attrs","undefined","rel","role","Host","key","onClick","onFocus","onBlur","name"],"sources":["src/components/button/button.css?tag=ts-button&encapsulation=shadow","src/components/button/button.tsx"],"sourcesContent":["/* ==========================================================================\n ts-button — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-button-radius Border radius\n --ts-button-font-weight Label font weight\n --ts-button-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: inline-block;\n vertical-align: middle;\n\n --ts-button-radius: var(--ts-shape-interactive);\n --ts-button-font-weight: var(--ts-font-weight-medium);\n --ts-button-focus-ring: var(--ts-focus-ring);\n}\n\n:host([block]) {\n display: block;\n width: 100%;\n}\n\n/* ---- Base native element ---- */\n.button__native {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-2);\n width: 100%;\n border: 1px solid transparent;\n border-radius: var(--ts-button-radius);\n font-family: var(--ts-font-family-base);\n font-weight: var(--ts-button-font-weight);\n line-height: var(--ts-line-height-tight);\n text-decoration: none;\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast),\n opacity var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n position: relative;\n white-space: nowrap;\n user-select: none;\n -webkit-appearance: none;\n appearance: none;\n outline: none;\n}\n\n/* ---- Focus visible ---- */\n.button__native:focus-visible {\n box-shadow: var(--ts-button-focus-ring);\n}\n\n/* ---- Active press (M3 bouncier) ---- */\n.button__native:active:not([disabled]):not([aria-disabled=\"true\"]) {\n transform: scale(0.96);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) .button__native {\n padding: calc(var(--ts-spacing-1) + 1px) var(--ts-spacing-2);\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"sm\"]) .button__native {\n padding: calc(var(--ts-spacing-1) + 1px) var(--ts-spacing-3);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .button__native {\n padding: calc(var(--ts-spacing-2) + 1px) var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .button__native {\n padding: calc(var(--ts-spacing-3) + 2px) var(--ts-spacing-6);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .button__native {\n padding: calc(var(--ts-spacing-4) + 2px) var(--ts-spacing-8);\n font-size: var(--ts-font-size-xl);\n}\n\n/* ---- Solid Appearance ---- */\n:host([appearance=\"solid\"]) .button__native {\n border-color: transparent;\n}\n:host([appearance=\"solid\"][variant=\"primary\"]) .button__native {\n background-color: var(--ts-color-interactive-primary);\n color: var(--ts-color-text-on-primary);\n}\n:host([appearance=\"solid\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-hover);\n}\n\n:host([appearance=\"solid\"][variant=\"success\"]) .button__native {\n background-color: var(--ts-color-success-600);\n color: var(--ts-color-text-on-success);\n}\n:host([appearance=\"solid\"][variant=\"success\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-success-500);\n}\n\n:host([appearance=\"solid\"][variant=\"danger\"]) .button__native {\n background-color: var(--ts-color-interactive-danger);\n color: var(--ts-color-text-on-danger);\n}\n:host([appearance=\"solid\"][variant=\"danger\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-danger-hover);\n}\n\n:host([appearance=\"solid\"][variant=\"warning\"]) .button__native {\n background-color: var(--ts-color-warning-600);\n color: var(--ts-color-text-on-warning);\n}\n:host([appearance=\"solid\"][variant=\"warning\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-warning-500);\n}\n\n:host([appearance=\"solid\"][variant=\"neutral\"]) .button__native {\n background-color: var(--ts-color-neutral-800);\n color: var(--ts-color-text-on-primary);\n}\n:host([appearance=\"solid\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-700);\n}\n\n:host([appearance=\"solid\"][variant=\"secondary\"]) .button__native {\n background-color: var(--ts-color-neutral-200);\n color: var(--ts-color-text-primary);\n}\n:host([appearance=\"solid\"][variant=\"secondary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-300);\n}\n\n/* ---- Outline Appearance ---- */\n:host([appearance=\"outline\"]) .button__native {\n background-color: transparent;\n}\n:host([appearance=\"outline\"][variant=\"primary\"]) .button__native {\n border-color: var(--ts-color-primary-500);\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"outline\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-subtle);\n}\n\n:host([appearance=\"outline\"][variant=\"danger\"]) .button__native {\n border-color: var(--ts-color-danger-500);\n color: var(--ts-color-interactive-danger);\n}\n:host([appearance=\"outline\"][variant=\"danger\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-danger-subtle);\n}\n\n:host([appearance=\"outline\"][variant=\"neutral\"]) .button__native {\n border-color: var(--ts-color-border-default);\n color: var(--ts-color-text-secondary);\n}\n:host([appearance=\"outline\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-bg-subtle);\n}\n\n/* ---- Ghost Appearance ---- */\n:host([appearance=\"ghost\"]) .button__native {\n background-color: transparent;\n border-color: transparent;\n}\n:host([appearance=\"ghost\"][variant=\"primary\"]) .button__native {\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"ghost\"][variant=\"primary\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-interactive-primary-subtle);\n border-color: var(--ts-color-primary-200);\n}\n\n:host([appearance=\"ghost\"][variant=\"neutral\"]) .button__native {\n color: var(--ts-color-text-secondary);\n}\n:host([appearance=\"ghost\"][variant=\"neutral\"]) .button__native:hover:not([disabled]) {\n background-color: var(--ts-color-neutral-100);\n border-color: var(--ts-color-neutral-200);\n}\n\n/* ---- Link Appearance ---- */\n:host([appearance=\"link\"]) .button__native {\n background: none;\n border: none;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n:host([appearance=\"link\"][variant=\"primary\"]) .button__native {\n color: var(--ts-color-interactive-primary);\n}\n:host([appearance=\"link\"]) .button__native:hover:not([disabled]) {\n text-decoration-thickness: 2px;\n}\n\n/* ---- Disabled State ---- */\n:host([disabled]) .button__native,\n.button__native[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Loading State ---- */\n:host([loading]) .button__label,\n:host([loading]) .button__prefix,\n:host([loading]) .button__suffix {\n visibility: hidden;\n}\n\n:host([loading]) .button__native {\n cursor: wait;\n position: relative;\n}\n\n/* ---- Spinner ---- */\n.button__spinner {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.button__spinner svg {\n width: 1.2em;\n height: 1.2em;\n animation: ts-spin 0.8s linear infinite;\n}\n\n@keyframes ts-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ---- Slot wrappers ---- */\n.button__prefix,\n.button__suffix {\n display: inline-flex;\n align-items: center;\n}\n\n.button__prefix:empty,\n.button__suffix:empty {\n display: none;\n}\n\n.button__label {\n display: inline-flex;\n align-items: center;\n}\n","import { Component, Prop, Event, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsVariant, TsAppearance } from '../../types';\n\n/**\n * @slot - Default slot for button label content.\n * @slot prefix - Content before the label (e.g., icon).\n * @slot suffix - Content after the label (e.g., icon).\n *\n * @part base - The native button element.\n * @part label - The label wrapper.\n * @part prefix - The prefix slot wrapper.\n * @part suffix - The suffix slot wrapper.\n * @part spinner - The loading spinner element.\n */\n@Component({\n tag: 'ts-button',\n styleUrl: 'button.css',\n shadow: true,\n})\nexport class TsButton {\n @Element() hostEl!: HTMLElement;\n\n /** The button's visual variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'primary';\n\n /** The button's visual weight / appearance. */\n @Prop({ reflect: true }) appearance: TsAppearance = 'solid';\n\n /** The button's size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Renders the button in a disabled state. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Renders a loading spinner and disables the button. */\n @Prop({ reflect: true }) loading = false;\n\n /** Makes the button take the full width of its container. */\n @Prop({ reflect: true }) block = false;\n\n /** The type attribute for the native button. */\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n\n /** An optional href — renders an anchor instead of a button. */\n @Prop() href?: string;\n\n /** Target attribute when href is set. */\n @Prop() target?: '_blank' | '_self' | '_parent' | '_top';\n\n /** Emitted when the button is clicked (not fired when disabled/loading). */\n @Event({ eventName: 'tsClick' }) tsClick!: EventEmitter<void>;\n\n /** Emitted when the button receives focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the button loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n private handleClick = (event: MouseEvent): void => {\n if (this.disabled || this.loading) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.tsClick.emit();\n };\n\n private handleFocus = (): void => {\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.tsBlur.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderSpinner() {\n return (\n <span class=\"button__spinner\" part=\"spinner\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-dasharray=\"31.4 31.4\" />\n </svg>\n </span>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const isLink = !!this.href;\n const Tag = isLink ? 'a' : 'button';\n\n const attrs = isLink\n ? {\n href: this.disabled ? undefined : this.href,\n target: this.target,\n rel: this.target === '_blank' ? 'noopener noreferrer' : undefined,\n role: 'button',\n }\n : {\n type: this.type,\n disabled: this.disabled || this.loading,\n };\n\n return (\n <Host\n class={{\n 'ts-button': true,\n [`ts-button--${this.variant}`]: true,\n [`ts-button--${this.appearance}`]: true,\n [`ts-button--${this.size}`]: true,\n 'ts-button--disabled': this.disabled,\n 'ts-button--loading': this.loading,\n 'ts-button--block': this.block,\n }}\n >\n <Tag\n {...attrs}\n class=\"button__native\"\n part=\"base\"\n aria-disabled={this.disabled || this.loading ? 'true' : undefined}\n aria-busy={this.loading ? 'true' : undefined}\n onClick={this.handleClick}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n >\n {this.loading && this.renderSpinner()}\n\n <span class=\"button__prefix\" part=\"prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <span class=\"button__label\" part=\"label\">\n <slot />\n </span>\n\n <span class=\"button__suffix\" part=\"suffix\">\n <slot name=\"suffix\" />\n </span>\n </Tag>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAY,IAAM,0+L,MCoBXC,EAAQ,M,gJAIMC,QAAqB,UAGrBC,WAA2B,QAG3BC,KAAe,KAGfC,SAAW,MAGXC,QAAU,MAGVC,MAAQ,MAGzBC,KAAsC,SAGtCC,KAGAC,OAGyBC,QAGAC,QAGDC,OAExBC,YAAeC,IACrB,GAAIC,KAAKX,UAAYW,KAAKV,QAAS,CACjCS,EAAME,iBACNF,EAAMG,kBACN,M,CAEFF,KAAKL,QAAQQ,MAAM,EAGbC,YAAc,KACpBJ,KAAKJ,QAAQO,MAAM,EAGbE,WAAa,KACnBL,KAAKH,OAAOM,MAAM,EAIZ,aAAAG,GACN,OACEC,EAAA,QAAMC,MAAM,kBAAkBC,KAAK,UAAS,cAAa,QACvDF,EAAA,OAAKG,QAAQ,YAAYC,KAAK,OAAOC,MAAM,8BACzCL,EAAA,UAAQM,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,mBAAkB,e,CAOtH,MAAAC,GACE,MAAMC,IAAWlB,KAAKP,KACtB,MAAM0B,EAAMD,EAAS,IAAM,SAE3B,MAAME,EAAQF,EACV,CACEzB,KAAMO,KAAKX,SAAWgC,UAAYrB,KAAKP,KACvCC,OAAQM,KAAKN,OACb4B,IAAKtB,KAAKN,SAAW,SAAW,sBAAwB2B,UACxDE,KAAM,UAER,CACE/B,KAAMQ,KAAKR,KACXH,SAAUW,KAAKX,UAAYW,KAAKV,SAGtC,OACEiB,EAACiB,EAAI,CAAAC,IAAA,2CACHjB,MAAO,CACL,YAAa,KACb,CAAC,cAAcR,KAAKd,WAAY,KAChC,CAAC,cAAcc,KAAKb,cAAe,KACnC,CAAC,cAAca,KAAKZ,QAAS,KAC7B,sBAAuBY,KAAKX,SAC5B,qBAAsBW,KAAKV,QAC3B,mBAAoBU,KAAKT,QAG3BgB,EAACY,EAAG,CAAAM,IAAA,8CACEL,EACJZ,MAAM,iBACNC,KAAK,OAAM,gBACIT,KAAKX,UAAYW,KAAKV,QAAU,OAAS+B,UAAS,YACtDrB,KAAKV,QAAU,OAAS+B,UACnCK,QAAS1B,KAAKF,YACd6B,QAAS3B,KAAKI,YACdwB,OAAQ5B,KAAKK,YAEZL,KAAKV,SAAWU,KAAKM,gBAEtBC,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,iBAAiBC,KAAK,UAChCF,EAAA,QAAAkB,IAAA,2CAAMI,KAAK,YAGbtB,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,gBAAgBC,KAAK,SAC/BF,EAAA,QAAAkB,IAAA,8CAGFlB,EAAA,QAAAkB,IAAA,2CAAMjB,MAAM,iBAAiBC,KAAK,UAChCF,EAAA,QAAAkB,IAAA,2CAAMI,KAAK,a","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["tooltipCss","TsTooltip","tooltipId","generateId","content","placement","showDelay","hideDelay","disabled","isVisible","showTimeout","hideTimeout","show","this","clearTimeout","setTimeout","hide","disconnectedCallback","handleMouseEnter","handleMouseLeave","handleFocusIn","handleFocusOut","handleKeydown","event","key","render","h","Host","class","onMouseEnter","onMouseLeave","onFocusin","onFocusout","onKeyDown","undefined","tooltip__popup","part","id","role"],"sources":["src/components/tooltip/tooltip.css?tag=ts-tooltip&encapsulation=shadow","src/components/tooltip/tooltip.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tooltip — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-tooltip-bg Popup background\n --ts-tooltip-color Popup text color\n --ts-tooltip-radius Popup border radius\n ========================================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-tooltip-bg: var(--ts-ref-neutral-900);\n --ts-tooltip-color: #ffffff;\n --ts-tooltip-radius: var(--ts-shape-badge);\n}\n\n.tooltip__trigger {\n display: inline-block;\n}\n\n/* ---- Popup ---- */\n.tooltip__popup {\n position: absolute;\n z-index: var(--ts-z-tooltip);\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n background-color: var(--ts-tooltip-bg);\n color: var(--ts-tooltip-color);\n font-size: var(--ts-font-size-xs);\n font-weight: var(--ts-font-weight-medium);\n line-height: var(--ts-line-height-normal);\n border-radius: var(--ts-tooltip-radius);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity var(--ts-transition-fast),\n transform var(--ts-transition-fast);\n}\n\n.tooltip__popup--visible {\n opacity: 1;\n transform: scale(1);\n}\n\n/* ---- Placements ---- */\n.tooltip__popup--top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform-origin: bottom center;\n}\n.tooltip__popup--top,\n.tooltip__popup--top-start,\n.tooltip__popup--top-end {\n bottom: calc(100% + 8px);\n}\n.tooltip__popup--top { left: 50%; margin-left: -50%; }\n.tooltip__popup--top-start { inset-inline-start: 0; }\n.tooltip__popup--top-end { inset-inline-end: 0; }\n\n.tooltip__popup--bottom,\n.tooltip__popup--bottom-start,\n.tooltip__popup--bottom-end {\n top: calc(100% + 8px);\n}\n.tooltip__popup--bottom { left: 50%; margin-left: -50%; }\n.tooltip__popup--bottom-start { inset-inline-start: 0; }\n.tooltip__popup--bottom-end { inset-inline-end: 0; }\n\n.tooltip__popup--left,\n.tooltip__popup--left-start,\n.tooltip__popup--left-end {\n inset-inline-end: calc(100% + 8px);\n}\n.tooltip__popup--left { top: 50%; transform: translateY(-50%) scale(0.95); }\n.tooltip__popup--left.tooltip__popup--visible { transform: translateY(-50%) scale(1); }\n\n.tooltip__popup--right,\n.tooltip__popup--right-start,\n.tooltip__popup--right-end {\n inset-inline-start: calc(100% + 8px);\n}\n.tooltip__popup--right { top: 50%; transform: translateY(-50%) scale(0.95); }\n.tooltip__popup--right.tooltip__popup--visible { transform: translateY(-50%) scale(1); }\n\n/* ---- Arrow ---- */\n.tooltip__arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--ts-tooltip-bg);\n transform: rotate(45deg);\n}\n\n.tooltip__popup--top .tooltip__arrow,\n.tooltip__popup--top-start .tooltip__arrow,\n.tooltip__popup--top-end .tooltip__arrow {\n bottom: -4px;\n left: 50%;\n margin-left: -4px;\n}\n\n.tooltip__popup--bottom .tooltip__arrow,\n.tooltip__popup--bottom-start .tooltip__arrow,\n.tooltip__popup--bottom-end .tooltip__arrow {\n top: -4px;\n left: 50%;\n margin-left: -4px;\n}\n\n.tooltip__popup--left .tooltip__arrow {\n inset-inline-end: -4px;\n top: 50%;\n margin-top: -4px;\n}\n\n.tooltip__popup--right .tooltip__arrow {\n inset-inline-start: -4px;\n top: 50%;\n margin-top: -4px;\n}\n","import { Component, Prop, State, h, Host, Element, Method } from '@stencil/core';\nimport type { TsPlacement } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot - Default slot for the trigger element.\n *\n * @part base - The tooltip popup container.\n * @part arrow - The tooltip arrow element.\n */\n@Component({\n tag: 'ts-tooltip',\n styleUrl: 'tooltip.css',\n shadow: true,\n})\nexport class TsTooltip {\n @Element() hostEl!: HTMLElement;\n\n private tooltipId = generateId('ts-tooltip');\n\n /** The tooltip text content. */\n @Prop() content = '';\n\n /** Placement of the tooltip relative to the trigger. */\n @Prop({ reflect: true }) placement: TsPlacement = 'top';\n\n /** Delay in ms before showing the tooltip. */\n @Prop() showDelay = 200;\n\n /** Delay in ms before hiding the tooltip. */\n @Prop() hideDelay = 0;\n\n /** Disables the tooltip. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Whether the tooltip is currently visible. */\n @State() isVisible = false;\n\n private showTimeout?: ReturnType<typeof setTimeout>;\n private hideTimeout?: ReturnType<typeof setTimeout>;\n\n /** Programmatically show the tooltip. */\n @Method()\n async show(): Promise<void> {\n if (this.disabled) return;\n clearTimeout(this.hideTimeout);\n this.showTimeout = setTimeout(() => {\n this.isVisible = true;\n }, this.showDelay);\n }\n\n /** Programmatically hide the tooltip. */\n @Method()\n async hide(): Promise<void> {\n clearTimeout(this.showTimeout);\n this.hideTimeout = setTimeout(() => {\n this.isVisible = false;\n }, this.hideDelay);\n }\n\n disconnectedCallback(): void {\n clearTimeout(this.showTimeout);\n clearTimeout(this.hideTimeout);\n }\n\n private handleMouseEnter = (): void => {\n this.show();\n };\n\n private handleMouseLeave = (): void => {\n this.hide();\n };\n\n private handleFocusIn = (): void => {\n this.show();\n };\n\n private handleFocusOut = (): void => {\n this.hide();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.isVisible) {\n this.hide();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-tooltip': true,\n 'ts-tooltip--visible': this.isVisible,\n }}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n onFocusin={this.handleFocusIn}\n onFocusout={this.handleFocusOut}\n onKeyDown={this.handleKeydown}\n >\n <span class=\"tooltip__trigger\" aria-describedby={this.isVisible ? this.tooltipId : undefined}>\n <slot />\n </span>\n\n <div\n class={{\n 'tooltip__popup': true,\n [`tooltip__popup--${this.placement}`]: true,\n 'tooltip__popup--visible': this.isVisible,\n }}\n part=\"base\"\n id={this.tooltipId}\n role=\"tooltip\"\n aria-hidden={!this.isVisible ? 'true' : undefined}\n >\n {this.content}\n <div class=\"tooltip__arrow\" part=\"arrow\" />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"6FAAA,MAAMA,EAAa,IAAM,u7E,MCeZC,EAAS,M,qDAGZC,UAAYC,EAAW,cAGvBC,QAAU,GAGOC,UAAyB,MAG1CC,UAAY,IAGZC,UAAY,EAGKC,SAAW,MAG3BC,UAAY,MAEbC,YACAC,YAIR,UAAMC,GACJ,GAAIC,KAAKL,SAAU,OACnBM,aAAaD,KAAKF,aAClBE,KAAKH,YAAcK,YAAW,KAC5BF,KAAKJ,UAAY,IAAI,GACpBI,KAAKP,U,CAKV,UAAMU,GACJF,aAAaD,KAAKH,aAClBG,KAAKF,YAAcI,YAAW,KAC5BF,KAAKJ,UAAY,KAAK,GACrBI,KAAKN,U,CAGV,oBAAAU,GACEH,aAAaD,KAAKH,aAClBI,aAAaD,KAAKF,Y,CAGZO,iBAAmB,KACzBL,KAAKD,MAAM,EAGLO,iBAAmB,KACzBN,KAAKG,MAAM,EAGLI,cAAgB,KACtBP,KAAKD,MAAM,EAGLS,eAAiB,KACvBR,KAAKG,MAAM,EAGLM,cAAiBC,IACvB,GAAIA,EAAMC,MAAQ,UAAYX,KAAKJ,UAAW,CAC5CI,KAAKG,M,GAKT,MAAAS,GACE,OACEC,EAACC,EAAI,CAAAH,IAAA,2CACHI,MAAO,CACL,aAAc,KACd,sBAAuBf,KAAKJ,WAE9BoB,aAAchB,KAAKK,iBACnBY,aAAcjB,KAAKM,iBACnBY,UAAWlB,KAAKO,cAChBY,WAAYnB,KAAKQ,eACjBY,UAAWpB,KAAKS,eAEhBI,EAAA,QAAAF,IAAA,2CAAMI,MAAM,mBAAkB,mBAAmBf,KAAKJ,UAAYI,KAAKX,UAAYgC,WACjFR,EAAA,QAAAF,IAAA,8CAGFE,EAAA,OAAAF,IAAA,2CACEI,MAAO,CACLO,eAAkB,KAClB,CAAC,mBAAmBtB,KAAKR,aAAc,KACvC,0BAA2BQ,KAAKJ,WAElC2B,KAAK,OACLC,GAAIxB,KAAKX,UACToC,KAAK,UAAS,eACAzB,KAAKJ,UAAY,OAASyB,WAEvCrB,KAAKT,QACNsB,EAAA,OAAAF,IAAA,2CAAKI,MAAM,iBAAiBQ,KAAK,W","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["tabsCss","TsTabs","value","variant","size","tsChange","handleValueChange","this","updatePanelVisibility","componentDidLoad","panels","getPanels","firstEnabled","find","p","hasAttribute","getAttribute","Array","from","hostEl","querySelectorAll","getTabData","map","panel","tab","disabled","icon","undefined","forEach","isActive","style","display","handleTabClick","tabValue","emit","handleKeydown","event","tabs","enabledTabs","filter","t","currentIndex","findIndex","newIndex","key","preventDefault","length","newTab","tabButtons","shadowRoot","allTabIndex","focus","render","h","Host","class","part","role","onKeyDown","tabs__tab","type","tabindex","onClick","name"],"sources":["src/components/tabs/tabs.css?tag=ts-tabs&encapsulation=shadow","src/components/tabs/tabs.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tabs — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-tabs-border-color Border color for tab bar\n --ts-tabs-active-color Active tab indicator color\n --ts-tabs-radius Border radius for enclosed/pill tabs\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-tabs-border-color: var(--ts-color-border-default);\n --ts-tabs-active-color: var(--ts-color-interactive-primary);\n --ts-tabs-radius: var(--ts-radius-md);\n}\n\n/* ---- Tab list ---- */\n.tabs__tablist {\n display: flex;\n gap: var(--ts-spacing-1);\n border-block-end: 2px solid var(--ts-tabs-border-color);\n}\n\n/* ---- Tab button base ---- */\n.tabs__tab {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n border: none;\n background: transparent;\n font-family: inherit;\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-secondary);\n cursor: pointer;\n position: relative;\n white-space: nowrap;\n transition:\n color var(--ts-transition-fast),\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast);\n outline: none;\n margin-block-end: -2px;\n border-block-end: 2px solid transparent;\n}\n\n.tabs__tab:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n.tabs__tab:hover:not([disabled]) {\n color: var(--ts-color-text-primary);\n}\n\n/* ---- Active tab (line variant) ---- */\n.tabs__tab--active {\n color: var(--ts-tabs-active-color);\n border-block-end-color: var(--ts-tabs-active-color);\n}\n\n/* ---- Disabled ---- */\n.tabs__tab--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .tabs__tab {\n padding: var(--ts-spacing-1) var(--ts-spacing-3);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .tabs__tab {\n padding: var(--ts-spacing-2) var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .tabs__tab {\n padding: var(--ts-spacing-3) var(--ts-spacing-5);\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Enclosed variant ---- */\n:host([variant=\"enclosed\"]) .tabs__tablist {\n gap: 0;\n border-block-end: 2px solid var(--ts-tabs-border-color);\n}\n\n:host([variant=\"enclosed\"]) .tabs__tab {\n border: 2px solid transparent;\n border-block-end: 2px solid var(--ts-tabs-border-color);\n border-start-start-radius: var(--ts-tabs-radius);\n border-start-end-radius: var(--ts-tabs-radius);\n margin-block-end: -2px;\n}\n\n:host([variant=\"enclosed\"]) .tabs__tab--active {\n border-color: var(--ts-tabs-border-color);\n border-block-end-color: var(--ts-color-bg-surface);\n background-color: var(--ts-color-bg-surface);\n color: var(--ts-tabs-active-color);\n}\n\n/* ---- Pill variant ---- */\n:host([variant=\"pill\"]) .tabs__tablist {\n border-block-end: none;\n gap: var(--ts-spacing-1);\n background-color: var(--ts-color-bg-subtle);\n border-radius: var(--ts-tabs-radius);\n padding: var(--ts-spacing-1);\n}\n\n:host([variant=\"pill\"]) .tabs__tab {\n border-block-end: none;\n border-radius: var(--ts-tabs-radius);\n margin-block-end: 0;\n}\n\n:host([variant=\"pill\"]) .tabs__tab--active {\n background-color: var(--ts-color-bg-surface);\n color: var(--ts-tabs-active-color);\n box-shadow: var(--ts-shadow-sm);\n}\n\n/* ---- Panels ---- */\n.tabs__panels {\n padding-block-start: var(--ts-spacing-4);\n}\n\n/* ---- Tab icon ---- */\n.tabs__tab-icon {\n font-size: 1em;\n}\n","import { Component, Prop, Event, h, Host, Element, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for `ts-tab-panel` children.\n *\n * @part tablist - The tab button container.\n * @part tab - Each individual tab button.\n * @part tab-active - The currently active tab button.\n * @part panels - The panel container.\n */\n@Component({\n tag: 'ts-tabs',\n styleUrl: 'tabs.css',\n shadow: true,\n})\nexport class TsTabs {\n @Element() hostEl!: HTMLElement;\n\n /** The value of the currently active tab. */\n @Prop({ mutable: true, reflect: true }) value?: string;\n\n /** Visual variant of the tab bar. */\n @Prop({ reflect: true }) variant: 'line' | 'enclosed' | 'pill' = 'line';\n\n /** The size of the tab buttons. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Emitted when the active tab changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ value: string }>;\n\n @Watch('value')\n handleValueChange(): void {\n this.updatePanelVisibility();\n }\n\n componentDidLoad(): void {\n // Default to first non-disabled tab if no value set\n if (!this.value) {\n const panels = this.getPanels();\n const firstEnabled = panels.find((p) => !p.hasAttribute('disabled'));\n if (firstEnabled) {\n this.value = firstEnabled.getAttribute('value') || '';\n }\n }\n this.updatePanelVisibility();\n }\n\n private getPanels(): Element[] {\n return Array.from(this.hostEl.querySelectorAll('ts-tab-panel'));\n }\n\n private getTabData(): Array<{ tab: string; value: string; disabled: boolean; icon?: string }> {\n return this.getPanels().map((panel) => ({\n tab: panel.getAttribute('tab') || '',\n value: panel.getAttribute('value') || '',\n disabled: panel.hasAttribute('disabled'),\n icon: panel.getAttribute('icon') || undefined,\n }));\n }\n\n private updatePanelVisibility(): void {\n this.getPanels().forEach((panel) => {\n const isActive = panel.getAttribute('value') === this.value;\n (panel as HTMLElement).style.display = isActive ? '' : 'none';\n });\n }\n\n private handleTabClick(tabValue: string, disabled: boolean): void {\n if (disabled || tabValue === this.value) return;\n this.value = tabValue;\n this.tsChange.emit({ value: tabValue });\n this.updatePanelVisibility();\n }\n\n private handleKeydown = (event: KeyboardEvent): void => {\n const tabs = this.getTabData();\n const enabledTabs = tabs.filter((t) => !t.disabled);\n const currentIndex = enabledTabs.findIndex((t) => t.value === this.value);\n\n let newIndex = currentIndex;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault();\n newIndex = (currentIndex + 1) % enabledTabs.length;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault();\n newIndex = (currentIndex - 1 + enabledTabs.length) % enabledTabs.length;\n break;\n case 'Home':\n event.preventDefault();\n newIndex = 0;\n break;\n case 'End':\n event.preventDefault();\n newIndex = enabledTabs.length - 1;\n break;\n default:\n return;\n }\n\n const newTab = enabledTabs[newIndex];\n if (newTab) {\n this.value = newTab.value;\n this.tsChange.emit({ value: newTab.value });\n this.updatePanelVisibility();\n\n // Focus the new tab button\n const tabButtons = this.hostEl.shadowRoot?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]');\n const allTabIndex = tabs.findIndex((t) => t.value === newTab.value);\n tabButtons?.[allTabIndex]?.focus();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const tabs = this.getTabData();\n\n return (\n <Host\n class={{\n 'ts-tabs': true,\n [`ts-tabs--${this.variant}`]: true,\n [`ts-tabs--${this.size}`]: true,\n }}\n >\n <div class=\"tabs__tablist\" part=\"tablist\" role=\"tablist\" onKeyDown={this.handleKeydown}>\n {tabs.map((t) => {\n const isActive = t.value === this.value;\n return (\n <button\n class={{\n 'tabs__tab': true,\n 'tabs__tab--active': isActive,\n 'tabs__tab--disabled': t.disabled,\n }}\n part={isActive ? 'tab tab-active' : 'tab'}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive ? 'true' : 'false'}\n aria-disabled={t.disabled ? 'true' : undefined}\n tabindex={isActive ? 0 : -1}\n disabled={t.disabled}\n onClick={() => this.handleTabClick(t.value, t.disabled)}\n >\n {t.icon && <ts-icon name={t.icon} class=\"tabs__tab-icon\" />}\n {t.tab}\n </button>\n );\n })}\n </div>\n <div class=\"tabs__panels\" part=\"panels\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["datePickerCss","WEEKDAYS","TsDatePicker","pickerId","generateId","triggerEl","value","placeholder","disabled","min","max","label","error","errorMessage","size","name","tsChange","isOpen","viewMonth","Date","getMonth","viewYear","getFullYear","focusedDay","handleValueChange","this","date","isNaN","getTime","connectedCallback","toggleCalendar","closeCalendar","prevMonth","nextMonth","selectDay","day","month","String","padStart","dayStr","newValue","emit","focus","isDayDisabled","dateStr","isToday","today","getDate","isSelected","getDaysInMonth","getFirstDayOfWeek","getDay","getMonthName","toLocaleString","handleTriggerKeydown","event","key","preventDefault","handleCalendarKeydown","daysInMonth","newDay","Math","handleDocumentClick","path","composedPath","includes","hostEl","componentDidLoad","document","addEventListener","disconnectedCallback","removeEventListener","renderCalendar","firstDay","days","i","push","d","h","class","part","role","onKeyDown","type","onClick","map","wd","index","tabindex","undefined","render","Host","htmlFor","ref","el","id","readOnly"],"sources":["src/components/date-picker/date-picker.css?tag=ts-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"sourcesContent":["/* ==========================================================================\n ts-date-picker — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-date-picker-bg Input/calendar background\n --ts-date-picker-radius Border radius\n --ts-date-picker-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-date-picker-bg: var(--ts-color-neutral-50);\n --ts-date-picker-radius: var(--ts-radius-md);\n --ts-date-picker-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.date-picker__label {\n display: block;\n margin-block-end: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-primary);\n}\n\n/* ---- Trigger Input ---- */\n.date-picker__trigger {\n display: block;\n width: 100%;\n border: 1px solid var(--ts-color-border-default);\n border-radius: var(--ts-date-picker-radius);\n background-color: var(--ts-date-picker-bg);\n color: var(--ts-color-text-primary);\n font-family: var(--ts-font-family-base);\n cursor: pointer;\n outline: none;\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.date-picker__trigger:focus-visible {\n box-shadow: var(--ts-date-picker-focus-ring);\n border-color: var(--ts-color-interactive-primary);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .date-picker__trigger {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .date-picker__trigger {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .date-picker__trigger {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Error state ---- */\n:host([error]) .date-picker__trigger {\n border-color: var(--ts-color-danger-500);\n}\n\n:host([error]) .date-picker__trigger:focus-visible {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n}\n\n.date-picker__error {\n display: block;\n margin-block-start: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .date-picker__trigger {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Calendar Dropdown ---- */\n.date-picker__calendar {\n position: absolute;\n inset-block-start: 100%;\n inset-inline-start: 0;\n z-index: var(--ts-z-dropdown, 100);\n margin-block-start: var(--ts-spacing-1);\n padding: var(--ts-spacing-3);\n background-color: var(--ts-color-bg-elevated);\n border: 1px solid var(--ts-color-border-subtle);\n border-radius: var(--ts-radius-lg);\n box-shadow: var(--ts-shadow-lg);\n min-inline-size: 280px;\n animation: ts-dp-fade-in 150ms ease-out;\n}\n\n/* ---- Header ---- */\n.date-picker__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-block-end: var(--ts-spacing-2);\n}\n\n.date-picker__month-year {\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n}\n\n.date-picker__nav-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: var(--ts-radius-md);\n background: transparent;\n color: var(--ts-color-text-secondary);\n font-size: var(--ts-font-size-lg);\n cursor: pointer;\n padding: 0;\n line-height: 1;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.date-picker__nav-btn:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-primary);\n}\n\n.date-picker__nav-btn:focus-visible {\n box-shadow: var(--ts-focus-ring);\n outline: none;\n}\n\n/* ---- Grid ---- */\n.date-picker__weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 0;\n margin-block-end: var(--ts-spacing-1);\n}\n\n.date-picker__weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--ts-font-size-xs);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-tertiary);\n padding: var(--ts-spacing-1) 0;\n}\n\n.date-picker__days {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 1px;\n}\n\n/* ---- Day cells ---- */\n.date-picker__day {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n margin: 1px auto;\n border: none;\n border-radius: var(--ts-radius-full);\n background: transparent;\n color: var(--ts-color-text-primary);\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n cursor: pointer;\n padding: 0;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.date-picker__day--empty {\n cursor: default;\n}\n\n.date-picker__day:not(.date-picker__day--empty):not(.date-picker__day--disabled):hover {\n background-color: var(--ts-color-bg-hover);\n}\n\n.date-picker__day:not(.date-picker__day--empty):focus-visible {\n box-shadow: var(--ts-date-picker-focus-ring);\n outline: none;\n}\n\n.date-picker__day--today {\n font-weight: var(--ts-font-weight-bold);\n border: 1px solid var(--ts-color-interactive-primary);\n}\n\n.date-picker__day--selected {\n background-color: var(--ts-color-interactive-primary);\n color: var(--ts-color-text-on-primary);\n font-weight: var(--ts-font-weight-semi);\n}\n\n.date-picker__day--selected:hover {\n background-color: var(--ts-color-interactive-primary-hover);\n}\n\n.date-picker__day--disabled {\n opacity: 0.35;\n cursor: not-allowed;\n}\n\n.date-picker__day--focused {\n box-shadow: var(--ts-date-picker-focus-ring);\n}\n\n/* ---- Animation ---- */\n@keyframes ts-dp-fade-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId } from '../../utils/aria';\n\nconst WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\n/**\n * @part trigger - The input trigger element.\n * @part calendar - The calendar dropdown container.\n * @part header - The month/year navigation header.\n * @part grid - The day grid.\n * @part day - Individual day cell.\n * @part label - The label element.\n * @part error - The error message.\n */\n@Component({\n tag: 'ts-date-picker',\n styleUrl: 'date-picker.css',\n shadow: true,\n})\nexport class TsDatePicker {\n @Element() hostEl!: HTMLElement;\n\n private pickerId = generateId('ts-date-picker');\n private triggerEl?: HTMLInputElement;\n\n /** The selected date value in ISO format (YYYY-MM-DD). */\n @Prop({ mutable: true, reflect: true }) value?: string;\n\n /** Placeholder text for the input. */\n @Prop() placeholder = 'Select date';\n\n /** Whether the date picker is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Minimum selectable date in ISO format. */\n @Prop() min?: string;\n\n /** Maximum selectable date in ISO format. */\n @Prop() max?: string;\n\n /** Label text for the input. */\n @Prop() label?: string;\n\n /** Whether the input is in an error state. */\n @Prop({ reflect: true }) error = false;\n\n /** Error message to display. */\n @Prop() errorMessage?: string;\n\n /** The input size. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Form field name. */\n @Prop() name?: string;\n\n /** Emitted when a date is selected. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ value: string }>;\n\n /** Whether the calendar dropdown is open. */\n @State() isOpen = false;\n\n /** The month currently being viewed (0-11). */\n @State() viewMonth = new Date().getMonth();\n\n /** The year currently being viewed. */\n @State() viewYear = new Date().getFullYear();\n\n /** Currently focused day in the grid for keyboard navigation. */\n @State() focusedDay: number | null = null;\n\n @Watch('value')\n handleValueChange(): void {\n if (this.value) {\n const date = new Date(this.value + 'T00:00:00');\n if (!isNaN(date.getTime())) {\n this.viewMonth = date.getMonth();\n this.viewYear = date.getFullYear();\n }\n }\n }\n\n connectedCallback(): void {\n this.handleValueChange();\n }\n\n private toggleCalendar = (): void => {\n if (this.disabled) return;\n this.isOpen = !this.isOpen;\n if (this.isOpen) {\n this.handleValueChange();\n }\n };\n\n private closeCalendar = (): void => {\n this.isOpen = false;\n this.focusedDay = null;\n };\n\n private prevMonth = (): void => {\n if (this.viewMonth === 0) {\n this.viewMonth = 11;\n this.viewYear -= 1;\n } else {\n this.viewMonth -= 1;\n }\n };\n\n private nextMonth = (): void => {\n if (this.viewMonth === 11) {\n this.viewMonth = 0;\n this.viewYear += 1;\n } else {\n this.viewMonth += 1;\n }\n };\n\n private selectDay = (day: number): void => {\n const month = String(this.viewMonth + 1).padStart(2, '0');\n const dayStr = String(day).padStart(2, '0');\n const newValue = `${this.viewYear}-${month}-${dayStr}`;\n this.value = newValue;\n this.tsChange.emit({ value: newValue });\n this.closeCalendar();\n this.triggerEl?.focus();\n };\n\n private isDayDisabled(day: number): boolean {\n const dateStr = `${this.viewYear}-${String(this.viewMonth + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n if (this.min && dateStr < this.min) return true;\n if (this.max && dateStr > this.max) return true;\n return false;\n }\n\n private isToday(day: number): boolean {\n const today = new Date();\n return (\n day === today.getDate() &&\n this.viewMonth === today.getMonth() &&\n this.viewYear === today.getFullYear()\n );\n }\n\n private isSelected(day: number): boolean {\n if (!this.value) return false;\n const date = new Date(this.value + 'T00:00:00');\n return (\n day === date.getDate() &&\n this.viewMonth === date.getMonth() &&\n this.viewYear === date.getFullYear()\n );\n }\n\n private getDaysInMonth(): number {\n return new Date(this.viewYear, this.viewMonth + 1, 0).getDate();\n }\n\n private getFirstDayOfWeek(): number {\n return new Date(this.viewYear, this.viewMonth, 1).getDay();\n }\n\n private getMonthName(): string {\n return new Date(this.viewYear, this.viewMonth).toLocaleString('default', { month: 'long' });\n }\n\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggleCalendar();\n } else if (event.key === 'Escape' && this.isOpen) {\n this.closeCalendar();\n }\n };\n\n private handleCalendarKeydown = (event: KeyboardEvent): void => {\n const daysInMonth = this.getDaysInMonth();\n\n if (event.key === 'Escape') {\n this.closeCalendar();\n this.triggerEl?.focus();\n return;\n }\n\n if (this.focusedDay === null) {\n this.focusedDay = 1;\n return;\n }\n\n let newDay = this.focusedDay;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n newDay = Math.min(this.focusedDay + 1, daysInMonth);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n newDay = Math.max(this.focusedDay - 1, 1);\n break;\n case 'ArrowDown':\n event.preventDefault();\n newDay = Math.min(this.focusedDay + 7, daysInMonth);\n break;\n case 'ArrowUp':\n event.preventDefault();\n newDay = Math.max(this.focusedDay - 7, 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (!this.isDayDisabled(this.focusedDay)) {\n this.selectDay(this.focusedDay);\n }\n return;\n default:\n return;\n }\n\n this.focusedDay = newDay;\n };\n\n private handleDocumentClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n if (!path.includes(this.hostEl)) {\n this.closeCalendar();\n }\n };\n\n componentDidLoad(): void {\n document.addEventListener('click', this.handleDocumentClick);\n }\n\n disconnectedCallback(): void {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderCalendar() {\n const daysInMonth = this.getDaysInMonth();\n const firstDay = this.getFirstDayOfWeek();\n const days: (number | null)[] = [];\n\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n for (let d = 1; d <= daysInMonth; d++) {\n days.push(d);\n }\n\n return (\n <div\n class=\"date-picker__calendar\"\n part=\"calendar\"\n role=\"dialog\"\n aria-label={`${this.getMonthName()} ${this.viewYear}`}\n onKeyDown={this.handleCalendarKeydown}\n >\n <div class=\"date-picker__header\" part=\"header\">\n <button\n class=\"date-picker__nav-btn\"\n type=\"button\"\n aria-label=\"Previous month\"\n onClick={this.prevMonth}\n >\n &#x2039;\n </button>\n <span class=\"date-picker__month-year\">\n {this.getMonthName()} {this.viewYear}\n </span>\n <button\n class=\"date-picker__nav-btn\"\n type=\"button\"\n aria-label=\"Next month\"\n onClick={this.nextMonth}\n >\n &#x203A;\n </button>\n </div>\n\n <div class=\"date-picker__grid\" role=\"grid\" aria-label=\"Calendar\">\n <div class=\"date-picker__weekdays\">\n {WEEKDAYS.map((wd) => (\n <span class=\"date-picker__weekday\" role=\"columnheader\" key={wd}>\n {wd}\n </span>\n ))}\n </div>\n <div class=\"date-picker__days\">\n {days.map((day, index) =>\n day === null ? (\n <span class=\"date-picker__day date-picker__day--empty\" key={`empty-${index}`} />\n ) : (\n <button\n class={{\n 'date-picker__day': true,\n 'date-picker__day--today': this.isToday(day),\n 'date-picker__day--selected': this.isSelected(day),\n 'date-picker__day--disabled': this.isDayDisabled(day),\n 'date-picker__day--focused': this.focusedDay === day,\n }}\n part=\"day\"\n type=\"button\"\n disabled={this.isDayDisabled(day)}\n tabindex={this.focusedDay === day ? 0 : -1}\n aria-label={`${day} ${this.getMonthName()} ${this.viewYear}`}\n aria-selected={this.isSelected(day) ? 'true' : undefined}\n key={`day-${day}`}\n onClick={() => this.selectDay(day)}\n >\n {day}\n </button>\n ),\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-date-picker': true,\n 'ts-date-picker--open': this.isOpen,\n 'ts-date-picker--error': this.error,\n [`ts-date-picker--${this.size}`]: true,\n }}\n >\n {this.label && (\n <label class=\"date-picker__label\" part=\"label\" htmlFor={this.pickerId}>\n {this.label}\n </label>\n )}\n\n <input\n ref={(el) => (this.triggerEl = el)}\n class=\"date-picker__trigger\"\n part=\"trigger\"\n type=\"text\"\n id={this.pickerId}\n name={this.name}\n value={this.value || ''}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly\n aria-haspopup=\"dialog\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n aria-invalid={this.error ? 'true' : undefined}\n onClick={this.toggleCalendar}\n onKeyDown={this.handleTriggerKeydown}\n />\n\n {this.isOpen && this.renderCalendar()}\n\n {this.error && this.errorMessage && (\n <span class=\"date-picker__error\" part=\"error\" role=\"alert\">\n {this.errorMessage}\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["accordionCss","TsAccordion","multiple","handleToggle","event","this","detail","open","target","items","hostEl","querySelectorAll","forEach","item","setAttribute","removeAttribute","render","h","Host","key","class"],"sources":["src/components/accordion/accordion.css?tag=ts-accordion&encapsulation=shadow","src/components/accordion/accordion.tsx"],"sourcesContent":["/* ==========================================================================\n ts-accordion — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-accordion-border-color Border color between items\n --ts-accordion-header-bg Header background color\n --ts-accordion-radius Border radius\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-accordion-border-color: var(--ts-color-border-default);\n --ts-accordion-header-bg: transparent;\n --ts-accordion-radius: var(--ts-radius-lg);\n}\n\n::slotted(ts-accordion-item) {\n border-block-end: 1px solid var(--ts-accordion-border-color);\n}\n\n::slotted(ts-accordion-item:first-child) {\n border-start-start-radius: var(--ts-accordion-radius);\n border-start-end-radius: var(--ts-accordion-radius);\n}\n\n::slotted(ts-accordion-item:last-child) {\n border-end-start-radius: var(--ts-accordion-radius);\n border-end-end-radius: var(--ts-accordion-radius);\n border-block-end: none;\n}\n","import { Component, Prop, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-accordion-item children.\n */\n@Component({\n tag: 'ts-accordion',\n styleUrl: 'accordion.css',\n shadow: true,\n})\nexport class TsAccordion {\n @Element() hostEl!: HTMLElement;\n\n /** Allow multiple items to be open simultaneously. */\n @Prop() multiple = false;\n\n @Listen('tsToggle')\n handleToggle(event: CustomEvent<{ open: boolean }>): void {\n if (!this.multiple && event.detail.open) {\n const target = event.target as HTMLElement;\n const items = this.hostEl.querySelectorAll('ts-accordion-item');\n items.forEach((item) => {\n if (item !== target) {\n item.setAttribute('open', 'false');\n item.removeAttribute('open');\n }\n });\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host class=\"ts-accordion\">\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"oDAAA,MAAMA,EAAe,IAAM,6iB,MCUdC,EAAW,M,qDAIdC,SAAW,MAGnB,YAAAC,CAAaC,GACX,IAAKC,KAAKH,UAAYE,EAAME,OAAOC,KAAM,CACvC,MAAMC,EAASJ,EAAMI,OACrB,MAAMC,EAAQJ,KAAKK,OAAOC,iBAAiB,qBAC3CF,EAAMG,SAASC,IACb,GAAIA,IAASL,EAAQ,CACnBK,EAAKC,aAAa,OAAQ,SAC1BD,EAAKE,gBAAgB,O,MAO7B,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CAACC,MAAM,gBACVH,EAAA,QAAAE,IAAA,6C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["textareaCss","TsTextarea","textareaEl","inputId","generateId","value","placeholder","disabled","readonly","size","label","helpText","error","errorMessage","required","name","rows","resize","maxlength","hasFocus","tsInput","tsChange","tsFocus","tsBlur","handleValueChange","newValue","oldValue","this","setFocus","focus","selectText","select","handleInput","event","target","previousValue","emit","handleChange","handleFocus","handleBlur","render","hasError","labelId","helpId","errorId","h","Host","key","class","part","id","htmlFor","textarea__wrapper","ref","el","readOnly","undefined","onInput","onChange","onFocus","onBlur","role"],"sources":["src/components/textarea/textarea.css?tag=ts-textarea&encapsulation=shadow","src/components/textarea/textarea.tsx"],"sourcesContent":["/* ==========================================================================\n ts-textarea — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-textarea-bg Textarea background\n --ts-textarea-border-color Default border color\n --ts-textarea-radius Border radius\n --ts-textarea-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-textarea-bg: var(--ts-color-bg-surface);\n --ts-textarea-border-color: var(--ts-color-border-default);\n --ts-textarea-radius: var(--ts-radius-md);\n --ts-textarea-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.textarea__label {\n display: block;\n margin-block-end: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n.textarea__required {\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Wrapper ---- */\n.textarea__wrapper {\n display: flex;\n border: 2px solid var(--ts-textarea-border-color);\n border-radius: var(--ts-textarea-radius);\n background-color: var(--ts-textarea-bg);\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n overflow: hidden;\n}\n\n.textarea__wrapper--focused {\n border-color: var(--ts-color-primary-500);\n box-shadow: var(--ts-textarea-focus-ring);\n}\n\n.textarea__wrapper--error {\n border-color: var(--ts-color-danger-500);\n}\n\n.textarea__wrapper--error.textarea__wrapper--focused {\n box-shadow: 0 0 0 3px var(--ts-color-focus-ring-danger);\n}\n\n.textarea__wrapper--disabled {\n background-color: var(--ts-color-bg-disabled);\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ---- Native Textarea ---- */\n.textarea__native {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n color: var(--ts-color-text-primary);\n width: 100%;\n min-width: 0;\n line-height: var(--ts-line-height-normal);\n}\n\n.textarea__native::placeholder {\n color: var(--ts-color-text-tertiary);\n}\n\n.textarea__native:disabled {\n cursor: not-allowed;\n}\n\n/* ---- Resize ---- */\n:host([resize=\"none\"]) .textarea__native {\n resize: none;\n}\n\n:host([resize=\"vertical\"]) .textarea__native {\n resize: vertical;\n}\n\n:host([resize=\"horizontal\"]) .textarea__native {\n resize: horizontal;\n}\n\n:host([resize=\"both\"]) .textarea__native {\n resize: both;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .textarea__wrapper {\n border-radius: var(--ts-radius-sm);\n}\n:host([size=\"sm\"]) .textarea__native {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .textarea__native {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .textarea__native {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .textarea__wrapper {\n border-radius: var(--ts-radius-lg);\n}\n:host([size=\"xl\"]) .textarea__native {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-xl);\n}\n\n/* ---- Help & Error Text ---- */\n.textarea__help,\n.textarea__error {\n margin-block-start: var(--ts-spacing-1);\n font-size: var(--ts-font-size-xs);\n line-height: var(--ts-line-height-normal);\n}\n\n.textarea__help {\n color: var(--ts-color-text-tertiary);\n}\n\n.textarea__error {\n color: var(--ts-color-danger-600);\n font-weight: var(--ts-font-weight-medium);\n}\n","import { Component, Prop, State, Event, Watch, h, Host, Element, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsChangeEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @part base - The outer wrapper.\n * @part label - The label element.\n * @part textarea - The native textarea element.\n * @part help-text - The help text wrapper.\n * @part error-text - The error message wrapper.\n */\n@Component({\n tag: 'ts-textarea',\n styleUrl: 'textarea.css',\n shadow: true,\n})\nexport class TsTextarea {\n @Element() hostEl!: HTMLElement;\n\n private textareaEl?: HTMLTextAreaElement;\n private inputId = generateId('ts-textarea');\n\n /** The textarea's value. */\n @Prop({ mutable: true, reflect: true }) value = '';\n\n /** Placeholder text. */\n @Prop() placeholder?: string;\n\n /** Renders the textarea as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Renders the textarea as readonly. */\n @Prop({ reflect: true }) readonly = false;\n\n /** The textarea size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Label text displayed above the textarea. */\n @Prop() label?: string;\n\n /** Help text displayed below the textarea. */\n @Prop() helpText?: string;\n\n /** Renders the textarea in an error state. */\n @Prop({ reflect: true }) error = false;\n\n /** Error message displayed below the textarea. */\n @Prop() errorMessage?: string;\n\n /** Makes the textarea required. */\n @Prop({ reflect: true }) required = false;\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Number of visible text rows. */\n @Prop() rows = 3;\n\n /** Resize behavior. */\n @Prop({ reflect: true }) resize: 'none' | 'vertical' | 'horizontal' | 'both' = 'vertical';\n\n /** Maximum character length. */\n @Prop() maxlength?: number;\n\n /** Whether the textarea is currently focused. */\n @State() hasFocus = false;\n\n /** Emitted on every keystroke. */\n @Event({ eventName: 'tsInput' }) tsInput!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the value changes (on blur / commit). */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsChangeEventDetail<string>>;\n\n /** Emitted when the textarea gains focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the textarea loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n @Watch('value')\n handleValueChange(newValue: string, oldValue: string): void {\n if (newValue !== oldValue && this.textareaEl) {\n this.textareaEl.value = newValue;\n }\n }\n\n /** Programmatically focus the textarea. */\n @Method()\n async setFocus(): Promise<void> {\n this.textareaEl?.focus();\n }\n\n /** Programmatically select the textarea text. */\n @Method()\n async selectText(): Promise<void> {\n this.textareaEl?.select();\n }\n\n private handleInput = (event: Event): void => {\n const target = event.target as HTMLTextAreaElement;\n const previousValue = this.value;\n this.value = target.value;\n this.tsInput.emit({ value: this.value, previousValue });\n };\n\n private handleChange = (): void => {\n this.tsChange.emit({ value: this.value, previousValue: this.value });\n };\n\n private handleFocus = (): void => {\n this.hasFocus = true;\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.hasFocus = false;\n this.tsBlur.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasError = this.error && !!this.errorMessage;\n const labelId = `${this.inputId}-label`;\n const helpId = `${this.inputId}-help`;\n const errorId = `${this.inputId}-error`;\n\n return (\n <Host\n class={{\n 'ts-textarea': true,\n [`ts-textarea--${this.size}`]: true,\n 'ts-textarea--focused': this.hasFocus,\n 'ts-textarea--disabled': this.disabled,\n 'ts-textarea--error': this.error,\n }}\n >\n {this.label && (\n <label class=\"textarea__label\" part=\"label\" id={labelId} htmlFor={this.inputId}>\n {this.label}\n {this.required && <span class=\"textarea__required\" aria-hidden=\"true\"> *</span>}\n </label>\n )}\n\n <div\n class={{\n 'textarea__wrapper': true,\n 'textarea__wrapper--focused': this.hasFocus,\n 'textarea__wrapper--error': this.error,\n 'textarea__wrapper--disabled': this.disabled,\n }}\n part=\"base\"\n >\n <textarea\n ref={(el) => (this.textareaEl = el)}\n id={this.inputId}\n class=\"textarea__native\"\n part=\"textarea\"\n value={this.value}\n placeholder={this.placeholder}\n disabled={this.disabled}\n readOnly={this.readonly}\n required={this.required}\n maxlength={this.maxlength}\n name={this.name}\n rows={this.rows}\n aria-labelledby={this.label ? labelId : undefined}\n aria-describedby={hasError ? errorId : this.helpText ? helpId : undefined}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required ? 'true' : undefined}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n </div>\n\n {hasError && (\n <div class=\"textarea__error\" part=\"error-text\" id={errorId} role=\"alert\">\n {this.errorMessage}\n </div>\n )}\n\n {!hasError && this.helpText && (\n <div class=\"textarea__help\" part=\"help-text\" id={helpId}>\n {this.helpText}\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"+FAAA,MAAMA,EAAc,IAAM,+jF,MCiBbC,EAAU,M,iLAGbC,WACAC,QAAUC,EAAW,eAGWC,MAAQ,GAGxCC,YAGiBC,SAAW,MAGXC,SAAW,MAGXC,KAAe,KAGhCC,MAGAC,SAGiBC,MAAQ,MAGzBC,aAGiBC,SAAW,MAG5BC,KAGAC,KAAO,EAGUC,OAAsD,WAGvEC,UAGCC,SAAW,MAGaC,QAGCC,SAGDC,QAGDC,OAGhC,iBAAAC,CAAkBC,EAAkBC,GAClC,GAAID,IAAaC,GAAYC,KAAKzB,WAAY,CAC5CyB,KAAKzB,WAAWG,MAAQoB,C,EAM5B,cAAMG,GACJD,KAAKzB,YAAY2B,O,CAKnB,gBAAMC,GACJH,KAAKzB,YAAY6B,Q,CAGXC,YAAeC,IACrB,MAAMC,EAASD,EAAMC,OACrB,MAAMC,EAAgBR,KAAKtB,MAC3BsB,KAAKtB,MAAQ6B,EAAO7B,MACpBsB,KAAKP,QAAQgB,KAAK,CAAE/B,MAAOsB,KAAKtB,MAAO8B,iBAAgB,EAGjDE,aAAe,KACrBV,KAAKN,SAASe,KAAK,CAAE/B,MAAOsB,KAAKtB,MAAO8B,cAAeR,KAAKtB,OAAQ,EAG9DiC,YAAc,KACpBX,KAAKR,SAAW,KAChBQ,KAAKL,QAAQc,MAAM,EAGbG,WAAa,KACnBZ,KAAKR,SAAW,MAChBQ,KAAKJ,OAAOa,MAAM,EAIpB,MAAAI,GACE,MAAMC,EAAWd,KAAKf,SAAWe,KAAKd,aACtC,MAAM6B,EAAU,GAAGf,KAAKxB,gBACxB,MAAMwC,EAAS,GAAGhB,KAAKxB,eACvB,MAAMyC,EAAU,GAAGjB,KAAKxB,gBAExB,OACE0C,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,cAAe,KACf,CAAC,gBAAgBrB,KAAKlB,QAAS,KAC/B,uBAAwBkB,KAAKR,SAC7B,wBAAyBQ,KAAKpB,SAC9B,qBAAsBoB,KAAKf,QAG5Be,KAAKjB,OACJmC,EAAA,SAAAE,IAAA,2CAAOC,MAAM,kBAAkBC,KAAK,QAAQC,GAAIR,EAASS,QAASxB,KAAKxB,SACpEwB,KAAKjB,MACLiB,KAAKb,UAAY+B,EAAA,QAAAE,IAAA,2CAAMC,MAAM,qBAAoB,cAAa,QAAM,OAIzEH,EAAA,OAAAE,IAAA,2CACEC,MAAO,CACLI,kBAAqB,KACrB,6BAA8BzB,KAAKR,SACnC,2BAA4BQ,KAAKf,MACjC,8BAA+Be,KAAKpB,UAEtC0C,KAAK,QAELJ,EAAA,YAAAE,IAAA,2CACEM,IAAMC,GAAQ3B,KAAKzB,WAAaoD,EAChCJ,GAAIvB,KAAKxB,QACT6C,MAAM,mBACNC,KAAK,WACL5C,MAAOsB,KAAKtB,MACZC,YAAaqB,KAAKrB,YAClBC,SAAUoB,KAAKpB,SACfgD,SAAU5B,KAAKnB,SACfM,SAAUa,KAAKb,SACfI,UAAWS,KAAKT,UAChBH,KAAMY,KAAKZ,KACXC,KAAMW,KAAKX,KAAI,kBACEW,KAAKjB,MAAQgC,EAAUc,UAAS,mBAC/Bf,EAAWG,EAAUjB,KAAKhB,SAAWgC,EAASa,UAAS,eAC3D7B,KAAKf,MAAQ,OAAS4C,UAAS,gBAC9B7B,KAAKb,SAAW,OAAS0C,UACxCC,QAAS9B,KAAKK,YACd0B,SAAU/B,KAAKU,aACfsB,QAAShC,KAAKW,YACdsB,OAAQjC,KAAKY,cAIhBE,GACCI,EAAA,OAAAE,IAAA,2CAAKC,MAAM,kBAAkBC,KAAK,aAAaC,GAAIN,EAASiB,KAAK,SAC9DlC,KAAKd,eAIR4B,GAAYd,KAAKhB,UACjBkC,EAAA,OAAAE,IAAA,2CAAKC,MAAM,iBAAiBC,KAAK,YAAYC,GAAIP,GAC9ChB,KAAKhB,U","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["switchOptionCss","TsSwitchOption","value","disabled","icon","active","tsOptionSelect","handleClick","this","emit","render","h","Host","key","class","role","tabindex","String","undefined","onClick","part","name","size"],"sources":["src/components/switch-group/switch-option.css?tag=ts-switch-option&encapsulation=shadow","src/components/switch-group/switch-option.tsx"],"sourcesContent":["/* ==========================================================================\n ts-switch-option — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: inline-flex;\n flex: 1;\n outline: none;\n}\n\n.switch-option__base {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ts-spacing-1);\n inline-size: 100%;\n padding-inline: var(--ts-spacing-3);\n padding-block: var(--ts-spacing-1);\n border-radius: calc(var(--ts-switch-group-radius, var(--ts-shape-interactive)) - 2px);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-secondary);\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.switch-option__base:hover {\n color: var(--ts-color-text-primary);\n}\n\n:host(:focus-visible) .switch-option__base {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Active ---- */\n:host([active]) .switch-option__base {\n background-color: var(--ts-switch-group-active-bg, var(--ts-color-bg-elevated));\n color: var(--ts-color-text-primary);\n box-shadow: var(--ts-shadow-sm);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .switch-option__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Icon ---- */\n.switch-option__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* ---- Label ---- */\n.switch-option__label {\n display: inline-flex;\n align-items: center;\n}\n","import { Component, Prop, Event, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for label text.\n *\n * @part base - The option container.\n * @part icon - The icon wrapper.\n */\n@Component({\n tag: 'ts-switch-option',\n styleUrl: 'switch-option.css',\n shadow: true,\n})\nexport class TsSwitchOption {\n @Element() hostEl!: HTMLElement;\n\n /** Unique identifier for this option. */\n @Prop({ reflect: true }) value?: string;\n\n /** Disables this option. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Optional icon name. */\n @Prop() icon?: string;\n\n /** Whether this option is the active selection (set by parent). */\n @Prop({ reflect: true, mutable: true }) active = false;\n\n /** @internal Emitted when this option is clicked. */\n @Event({ eventName: 'tsOptionSelect', bubbles: true }) tsOptionSelect!: EventEmitter<{ value: string }>;\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.tsOptionSelect.emit({ value: this.value || '' });\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-switch-option': true,\n 'ts-switch-option--active': this.active,\n 'ts-switch-option--disabled': this.disabled,\n }}\n role=\"radio\"\n tabindex={this.active ? 0 : -1}\n aria-checked={String(this.active)}\n aria-disabled={this.disabled ? 'true' : undefined}\n onClick={this.handleClick}\n >\n <div class=\"switch-option__base\" part=\"base\">\n {this.icon && (\n <span class=\"switch-option__icon\" part=\"icon\" aria-hidden=\"true\">\n <ts-icon name={this.icon} size=\"sm\" />\n </span>\n )}\n <span class=\"switch-option__label\">\n <slot />\n </span>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAkB,IAAM,6mC,MCcjBC,EAAc,M,kGAIAC,MAGAC,SAAW,MAG5BC,KAGgCC,OAAS,MAGMC,eAE/CC,YAAc,KACpB,GAAIC,KAAKL,SAAU,OACnBK,KAAKF,eAAeG,KAAK,CAAEP,MAAOM,KAAKN,OAAS,IAAK,EAIvD,MAAAQ,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,mBAAoB,KACpB,2BAA4BN,KAAKH,OACjC,6BAA8BG,KAAKL,UAErCY,KAAK,QACLC,SAAUR,KAAKH,OAAS,GAAI,EAAE,eAChBY,OAAOT,KAAKH,QAAO,gBAClBG,KAAKL,SAAW,OAASe,UACxCC,QAASX,KAAKD,aAEdI,EAAA,OAAAE,IAAA,2CAAKC,MAAM,sBAAsBM,KAAK,QACnCZ,KAAKJ,MACJO,EAAA,QAAAE,IAAA,2CAAMC,MAAM,sBAAsBM,KAAK,OAAM,cAAa,QACxDT,EAAA,WAAAE,IAAA,2CAASQ,KAAMb,KAAKJ,KAAMkB,KAAK,QAGnCX,EAAA,QAAAE,IAAA,2CAAMC,MAAM,wBACVH,EAAA,QAAAE,IAAA,+C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["selectCss","TsSelect","inputId","generateId","triggerEl","value","placeholder","disabled","size","label","helpText","error","errorMessage","required","name","multiple","isOpen","focusedIndex","options","tsChange","tsFocus","tsBlur","handleValueChange","handleDocumentClick","event","this","hostEl","contains","target","close","componentWillLoad","parseOptions","componentDidLoad","slot","shadowRoot","querySelector","addEventListener","slottedOptions","querySelectorAll","Array","from","map","opt","textContent","trim","open","findIndex","o","focus","selectOption","option","emit","handleTriggerClick","handleTriggerKeydown","key","preventDefault","handleDropdownKeydown","enabledOptions","filter","moveFocus","length","indexOf","direction","next","handleFocus","handleBlur","getDisplayText","selected","find","render","hasError","labelId","helpId","errorId","listboxId","displayText","h","Host","class","part","id","ref","el","select__trigger","type","role","undefined","onClick","onKeyDown","onFocus","onBlur","select__display","viewBox","fill","d","stroke","index","select__option"],"sources":["src/components/select/select.css?tag=ts-select&encapsulation=shadow","src/components/select/select.tsx"],"sourcesContent":["/* ==========================================================================\n ts-select — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-select-bg Select background\n --ts-select-border-color Default border color\n --ts-select-radius Border radius\n --ts-select-focus-ring Focus ring box-shadow\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-select-bg: var(--ts-color-neutral-50);\n --ts-select-border-color: var(--ts-color-border-default);\n --ts-select-radius: var(--ts-radius-md);\n --ts-select-focus-ring: var(--ts-focus-ring);\n}\n\n/* ---- Label ---- */\n.select__label {\n display: block;\n margin-block-end: var(--ts-spacing-1);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n.select__required {\n color: var(--ts-color-danger-500);\n}\n\n/* ---- Container ---- */\n.select__container {\n position: relative;\n}\n\n/* ---- Trigger button ---- */\n.select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ts-spacing-2);\n width: 100%;\n border: 1px solid var(--ts-select-border-color);\n border-radius: var(--ts-select-radius);\n background-color: var(--ts-select-bg);\n font-family: inherit;\n color: var(--ts-color-text-primary);\n cursor: pointer;\n outline: none;\n transition:\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n text-align: start;\n appearance: none;\n}\n\n.select__trigger:focus-visible {\n border-color: var(--ts-color-primary-500);\n box-shadow: var(--ts-select-focus-ring);\n}\n\n.select__trigger--error {\n border-color: var(--ts-color-danger-500);\n}\n\n.select__trigger--error:focus-visible {\n box-shadow: 0 0 0 3px var(--ts-color-focus-ring-danger);\n}\n\n.select__trigger--disabled {\n background-color: var(--ts-color-bg-disabled);\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.select__trigger--open {\n border-color: var(--ts-color-primary-500);\n box-shadow: var(--ts-select-focus-ring);\n}\n\n/* ---- Display text ---- */\n.select__display {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.select__display--placeholder {\n color: var(--ts-color-text-tertiary);\n}\n\n/* ---- Chevron ---- */\n.select__chevron {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n transition: transform var(--ts-transition-fast);\n color: var(--ts-color-text-tertiary);\n}\n\n:host(.ts-select--open) .select__chevron {\n transform: rotate(180deg);\n}\n\n/* ---- Dropdown ---- */\n.select__dropdown {\n position: absolute;\n inset-inline-start: 0;\n inset-inline-end: 0;\n top: calc(100% + var(--ts-spacing-1));\n z-index: 1000;\n background-color: var(--ts-color-bg-elevated);\n border: 1px solid var(--ts-color-border-default);\n border-radius: var(--ts-radius-md);\n box-shadow: var(--ts-shadow-lg);\n max-height: 15rem;\n overflow-y: auto;\n padding-block: var(--ts-spacing-1);\n}\n\n/* ---- Option ---- */\n.select__option {\n display: flex;\n align-items: center;\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n color: var(--ts-color-text-primary);\n font-size: inherit;\n}\n\n.select__option:hover:not(.select__option--disabled) {\n background-color: var(--ts-color-interactive-primary-subtle);\n}\n\n.select__option--focused {\n background-color: var(--ts-color-bg-subtle);\n}\n\n.select__option--selected {\n color: var(--ts-color-interactive-primary);\n font-weight: var(--ts-font-weight-medium);\n}\n\n.select__option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .select__trigger {\n padding: var(--ts-spacing-1) var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n border-radius: var(--ts-radius-sm);\n}\n\n:host([size=\"md\"]) .select__trigger {\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) .select__trigger {\n padding: var(--ts-spacing-3) var(--ts-spacing-4);\n font-size: var(--ts-font-size-lg);\n}\n\n:host([size=\"xl\"]) .select__trigger {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-xl);\n border-radius: var(--ts-radius-lg);\n}\n\n/* ---- Hidden slot ---- */\n.select__hidden-slot {\n display: none;\n}\n\n/* ---- Help & Error Text ---- */\n.select__help,\n.select__error {\n margin-block-start: var(--ts-spacing-1);\n font-size: var(--ts-font-size-xs);\n line-height: var(--ts-line-height-normal);\n}\n\n.select__help {\n color: var(--ts-color-text-tertiary);\n}\n\n.select__error {\n color: var(--ts-color-danger-600);\n font-weight: var(--ts-font-weight-medium);\n}\n","import { Component, Prop, State, Event, Watch, h, Host, Element, Listen } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize, TsSelectChangeEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\ninterface SelectOption {\n value: string;\n label: string;\n disabled: boolean;\n}\n\n/**\n * @slot - Default slot for `<option>` elements.\n *\n * @part base - The outer wrapper.\n * @part label - The label element.\n * @part trigger - The select trigger button.\n * @part dropdown - The dropdown panel.\n * @part option - An option in the dropdown list.\n * @part help-text - The help text wrapper.\n * @part error-text - The error message wrapper.\n */\n@Component({\n tag: 'ts-select',\n styleUrl: 'select.css',\n shadow: true,\n})\nexport class TsSelect {\n @Element() hostEl!: HTMLElement;\n\n private inputId = generateId('ts-select');\n private triggerEl?: HTMLElement;\n\n /** The current value. */\n @Prop({ mutable: true, reflect: true }) value = '';\n\n /** Placeholder text when no value is selected. */\n @Prop() placeholder?: string;\n\n /** Renders the select as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** The select size. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Label text displayed above the select. */\n @Prop() label?: string;\n\n /** Help text displayed below the select. */\n @Prop() helpText?: string;\n\n /** Renders the select in an error state. */\n @Prop({ reflect: true }) error = false;\n\n /** Error message displayed below the select. */\n @Prop() errorMessage?: string;\n\n /** Makes the select required. */\n @Prop({ reflect: true }) required = false;\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Allow multiple selections. */\n @Prop({ reflect: true }) multiple = false;\n\n /** Whether the dropdown is open. */\n @State() isOpen = false;\n\n /** The index of the currently focused option. */\n @State() focusedIndex = -1;\n\n /** Parsed options from slotted <option> elements. */\n @State() options: SelectOption[] = [];\n\n /** Emitted when the value changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsSelectChangeEventDetail>;\n\n /** Emitted when the select gains focus. */\n @Event({ eventName: 'tsFocus' }) tsFocus!: EventEmitter<void>;\n\n /** Emitted when the select loses focus. */\n @Event({ eventName: 'tsBlur' }) tsBlur!: EventEmitter<void>;\n\n @Watch('value')\n handleValueChange(): void {\n // Value was changed externally; ensure UI is in sync\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent): void {\n if (this.isOpen && !this.hostEl.contains(event.target as Node)) {\n this.close();\n }\n }\n\n componentWillLoad(): void {\n this.parseOptions();\n }\n\n componentDidLoad(): void {\n // Observe slot changes to re-parse options\n const slot = this.hostEl.shadowRoot?.querySelector('.select__hidden-slot slot');\n slot?.addEventListener('slotchange', () => this.parseOptions());\n }\n\n private parseOptions(): void {\n const slottedOptions = this.hostEl.querySelectorAll('option');\n this.options = Array.from(slottedOptions).map((opt) => ({\n value: opt.value,\n label: opt.textContent?.trim() ?? opt.value,\n disabled: opt.disabled,\n }));\n }\n\n private open(): void {\n if (this.disabled) return;\n this.isOpen = true;\n this.focusedIndex = this.options.findIndex((o) => o.value === this.value);\n if (this.focusedIndex < 0) this.focusedIndex = 0;\n }\n\n private close(): void {\n this.isOpen = false;\n this.focusedIndex = -1;\n this.triggerEl?.focus();\n }\n\n private selectOption(option: SelectOption): void {\n if (option.disabled) return;\n this.value = option.value;\n this.tsChange.emit({ value: this.value });\n this.close();\n }\n\n private handleTriggerClick = (): void => {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen) {\n this.open();\n } else if (event.key === 'Enter' || event.key === ' ') {\n if (this.focusedIndex >= 0 && this.options[this.focusedIndex]) {\n this.selectOption(this.options[this.focusedIndex]);\n }\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.isOpen) {\n this.open();\n }\n break;\n case 'Escape':\n if (this.isOpen) {\n event.preventDefault();\n this.close();\n }\n break;\n }\n };\n\n private handleDropdownKeydown = (event: KeyboardEvent): void => {\n const enabledOptions = this.options.filter((o) => !o.disabled);\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocus(-1);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (this.focusedIndex >= 0 && this.options[this.focusedIndex] && !this.options[this.focusedIndex].disabled) {\n this.selectOption(this.options[this.focusedIndex]);\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'Home':\n event.preventDefault();\n this.focusedIndex = enabledOptions.length > 0 ? this.options.indexOf(enabledOptions[0]) : 0;\n break;\n case 'End':\n event.preventDefault();\n this.focusedIndex = enabledOptions.length > 0 ? this.options.indexOf(enabledOptions[enabledOptions.length - 1]) : this.options.length - 1;\n break;\n }\n };\n\n private moveFocus(direction: number): void {\n let next = this.focusedIndex + direction;\n while (next >= 0 && next < this.options.length && this.options[next].disabled) {\n next += direction;\n }\n if (next >= 0 && next < this.options.length) {\n this.focusedIndex = next;\n }\n }\n\n private handleFocus = (): void => {\n this.tsFocus.emit();\n };\n\n private handleBlur = (): void => {\n this.tsBlur.emit();\n };\n\n private getDisplayText(): string {\n const selected = this.options.find((o) => o.value === this.value);\n return selected?.label ?? '';\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const hasError = this.error && !!this.errorMessage;\n const labelId = `${this.inputId}-label`;\n const helpId = `${this.inputId}-help`;\n const errorId = `${this.inputId}-error`;\n const listboxId = `${this.inputId}-listbox`;\n const displayText = this.getDisplayText();\n\n return (\n <Host\n class={{\n 'ts-select': true,\n [`ts-select--${this.size}`]: true,\n 'ts-select--open': this.isOpen,\n 'ts-select--disabled': this.disabled,\n 'ts-select--error': this.error,\n }}\n >\n {this.label && (\n <label class=\"select__label\" part=\"label\" id={labelId}>\n {this.label}\n {this.required && <span class=\"select__required\" aria-hidden=\"true\"> *</span>}\n </label>\n )}\n\n <div class=\"select__container\">\n <button\n ref={(el) => (this.triggerEl = el)}\n class={{\n 'select__trigger': true,\n 'select__trigger--open': this.isOpen,\n 'select__trigger--error': this.error,\n 'select__trigger--disabled': this.disabled,\n }}\n part=\"trigger\"\n type=\"button\"\n role=\"combobox\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-labelledby={this.label ? labelId : undefined}\n aria-invalid={this.error ? 'true' : undefined}\n aria-required={this.required ? 'true' : undefined}\n disabled={this.disabled}\n onClick={this.handleTriggerClick}\n onKeyDown={this.handleTriggerKeydown}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n >\n <span class={{ 'select__display': true, 'select__display--placeholder': !displayText }}>\n {displayText || this.placeholder || '\\u00A0'}\n </span>\n <svg class=\"select__chevron\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n {this.isOpen && (\n <div\n class=\"select__dropdown\"\n part=\"dropdown\"\n role=\"listbox\"\n id={listboxId}\n aria-labelledby={this.label ? labelId : undefined}\n onKeyDown={this.handleDropdownKeydown}\n >\n {this.options.map((option, index) => (\n <div\n class={{\n 'select__option': true,\n 'select__option--selected': option.value === this.value,\n 'select__option--focused': index === this.focusedIndex,\n 'select__option--disabled': option.disabled,\n }}\n part=\"option\"\n role=\"option\"\n aria-selected={option.value === this.value ? 'true' : 'false'}\n aria-disabled={option.disabled ? 'true' : undefined}\n onClick={() => this.selectOption(option)}\n >\n {option.label}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Hidden slot to capture <option> elements */}\n <div class=\"select__hidden-slot\">\n <slot />\n </div>\n\n {hasError && (\n <div class=\"select__error\" part=\"error-text\" id={errorId} role=\"alert\">\n {this.errorMessage}\n </div>\n )}\n\n {!hasError && this.helpText && (\n <div class=\"select__help\" part=\"help-text\" id={helpId}>\n {this.helpText}\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["radioCss","TsRadio","inputId","generateId","checked","disabled","value","name","label","size","tsChange","select","this","emit","handleClick","handleKeydown","event","key","preventDefault","render","h","Host","class","part","role","undefined","tabindex","onClick","onKeyDown","id"],"sources":["src/components/radio/radio.css?tag=ts-radio&encapsulation=shadow","src/components/radio/radio.tsx"],"sourcesContent":["/* ==========================================================================\n ts-radio — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-radio-size Radio circle size\n --ts-radio-color Selected color\n --ts-radio-border-color Default border color\n ========================================================================== */\n\n:host {\n display: inline-block;\n font-family: var(--ts-font-family-base);\n\n --ts-radio-size: 1.25rem;\n --ts-radio-color: var(--ts-color-interactive-primary);\n --ts-radio-border-color: var(--ts-color-border-default);\n}\n\n/* ---- Base container ---- */\n.radio__base {\n display: inline-flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n cursor: pointer;\n outline: none;\n}\n\n.radio__base:focus-visible .radio__control {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Control circle ---- */\n.radio__control {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--ts-radio-size);\n height: var(--ts-radio-size);\n box-sizing: border-box;\n border: 2px solid var(--ts-radio-border-color);\n border-radius: 50%;\n background-color: var(--ts-color-bg-elevated);\n transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n flex-shrink: 0;\n}\n\n/* ---- Inner dot ---- */\n.radio__dot {\n width: 0;\n height: 0;\n border-radius: 50%;\n background-color: var(--ts-color-text-on-primary);\n transition:\n width var(--ts-transition-fast),\n height var(--ts-transition-fast);\n}\n\n/* ---- Checked state ---- */\n:host([checked]) .radio__control {\n background-color: var(--ts-radio-color);\n border-color: var(--ts-radio-color);\n}\n\n:host([checked]) .radio__dot {\n width: 40%;\n height: 40%;\n}\n\n/* ---- Hover ---- */\n.radio__base:hover:not([aria-disabled=\"true\"]) .radio__control {\n border-color: var(--ts-color-primary-500);\n}\n\n/* ---- Disabled state ---- */\n:host([disabled]) .radio__base {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-radio-size: 1rem;\n}\n\n:host([size=\"sm\"]) .radio__label {\n font-size: var(--ts-font-size-sm);\n}\n\n:host([size=\"md\"]) .radio__label {\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"lg\"]) {\n --ts-radio-size: 1.5rem;\n}\n\n:host([size=\"lg\"]) .radio__label {\n font-size: var(--ts-font-size-lg);\n}\n\n/* ---- Label ---- */\n.radio__label {\n color: var(--ts-color-text-primary);\n line-height: var(--ts-line-height-normal);\n user-select: none;\n}\n","import { Component, Prop, Event, h, Host, Element, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsCheckboxChangeEventDetail } from '../../types';\nimport { generateId } from '../../utils/aria';\n\n/**\n * @slot - Default slot for the radio label.\n *\n * @part base - The radio container.\n * @part control - The visual radio circle.\n * @part label - The label wrapper.\n */\n@Component({\n tag: 'ts-radio',\n styleUrl: 'radio.css',\n shadow: true,\n})\nexport class TsRadio {\n @Element() hostEl!: HTMLElement;\n\n private inputId = generateId('ts-radio');\n\n /** Whether the radio is checked. */\n @Prop({ mutable: true, reflect: true }) checked = false;\n\n /** Renders the radio as disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** The value associated with this radio. */\n @Prop() value = '';\n\n /** Name attribute for form submission. */\n @Prop() name?: string;\n\n /** Label text. If omitted, use the default slot. */\n @Prop() label?: string;\n\n /** The radio size. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md';\n\n /** Emitted when the radio is selected. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<TsCheckboxChangeEventDetail>;\n\n /** Programmatically select the radio. */\n @Method()\n async select(): Promise<void> {\n if (!this.disabled && !this.checked) {\n this.checked = true;\n this.tsChange.emit({ checked: this.checked, value: this.value });\n }\n }\n\n private handleClick = (): void => {\n this.select();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === ' ') {\n event.preventDefault();\n this.select();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-radio': true,\n [`ts-radio--${this.size}`]: true,\n 'ts-radio--checked': this.checked,\n 'ts-radio--disabled': this.disabled,\n }}\n >\n <div\n class=\"radio__base\"\n part=\"base\"\n role=\"radio\"\n aria-checked={this.checked ? 'true' : 'false'}\n aria-disabled={this.disabled ? 'true' : undefined}\n tabindex={this.disabled ? -1 : 0}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"radio__control\" part=\"control\">\n <div class=\"radio__dot\" />\n </div>\n\n <label class=\"radio__label\" part=\"label\" id={`${this.inputId}-label`}>\n {this.label ? this.label : <slot />}\n </label>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"+FAAA,MAAMA,EAAW,IAAM,yqD,MCiBVC,EAAO,M,sFAGVC,QAAUC,EAAW,YAGWC,QAAU,MAGzBC,SAAW,MAG5BC,MAAQ,GAGRC,KAGAC,MAGiBC,KAA2B,KAGlBC,SAIlC,YAAMC,GACJ,IAAKC,KAAKP,WAAaO,KAAKR,QAAS,CACnCQ,KAAKR,QAAU,KACfQ,KAAKF,SAASG,KAAK,CAAET,QAASQ,KAAKR,QAASE,MAAOM,KAAKN,O,EAIpDQ,YAAc,KACpBF,KAAKD,QAAQ,EAGPI,cAAiBC,IACvB,GAAIA,EAAMC,MAAQ,IAAK,CACrBD,EAAME,iBACNN,KAAKD,Q,GAKT,MAAAQ,GACE,OACEC,EAACC,EAAI,CAAAJ,IAAA,2CACHK,MAAO,CACL,WAAY,KACZ,CAAC,aAAaV,KAAKH,QAAS,KAC5B,oBAAqBG,KAAKR,QAC1B,qBAAsBQ,KAAKP,WAG7Be,EAAA,OAAAH,IAAA,2CACEK,MAAM,cACNC,KAAK,OACLC,KAAK,QAAO,eACEZ,KAAKR,QAAU,OAAS,QAAO,gBAC9BQ,KAAKP,SAAW,OAASoB,UACxCC,SAAUd,KAAKP,UAAW,EAAK,EAC/BsB,QAASf,KAAKE,YACdc,UAAWhB,KAAKG,eAEhBK,EAAA,OAAAH,IAAA,2CAAKK,MAAM,iBAAiBC,KAAK,WAC/BH,EAAA,OAAAH,IAAA,2CAAKK,MAAM,gBAGbF,EAAA,SAAAH,IAAA,2CAAOK,MAAM,eAAeC,KAAK,QAAQM,GAAI,GAAGjB,KAAKV,iBAClDU,KAAKJ,MAAQI,KAAKJ,MAAQY,EAAA,e","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["modalCss","TsModal","dialogEl","removeFocusTrap","previouslyFocused","modalId","generateId","open","size","label","closeOnOverlay","closeOnEscape","showClose","tsOpen","tsClose","isAnimating","handleOpenChange","isOpen","this","openModal","closeModal","show","close","document","activeElement","emit","body","style","overflow","requestAnimationFrame","trapFocus","focus","disconnectedCallback","handleOverlayClick","handleDialogClick","event","stopPropagation","handleKeydown","key","handleCloseClick","render","h","Host","class","onKeyDown","part","onClick","ref","el","modal__dialog","role","undefined","tabindex","type","id","name"],"sources":["src/components/modal/modal.css?tag=ts-modal&encapsulation=shadow","src/components/modal/modal.tsx"],"sourcesContent":["/* ==========================================================================\n ts-modal — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-modal-bg Dialog background\n --ts-modal-overlay-bg Overlay background\n --ts-modal-radius Dialog border radius\n --ts-modal-shadow Dialog box-shadow\n ========================================================================== */\n\n:host {\n font-family: var(--ts-font-family-base);\n\n --ts-modal-bg: var(--ts-color-bg-elevated);\n --ts-modal-overlay-bg: var(--ts-color-bg-overlay);\n --ts-modal-radius: var(--ts-shape-overlay);\n --ts-modal-shadow: var(--ts-shadow-xl);\n}\n\n/* ---- Overlay ---- */\n.modal__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ts-z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--ts-spacing-4);\n background-color: var(--ts-modal-overlay-bg);\n animation: ts-fade-in 240ms cubic-bezier(0.25, 0.1, 0.25, 1);\n}\n\n/* ---- Dialog ---- */\n.modal__dialog {\n position: relative;\n background-color: var(--ts-modal-bg);\n border-radius: var(--ts-modal-radius);\n box-shadow: var(--ts-modal-shadow);\n max-height: calc(100vh - var(--ts-spacing-16));\n overflow-y: auto;\n animation: ts-scale-in 280ms cubic-bezier(0.16, 1, 0.3, 1);\n outline: none;\n}\n\n/* ---- Sizes ---- */\n.modal__dialog--xs { width: 100%; max-width: 320px; }\n.modal__dialog--sm { width: 100%; max-width: 440px; }\n.modal__dialog--md { width: 100%; max-width: 560px; }\n.modal__dialog--lg { width: 100%; max-width: 720px; }\n.modal__dialog--xl { width: 100%; max-width: 960px; }\n\n/* ---- Close Button ---- */\n.modal__close {\n position: absolute;\n top: var(--ts-spacing-3);\n inset-inline-end: var(--ts-spacing-3);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: var(--ts-radius-md);\n background: transparent;\n color: var(--ts-color-text-tertiary);\n font-size: var(--ts-font-size-md);\n cursor: pointer;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n z-index: 1;\n padding: 0;\n line-height: 1;\n}\n\n.modal__close:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-secondary);\n}\n\n.modal__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Sections ---- */\n.modal__header {\n padding: var(--ts-spacing-5) var(--ts-spacing-6) var(--ts-spacing-3);\n font-size: var(--ts-font-size-lg);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n}\n\n.modal__header:empty {\n display: none;\n}\n\n.modal__body {\n padding: var(--ts-spacing-3) var(--ts-spacing-6);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n}\n\n.modal__footer {\n padding: var(--ts-spacing-3) var(--ts-spacing-6) var(--ts-spacing-5);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--ts-spacing-2);\n}\n\n.modal__footer:empty {\n display: none;\n}\n\n/* ---- Animations ---- */\n@keyframes ts-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes ts-scale-in {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(8px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n h,\n Host,\n Element,\n Method,\n Watch,\n} from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize } from '../../types';\nimport { generateId, trapFocus } from '../../utils/aria';\n\n/**\n * @slot - Default slot for modal body content.\n * @slot header - Modal header content.\n * @slot footer - Modal footer content (e.g., action buttons).\n *\n * @part overlay - The backdrop overlay.\n * @part dialog - The dialog container.\n * @part header - The header wrapper.\n * @part body - The body wrapper.\n * @part footer - The footer wrapper.\n * @part close - The close button.\n */\n@Component({\n tag: 'ts-modal',\n styleUrl: 'modal.css',\n shadow: true,\n})\nexport class TsModal {\n @Element() hostEl!: HTMLElement;\n\n private dialogEl?: HTMLElement;\n private removeFocusTrap?: () => void;\n private previouslyFocused?: HTMLElement;\n private modalId = generateId('ts-modal');\n\n /** Whether the modal is open. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** The modal's width size preset. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Label for accessibility (used as aria-label). */\n @Prop() label?: string;\n\n /** Whether clicking the overlay closes the modal. */\n @Prop() closeOnOverlay = true;\n\n /** Whether pressing Escape closes the modal. */\n @Prop() closeOnEscape = true;\n\n /** Whether to show the close button. */\n @Prop() showClose = true;\n\n /** Emitted when the modal opens. */\n @Event({ eventName: 'tsOpen' }) tsOpen!: EventEmitter<void>;\n\n /** Emitted when the modal closes. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Internal animation state. */\n @State() isAnimating = false;\n\n @Watch('open')\n handleOpenChange(isOpen: boolean): void {\n if (isOpen) {\n this.openModal();\n } else {\n this.closeModal();\n }\n }\n\n /** Programmatically open the modal. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n /** Programmatically close the modal. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n }\n\n private openModal(): void {\n this.previouslyFocused = document.activeElement as HTMLElement;\n this.isAnimating = true;\n this.tsOpen.emit();\n\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n\n requestAnimationFrame(() => {\n if (this.dialogEl) {\n this.removeFocusTrap = trapFocus(this.dialogEl);\n // Focus the dialog itself\n this.dialogEl.focus();\n }\n });\n }\n\n private closeModal(): void {\n this.isAnimating = false;\n this.tsClose.emit();\n\n // Restore body scroll\n document.body.style.overflow = '';\n\n // Clean up focus trap\n this.removeFocusTrap?.();\n\n // Restore focus\n this.previouslyFocused?.focus();\n }\n\n disconnectedCallback(): void {\n this.removeFocusTrap?.();\n document.body.style.overflow = '';\n }\n\n private handleOverlayClick = (): void => {\n if (this.closeOnOverlay) {\n this.close();\n }\n };\n\n private handleDialogClick = (event: MouseEvent): void => {\n // Prevent overlay click from firing when clicking inside the dialog\n event.stopPropagation();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.closeOnEscape) {\n event.stopPropagation();\n this.close();\n }\n };\n\n private handleCloseClick = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n if (!this.open) return null;\n\n return (\n <Host\n class={{\n 'ts-modal': true,\n 'ts-modal--open': this.open,\n }}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"modal__overlay\" part=\"overlay\" onClick={this.handleOverlayClick}>\n <div\n ref={(el) => (this.dialogEl = el)}\n class={{\n 'modal__dialog': true,\n [`modal__dialog--${this.size}`]: true,\n }}\n part=\"dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={this.label}\n aria-labelledby={!this.label ? `${this.modalId}-header` : undefined}\n tabindex={-1}\n onClick={this.handleDialogClick}\n >\n {this.showClose && (\n <button\n class=\"modal__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Close modal\"\n onClick={this.handleCloseClick}\n >\n ✕\n </button>\n )}\n\n <div class=\"modal__header\" part=\"header\" id={`${this.modalId}-header`}>\n <slot name=\"header\" />\n </div>\n\n <div class=\"modal__body\" part=\"body\">\n <slot />\n </div>\n\n <div class=\"modal__footer\" part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAW,IAAM,8yE,MCgCVC,EAAO,M,iHAGVC,SACAC,gBACAC,kBACAC,QAAUC,EAAW,YAGWC,KAAO,MAGtBC,KAAe,KAGhCC,MAGAC,eAAiB,KAGjBC,cAAgB,KAGhBC,UAAY,KAGYC,OAGCC,QAGxBC,YAAc,MAGvB,gBAAAC,CAAiBC,GACf,GAAIA,EAAQ,CACVC,KAAKC,W,KACA,CACLD,KAAKE,Y,EAMT,UAAMC,GACJH,KAAKX,KAAO,I,CAKd,WAAMe,GACJJ,KAAKX,KAAO,K,CAGN,SAAAY,GACND,KAAKd,kBAAoBmB,SAASC,cAClCN,KAAKH,YAAc,KACnBG,KAAKL,OAAOY,OAGZF,SAASG,KAAKC,MAAMC,SAAW,SAE/BC,uBAAsB,KACpB,GAAIX,KAAKhB,SAAU,CACjBgB,KAAKf,gBAAkB2B,EAAUZ,KAAKhB,UAEtCgB,KAAKhB,SAAS6B,O,KAKZ,UAAAX,GACNF,KAAKH,YAAc,MACnBG,KAAKJ,QAAQW,OAGbF,SAASG,KAAKC,MAAMC,SAAW,GAG/BV,KAAKf,oBAGLe,KAAKd,mBAAmB2B,O,CAG1B,oBAAAC,GACEd,KAAKf,oBACLoB,SAASG,KAAKC,MAAMC,SAAW,E,CAGzBK,mBAAqB,KAC3B,GAAIf,KAAKR,eAAgB,CACvBQ,KAAKI,O,GAIDY,kBAAqBC,IAE3BA,EAAMC,iBAAiB,EAGjBC,cAAiBF,IACvB,GAAIA,EAAMG,MAAQ,UAAYpB,KAAKP,cAAe,CAChDwB,EAAMC,kBACNlB,KAAKI,O,GAIDiB,iBAAmB,KACzBrB,KAAKI,OAAO,EAId,MAAAkB,GACE,IAAKtB,KAAKX,KAAM,OAAO,KAEvB,OACEkC,EAACC,EAAI,CACHC,MAAO,CACL,WAAY,KACZ,iBAAkBzB,KAAKX,MAEzBqC,UAAW1B,KAAKmB,eAEhBI,EAAA,OAAKE,MAAM,iBAAiBE,KAAK,UAAUC,QAAS5B,KAAKe,oBACvDQ,EAAA,OACEM,IAAMC,GAAQ9B,KAAKhB,SAAW8C,EAC9BL,MAAO,CACLM,cAAiB,KACjB,CAAC,kBAAkB/B,KAAKV,QAAS,MAEnCqC,KAAK,SACLK,KAAK,SAAQ,aACF,OAAM,aACLhC,KAAKT,MAAK,mBACJS,KAAKT,MAAQ,GAAGS,KAAKb,iBAAmB8C,UAC1DC,UAAU,EACVN,QAAS5B,KAAKgB,mBAEbhB,KAAKN,WACJ6B,EAAA,UACEE,MAAM,eACNE,KAAK,QACLQ,KAAK,SAAQ,aACF,cACXP,QAAS5B,KAAKqB,kBAAgB,KAMlCE,EAAA,OAAKE,MAAM,gBAAgBE,KAAK,SAASS,GAAI,GAAGpC,KAAKb,kBACnDoC,EAAA,QAAMc,KAAK,YAGbd,EAAA,OAAKE,MAAM,cAAcE,KAAK,QAC5BJ,EAAA,cAGFA,EAAA,OAAKE,MAAM,gBAAgBE,KAAK,UAC9BJ,EAAA,QAAMc,KAAK,c","ignoreList":[]}