@tessera-ui/core 0.4.0 → 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,"names":["navCss","TsNav","__stencil_proxyCustomElement","HTMLElement","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":"gEAAA,MAAMA,EAAS,IAAM,0mB,MCaRC,EAAKC,EAAA,MAAAD,UAAAE,E,iFAESC,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":["drawerCss","TsDrawer","__stencil_proxyCustomElement","HTMLElement","panelEl","removeFocusTrap","previouslyFocused","drawerId","generateId","open","placement","size","dismissible","heading","tsClose","isAnimating","handleOpenChange","isOpen","this","openDrawer","closeDrawer","show","close","document","activeElement","body","style","overflow","requestAnimationFrame","trapFocus","focus","emit","disconnectedCallback","handleOverlayClick","handlePanelClick","event","stopPropagation","handleKeydown","key","handleCloseClick","render","h","Host","class","onKeyDown","part","onClick","ref","el","drawer__panel","role","undefined","tabindex","id","type","name"],"sources":["src/components/drawer/drawer.css?tag=ts-drawer&encapsulation=shadow","src/components/drawer/drawer.tsx"],"sourcesContent":["/* ==========================================================================\n ts-drawer — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-drawer-bg Panel background\n --ts-drawer-shadow Panel box-shadow\n --ts-drawer-overlay-bg Overlay background\n ========================================================================== */\n\n:host {\n font-family: var(--ts-font-family-base);\n\n --ts-drawer-bg: var(--ts-color-bg-elevated);\n --ts-drawer-shadow: var(--ts-shadow-xl);\n --ts-drawer-overlay-bg: var(--ts-color-bg-overlay);\n}\n\n/* ---- Overlay ---- */\n.drawer__overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ts-z-modal);\n background-color: var(--ts-drawer-overlay-bg);\n animation: ts-drawer-fade-in 200ms ease-out;\n}\n\n/* ---- Panel ---- */\n.drawer__panel {\n position: fixed;\n display: flex;\n flex-direction: column;\n background-color: var(--ts-drawer-bg);\n box-shadow: var(--ts-drawer-shadow);\n outline: none;\n overflow-y: auto;\n}\n\n/* ---- Placement ---- */\n.drawer__panel--start {\n inset-block-start: 0;\n inset-block-end: 0;\n inset-inline-start: 0;\n animation: ts-drawer-slide-start 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--end {\n inset-block-start: 0;\n inset-block-end: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-end 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--top {\n inset-block-start: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-top 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.drawer__panel--bottom {\n inset-block-end: 0;\n inset-inline-start: 0;\n inset-inline-end: 0;\n animation: ts-drawer-slide-bottom 250ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ---- Sizes — horizontal placement (start/end) ---- */\n.drawer__panel--start.drawer__panel--sm,\n.drawer__panel--end.drawer__panel--sm {\n inline-size: 320px;\n}\n\n.drawer__panel--start.drawer__panel--md,\n.drawer__panel--end.drawer__panel--md {\n inline-size: 440px;\n}\n\n.drawer__panel--start.drawer__panel--lg,\n.drawer__panel--end.drawer__panel--lg {\n inline-size: 640px;\n}\n\n.drawer__panel--start.drawer__panel--full,\n.drawer__panel--end.drawer__panel--full {\n inline-size: 100%;\n}\n\n/* ---- Sizes — vertical placement (top/bottom) ---- */\n.drawer__panel--top.drawer__panel--sm,\n.drawer__panel--bottom.drawer__panel--sm {\n block-size: 320px;\n}\n\n.drawer__panel--top.drawer__panel--md,\n.drawer__panel--bottom.drawer__panel--md {\n block-size: 440px;\n}\n\n.drawer__panel--top.drawer__panel--lg,\n.drawer__panel--bottom.drawer__panel--lg {\n block-size: 640px;\n}\n\n.drawer__panel--top.drawer__panel--full,\n.drawer__panel--bottom.drawer__panel--full {\n block-size: 100%;\n}\n\n/* ---- Header ---- */\n.drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n border-block-end: 1px solid var(--ts-color-border-default);\n}\n\n.drawer__title {\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/* ---- Close Button ---- */\n.drawer__close {\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 padding: 0;\n line-height: 1;\n margin-inline-start: auto;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.drawer__close:hover {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-secondary);\n}\n\n.drawer__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Body ---- */\n.drawer__body {\n flex: 1;\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n overflow-y: auto;\n}\n\n/* ---- Footer ---- */\n.drawer__footer {\n padding: var(--ts-spacing-4) var(--ts-spacing-5);\n border-block-start: 1px solid var(--ts-color-border-default);\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--ts-spacing-2);\n}\n\n.drawer__footer:empty {\n display: none;\n}\n\n/* ---- Animations ---- */\n@keyframes ts-drawer-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes ts-drawer-slide-start {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n}\n\n@keyframes ts-drawer-slide-end {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n@keyframes ts-drawer-slide-top {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n}\n\n@keyframes ts-drawer-slide-bottom {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Method, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId, trapFocus } from '../../utils/aria';\n\n/**\n * @slot - Default slot for drawer body content.\n * @slot footer - Drawer footer content (e.g., action buttons).\n *\n * @part overlay - The backdrop overlay.\n * @part panel - The slide-in panel 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-drawer',\n styleUrl: 'drawer.css',\n shadow: true,\n})\nexport class TsDrawer {\n @Element() hostEl!: HTMLElement;\n\n private panelEl?: HTMLElement;\n private removeFocusTrap?: () => void;\n private previouslyFocused?: HTMLElement;\n private drawerId = generateId('ts-drawer');\n\n /** Whether the drawer is open. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** Which edge the drawer slides in from. */\n @Prop({ reflect: true }) placement: 'start' | 'end' | 'top' | 'bottom' = 'end';\n\n /** The drawer's width/height preset. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' | 'full' = 'md';\n\n /** Whether clicking the overlay or pressing Escape closes the drawer. */\n @Prop() dismissible = true;\n\n /** Accessible heading for the drawer. */\n @Prop() heading?: string;\n\n /** Emitted when the drawer 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.openDrawer();\n } else {\n this.closeDrawer();\n }\n }\n\n /** Programmatically open the drawer. */\n @Method()\n async show(): Promise<void> {\n this.open = true;\n }\n\n /** Programmatically close the drawer. */\n @Method()\n async close(): Promise<void> {\n this.open = false;\n }\n\n private openDrawer(): void {\n this.previouslyFocused = document.activeElement as HTMLElement;\n this.isAnimating = true;\n\n document.body.style.overflow = 'hidden';\n\n requestAnimationFrame(() => {\n if (this.panelEl) {\n this.removeFocusTrap = trapFocus(this.panelEl);\n this.panelEl.focus();\n }\n });\n }\n\n private closeDrawer(): void {\n this.isAnimating = false;\n this.tsClose.emit();\n\n document.body.style.overflow = '';\n this.removeFocusTrap?.();\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.dismissible) {\n this.close();\n }\n };\n\n private handlePanelClick = (event: MouseEvent): void => {\n event.stopPropagation();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.dismissible) {\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-drawer': true,\n 'ts-drawer--open': this.open,\n [`ts-drawer--${this.placement}`]: true,\n [`ts-drawer--${this.size}`]: true,\n }}\n onKeyDown={this.handleKeydown}\n >\n <div class=\"drawer__overlay\" part=\"overlay\" onClick={this.handleOverlayClick}>\n <div\n ref={(el) => (this.panelEl = el)}\n class={{\n 'drawer__panel': true,\n [`drawer__panel--${this.placement}`]: true,\n [`drawer__panel--${this.size}`]: true,\n }}\n part=\"panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={this.heading}\n aria-labelledby={!this.heading ? `${this.drawerId}-header` : undefined}\n tabindex={-1}\n onClick={this.handlePanelClick}\n >\n <div class=\"drawer__header\" part=\"header\" id={`${this.drawerId}-header`}>\n {this.heading && <span class=\"drawer__title\">{this.heading}</span>}\n {this.dismissible && (\n <button\n class=\"drawer__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Close drawer\"\n onClick={this.handleCloseClick}\n >\n &#x2715;\n </button>\n )}\n </div>\n\n <div class=\"drawer__body\" part=\"body\">\n <slot />\n </div>\n\n <div class=\"drawer__footer\" part=\"footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"kHAAA,MAAMA,EAAY,IAAM,4/G,MCoBXC,EAAQC,EAAA,MAAAD,UAAAE,E,yIAGXC,QACAC,gBACAC,kBACAC,SAAWC,EAAW,aAGUC,KAAO,MAGtBC,UAAgD,MAGhDC,KAAoC,KAGrDC,YAAc,KAGdC,QAGyBC,QAGxBC,YAAc,MAGvB,gBAAAC,CAAiBC,GACf,GAAIA,EAAQ,CACVC,KAAKC,Y,KACA,CACLD,KAAKE,a,EAMT,UAAMC,GACJH,KAAKT,KAAO,I,CAKd,WAAMa,GACJJ,KAAKT,KAAO,K,CAGN,UAAAU,GACND,KAAKZ,kBAAoBiB,SAASC,cAClCN,KAAKH,YAAc,KAEnBQ,SAASE,KAAKC,MAAMC,SAAW,SAE/BC,uBAAsB,KACpB,GAAIV,KAAKd,QAAS,CAChBc,KAAKb,gBAAkBwB,EAAUX,KAAKd,SACtCc,KAAKd,QAAQ0B,O,KAKX,WAAAV,GACNF,KAAKH,YAAc,MACnBG,KAAKJ,QAAQiB,OAEbR,SAASE,KAAKC,MAAMC,SAAW,GAC/BT,KAAKb,oBACLa,KAAKZ,mBAAmBwB,O,CAG1B,oBAAAE,GACEd,KAAKb,oBACLkB,SAASE,KAAKC,MAAMC,SAAW,E,CAGzBM,mBAAqB,KAC3B,GAAIf,KAAKN,YAAa,CACpBM,KAAKI,O,GAIDY,iBAAoBC,IAC1BA,EAAMC,iBAAiB,EAGjBC,cAAiBF,IACvB,GAAIA,EAAMG,MAAQ,UAAYpB,KAAKN,YAAa,CAC9CuB,EAAMC,kBACNlB,KAAKI,O,GAIDiB,iBAAmB,KACzBrB,KAAKI,OAAO,EAId,MAAAkB,GACE,IAAKtB,KAAKT,KAAM,OAAO,KAEvB,OACEgC,EAACC,EAAI,CACHC,MAAO,CACL,YAAa,KACb,kBAAmBzB,KAAKT,KACxB,CAAC,cAAcS,KAAKR,aAAc,KAClC,CAAC,cAAcQ,KAAKP,QAAS,MAE/BiC,UAAW1B,KAAKmB,eAEhBI,EAAA,OAAKE,MAAM,kBAAkBE,KAAK,UAAUC,QAAS5B,KAAKe,oBACxDQ,EAAA,OACEM,IAAMC,GAAQ9B,KAAKd,QAAU4C,EAC7BL,MAAO,CACLM,cAAiB,KACjB,CAAC,kBAAkB/B,KAAKR,aAAc,KACtC,CAAC,kBAAkBQ,KAAKP,QAAS,MAEnCkC,KAAK,QACLK,KAAK,SAAQ,aACF,OAAM,aACLhC,KAAKL,QAAO,mBACNK,KAAKL,QAAU,GAAGK,KAAKX,kBAAoB4C,UAC7DC,UAAU,EACVN,QAAS5B,KAAKgB,kBAEdO,EAAA,OAAKE,MAAM,iBAAiBE,KAAK,SAASQ,GAAI,GAAGnC,KAAKX,mBACnDW,KAAKL,SAAW4B,EAAA,QAAME,MAAM,iBAAiBzB,KAAKL,SAClDK,KAAKN,aACJ6B,EAAA,UACEE,MAAM,gBACNE,KAAK,QACLS,KAAK,SAAQ,aACF,eACXR,QAAS5B,KAAKqB,kBAAgB,MAOpCE,EAAA,OAAKE,MAAM,eAAeE,KAAK,QAC7BJ,EAAA,cAGFA,EAAA,OAAKE,MAAM,iBAAiBE,KAAK,UAC/BJ,EAAA,QAAMc,KAAK,c","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["breadcrumbCss","TsBreadcrumb","__stencil_proxyCustomElement","HTMLElement","separator","componentDidRender","items","this","hostEl","querySelectorAll","forEach","item","index","length","setAttribute","removeAttribute","render","h","Host","key","class","part"],"sources":["src/components/breadcrumb/breadcrumb.css?tag=ts-breadcrumb&encapsulation=shadow","src/components/breadcrumb/breadcrumb.tsx"],"sourcesContent":["/* ==========================================================================\n ts-breadcrumb — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-breadcrumb-separator-color Separator color\n --ts-breadcrumb-link-color Link color\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-breadcrumb-separator-color: var(--ts-color-text-tertiary);\n --ts-breadcrumb-link-color: var(--ts-color-interactive-primary);\n}\n\n.breadcrumb__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ts-spacing-1);\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n}\n","import { Component, Prop, h, Host, Element } from '@stencil/core';\n\n/**\n * @slot - Default slot for ts-breadcrumb-item children.\n *\n * @part nav - The nav element.\n * @part list - The ordered list element.\n */\n@Component({\n tag: 'ts-breadcrumb',\n styleUrl: 'breadcrumb.css',\n shadow: true,\n})\nexport class TsBreadcrumb {\n @Element() hostEl!: HTMLElement;\n\n /** The separator character between breadcrumb items. */\n @Prop() separator = '/';\n\n componentDidRender(): void {\n const items = this.hostEl.querySelectorAll('ts-breadcrumb-item');\n items.forEach((item, index) => {\n if (index < items.length - 1) {\n item.setAttribute('separator', this.separator);\n } else {\n item.removeAttribute('separator');\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host class=\"ts-breadcrumb\">\n <nav part=\"nav\" aria-label=\"Breadcrumb\">\n <ol part=\"list\" class=\"breadcrumb__list\">\n <slot />\n </ol>\n </nav>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAgB,IAAM,wV,MCafC,EAAYC,EAAA,MAAAD,UAAAE,E,0GAIfC,UAAY,IAEpB,kBAAAC,GACE,MAAMC,EAAQC,KAAKC,OAAOC,iBAAiB,sBAC3CH,EAAMI,SAAQ,CAACC,EAAMC,KACnB,GAAIA,EAAQN,EAAMO,OAAS,EAAG,CAC5BF,EAAKG,aAAa,YAAaP,KAAKH,U,KAC/B,CACLO,EAAKI,gBAAgB,Y,KAM3B,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CAACC,MAAM,iBACVH,EAAA,OAAAE,IAAA,2CAAKE,KAAK,MAAK,aAAY,cACzBJ,EAAA,MAAAE,IAAA,2CAAIE,KAAK,OAAOD,MAAM,oBACpBH,EAAA,QAAAE,IAAA,+C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["treeCss","TsTree","__stencil_proxyCustomElement","HTMLElement","selectable","handleKeyDown","event","items","this","getVisibleItems","length","focused","document","activeElement","currentIndex","indexOf","currentItem","key","preventDefault","focus","expanded","allItems","Array","from","hostEl","querySelectorAll","filter","item","parent","parentElement","tagName","render","h","Host","class","role","part"],"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"],"mappings":"gEAAA,MAAMA,EAAU,IAAM,4O,MCYTC,EAAMC,EAAA,MAAAD,UAAAE,E,0GAIQC,WAAa,MAGtC,aAAAC,CAAcC,GACZ,MAAMC,EAAQC,KAAKC,kBACnB,GAAIF,EAAMG,SAAW,EAAG,OAExB,MAAMC,EAAUC,SAASC,cACzB,MAAMC,EAAeP,EAAMQ,QAAQJ,GACnC,GAAIG,KAAiB,EAAI,OAEzB,MAAME,EAAcT,EAAMO,GAE1B,OAAQR,EAAMW,KACZ,IAAK,YACHX,EAAMY,iBACN,GAAIJ,EAAeP,EAAMG,OAAS,EAAG,CACnCH,EAAMO,EAAe,GAAGK,O,CAE1B,MACF,IAAK,UACHb,EAAMY,iBACN,GAAIJ,EAAe,EAAG,CACpBP,EAAMO,EAAe,GAAGK,O,CAE1B,MACF,IAAK,aACHb,EAAMY,iBACN,GAAIF,IAAgBA,EAAYI,SAAU,CACxCJ,EAAYI,SAAW,I,CAEzB,MACF,IAAK,YACHd,EAAMY,iBACN,GAAIF,GAAeA,EAAYI,SAAU,CACvCJ,EAAYI,SAAW,K,CAEzB,MACF,IAAK,OACHd,EAAMY,iBACNX,EAAM,GAAGY,QACT,MACF,IAAK,MACHb,EAAMY,iBACNX,EAAMA,EAAMG,OAAS,GAAGS,QACxB,M,CAIE,eAAAV,GACN,MAAMY,EAAWC,MAAMC,KAAKf,KAAKgB,OAAOC,iBAAiB,iBACzD,OAAOJ,EAASK,QAAOC,IACrB,IAAIC,EAASD,EAAKE,cAClB,MAAOD,GAAUA,IAAWpB,KAAKgB,OAAQ,CACvC,GAAII,EAAOE,UAAY,iBAAoBF,EAAiCR,SAAU,CACpF,OAAO,K,CAETQ,EAASA,EAAOC,a,CAElB,OAAO,IAAI,G,CAKf,MAAAE,GACE,OACEC,EAACC,EAAI,CAAAhB,IAAA,2CACHiB,MAAO,CAAE,UAAW,MACpBC,KAAK,QAELH,EAAA,OAAAf,IAAA,2CAAKiB,MAAM,aAAaE,KAAK,QAC3BJ,EAAA,QAAAf,IAAA,8C","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as s,H as e,h as i,c as n}from"./p-DkpyRqHf.js";const a=()=>`:host{display:grid;width:100%;box-sizing:border-box}`;const o=s(class t extends e{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}columns="auto";gap="4";minColumnWidth="280px";align="stretch";render(){const t=this.columns==="auto"?`repeat(auto-fill, minmax(${this.minColumnWidth}, 1fr))`:`repeat(${this.columns}, 1fr)`;const s={gridTemplateColumns:t,gap:`var(--ts-spacing-${this.gap})`,alignItems:this.align};return i(n,{key:"f2d1238a19d2235c676d1fd08f045b18dc3b40fa",style:s},i("slot",{key:"3c454fc9910bcf8960b4a2833f82e91eb6d5be03"}))}static get style(){return a()}},[769,"ts-grid",{columns:[513],gap:[513],minColumnWidth:[513,"min-column-width"],align:[513]}]);function r(){if(typeof customElements==="undefined"){return}const s=["ts-grid"];s.forEach((s=>{switch(s){case"ts-grid":if(!customElements.get(t(s))){customElements.define(t(s),o)}break}}))}r();export{o as T,r as d};
2
- //# sourceMappingURL=p-BeErYjKz.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["gridCss","TsGrid","__stencil_proxyCustomElement","HTMLElement","columns","gap","minColumnWidth","align","render","gridTemplateColumns","this","style","alignItems","h","Host","key"],"sources":["src/components/grid/grid.css?tag=ts-grid&encapsulation=shadow","src/components/grid/grid.tsx"],"sourcesContent":["/* ==========================================================================\n ts-grid — Shadow DOM Scoped Styles\n\n CSS Grid layout component with responsive auto-fill columns.\n ========================================================================== */\n\n:host {\n display: grid;\n width: 100%;\n box-sizing: border-box;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for grid items.\n *\n * @part base - The grid container.\n */\n@Component({\n tag: 'ts-grid',\n styleUrl: 'grid.css',\n shadow: true,\n})\nexport class TsGrid {\n /** Number of columns or 'auto' for responsive auto-fill. */\n @Prop({ reflect: true }) columns: string = 'auto';\n\n /** Spacing token number for gap between items. */\n @Prop({ reflect: true }) gap: string = '4';\n\n /** Minimum column width when columns is 'auto'. */\n @Prop({ reflect: true }) minColumnWidth: string = '280px';\n\n /** Vertical alignment of grid items. */\n @Prop({ reflect: true }) align: 'start' | 'center' | 'end' | 'stretch' = 'stretch';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const gridTemplateColumns =\n this.columns === 'auto'\n ? `repeat(auto-fill, minmax(${this.minColumnWidth}, 1fr))`\n : `repeat(${this.columns}, 1fr)`;\n\n const style = {\n gridTemplateColumns,\n gap: `var(--ts-spacing-${this.gap})`,\n alignItems: this.align,\n };\n\n return (\n <Host style={style}>\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAU,IAAM,uD,MCYTC,EAAMC,EAAA,MAAAD,UAAAE,E,iFAEQC,QAAkB,OAGlBC,IAAc,IAGdC,eAAyB,QAGzBC,MAAgD,UAGzE,MAAAC,GACE,MAAMC,EACJC,KAAKN,UAAY,OACb,4BAA4BM,KAAKJ,wBACjC,UAAUI,KAAKN,gBAErB,MAAMO,EAAQ,CACZF,sBACAJ,IAAK,oBAAoBK,KAAKL,OAC9BO,WAAYF,KAAKH,OAGnB,OACEM,EAACC,EAAI,CAAAC,IAAA,2CAACJ,MAAOA,GACXE,EAAA,QAAAE,IAAA,6C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["accordionItemCss","accordionItemId","TsAccordionItem","__stencil_proxyCustomElement","HTMLElement","headerId","panelId","open","disabled","heading","tsToggle","internalOpen","onOpenChange","newVal","this","connectedCallback","id","handleClick","emit","handleKeyDown","event","key","preventDefault","render","h","Host","class","part","role","tabindex","undefined","onClick","onKeyDown","name","viewBox","fill","stroke","points","hidden"],"sources":["src/components/accordion/accordion-item.css?tag=ts-accordion-item&encapsulation=shadow","src/components/accordion/accordion-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-accordion-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: block;\n}\n\n/* ---- Header ---- */\n.accordion-item__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ts-spacing-2);\n padding-block: var(--ts-spacing-3);\n padding-inline: var(--ts-spacing-4);\n background: var(--ts-accordion-header-bg, transparent);\n border: none;\n cursor: pointer;\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-md);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n outline: none;\n transition: background-color var(--ts-transition-fast);\n user-select: none;\n}\n\n.accordion-item__header:hover:not([aria-disabled=\"true\"]) {\n background-color: var(--ts-color-bg-subtle);\n}\n\n.accordion-item__header:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .accordion-item__header {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Chevron icon ---- */\n.accordion-item__icon {\n display: inline-flex;\n align-items: center;\n transition: transform var(--ts-transition-fast);\n}\n\n.accordion-item__icon svg {\n inline-size: 1.25em;\n block-size: 1.25em;\n}\n\n:host(.ts-accordion-item--open) .accordion-item__icon {\n transform: rotate(180deg);\n}\n\n/* ---- Panel ---- */\n.accordion-item__panel {\n overflow: hidden;\n transition: max-block-size var(--ts-transition-normal);\n}\n\n.accordion-item__panel[hidden] {\n display: none;\n}\n\n.accordion-item__content {\n padding-block: var(--ts-spacing-2);\n padding-inline: var(--ts-spacing-4);\n padding-block-end: var(--ts-spacing-4);\n font-size: var(--ts-font-size-md);\n color: var(--ts-color-text-secondary);\n}\n","import { Component, Prop, Event, h, Host, State, Watch } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\nlet accordionItemId = 0;\n\n/**\n * @slot - Default slot for panel content.\n * @slot header - Custom header content (replaces heading text).\n *\n * @part header - The header button.\n * @part panel - The content panel.\n */\n@Component({\n tag: 'ts-accordion-item',\n styleUrl: 'accordion-item.css',\n shadow: true,\n})\nexport class TsAccordionItem {\n private headerId!: string;\n private panelId!: string;\n\n /** Whether the item is expanded. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** Disables toggling. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Header text for the item. */\n @Prop() heading?: string;\n\n /** Emitted when the item is toggled. */\n @Event({ eventName: 'tsToggle' }) tsToggle!: EventEmitter<{ open: boolean }>;\n\n @State() internalOpen = false;\n\n @Watch('open')\n onOpenChange(newVal: boolean): void {\n this.internalOpen = newVal;\n }\n\n connectedCallback(): void {\n const id = accordionItemId++;\n this.headerId = `ts-accordion-header-${id}`;\n this.panelId = `ts-accordion-panel-${id}`;\n this.internalOpen = this.open;\n }\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.open = !this.open;\n this.internalOpen = this.open;\n this.tsToggle.emit({ open: this.open });\n };\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.handleClick();\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-accordion-item': true,\n 'ts-accordion-item--open': this.internalOpen,\n 'ts-accordion-item--disabled': this.disabled,\n }}\n >\n <div\n class=\"accordion-item__header\"\n part=\"header\"\n id={this.headerId}\n role=\"button\"\n tabindex={this.disabled ? -1 : 0}\n aria-expanded={this.internalOpen ? 'true' : 'false'}\n aria-controls={this.panelId}\n aria-disabled={this.disabled ? 'true' : undefined}\n onClick={this.handleClick}\n onKeyDown={this.handleKeyDown}\n >\n <slot name=\"header\">\n <span class=\"accordion-item__heading\">{this.heading}</span>\n </slot>\n <span class=\"accordion-item__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </span>\n </div>\n <div\n class=\"accordion-item__panel\"\n part=\"panel\"\n id={this.panelId}\n role=\"region\"\n aria-labelledby={this.headerId}\n hidden={!this.internalOpen}\n >\n <div class=\"accordion-item__content\">\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAmB,IAAM,k0CCG/B,IAAIC,EAAkB,E,MAcTC,EAAeC,EAAA,MAAAD,UAAAE,E,kHAClBC,SACAC,QAGgCC,KAAO,MAGtBC,SAAW,MAG5BC,QAG0BC,SAEzBC,aAAe,MAGxB,YAAAC,CAAaC,GACXC,KAAKH,aAAeE,C,CAGtB,iBAAAE,GACE,MAAMC,EAAKf,IACXa,KAAKT,SAAW,uBAAuBW,IACvCF,KAAKR,QAAU,sBAAsBU,IACrCF,KAAKH,aAAeG,KAAKP,I,CAGnBU,YAAc,KACpB,GAAIH,KAAKN,SAAU,OACnBM,KAAKP,MAAQO,KAAKP,KAClBO,KAAKH,aAAeG,KAAKP,KACzBO,KAAKJ,SAASQ,KAAK,CAAEX,KAAMO,KAAKP,MAAO,EAGjCY,cAAiBC,IACvB,GAAIA,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CAC9CD,EAAME,iBACNR,KAAKG,a,GAKT,MAAAM,GACE,OACEC,EAACC,EAAI,CAAAJ,IAAA,2CACHK,MAAO,CACL,oBAAqB,KACrB,0BAA2BZ,KAAKH,aAChC,8BAA+BG,KAAKN,WAGtCgB,EAAA,OAAAH,IAAA,2CACEK,MAAM,yBACNC,KAAK,SACLX,GAAIF,KAAKT,SACTuB,KAAK,SACLC,SAAUf,KAAKN,UAAW,EAAK,EAAC,gBACjBM,KAAKH,aAAe,OAAS,QAAO,gBACpCG,KAAKR,QAAO,gBACZQ,KAAKN,SAAW,OAASsB,UACxCC,QAASjB,KAAKG,YACde,UAAWlB,KAAKK,eAEhBK,EAAA,QAAAH,IAAA,2CAAMY,KAAK,UACTT,EAAA,QAAAH,IAAA,2CAAMK,MAAM,2BAA2BZ,KAAKL,UAE9Ce,EAAA,QAAAH,IAAA,2CAAMK,MAAM,uBAAsB,cAAa,QAC7CF,EAAA,OAAAH,IAAA,2CAAKa,QAAQ,YAAYC,KAAK,OAAOC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,kBAAiB,SACjHZ,EAAA,YAAAH,IAAA,2CAAUgB,OAAO,sBAIvBb,EAAA,OAAAH,IAAA,2CACEK,MAAM,wBACNC,KAAK,QACLX,GAAIF,KAAKR,QACTsB,KAAK,SAAQ,kBACId,KAAKT,SACtBiC,QAASxB,KAAKH,cAEda,EAAA,OAAAH,IAAA,2CAAKK,MAAM,2BACTF,EAAA,QAAAH,IAAA,+C","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as i,H as a,d as n,h as e,c as s}from"./p-DkpyRqHf.js";const o=()=>`:host{display:block;--ts-pagination-button-size:2.25rem;--ts-pagination-active-bg:var(--ts-color-interactive-primary);--ts-pagination-active-color:var(--ts-color-text-on-primary)}.pagination__nav{display:flex;align-items:center;gap:var(--ts-spacing-1)}.pagination__button{display:inline-flex;align-items:center;justify-content:center;min-inline-size:var(--ts-pagination-button-size);block-size:var(--ts-pagination-button-size);padding-inline:var(--ts-spacing-2);border:1px solid var(--ts-color-border-default);border-radius:var(--ts-radius-md);background:transparent;color:var(--ts-color-text-primary);font-family:var(--ts-font-family-base);font-size:var(--ts-font-size-sm);cursor:pointer;transition:background-color var(--ts-transition-fast), border-color var(--ts-transition-fast), color var(--ts-transition-fast);outline:none}.pagination__button:hover:not(:disabled):not(.pagination__button--active){background-color:var(--ts-color-bg-subtle);border-color:var(--ts-color-border-strong)}.pagination__button:focus-visible{box-shadow:var(--ts-focus-ring)}.pagination__button:disabled{opacity:0.5;cursor:not-allowed}.pagination__button--active{background-color:var(--ts-pagination-active-bg);border-color:var(--ts-pagination-active-bg);color:var(--ts-pagination-active-color);font-weight:var(--ts-font-weight-semi)}.pagination__prev svg,.pagination__next svg{inline-size:1em;block-size:1em}.pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-inline-size:var(--ts-pagination-button-size);block-size:var(--ts-pagination-button-size);color:var(--ts-color-text-tertiary);font-size:var(--ts-font-size-sm);user-select:none}:host([size="sm"]){--ts-pagination-button-size:1.75rem}:host([size="sm"]) .pagination__button{font-size:var(--ts-font-size-xs)}:host([size="lg"]){--ts-pagination-button-size:2.75rem}:host([size="lg"]) .pagination__button{font-size:var(--ts-font-size-md)}`;const r=i(class t extends a{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tsChange=n(this,"tsChange")}total;pageSize=10;currentPage=1;siblingCount=1;size="md";tsChange;get totalPages(){return Math.max(1,Math.ceil(this.total/this.pageSize))}getPageRange(){const t=this.totalPages;const i=this.currentPage;const a=this.siblingCount;const n=[];const e=Math.max(i-a,2);const s=Math.min(i+a,t-1);const o=e>2;const r=s<t-1;n.push(1);if(o){n.push("ellipsis")}else{for(let t=2;t<e;t++){n.push(t)}}for(let t=e;t<=s;t++){n.push(t)}if(r){n.push("ellipsis")}else{for(let i=s+1;i<t;i++){n.push(i)}}if(t>1){n.push(t)}return n}handlePageClick=t=>{if(t<1||t>this.totalPages||t===this.currentPage)return;this.currentPage=t;this.tsChange.emit({page:t})};render(){const t=this.getPageRange();const i=this.currentPage<=1;const a=this.currentPage>=this.totalPages;return e(s,{key:"8ce453e001c6830299e02d8a83fed0d623328b9f",class:{"ts-pagination":true,[`ts-pagination--${this.size}`]:true}},e("nav",{key:"c9c0d1a1d80010cd7653363c45108a93189f993e",part:"nav","aria-label":"Pagination",class:"pagination__nav"},e("button",{key:"03fb8b5042561750aab8371cca844cd2373fa74a",class:"pagination__button pagination__prev",part:"prev",disabled:i,"aria-label":"Previous page",onClick:()=>this.handlePageClick(this.currentPage-1)},e("svg",{key:"a68fae5805dcffc8fca44ccaaea19b1dbecdb9cb",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},e("polyline",{key:"e186ca6298102fa64973edb8f566e87ed4474a22",points:"15 18 9 12 15 6"}))),t.map(((t,i)=>t==="ellipsis"?e("span",{class:"pagination__ellipsis",key:`ellipsis-${i}`,"aria-hidden":"true"},"..."):e("button",{class:{pagination__button:true,"pagination__button--active":t===this.currentPage},part:"button","aria-current":t===this.currentPage?"page":undefined,"aria-label":`Page ${t}`,onClick:()=>this.handlePageClick(t),key:t},t))),e("button",{key:"9fce8efe8707cadfc19d20418079cc631a1228a9",class:"pagination__button pagination__next",part:"next",disabled:a,"aria-label":"Next page",onClick:()=>this.handlePageClick(this.currentPage+1)},e("svg",{key:"57ca47eb763ab4adfb24deab8221a405fc2635e6",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},e("polyline",{key:"c0230ffe8334b72b783b939704dee4b705504dcb",points:"9 18 15 12 9 6"})))))}static get style(){return o()}},[513,"ts-pagination",{total:[2],pageSize:[2,"page-size"],currentPage:[1538,"current-page"],siblingCount:[2,"sibling-count"],size:[513]}]);function c(){if(typeof customElements==="undefined"){return}const i=["ts-pagination"];i.forEach((i=>{switch(i){case"ts-pagination":if(!customElements.get(t(i))){customElements.define(t(i),r)}break}}))}c();export{r as T,c as d};
2
- //# sourceMappingURL=p-BjyTgfXe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["paginationCss","TsPagination","__stencil_proxyCustomElement","HTMLElement","total","pageSize","currentPage","siblingCount","size","tsChange","totalPages","Math","max","ceil","this","getPageRange","current","siblings","range","leftSibling","rightSibling","min","showLeftEllipsis","showRightEllipsis","push","i","handlePageClick","page","emit","render","pages","isFirstPage","isLastPage","h","Host","key","class","part","disabled","onClick","viewBox","fill","stroke","points","map","index","pagination__button","undefined"],"sources":["src/components/pagination/pagination.css?tag=ts-pagination&encapsulation=shadow","src/components/pagination/pagination.tsx"],"sourcesContent":["/* ==========================================================================\n ts-pagination — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-pagination-button-size Button dimensions\n --ts-pagination-active-bg Active page background\n --ts-pagination-active-color Active page text color\n ========================================================================== */\n\n:host {\n display: block;\n\n --ts-pagination-button-size: 2.25rem;\n --ts-pagination-active-bg: var(--ts-color-interactive-primary);\n --ts-pagination-active-color: var(--ts-color-text-on-primary);\n}\n\n.pagination__nav {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-1);\n}\n\n/* ---- Buttons ---- */\n.pagination__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-inline-size: var(--ts-pagination-button-size);\n block-size: var(--ts-pagination-button-size);\n padding-inline: var(--ts-spacing-2);\n border: 1px solid var(--ts-color-border-default);\n border-radius: var(--ts-radius-md);\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 transition:\n background-color var(--ts-transition-fast),\n border-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n outline: none;\n}\n\n.pagination__button:hover:not(:disabled):not(.pagination__button--active) {\n background-color: var(--ts-color-bg-subtle);\n border-color: var(--ts-color-border-strong);\n}\n\n.pagination__button:focus-visible {\n box-shadow: var(--ts-focus-ring);\n}\n\n.pagination__button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---- Active page ---- */\n.pagination__button--active {\n background-color: var(--ts-pagination-active-bg);\n border-color: var(--ts-pagination-active-bg);\n color: var(--ts-pagination-active-color);\n font-weight: var(--ts-font-weight-semi);\n}\n\n/* ---- Prev/Next arrows ---- */\n.pagination__prev svg,\n.pagination__next svg {\n inline-size: 1em;\n block-size: 1em;\n}\n\n/* ---- Ellipsis ---- */\n.pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-inline-size: var(--ts-pagination-button-size);\n block-size: var(--ts-pagination-button-size);\n color: var(--ts-color-text-tertiary);\n font-size: var(--ts-font-size-sm);\n user-select: none;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-pagination-button-size: 1.75rem;\n}\n\n:host([size=\"sm\"]) .pagination__button {\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"lg\"]) {\n --ts-pagination-button-size: 2.75rem;\n}\n\n:host([size=\"lg\"]) .pagination__button {\n font-size: var(--ts-font-size-md);\n}\n","import { Component, Prop, Event, h, Host } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @part nav - The nav element.\n * @part button - Each page button.\n * @part prev - The previous button.\n * @part next - The next button.\n */\n@Component({\n tag: 'ts-pagination',\n styleUrl: 'pagination.css',\n shadow: true,\n})\nexport class TsPagination {\n /** Total number of items. */\n @Prop() total!: number;\n\n /** Number of items per page. */\n @Prop() pageSize = 10;\n\n /** The current active page (1-based). */\n @Prop({ mutable: true, reflect: true }) currentPage = 1;\n\n /** Number of sibling pages shown around the current page. */\n @Prop() siblingCount = 1;\n\n /** The size of the pagination buttons. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Emitted when the page changes. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ page: number }>;\n\n private get totalPages(): number {\n return Math.max(1, Math.ceil(this.total / this.pageSize));\n }\n\n private getPageRange(): (number | 'ellipsis')[] {\n const total = this.totalPages;\n const current = this.currentPage;\n const siblings = this.siblingCount;\n\n const range: (number | 'ellipsis')[] = [];\n\n const leftSibling = Math.max(current - siblings, 2);\n const rightSibling = Math.min(current + siblings, total - 1);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < total - 1;\n\n // Always show first page\n range.push(1);\n\n if (showLeftEllipsis) {\n range.push('ellipsis');\n } else {\n for (let i = 2; i < leftSibling; i++) {\n range.push(i);\n }\n }\n\n for (let i = leftSibling; i <= rightSibling; i++) {\n range.push(i);\n }\n\n if (showRightEllipsis) {\n range.push('ellipsis');\n } else {\n for (let i = rightSibling + 1; i < total; i++) {\n range.push(i);\n }\n }\n\n // Always show last page (if > 1)\n if (total > 1) {\n range.push(total);\n }\n\n return range;\n }\n\n private handlePageClick = (page: number): void => {\n if (page < 1 || page > this.totalPages || page === this.currentPage) return;\n this.currentPage = page;\n this.tsChange.emit({ page });\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const pages = this.getPageRange();\n const isFirstPage = this.currentPage <= 1;\n const isLastPage = this.currentPage >= this.totalPages;\n\n return (\n <Host\n class={{\n 'ts-pagination': true,\n [`ts-pagination--${this.size}`]: true,\n }}\n >\n <nav part=\"nav\" aria-label=\"Pagination\" class=\"pagination__nav\">\n <button\n class=\"pagination__button pagination__prev\"\n part=\"prev\"\n disabled={isFirstPage}\n aria-label=\"Previous page\"\n onClick={() => this.handlePageClick(this.currentPage - 1)}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n {pages.map((page, index) =>\n page === 'ellipsis' ? (\n <span class=\"pagination__ellipsis\" key={`ellipsis-${index}`} aria-hidden=\"true\">\n ...\n </span>\n ) : (\n <button\n class={{\n pagination__button: true,\n 'pagination__button--active': page === this.currentPage,\n }}\n part=\"button\"\n aria-current={page === this.currentPage ? 'page' : undefined}\n aria-label={`Page ${page}`}\n onClick={() => this.handlePageClick(page)}\n key={page}\n >\n {page}\n </button>\n ),\n )}\n\n <button\n class=\"pagination__button pagination__next\"\n part=\"next\"\n disabled={isLastPage}\n aria-label=\"Next page\"\n onClick={() => this.handlePageClick(this.currentPage + 1)}\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 </button>\n </nav>\n </Host>\n );\n }\n}\n"],"mappings":"kEAAA,MAAMA,EAAgB,IAAM,63D,MCefC,EAAYC,EAAA,MAAAD,UAAAE,E,kHAEfC,MAGAC,SAAW,GAGqBC,YAAc,EAG9CC,aAAe,EAGEC,KAAe,KAGNC,SAElC,cAAYC,GACV,OAAOC,KAAKC,IAAI,EAAGD,KAAKE,KAAKC,KAAKV,MAAQU,KAAKT,U,CAGzC,YAAAU,GACN,MAAMX,EAAQU,KAAKJ,WACnB,MAAMM,EAAUF,KAAKR,YACrB,MAAMW,EAAWH,KAAKP,aAEtB,MAAMW,EAAiC,GAEvC,MAAMC,EAAcR,KAAKC,IAAII,EAAUC,EAAU,GACjD,MAAMG,EAAeT,KAAKU,IAAIL,EAAUC,EAAUb,EAAQ,GAE1D,MAAMkB,EAAmBH,EAAc,EACvC,MAAMI,EAAoBH,EAAehB,EAAQ,EAGjDc,EAAMM,KAAK,GAEX,GAAIF,EAAkB,CACpBJ,EAAMM,KAAK,W,KACN,CACL,IAAK,IAAIC,EAAI,EAAGA,EAAIN,EAAaM,IAAK,CACpCP,EAAMM,KAAKC,E,EAIf,IAAK,IAAIA,EAAIN,EAAaM,GAAKL,EAAcK,IAAK,CAChDP,EAAMM,KAAKC,E,CAGb,GAAIF,EAAmB,CACrBL,EAAMM,KAAK,W,KACN,CACL,IAAK,IAAIC,EAAIL,EAAe,EAAGK,EAAIrB,EAAOqB,IAAK,CAC7CP,EAAMM,KAAKC,E,EAKf,GAAIrB,EAAQ,EAAG,CACbc,EAAMM,KAAKpB,E,CAGb,OAAOc,C,CAGDQ,gBAAmBC,IACzB,GAAIA,EAAO,GAAKA,EAAOb,KAAKJ,YAAciB,IAASb,KAAKR,YAAa,OACrEQ,KAAKR,YAAcqB,EACnBb,KAAKL,SAASmB,KAAK,CAAED,QAAO,EAI9B,MAAAE,GACE,MAAMC,EAAQhB,KAAKC,eACnB,MAAMgB,EAAcjB,KAAKR,aAAe,EACxC,MAAM0B,EAAalB,KAAKR,aAAeQ,KAAKJ,WAE5C,OACEuB,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,gBAAiB,KACjB,CAAC,kBAAkBtB,KAAKN,QAAS,OAGnCyB,EAAA,OAAAE,IAAA,2CAAKE,KAAK,MAAK,aAAY,aAAaD,MAAM,mBAC5CH,EAAA,UAAAE,IAAA,2CACEC,MAAM,sCACNC,KAAK,OACLC,SAAUP,EAAW,aACV,gBACXQ,QAAS,IAAMzB,KAAKY,gBAAgBZ,KAAKR,YAAc,IAEvD2B,EAAA,OAAAE,IAAA,2CAAKK,QAAQ,YAAYC,KAAK,OAAOC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,kBAAiB,SACjHT,EAAA,YAAAE,IAAA,2CAAUQ,OAAO,sBAIpBb,EAAMc,KAAI,CAACjB,EAAMkB,IAChBlB,IAAS,WACPM,EAAA,QAAMG,MAAM,uBAAuBD,IAAK,YAAYU,IAAO,cAAc,QAAM,OAI/EZ,EAAA,UACEG,MAAO,CACLU,mBAAoB,KACpB,6BAA8BnB,IAASb,KAAKR,aAE9C+B,KAAK,SAAQ,eACCV,IAASb,KAAKR,YAAc,OAASyC,UAAS,aAChD,QAAQpB,IACpBY,QAAS,IAAMzB,KAAKY,gBAAgBC,GACpCQ,IAAKR,GAEJA,KAKPM,EAAA,UAAAE,IAAA,2CACEC,MAAM,sCACNC,KAAK,OACLC,SAAUN,EAAU,aACT,YACXO,QAAS,IAAMzB,KAAKY,gBAAgBZ,KAAKR,YAAc,IAEvD2B,EAAA,OAAAE,IAAA,2CAAKK,QAAQ,YAAYC,KAAK,OAAOC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,kBAAiB,SACjHT,EAAA,YAAAE,IAAA,2CAAUQ,OAAO,sB","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as e,H as s,h as a,c as i}from"./p-DkpyRqHf.js";import{d as n}from"./p-TFHAUMKT.js";const c=()=>`:host{display:block;font-family:var(--ts-font-family-base);--ts-empty-state-icon-size:3rem;--ts-empty-state-icon-color:var(--ts-color-text-tertiary)}.empty-state__base{display:flex;flex-direction:column;align-items:center;text-align:center;padding-inline:var(--ts-spacing-6);padding-block:var(--ts-spacing-8);gap:var(--ts-spacing-3)}.empty-state__icon{display:flex;align-items:center;justify-content:center;color:var(--ts-empty-state-icon-color);font-size:var(--ts-empty-state-icon-size);margin-block-end:var(--ts-spacing-2)}.empty-state__icon:empty{display:none}.empty-state__heading{margin:0;font-size:var(--ts-font-size-lg);font-weight:var(--ts-font-weight-semi);color:var(--ts-color-text-primary);line-height:var(--ts-line-height-tight)}.empty-state__description{margin:0;font-size:var(--ts-font-size-sm);color:var(--ts-color-text-secondary);line-height:var(--ts-line-height-normal);max-inline-size:36ch}.empty-state__content:empty{display:none}.empty-state__action{display:flex;align-items:center;gap:var(--ts-spacing-2);margin-block-start:var(--ts-spacing-2)}.empty-state__action:empty{display:none}:host([size="sm"]) .empty-state__base{padding-inline:var(--ts-spacing-4);padding-block:var(--ts-spacing-4);gap:var(--ts-spacing-2)}:host([size="sm"]) .empty-state__icon{--ts-empty-state-icon-size:2rem}:host([size="sm"]) .empty-state__heading{font-size:var(--ts-font-size-md)}:host([size="sm"]) .empty-state__description{font-size:var(--ts-font-size-xs)}:host([size="lg"]) .empty-state__base{padding-inline:var(--ts-spacing-8);padding-block:var(--ts-spacing-12);gap:var(--ts-spacing-4)}:host([size="lg"]) .empty-state__icon{--ts-empty-state-icon-size:4.5rem}:host([size="lg"]) .empty-state__heading{font-size:var(--ts-font-size-xl)}:host([size="lg"]) .empty-state__description{font-size:var(--ts-font-size-md);max-inline-size:48ch}`;const o=e(class t extends s{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}heading;description;icon;size="md";render(){return a(i,{key:"517bcb74b651797e31e8b631c88e6805493e85fc",class:{"ts-empty-state":true,[`ts-empty-state--${this.size}`]:true}},a("div",{key:"738a7d08d1657b83672a53d1dd8d07f174176739",class:"empty-state__base",part:"base"},a("div",{key:"bbc92546c5172180e64f817a8a0bd5c766d12869",class:"empty-state__icon",part:"icon"},a("slot",{key:"46be0b9827a41af2d05647dcc56ac19c5484a364",name:"icon"},this.icon&&a("ts-icon",{key:"14720f6e52094f08a79b067d228a35ff3d94ce66",name:this.icon}))),this.heading&&a("h3",{key:"88a6cad61c93cc07b274ea7f8bf4e0b4cb0eee57",class:"empty-state__heading",part:"heading"},this.heading),this.description&&a("p",{key:"a59a3db32e57a06c95174708cbd935288de9d3ae",class:"empty-state__description",part:"description"},this.description),a("div",{key:"183fb5fbc08a0bf80fe1dd14c31bc5c55ba14fb7",class:"empty-state__content",part:"content"},a("slot",{key:"e51960738181881636c7cb8a6c31d72d6213a026"})),a("div",{key:"5cb324a51b4a210952eba2e556a64f9bc39d8383",class:"empty-state__action",part:"action"},a("slot",{key:"173a07dc3546f213e3f5a3ed67d6ed94c3e34386",name:"action"}))))}static get style(){return c()}},[769,"ts-empty-state",{heading:[1],description:[1],icon:[1],size:[513]}]);function p(){if(typeof customElements==="undefined"){return}const e=["ts-empty-state","ts-icon"];e.forEach((e=>{switch(e){case"ts-empty-state":if(!customElements.get(t(e))){customElements.define(t(e),o)}break;case"ts-icon":if(!customElements.get(t(e))){n()}break}}))}p();export{o as T,p as d};
2
- //# sourceMappingURL=p-BlZHjan9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["emptyStateCss","TsEmptyState","__stencil_proxyCustomElement","HTMLElement","heading","description","icon","size","render","h","Host","key","class","this","part","name"],"sources":["src/components/empty-state/empty-state.css?tag=ts-empty-state&encapsulation=shadow","src/components/empty-state/empty-state.tsx"],"sourcesContent":["/* ==========================================================================\n ts-empty-state — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-empty-state-icon-size Icon size\n --ts-empty-state-icon-color Icon color\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-empty-state-icon-size: 3rem;\n --ts-empty-state-icon-color: var(--ts-color-text-tertiary);\n}\n\n.empty-state__base {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding-inline: var(--ts-spacing-6);\n padding-block: var(--ts-spacing-8);\n gap: var(--ts-spacing-3);\n}\n\n/* ---- Icon ---- */\n.empty-state__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--ts-empty-state-icon-color);\n font-size: var(--ts-empty-state-icon-size);\n margin-block-end: var(--ts-spacing-2);\n}\n\n.empty-state__icon:empty {\n display: none;\n}\n\n/* ---- Heading ---- */\n.empty-state__heading {\n margin: 0;\n font-size: var(--ts-font-size-lg);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-primary);\n line-height: var(--ts-line-height-tight);\n}\n\n/* ---- Description ---- */\n.empty-state__description {\n margin: 0;\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n line-height: var(--ts-line-height-normal);\n max-inline-size: 36ch;\n}\n\n/* ---- Content ---- */\n.empty-state__content:empty {\n display: none;\n}\n\n/* ---- Action ---- */\n.empty-state__action {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n margin-block-start: var(--ts-spacing-2);\n}\n\n.empty-state__action:empty {\n display: none;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) .empty-state__base {\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-4);\n gap: var(--ts-spacing-2);\n}\n\n:host([size=\"sm\"]) .empty-state__icon {\n --ts-empty-state-icon-size: 2rem;\n}\n\n:host([size=\"sm\"]) .empty-state__heading {\n font-size: var(--ts-font-size-md);\n}\n\n:host([size=\"sm\"]) .empty-state__description {\n font-size: var(--ts-font-size-xs);\n}\n\n:host([size=\"lg\"]) .empty-state__base {\n padding-inline: var(--ts-spacing-8);\n padding-block: var(--ts-spacing-12);\n gap: var(--ts-spacing-4);\n}\n\n:host([size=\"lg\"]) .empty-state__icon {\n --ts-empty-state-icon-size: 4.5rem;\n}\n\n:host([size=\"lg\"]) .empty-state__heading {\n font-size: var(--ts-font-size-xl);\n}\n\n:host([size=\"lg\"]) .empty-state__description {\n font-size: var(--ts-font-size-md);\n max-inline-size: 48ch;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\n/**\n * @slot - Custom content below the description.\n * @slot action - CTA buttons.\n * @slot icon - Custom icon or illustration.\n *\n * @part base - The empty state container.\n * @part icon - The icon wrapper.\n * @part heading - The heading element.\n * @part description - The description text.\n * @part content - The custom content wrapper.\n * @part action - The action slot wrapper.\n */\n@Component({\n tag: 'ts-empty-state',\n styleUrl: 'empty-state.css',\n shadow: true,\n})\nexport class TsEmptyState {\n /** The heading text. */\n @Prop() heading?: string;\n\n /** The description text. */\n @Prop() description?: string;\n\n /** Lucide icon name displayed large. */\n @Prop() icon?: string;\n\n /** The size of the empty state. */\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-empty-state': true,\n [`ts-empty-state--${this.size}`]: true,\n }}\n >\n <div class=\"empty-state__base\" part=\"base\">\n <div class=\"empty-state__icon\" part=\"icon\">\n <slot name=\"icon\">\n {this.icon && <ts-icon name={this.icon} />}\n </slot>\n </div>\n\n {this.heading && (\n <h3 class=\"empty-state__heading\" part=\"heading\">\n {this.heading}\n </h3>\n )}\n\n {this.description && (\n <p class=\"empty-state__description\" part=\"description\">\n {this.description}\n </p>\n )}\n\n <div class=\"empty-state__content\" part=\"content\">\n <slot />\n </div>\n\n <div class=\"empty-state__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"+FAAA,MAAMA,EAAgB,IAAM,8yD,MCoBfC,EAAYC,EAAA,MAAAD,UAAAE,E,iFAEfC,QAGAC,YAGAC,KAGiBC,KAAe,KAGxC,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,iBAAkB,KAClB,CAAC,mBAAmBC,KAAKN,QAAS,OAGpCE,EAAA,OAAAE,IAAA,2CAAKC,MAAM,oBAAoBE,KAAK,QAClCL,EAAA,OAAAE,IAAA,2CAAKC,MAAM,oBAAoBE,KAAK,QAClCL,EAAA,QAAAE,IAAA,2CAAMI,KAAK,QACRF,KAAKP,MAAQG,EAAA,WAAAE,IAAA,2CAASI,KAAMF,KAAKP,SAIrCO,KAAKT,SACJK,EAAA,MAAAE,IAAA,2CAAIC,MAAM,uBAAuBE,KAAK,WACnCD,KAAKT,SAITS,KAAKR,aACJI,EAAA,KAAAE,IAAA,2CAAGC,MAAM,2BAA2BE,KAAK,eACtCD,KAAKR,aAIVI,EAAA,OAAAE,IAAA,2CAAKC,MAAM,uBAAuBE,KAAK,WACrCL,EAAA,QAAAE,IAAA,8CAGFF,EAAA,OAAAE,IAAA,2CAAKC,MAAM,sBAAsBE,KAAK,UACpCL,EAAA,QAAAE,IAAA,2CAAMI,KAAK,a","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["spinnerCss","TsSpinner","__stencil_proxyCustomElement","HTMLElement","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":"gEAAA,MAAMA,EAAa,IAAM,qsB,MCYZC,EAASC,EAAA,MAAAD,UAAAE,E,iFAEKC,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":["avatarCss","TsAvatar","__stencil_proxyCustomElement","HTMLElement","src","alt","name","size","variant","color","hasError","handleError","this","getInitials","words","trim","split","length","charAt","toUpperCase","render","showImage","initials","showInitials","h","Host","key","class","part","role","style","backgroundColor","undefined","onError"],"sources":["src/components/avatar/avatar.css?tag=ts-avatar&encapsulation=shadow","src/components/avatar/avatar.tsx"],"sourcesContent":["/* ==========================================================================\n ts-avatar — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-avatar-size Avatar dimensions\n --ts-avatar-bg Background color for initials/slot\n --ts-avatar-color Text color for initials\n --ts-avatar-radius Border radius\n ========================================================================== */\n\n:host {\n display: inline-flex;\n vertical-align: middle;\n\n --ts-avatar-size: 2.5rem;\n --ts-avatar-bg: var(--ts-color-neutral-200);\n --ts-avatar-color: var(--ts-color-text-primary);\n --ts-avatar-radius: var(--ts-shape-full);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"xs\"]) { --ts-avatar-size: 1.5rem; font-size: var(--ts-font-size-xs); }\n:host([size=\"sm\"]) { --ts-avatar-size: 2rem; font-size: var(--ts-font-size-sm); }\n:host([size=\"md\"]) { --ts-avatar-size: 2.5rem; font-size: var(--ts-font-size-md); }\n:host([size=\"lg\"]) { --ts-avatar-size: 3rem; font-size: var(--ts-font-size-lg); }\n:host([size=\"xl\"]) { --ts-avatar-size: 4rem; font-size: var(--ts-font-size-xl); }\n\n/* ---- Variant: square ---- */\n:host([variant=\"square\"]) {\n --ts-avatar-radius: var(--ts-radius-full);\n}\n\n/* ---- Base container ---- */\n.avatar__base {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--ts-avatar-size);\n height: var(--ts-avatar-size);\n border-radius: var(--ts-avatar-radius);\n background-color: var(--ts-avatar-bg);\n color: var(--ts-avatar-color);\n overflow: hidden;\n user-select: none;\n flex-shrink: 0;\n}\n\n/* ---- Image ---- */\n.avatar__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n}\n\n/* ---- Initials ---- */\n.avatar__initials {\n font-family: var(--ts-font-family-base);\n font-weight: var(--ts-font-weight-semi);\n font-size: inherit;\n line-height: 1;\n text-transform: uppercase;\n}\n","import { Component, Prop, State, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for custom content (e.g., icon).\n *\n * @part base - The avatar container.\n * @part image - The avatar image element.\n * @part initials - The initials text element.\n */\n@Component({\n tag: 'ts-avatar',\n styleUrl: 'avatar.css',\n shadow: true,\n})\nexport class TsAvatar {\n /** Image URL for the avatar. */\n @Prop() src?: string;\n\n /** Alt text for the avatar image. */\n @Prop() alt?: string;\n\n /** Name used to generate initials fallback. */\n @Prop() name?: string;\n\n /** The size of the avatar. */\n @Prop({ reflect: true }) size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n\n /** Shape variant of the avatar. */\n @Prop({ reflect: true }) variant: 'circle' | 'square' = 'circle';\n\n /** Background color for the initials fallback. */\n @Prop() color?: string;\n\n /** Whether the image failed to load. */\n @State() hasError = false;\n\n private handleError = (): void => {\n this.hasError = true;\n };\n\n private getInitials(): string {\n if (!this.name) return '';\n const words = this.name.trim().split(/\\s+/);\n if (words.length === 1) {\n return words[0].charAt(0).toUpperCase();\n }\n return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const showImage = this.src && !this.hasError;\n const initials = this.getInitials();\n const showInitials = !showImage && initials;\n\n return (\n <Host\n class={{\n 'ts-avatar': true,\n [`ts-avatar--${this.size}`]: true,\n [`ts-avatar--${this.variant}`]: true,\n }}\n >\n <div\n class=\"avatar__base\"\n part=\"base\"\n role=\"img\"\n aria-label={this.alt || this.name || 'Avatar'}\n style={this.color && !showImage ? { backgroundColor: this.color } : undefined}\n >\n {showImage && (\n <img\n class=\"avatar__image\"\n part=\"image\"\n src={this.src}\n alt={this.alt || this.name || ''}\n onError={this.handleError}\n />\n )}\n {showInitials && (\n <span class=\"avatar__initials\" part=\"initials\" aria-hidden=\"true\">\n {initials}\n </span>\n )}\n {!showImage && !showInitials && <slot />}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAY,IAAM,woC,MCcXC,EAAQC,EAAA,MAAAD,UAAAE,E,iFAEXC,IAGAC,IAGAC,KAGiBC,KAAyC,KAGzCC,QAA+B,SAGhDC,MAGCC,SAAW,MAEZC,YAAc,KACpBC,KAAKF,SAAW,IAAI,EAGd,WAAAG,GACN,IAAKD,KAAKN,KAAM,MAAO,GACvB,MAAMQ,EAAQF,KAAKN,KAAKS,OAAOC,MAAM,OACrC,GAAIF,EAAMG,SAAW,EAAG,CACtB,OAAOH,EAAM,GAAGI,OAAO,GAAGC,a,CAE5B,OAAQL,EAAM,GAAGI,OAAO,GAAKJ,EAAMA,EAAMG,OAAS,GAAGC,OAAO,IAAIC,a,CAIlE,MAAAC,GACE,MAAMC,EAAYT,KAAKR,MAAQQ,KAAKF,SACpC,MAAMY,EAAWV,KAAKC,cACtB,MAAMU,GAAgBF,GAAaC,EAEnC,OACEE,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,YAAa,KACb,CAAC,cAAcf,KAAKL,QAAS,KAC7B,CAAC,cAAcK,KAAKJ,WAAY,OAGlCgB,EAAA,OAAAE,IAAA,2CACEC,MAAM,eACNC,KAAK,OACLC,KAAK,MAAK,aACEjB,KAAKP,KAAOO,KAAKN,MAAQ,SACrCwB,MAAOlB,KAAKH,QAAUY,EAAY,CAAEU,gBAAiBnB,KAAKH,OAAUuB,WAEnEX,GACCG,EAAA,OAAAE,IAAA,2CACEC,MAAM,gBACNC,KAAK,QACLxB,IAAKQ,KAAKR,IACVC,IAAKO,KAAKP,KAAOO,KAAKN,MAAQ,GAC9B2B,QAASrB,KAAKD,cAGjBY,GACCC,EAAA,QAAAE,IAAA,2CAAMC,MAAM,mBAAmBC,KAAK,WAAU,cAAa,QACxDN,IAGHD,IAAcE,GAAgBC,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["progressCss","TsProgress","__stencil_proxyCustomElement","HTMLElement","value","max","variant","size","indeterminate","label","showValue","percentage","this","Math","min","render","percent","h","Host","key","class","part","role","undefined","style","width","round"],"sources":["src/components/progress/progress.css?tag=ts-progress&encapsulation=shadow","src/components/progress/progress.tsx"],"sourcesContent":["/* ==========================================================================\n ts-progress — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-progress-track-bg Track background color\n --ts-progress-fill-bg Fill bar background color\n --ts-progress-radius Border radius\n --ts-progress-height Track height\n ========================================================================== */\n\n:host {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n\n --ts-progress-track-bg: var(--ts-color-neutral-200);\n --ts-progress-fill-bg: var(--ts-color-interactive-primary);\n --ts-progress-radius: var(--ts-radius-full);\n --ts-progress-height: 0.5rem;\n}\n\n/* ---- Track ---- */\n.progress__track {\n flex: 1;\n block-size: var(--ts-progress-height);\n background-color: var(--ts-progress-track-bg);\n border-radius: var(--ts-progress-radius);\n overflow: hidden;\n position: relative;\n}\n\n/* ---- Fill ---- */\n.progress__fill {\n block-size: 100%;\n background-color: var(--ts-progress-fill-bg);\n border-radius: var(--ts-progress-radius);\n transition: width var(--ts-transition-normal);\n}\n\n/* ---- Label ---- */\n.progress__label {\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-semi);\n color: var(--ts-color-text-secondary);\n min-inline-size: 3ch;\n text-align: end;\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n --ts-progress-height: 0.25rem;\n}\n\n:host([size=\"lg\"]) {\n --ts-progress-height: 0.75rem;\n}\n\n/* ---- Variants ---- */\n:host([variant=\"success\"]) {\n --ts-progress-fill-bg: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) {\n --ts-progress-fill-bg: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) {\n --ts-progress-fill-bg: var(--ts-color-danger-500);\n}\n\n:host([variant=\"info\"]) {\n --ts-progress-fill-bg: var(--ts-color-info-500);\n}\n\n/* ---- Indeterminate animation ---- */\n:host([indeterminate]) .progress__fill {\n width: 40%;\n animation: ts-progress-slide 1.5s ease-in-out infinite;\n}\n\n@keyframes ts-progress-slide {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(350%);\n }\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { TsSize } from '../../types';\n\ntype TsProgressVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info';\n\n/**\n * @part track - The progress track.\n * @part fill - The progress fill bar.\n * @part label - The value label text.\n */\n@Component({\n tag: 'ts-progress',\n styleUrl: 'progress.css',\n shadow: true,\n})\nexport class TsProgress {\n /** Current progress value (0 to max). */\n @Prop() value = 0;\n\n /** Maximum value. */\n @Prop() max = 100;\n\n /** The color variant. */\n @Prop({ reflect: true }) variant: TsProgressVariant = 'primary';\n\n /** The size of the progress bar. */\n @Prop({ reflect: true }) size: TsSize = 'md';\n\n /** Whether the progress is indeterminate. */\n @Prop({ reflect: true }) indeterminate = false;\n\n /** Accessible label for the progress bar. */\n @Prop() label?: string;\n\n /** Whether to display the percentage value. */\n @Prop({ reflect: true }) showValue = false;\n\n private get percentage(): number {\n if (this.max <= 0) return 0;\n return Math.min(100, Math.max(0, (this.value / this.max) * 100));\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const percent = this.percentage;\n\n return (\n <Host\n class={{\n 'ts-progress': true,\n [`ts-progress--${this.variant}`]: true,\n [`ts-progress--${this.size}`]: true,\n 'ts-progress--indeterminate': this.indeterminate,\n }}\n >\n <div\n class=\"progress__track\"\n part=\"track\"\n role=\"progressbar\"\n aria-valuenow={this.indeterminate ? undefined : this.value}\n aria-valuemin={0}\n aria-valuemax={this.max}\n aria-label={this.label || undefined}\n >\n <div\n class=\"progress__fill\"\n part=\"fill\"\n style={this.indeterminate ? undefined : { width: `${percent}%` }}\n />\n </div>\n {this.showValue && !this.indeterminate && (\n <span class=\"progress__label\" part=\"label\" aria-hidden=\"true\">\n {Math.round(percent)}%\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAc,IAAM,k2C,MCebC,EAAUC,EAAA,MAAAD,UAAAE,E,iFAEbC,MAAQ,EAGRC,IAAM,IAGWC,QAA6B,UAG7BC,KAAe,KAGfC,cAAgB,MAGjCC,MAGiBC,UAAY,MAErC,cAAYC,GACV,GAAIC,KAAKP,KAAO,EAAG,OAAO,EAC1B,OAAOQ,KAAKC,IAAI,IAAKD,KAAKR,IAAI,EAAIO,KAAKR,MAAQQ,KAAKP,IAAO,K,CAI7D,MAAAU,GACE,MAAMC,EAAUJ,KAAKD,WAErB,OACEM,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,cAAe,KACf,CAAC,gBAAgBR,KAAKN,WAAY,KAClC,CAAC,gBAAgBM,KAAKL,QAAS,KAC/B,6BAA8BK,KAAKJ,gBAGrCS,EAAA,OAAAE,IAAA,2CACEC,MAAM,kBACNC,KAAK,QACLC,KAAK,cAAa,gBACHV,KAAKJ,cAAgBe,UAAYX,KAAKR,MAAK,gBAC3C,EAAC,gBACDQ,KAAKP,IAAG,aACXO,KAAKH,OAASc,WAE1BN,EAAA,OAAAE,IAAA,2CACEC,MAAM,iBACNC,KAAK,OACLG,MAAOZ,KAAKJ,cAAgBe,UAAY,CAAEE,MAAO,GAAGT,SAGvDJ,KAAKF,YAAcE,KAAKJ,eACvBS,EAAA,QAAAE,IAAA,2CAAMC,MAAM,kBAAkBC,KAAK,QAAO,cAAa,QACpDR,KAAKa,MAAMV,GAAQ,K","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as s,H as r,h as o,c as e}from"./p-DkpyRqHf.js";const a=()=>`:host{display:block;--ts-accordion-border-color:var(--ts-color-border-default);--ts-accordion-header-bg:transparent;--ts-accordion-radius:var(--ts-radius-lg)}::slotted(ts-accordion-item){border-block-end:1px solid var(--ts-accordion-border-color)}::slotted(ts-accordion-item:first-child){border-start-start-radius:var(--ts-accordion-radius);border-start-end-radius:var(--ts-accordion-radius)}::slotted(ts-accordion-item:last-child){border-end-start-radius:var(--ts-accordion-radius);border-end-end-radius:var(--ts-accordion-radius);border-block-end:none}`;const d=s(class t extends r{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}get hostEl(){return this}multiple=false;handleToggle(t){if(!this.multiple&&t.detail.open){const s=t.target;const r=this.hostEl.querySelectorAll("ts-accordion-item");r.forEach((t=>{if(t!==s){t.setAttribute("open","false");t.removeAttribute("open")}}))}}render(){return o(e,{key:"737635093f0c31076c08a6fb2a88804604b1b77e",class:"ts-accordion"},o("slot",{key:"9daa06ca9dd44478594e686792da9529637f69a3"}))}static get style(){return a()}},[769,"ts-accordion",{multiple:[4]},[[0,"tsToggle","handleToggle"]]]);function c(){if(typeof customElements==="undefined"){return}const s=["ts-accordion"];s.forEach((s=>{switch(s){case"ts-accordion":if(!customElements.get(t(s))){customElements.define(t(s),d)}break}}))}c();export{d as T,c as d};
2
- //# sourceMappingURL=p-CGh7W07E.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["accordionCss","TsAccordion","__stencil_proxyCustomElement","HTMLElement","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":"2DAAA,MAAMA,EAAe,IAAM,6iB,MCUdC,EAAWC,EAAA,MAAAD,UAAAE,E,0GAIdC,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,2 +0,0 @@
1
- import{t,p as e,H as a,d as i,h as s,c as n}from"./p-DkpyRqHf.js";import{d as r}from"./p-TFHAUMKT.js";const o=()=>`:host{display:block;font-family:var(--ts-font-family-base)}.nav-item__wrapper{list-style:none;margin:0;padding:0}.nav-item__link{display:flex;align-items:center;gap:var(--ts-spacing-2);padding:var(--ts-spacing-2) var(--ts-spacing-3);border:none;border-radius:var(--ts-radius-md);background:transparent;color:var(--ts-color-text-secondary);font-family:var(--ts-font-family-base);font-size:var(--ts-font-size-sm);font-weight:var(--ts-font-weight-medium);text-decoration:none;cursor:pointer;width:100%;text-align:start;transition:background-color var(--ts-transition-fast), color var(--ts-transition-fast)}.nav-item__link:hover:not([disabled]):not([aria-disabled="true"]){background-color:var(--ts-color-bg-hover);color:var(--ts-color-text-primary)}.nav-item__link:focus-visible{box-shadow:var(--ts-focus-ring);outline:none}:host([active]) .nav-item__link{background-color:var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.1));color:var(--ts-color-interactive-primary);font-weight:var(--ts-font-weight-semi)}:host([disabled]) .nav-item__link{opacity:0.5;cursor:not-allowed;pointer-events:none}.nav-item__icon{display:inline-flex;align-items:center;flex-shrink:0}.nav-item__label{display:inline-flex;align-items:center;white-space:nowrap}`;const c=e(class t extends a{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow();this.tsSelect=i(this,"tsSelect")}href;active=false;disabled=false;icon;tsSelect;handleClick=t=>{if(this.disabled){t.preventDefault();t.stopPropagation();return}this.tsSelect.emit()};render(){const t=this.href?"a":"button";const e=this.href?{href:this.disabled?undefined:this.href}:{type:"button",disabled:this.disabled};return s(n,{key:"edc70c61d701ba9765e37d18e49f1f9d198dde85",class:{"ts-nav-item":true,"ts-nav-item--active":this.active,"ts-nav-item--disabled":this.disabled}},s("li",{key:"fa4090e6dd631e6caaf89c84b7735c64f25d46d0",class:"nav-item__wrapper",part:"item",role:"listitem"},s(t,{key:"eb44e83812a47b281719155a49633de0e960a19e",...e,class:"nav-item__link",part:"link","aria-current":this.active?"page":undefined,"aria-disabled":this.disabled?"true":undefined,onClick:this.handleClick},this.icon&&s("span",{key:"a12ec79c7dc7d7a1bf53c4d0c25fc7ed8c4d1fcc",class:"nav-item__icon",part:"icon","aria-hidden":"true"},s("ts-icon",{key:"5268366fada499e81d589b4b21c08065b6d83dd4",name:this.icon,size:"sm"})),s("span",{key:"bef8a388eab007fa739025fbb242f490204cad1f",class:"nav-item__label",part:"label"},s("slot",{key:"9154d4a5f1075ecaa077998198bf6cd0258449d3"})))))}static get style(){return o()}},[769,"ts-nav-item",{href:[1],active:[516],disabled:[516],icon:[1]}]);function l(){if(typeof customElements==="undefined"){return}const e=["ts-nav-item","ts-icon"];e.forEach((e=>{switch(e){case"ts-nav-item":if(!customElements.get(t(e))){customElements.define(t(e),c)}break;case"ts-icon":if(!customElements.get(t(e))){r()}break}}))}l();export{c as T,l as d};
2
- //# sourceMappingURL=p-CHtE5caV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["navItemCss","TsNavItem","__stencil_proxyCustomElement","HTMLElement","href","active","disabled","icon","tsSelect","handleClick","event","this","preventDefault","stopPropagation","emit","render","Tag","attrs","undefined","type","h","Host","key","class","part","role","onClick","name","size"],"sources":["src/components/nav/nav-item.css?tag=ts-nav-item&encapsulation=shadow","src/components/nav/nav-item.tsx"],"sourcesContent":["/* ==========================================================================\n ts-nav-item — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n}\n\n.nav-item__wrapper {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.nav-item__link {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-2);\n padding: var(--ts-spacing-2) var(--ts-spacing-3);\n border: none;\n border-radius: var(--ts-radius-md);\n background: transparent;\n color: var(--ts-color-text-secondary);\n font-family: var(--ts-font-family-base);\n font-size: var(--ts-font-size-sm);\n font-weight: var(--ts-font-weight-medium);\n text-decoration: none;\n cursor: pointer;\n width: 100%;\n text-align: start;\n transition:\n background-color var(--ts-transition-fast),\n color var(--ts-transition-fast);\n}\n\n.nav-item__link:hover:not([disabled]):not([aria-disabled=\"true\"]) {\n background-color: var(--ts-color-bg-hover);\n color: var(--ts-color-text-primary);\n}\n\n.nav-item__link:focus-visible {\n box-shadow: var(--ts-focus-ring);\n outline: none;\n}\n\n/* ---- Active state ---- */\n:host([active]) .nav-item__link {\n background-color: var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.1));\n color: var(--ts-color-interactive-primary);\n font-weight: var(--ts-font-weight-semi);\n}\n\n/* ---- Disabled state ---- */\n:host([disabled]) .nav-item__link {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Icon ---- */\n.nav-item__icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* ---- Label ---- */\n.nav-item__label {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n}\n","import { Component, Prop, Event, h, Host } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for label text.\n *\n * @part item - The list item wrapper.\n * @part link - The anchor or button element.\n * @part icon - The icon wrapper.\n * @part label - The label wrapper.\n */\n@Component({\n tag: 'ts-nav-item',\n styleUrl: 'nav-item.css',\n shadow: true,\n})\nexport class TsNavItem {\n /** The URL to navigate to. */\n @Prop() href?: string;\n\n /** Whether this item is currently active. */\n @Prop({ reflect: true }) active = false;\n\n /** Whether this item is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Lucide icon name to display. */\n @Prop() icon?: string;\n\n /** Emitted when the nav item is selected. */\n @Event({ eventName: 'tsSelect' }) tsSelect!: EventEmitter<void>;\n\n private handleClick = (event: MouseEvent): void => {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.tsSelect.emit();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const Tag = this.href ? 'a' : 'button';\n const attrs = this.href\n ? { href: this.disabled ? undefined : this.href }\n : { type: 'button' as const, disabled: this.disabled };\n\n return (\n <Host\n class={{\n 'ts-nav-item': true,\n 'ts-nav-item--active': this.active,\n 'ts-nav-item--disabled': this.disabled,\n }}\n >\n <li class=\"nav-item__wrapper\" part=\"item\" role=\"listitem\">\n <Tag\n {...attrs}\n class=\"nav-item__link\"\n part=\"link\"\n aria-current={this.active ? 'page' : undefined}\n aria-disabled={this.disabled ? 'true' : undefined}\n onClick={this.handleClick}\n >\n {this.icon && (\n <span class=\"nav-item__icon\" part=\"icon\" aria-hidden=\"true\">\n <ts-icon name={this.icon} size=\"sm\" />\n </span>\n )}\n <span class=\"nav-item__label\" part=\"label\">\n <slot />\n </span>\n </Tag>\n </li>\n </Host>\n );\n }\n}\n"],"mappings":"sGAAA,MAAMA,EAAa,IAAM,uuC,MCgBZC,EAASC,EAAA,MAAAD,UAAAE,E,kHAEZC,KAGiBC,OAAS,MAGTC,SAAW,MAG5BC,KAG0BC,SAE1BC,YAAeC,IACrB,GAAIC,KAAKL,SAAU,CACjBI,EAAME,iBACNF,EAAMG,kBACN,M,CAEFF,KAAKH,SAASM,MAAM,EAItB,MAAAC,GACE,MAAMC,EAAML,KAAKP,KAAO,IAAM,SAC9B,MAAMa,EAAQN,KAAKP,KACf,CAAEA,KAAMO,KAAKL,SAAWY,UAAYP,KAAKP,MACzC,CAAEe,KAAM,SAAmBb,SAAUK,KAAKL,UAE9C,OACEc,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,cAAe,KACf,sBAAuBZ,KAAKN,OAC5B,wBAAyBM,KAAKL,WAGhCc,EAAA,MAAAE,IAAA,2CAAIC,MAAM,oBAAoBC,KAAK,OAAOC,KAAK,YAC7CL,EAACJ,EAAG,CAAAM,IAAA,8CACEL,EACJM,MAAM,iBACNC,KAAK,OAAM,eACGb,KAAKN,OAAS,OAASa,UAAS,gBAC/BP,KAAKL,SAAW,OAASY,UACxCQ,QAASf,KAAKF,aAEbE,KAAKJ,MACJa,EAAA,QAAAE,IAAA,2CAAMC,MAAM,iBAAiBC,KAAK,OAAM,cAAa,QACnDJ,EAAA,WAAAE,IAAA,2CAASK,KAAMhB,KAAKJ,KAAMqB,KAAK,QAGnCR,EAAA,QAAAE,IAAA,2CAAMC,MAAM,kBAAkBC,KAAK,SACjCJ,EAAA,QAAAE,IAAA,gD","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t as s,p as n,H as r,d as e,h as a,c as t}from"./p-DkpyRqHf.js";import{d as o}from"./p-TFHAUMKT.js";const i=()=>`:host{display:block;font-family:var(--ts-font-family-base);--ts-banner-bg:var(--ts-color-info-bg);--ts-banner-border-color:var(--ts-color-info-border)}:host([sticky]){position:sticky;inset-block-start:0;z-index:var(--ts-z-sticky, 100)}.banner__base{display:flex;align-items:center;gap:var(--ts-spacing-3);padding-inline:var(--ts-spacing-4);padding-block:var(--ts-spacing-3);background-color:var(--ts-banner-bg);border-block-end:1px solid var(--ts-banner-border-color);font-size:var(--ts-font-size-sm);line-height:var(--ts-line-height-normal);inline-size:100%}:host([variant="info"]){--ts-banner-bg:var(--ts-color-info-bg);--ts-banner-border-color:var(--ts-color-info-border)}:host([variant="info"]) .banner__base{color:var(--ts-color-info-600)}:host([variant="success"]){--ts-banner-bg:var(--ts-color-success-bg);--ts-banner-border-color:var(--ts-color-success-border)}:host([variant="success"]) .banner__base{color:var(--ts-color-success-600)}:host([variant="warning"]){--ts-banner-bg:var(--ts-color-warning-bg);--ts-banner-border-color:var(--ts-color-warning-border)}:host([variant="warning"]) .banner__base{color:var(--ts-color-warning-600)}:host([variant="danger"]){--ts-banner-bg:var(--ts-color-danger-bg);--ts-banner-border-color:var(--ts-color-danger-border)}:host([variant="danger"]) .banner__base{color:var(--ts-color-danger-600)}:host([variant="neutral"]){--ts-banner-bg:var(--ts-color-bg-subtle);--ts-banner-border-color:var(--ts-color-border-subtle)}:host([variant="neutral"]) .banner__base{color:var(--ts-color-text-secondary)}.banner__icon{display:flex;align-items:center;font-size:1.15em;flex-shrink:0}.banner__message{flex:1;min-inline-size:0}.banner__action{display:flex;align-items:center;flex-shrink:0}.banner__action:empty{display:none}.banner__close{display:flex;align-items:center;justify-content:center;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;border:none;border-radius:var(--ts-radius-sm);background:transparent;color:currentColor;opacity:0.6;cursor:pointer;font-size:0.8em;transition:opacity var(--ts-transition-fast);padding:0;line-height:1}.banner__close:hover{opacity:1}.banner__close:focus-visible{box-shadow:var(--ts-focus-ring);opacity:1}`;const c=n(class s extends r{constructor(s){super();if(s!==false){this.__registerHost()}this.__attachShadow();this.tsClose=e(this,"tsClose")}variant="info";dismissible=false;icon;sticky=false;isVisible=true;tsClose;async close(){this.isVisible=false;this.tsClose.emit()}async show(){this.isVisible=true}handleClose=()=>{this.close()};renderDefaultIcon(){const s={info:"ℹ",success:"✓",warning:"⚠",danger:"✕",primary:"ℹ",secondary:"ℹ",neutral:"ℹ"};return a("span",{"aria-hidden":"true"},s[this.variant]||"ℹ")}render(){if(!this.isVisible)return null;const s=this.variant==="danger"?"alert":"banner";const n=this.variant==="danger"?"assertive":"polite";return a(t,{class:{"ts-banner":true,[`ts-banner--${this.variant}`]:true,"ts-banner--sticky":this.sticky},role:s,"aria-live":n},a("div",{class:"banner__base",part:"base"},a("div",{class:"banner__icon",part:"icon"},this.icon?a("ts-icon",{name:this.icon}):this.renderDefaultIcon()),a("div",{class:"banner__message",part:"message"},a("slot",null)),a("div",{class:"banner__action",part:"action"},a("slot",{name:"action"})),this.dismissible&&a("button",{class:"banner__close",part:"close",type:"button","aria-label":"Dismiss banner",onClick:this.handleClose},"\\u2715")))}static get style(){return i()}},[769,"ts-banner",{variant:[513],dismissible:[516],icon:[1],sticky:[516],isVisible:[32],close:[64],show:[64]}]);function l(){if(typeof customElements==="undefined"){return}const n=["ts-banner","ts-icon"];n.forEach((n=>{switch(n){case"ts-banner":if(!customElements.get(s(n))){customElements.define(s(n),c)}break;case"ts-icon":if(!customElements.get(s(n))){o()}break}}))}l();export{c as T,l as d};
2
- //# sourceMappingURL=p-CSNeA_zh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["bannerCss","TsBanner","__stencil_proxyCustomElement","HTMLElement","variant","dismissible","icon","sticky","isVisible","tsClose","close","this","emit","show","handleClose","renderDefaultIcon","icons","info","success","warning","danger","primary","secondary","neutral","h","render","role","ariaLive","Host","class","part","name","type","onClick"],"sources":["src/components/banner/banner.css?tag=ts-banner&encapsulation=shadow","src/components/banner/banner.tsx"],"sourcesContent":["/* ==========================================================================\n ts-banner — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-banner-bg Background color\n --ts-banner-border-color Border color\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-banner-bg: var(--ts-color-info-bg);\n --ts-banner-border-color: var(--ts-color-info-border);\n}\n\n:host([sticky]) {\n position: sticky;\n inset-block-start: 0;\n z-index: var(--ts-z-sticky, 100);\n}\n\n.banner__base {\n display: flex;\n align-items: center;\n gap: var(--ts-spacing-3);\n padding-inline: var(--ts-spacing-4);\n padding-block: var(--ts-spacing-3);\n background-color: var(--ts-banner-bg);\n border-block-end: 1px solid var(--ts-banner-border-color);\n font-size: var(--ts-font-size-sm);\n line-height: var(--ts-line-height-normal);\n inline-size: 100%;\n}\n\n/* ---- Variants ---- */\n:host([variant=\"info\"]) {\n --ts-banner-bg: var(--ts-color-info-bg);\n --ts-banner-border-color: var(--ts-color-info-border);\n}\n:host([variant=\"info\"]) .banner__base {\n color: var(--ts-color-info-600);\n}\n\n:host([variant=\"success\"]) {\n --ts-banner-bg: var(--ts-color-success-bg);\n --ts-banner-border-color: var(--ts-color-success-border);\n}\n:host([variant=\"success\"]) .banner__base {\n color: var(--ts-color-success-600);\n}\n\n:host([variant=\"warning\"]) {\n --ts-banner-bg: var(--ts-color-warning-bg);\n --ts-banner-border-color: var(--ts-color-warning-border);\n}\n:host([variant=\"warning\"]) .banner__base {\n color: var(--ts-color-warning-600);\n}\n\n:host([variant=\"danger\"]) {\n --ts-banner-bg: var(--ts-color-danger-bg);\n --ts-banner-border-color: var(--ts-color-danger-border);\n}\n:host([variant=\"danger\"]) .banner__base {\n color: var(--ts-color-danger-600);\n}\n\n:host([variant=\"neutral\"]) {\n --ts-banner-bg: var(--ts-color-bg-subtle);\n --ts-banner-border-color: var(--ts-color-border-subtle);\n}\n:host([variant=\"neutral\"]) .banner__base {\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Icon ---- */\n.banner__icon {\n display: flex;\n align-items: center;\n font-size: 1.15em;\n flex-shrink: 0;\n}\n\n/* ---- Message ---- */\n.banner__message {\n flex: 1;\n min-inline-size: 0;\n}\n\n/* ---- Action ---- */\n.banner__action {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.banner__action:empty {\n display: none;\n}\n\n/* ---- Close Button ---- */\n.banner__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.banner__close:hover {\n opacity: 1;\n}\n\n.banner__close:focus-visible {\n box-shadow: var(--ts-focus-ring);\n opacity: 1;\n}\n","import { Component, Prop, Event, State, h, Host, Method } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport type { TsVariant } from '../../types';\n\n/**\n * @slot - Default slot for message content.\n * @slot action - CTA button.\n *\n * @part base - The banner container.\n * @part icon - The icon wrapper.\n * @part message - The message wrapper.\n * @part action - The action slot wrapper.\n * @part close - The close/dismiss button.\n */\n@Component({\n tag: 'ts-banner',\n styleUrl: 'banner.css',\n shadow: true,\n})\nexport class TsBanner {\n /** The banner's semantic variant. */\n @Prop({ reflect: true }) variant: TsVariant = 'info';\n\n /** Whether the banner can be dismissed. */\n @Prop({ reflect: true }) dismissible = false;\n\n /** Optional Lucide icon name. */\n @Prop() icon?: string;\n\n /** Whether the banner sticks to the top of the viewport. */\n @Prop({ reflect: true }) sticky = false;\n\n /** Whether the banner is currently visible. */\n @State() isVisible = true;\n\n /** Emitted when the banner is dismissed. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Programmatically close the banner. */\n @Method()\n async close(): Promise<void> {\n this.isVisible = false;\n this.tsClose.emit();\n }\n\n /** Programmatically show the banner. */\n @Method()\n async show(): Promise<void> {\n this.isVisible = true;\n }\n\n private handleClose = (): void => {\n this.close();\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private renderDefaultIcon() {\n const icons: Record<string, string> = {\n info: '\\u2139',\n success: '\\u2713',\n warning: '\\u26A0',\n danger: '\\u2715',\n primary: '\\u2139',\n secondary: '\\u2139',\n neutral: '\\u2139',\n };\n return <span 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 role = this.variant === 'danger' ? 'alert' : 'banner';\n const ariaLive = this.variant === 'danger' ? 'assertive' : 'polite';\n\n return (\n <Host\n class={{\n 'ts-banner': true,\n [`ts-banner--${this.variant}`]: true,\n 'ts-banner--sticky': this.sticky,\n }}\n role={role}\n aria-live={ariaLive}\n >\n <div class=\"banner__base\" part=\"base\">\n <div class=\"banner__icon\" part=\"icon\">\n {this.icon ? <ts-icon name={this.icon} /> : this.renderDefaultIcon()}\n </div>\n\n <div class=\"banner__message\" part=\"message\">\n <slot />\n </div>\n\n <div class=\"banner__action\" part=\"action\">\n <slot name=\"action\" />\n </div>\n\n {this.dismissible && (\n <button\n class=\"banner__close\"\n part=\"close\"\n type=\"button\"\n aria-label=\"Dismiss banner\"\n onClick={this.handleClose}\n >\n \\u2715\n </button>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAY,IAAM,soE,MCmBXC,EAAQC,EAAA,MAAAD,UAAAE,E,gHAEMC,QAAqB,OAGrBC,YAAc,MAG/BC,KAGiBC,OAAS,MAGzBC,UAAY,KAGYC,QAIjC,WAAMC,GACJC,KAAKH,UAAY,MACjBG,KAAKF,QAAQG,M,CAKf,UAAMC,GACJF,KAAKH,UAAY,I,CAGXM,YAAc,KACpBH,KAAKD,OAAO,EAIN,iBAAAK,GACN,MAAMC,EAAgC,CACpCC,KAAM,IACNC,QAAS,IACTC,QAAS,IACTC,OAAQ,IACRC,QAAS,IACTC,UAAW,IACXC,QAAS,KAEX,OAAOC,EAAA,sBAAkB,QAAQR,EAAML,KAAKP,UAAY,I,CAI1D,MAAAqB,GACE,IAAKd,KAAKH,UAAW,OAAO,KAE5B,MAAMkB,EAAOf,KAAKP,UAAY,SAAW,QAAU,SACnD,MAAMuB,EAAWhB,KAAKP,UAAY,SAAW,YAAc,SAE3D,OACEoB,EAACI,EAAI,CACHC,MAAO,CACL,YAAa,KACb,CAAC,cAAclB,KAAKP,WAAY,KAChC,oBAAqBO,KAAKJ,QAE5BmB,KAAMA,EAAI,YACCC,GAEXH,EAAA,OAAKK,MAAM,eAAeC,KAAK,QAC7BN,EAAA,OAAKK,MAAM,eAAeC,KAAK,QAC5BnB,KAAKL,KAAOkB,EAAA,WAASO,KAAMpB,KAAKL,OAAWK,KAAKI,qBAGnDS,EAAA,OAAKK,MAAM,kBAAkBC,KAAK,WAChCN,EAAA,cAGFA,EAAA,OAAKK,MAAM,iBAAiBC,KAAK,UAC/BN,EAAA,QAAMO,KAAK,YAGZpB,KAAKN,aACJmB,EAAA,UACEK,MAAM,gBACNC,KAAK,QACLE,KAAK,SAAQ,aACF,iBACXC,QAAStB,KAAKG,aAAW,Y","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as s,H as n,h as i,c as e}from"./p-DkpyRqHf.js";const a=()=>`:host{display:block;margin-inline:auto;width:100%;box-sizing:border-box;--ts-container-padding:var(--ts-grid-margin)}:host([size="sm"]){max-width:640px}:host([size="md"]){max-width:768px}:host([size="lg"]){max-width:1024px}:host([size="xl"]){max-width:1280px}:host([size="full"]){max-width:100%}:host(:not(.ts-container--no-padding)){padding-inline:var(--ts-container-padding)}:host(.ts-container--no-padding){padding-inline:0}`;const o=s(class t extends n{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}size="lg";padding=true;render(){return i(e,{key:"45f43cf6088754adc81c04a59249361ee1484d73",class:{"ts-container":true,"ts-container--no-padding":!this.padding}},i("slot",{key:"1b302d969a21f7c35bfa8e54523df064171fdaa5"}))}static get style(){return a()}},[769,"ts-container",{size:[513],padding:[516]}]);function d(){if(typeof customElements==="undefined"){return}const s=["ts-container"];s.forEach((s=>{switch(s){case"ts-container":if(!customElements.get(t(s))){customElements.define(t(s),o)}break}}))}d();export{o as T,d};
2
- //# sourceMappingURL=p-CbHlJvjF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["containerCss","TsContainer","__stencil_proxyCustomElement","HTMLElement","size","padding","render","h","Host","key","class","this"],"sources":["src/components/container/container.css?tag=ts-container&encapsulation=shadow","src/components/container/container.tsx"],"sourcesContent":["/* ==========================================================================\n ts-container — Shadow DOM Scoped Styles\n\n Centered max-width container with responsive padding.\n\n Component tokens (Tier 3):\n --ts-container-padding Horizontal padding\n ========================================================================== */\n\n:host {\n display: block;\n margin-inline: auto;\n width: 100%;\n box-sizing: border-box;\n\n --ts-container-padding: var(--ts-grid-margin);\n}\n\n/* ---- Sizes ---- */\n:host([size=\"sm\"]) {\n max-width: 640px;\n}\n\n:host([size=\"md\"]) {\n max-width: 768px;\n}\n\n:host([size=\"lg\"]) {\n max-width: 1024px;\n}\n\n:host([size=\"xl\"]) {\n max-width: 1280px;\n}\n\n:host([size=\"full\"]) {\n max-width: 100%;\n}\n\n/* ---- Padding ---- */\n:host(:not(.ts-container--no-padding)) {\n padding-inline: var(--ts-container-padding);\n}\n\n:host(.ts-container--no-padding) {\n padding-inline: 0;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for container content.\n *\n * @part base - The container element.\n */\n@Component({\n tag: 'ts-container',\n styleUrl: 'container.css',\n shadow: true,\n})\nexport class TsContainer {\n /** The maximum width of the container. */\n @Prop({ reflect: true }) size: 'sm' | 'md' | 'lg' | 'xl' | 'full' = 'lg';\n\n /** Whether to apply horizontal padding. */\n @Prop({ reflect: true }) padding: boolean = true;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-container': true,\n 'ts-container--no-padding': !this.padding,\n }}\n >\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAe,IAAM,8a,MCYdC,EAAWC,EAAA,MAAAD,UAAAE,E,iFAEGC,KAA2C,KAG3CC,QAAmB,KAG5C,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,eAAgB,KAChB,4BAA6BC,KAAKN,UAGpCE,EAAA,QAAAE,IAAA,6C","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as e,H as s,h as a,c as i}from"./p-DkpyRqHf.js";const r=()=>`:host{display:block;font-family:var(--ts-font-family-base);--ts-stepper-active-color:var(--ts-color-interactive-primary);--ts-stepper-completed-color:var(--ts-color-success-600);--ts-stepper-connector-color:var(--ts-color-border-default)}.stepper__container{display:flex}:host([orientation="horizontal"]) .stepper__container{flex-direction:row;align-items:flex-start}:host([orientation="vertical"]) .stepper__container{flex-direction:column}`;const o=e(class t extends s{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}get hostEl(){return this}activeStep=0;orientation="horizontal";linear=false;handleActiveStepChange(){this.updateStepStates()}componentDidLoad(){this.updateStepStates()}updateStepStates(){const t=Array.from(this.hostEl.querySelectorAll("ts-step"));t.forEach(((e,s)=>{e.setAttribute("data-index",String(s));e.setAttribute("data-orientation",this.orientation);if(s===this.activeStep){e.setAttribute("data-active","")}else{e.removeAttribute("data-active")}if(this.linear&&s>this.activeStep){e.setAttribute("disabled","")}else if(this.linear){e.removeAttribute("disabled")}if(s<t.length-1){e.setAttribute("data-has-connector","")}else{e.removeAttribute("data-has-connector")}}))}render(){return a(i,{key:"202c3f1869c3010f5c6f8b5ee52850bcbbce5891",class:{"ts-stepper":true,[`ts-stepper--${this.orientation}`]:true}},a("div",{key:"32b8444cf38f04152a1e288241d703aa5e483379",class:"stepper__container",part:"container",role:"list"},a("slot",{key:"399b699aa4133bb1bb6d93fdc56b45d9bffb234d"})))}static get watchers(){return{activeStep:[{handleActiveStepChange:0}]}}static get style(){return r()}},[769,"ts-stepper",{activeStep:[514,"active-step"],orientation:[513],linear:[4]},undefined,{activeStep:[{handleActiveStepChange:0}]}]);function n(){if(typeof customElements==="undefined"){return}const e=["ts-stepper"];e.forEach((e=>{switch(e){case"ts-stepper":if(!customElements.get(t(e))){customElements.define(t(e),o)}break}}))}n();export{o as T,n as d};
2
- //# sourceMappingURL=p-CkQOAizb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["stepperCss","TsStepper","__stencil_proxyCustomElement","HTMLElement","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":"2DAAA,MAAMA,EAAa,IAAM,4b,MCYZC,EAASC,EAAA,MAAAD,UAAAE,E,0GAIKC,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":["menuCss","TsMenu","__stencil_proxyCustomElement","HTMLElement","menuId","generateId","triggerEl","open","trigger","placement","tsOpen","tsClose","focusedIndex","handleOpenChange","isOpen","this","emit","requestAnimationFrame","focusFirstItem","handleDocumentClick","event","hostEl","contains","target","handleItemSelect","focus","handleKeydown","items","getMenuItems","length","key","preventDefault","focusItem","Array","from","querySelectorAll","el","item","setFocus","handleTriggerClick","handleTriggerKeydown","handleMouseEnter","handleMouseLeave","render","h","Host","class","onMouseEnter","onMouseLeave","ref","onClick","onKeyDown","name","menu__panel","part","id","role","undefined"],"sources":["src/components/menu/menu.css?tag=ts-menu&encapsulation=shadow","src/components/menu/menu.tsx"],"sourcesContent":["/* ==========================================================================\n ts-menu — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-menu-bg Menu panel background\n --ts-menu-radius Menu panel border radius\n --ts-menu-shadow Menu panel elevation shadow\n ========================================================================== */\n\n:host {\n display: inline-block;\n position: relative;\n font-family: var(--ts-font-family-base);\n\n --ts-menu-bg: var(--ts-color-bg-elevated);\n --ts-menu-radius: var(--ts-shape-overlay);\n --ts-menu-shadow: var(--ts-shadow-lg);\n}\n\n/* ---- Trigger ---- */\n.menu__trigger {\n display: inline-flex;\n}\n\n/* ---- Panel ---- */\n.menu__panel {\n position: absolute;\n z-index: var(--ts-z-tooltip);\n display: none;\n flex-direction: column;\n min-inline-size: 10rem;\n padding-block: var(--ts-spacing-1);\n background-color: var(--ts-menu-bg);\n border-radius: var(--ts-menu-radius);\n box-shadow: var(--ts-menu-shadow);\n border: 1px solid var(--ts-color-border-default);\n overflow-y: auto;\n max-block-size: 20rem;\n animation: ts-menu-fade-in 150ms ease-out;\n}\n\n.menu__panel--open {\n display: flex;\n}\n\n/* ---- Placement ---- */\n.menu__panel--bottom-start {\n inset-block-start: 100%;\n inset-inline-start: 0;\n margin-block-start: var(--ts-spacing-1);\n}\n\n.menu__panel--bottom-end {\n inset-block-start: 100%;\n inset-inline-end: 0;\n margin-block-start: var(--ts-spacing-1);\n}\n\n.menu__panel--top-start {\n inset-block-end: 100%;\n inset-inline-start: 0;\n margin-block-end: var(--ts-spacing-1);\n}\n\n.menu__panel--top-end {\n inset-block-end: 100%;\n inset-inline-end: 0;\n margin-block-end: var(--ts-spacing-1);\n}\n\n/* ---- Animation ---- */\n@keyframes ts-menu-fade-in {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n","import { Component, Prop, State, Event, h, Host, Element, Watch, Listen } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\nimport { generateId } from '../../utils/aria';\n\nexport type TsMenuPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\n\nexport type TsMenuTrigger = 'click' | 'hover';\n\n/**\n * @slot trigger - The element that opens the menu (e.g., a button).\n * @slot - Default slot for ts-menu-item children.\n *\n * @part panel - The dropdown panel container.\n */\n@Component({\n tag: 'ts-menu',\n styleUrl: 'menu.css',\n shadow: true,\n})\nexport class TsMenu {\n @Element() hostEl!: HTMLElement;\n\n private menuId = generateId('ts-menu');\n private triggerEl?: HTMLElement;\n\n /** Whether the menu dropdown is open. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /** How the menu is triggered. */\n @Prop({ reflect: true }) trigger: TsMenuTrigger = 'click';\n\n /** Placement of the dropdown relative to the trigger. */\n @Prop({ reflect: true }) placement: TsMenuPlacement = 'bottom-start';\n\n /** Emitted when the menu opens. */\n @Event({ eventName: 'tsOpen' }) tsOpen!: EventEmitter<void>;\n\n /** Emitted when the menu closes. */\n @Event({ eventName: 'tsClose' }) tsClose!: EventEmitter<void>;\n\n /** Tracks the currently focused item index for keyboard navigation. */\n @State() focusedIndex = -1;\n\n @Watch('open')\n handleOpenChange(isOpen: boolean): void {\n if (isOpen) {\n this.tsOpen.emit();\n requestAnimationFrame(() => {\n this.focusFirstItem();\n });\n } else {\n this.focusedIndex = -1;\n this.tsClose.emit();\n }\n }\n\n @Listen('click', { target: 'document' })\n handleDocumentClick(event: MouseEvent): void {\n if (this.open && !this.hostEl.contains(event.target as Node)) {\n this.open = false;\n }\n }\n\n @Listen('tsSelect')\n handleItemSelect(): void {\n this.open = false;\n this.triggerEl?.focus();\n }\n\n @Listen('keydown')\n handleKeydown(event: KeyboardEvent): void {\n if (!this.open) return;\n\n const items = this.getMenuItems();\n if (items.length === 0) return;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n this.focusedIndex = (this.focusedIndex + 1) % items.length;\n this.focusItem(items[this.focusedIndex]);\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n this.focusedIndex = this.focusedIndex <= 0 ? items.length - 1 : this.focusedIndex - 1;\n this.focusItem(items[this.focusedIndex]);\n break;\n }\n case 'Home': {\n event.preventDefault();\n this.focusedIndex = 0;\n this.focusItem(items[0]);\n break;\n }\n case 'End': {\n event.preventDefault();\n this.focusedIndex = items.length - 1;\n this.focusItem(items[this.focusedIndex]);\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.open = false;\n this.triggerEl?.focus();\n break;\n }\n case 'Tab': {\n this.open = false;\n break;\n }\n }\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(this.hostEl.querySelectorAll<HTMLElement>('ts-menu-item:not([disabled])'));\n }\n\n private focusItem(el: HTMLElement): void {\n const item = el as HTMLElement & { setFocus?: () => Promise<void> };\n if (typeof item.setFocus === 'function') {\n item.setFocus();\n } else {\n el.focus();\n }\n }\n\n private focusFirstItem(): void {\n const items = this.getMenuItems();\n if (items.length > 0) {\n this.focusedIndex = 0;\n this.focusItem(items[0]);\n }\n }\n\n private handleTriggerClick = (): void => {\n if (this.trigger === 'click') {\n this.open = !this.open;\n }\n };\n\n private handleTriggerKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.open = true;\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.trigger === 'hover') {\n this.open = true;\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.trigger === 'hover') {\n this.open = false;\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-menu': true,\n 'ts-menu--open': this.open,\n }}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n >\n <div\n class=\"menu__trigger\"\n ref={(el) => (this.triggerEl = el)}\n onClick={this.handleTriggerClick}\n onKeyDown={this.handleTriggerKeydown}\n aria-haspopup=\"true\"\n aria-expanded={this.open ? 'true' : 'false'}\n aria-controls={this.menuId}\n >\n <slot name=\"trigger\" />\n </div>\n\n <div\n class={{\n 'menu__panel': true,\n 'menu__panel--open': this.open,\n [`menu__panel--${this.placement}`]: true,\n }}\n part=\"panel\"\n id={this.menuId}\n role=\"menu\"\n aria-hidden={!this.open ? 'true' : undefined}\n >\n <slot />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2GAAA,MAAMA,EAAU,IAAM,ypC,MCmBTC,EAAMC,EAAA,MAAAD,UAAAE,E,sKAGTC,OAASC,EAAW,WACpBC,UAGgCC,KAAO,MAGtBC,QAAyB,QAGzBC,UAA6B,eAGtBC,OAGCC,QAGxBC,cAAe,EAGxB,gBAAAC,CAAiBC,GACf,GAAIA,EAAQ,CACVC,KAAKL,OAAOM,OACZC,uBAAsB,KACpBF,KAAKG,gBAAgB,G,KAElB,CACLH,KAAKH,cAAe,EACpBG,KAAKJ,QAAQK,M,EAKjB,mBAAAG,CAAoBC,GAClB,GAAIL,KAAKR,OAASQ,KAAKM,OAAOC,SAASF,EAAMG,QAAiB,CAC5DR,KAAKR,KAAO,K,EAKhB,gBAAAiB,GACET,KAAKR,KAAO,MACZQ,KAAKT,WAAWmB,O,CAIlB,aAAAC,CAAcN,GACZ,IAAKL,KAAKR,KAAM,OAEhB,MAAMoB,EAAQZ,KAAKa,eACnB,GAAID,EAAME,SAAW,EAAG,OAExB,OAAQT,EAAMU,KACZ,IAAK,YAAa,CAChBV,EAAMW,iBACNhB,KAAKH,cAAgBG,KAAKH,aAAe,GAAKe,EAAME,OACpDd,KAAKiB,UAAUL,EAAMZ,KAAKH,eAC1B,K,CAEF,IAAK,UAAW,CACdQ,EAAMW,iBACNhB,KAAKH,aAAeG,KAAKH,cAAgB,EAAIe,EAAME,OAAS,EAAId,KAAKH,aAAe,EACpFG,KAAKiB,UAAUL,EAAMZ,KAAKH,eAC1B,K,CAEF,IAAK,OAAQ,CACXQ,EAAMW,iBACNhB,KAAKH,aAAe,EACpBG,KAAKiB,UAAUL,EAAM,IACrB,K,CAEF,IAAK,MAAO,CACVP,EAAMW,iBACNhB,KAAKH,aAAee,EAAME,OAAS,EACnCd,KAAKiB,UAAUL,EAAMZ,KAAKH,eAC1B,K,CAEF,IAAK,SAAU,CACbQ,EAAMW,iBACNhB,KAAKR,KAAO,MACZQ,KAAKT,WAAWmB,QAChB,K,CAEF,IAAK,MAAO,CACVV,KAAKR,KAAO,MACZ,K,GAKE,YAAAqB,GACN,OAAOK,MAAMC,KAAKnB,KAAKM,OAAOc,iBAA8B,gC,CAGtD,SAAAH,CAAUI,GAChB,MAAMC,EAAOD,EACb,UAAWC,EAAKC,WAAa,WAAY,CACvCD,EAAKC,U,KACA,CACLF,EAAGX,O,EAIC,cAAAP,GACN,MAAMS,EAAQZ,KAAKa,eACnB,GAAID,EAAME,OAAS,EAAG,CACpBd,KAAKH,aAAe,EACpBG,KAAKiB,UAAUL,EAAM,G,EAIjBY,mBAAqB,KAC3B,GAAIxB,KAAKP,UAAY,QAAS,CAC5BO,KAAKR,MAAQQ,KAAKR,I,GAIdiC,qBAAwBpB,IAC9B,GAAIA,EAAMU,MAAQ,aAAeV,EAAMU,MAAQ,SAAWV,EAAMU,MAAQ,IAAK,CAC3EV,EAAMW,iBACNhB,KAAKR,KAAO,I,GAIRkC,iBAAmB,KACzB,GAAI1B,KAAKP,UAAY,QAAS,CAC5BO,KAAKR,KAAO,I,GAIRmC,iBAAmB,KACzB,GAAI3B,KAAKP,UAAY,QAAS,CAC5BO,KAAKR,KAAO,K,GAKhB,MAAAoC,GACE,OACEC,EAACC,EAAI,CAAAf,IAAA,2CACHgB,MAAO,CACL,UAAW,KACX,gBAAiB/B,KAAKR,MAExBwC,aAAchC,KAAK0B,iBACnBO,aAAcjC,KAAK2B,kBAEnBE,EAAA,OAAAd,IAAA,2CACEgB,MAAM,gBACNG,IAAMb,GAAQrB,KAAKT,UAAY8B,EAC/Bc,QAASnC,KAAKwB,mBACdY,UAAWpC,KAAKyB,qBAAoB,gBACtB,OAAM,gBACLzB,KAAKR,KAAO,OAAS,QAAO,gBAC5BQ,KAAKX,QAEpBwC,EAAA,QAAAd,IAAA,2CAAMsB,KAAK,aAGbR,EAAA,OAAAd,IAAA,2CACEgB,MAAO,CACLO,YAAe,KACf,oBAAqBtC,KAAKR,KAC1B,CAAC,gBAAgBQ,KAAKN,aAAc,MAEtC6C,KAAK,QACLC,GAAIxC,KAAKX,OACToD,KAAK,OAAM,eACGzC,KAAKR,KAAO,OAASkD,WAEnCb,EAAA,QAAAd,IAAA,8C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["spacerCss","TsSpacer","__stencil_proxyCustomElement","HTMLElement","size","axis","render","style","this","width","height","h","Host","key"],"sources":["src/components/spacer/spacer.css?tag=ts-spacer&encapsulation=shadow","src/components/spacer/spacer.tsx"],"sourcesContent":["/* ==========================================================================\n ts-spacer — Shadow DOM Scoped Styles\n\n An explicit spacing element for vertical or horizontal space.\n ========================================================================== */\n\n:host {\n display: block;\n}\n\n:host([axis=\"horizontal\"]) {\n display: inline-block;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * An explicit spacing element for adding vertical or horizontal space.\n */\n@Component({\n tag: 'ts-spacer',\n styleUrl: 'spacer.css',\n shadow: true,\n})\nexport class TsSpacer {\n /** Spacing token number controlling the size of the spacer. */\n @Prop({ reflect: true }) size: string = '4';\n\n /** The axis along which the spacer adds space. */\n @Prop({ reflect: true }) axis: 'vertical' | 'horizontal' = 'vertical';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const style =\n this.axis === 'horizontal'\n ? { width: `var(--ts-spacing-${this.size})`, height: '100%' }\n : { height: `var(--ts-spacing-${this.size})`, width: '100%' };\n\n return <Host style={style}></Host>;\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAY,IAAM,uE,MCUXC,EAAQC,EAAA,MAAAD,UAAAE,E,iFAEMC,KAAe,IAGfC,KAAkC,WAG3D,MAAAC,GACE,MAAMC,EACJC,KAAKH,OAAS,aACV,CAAEI,MAAO,oBAAoBD,KAAKJ,QAASM,OAAQ,QACnD,CAAEA,OAAQ,oBAAoBF,KAAKJ,QAASK,MAAO,QAEzD,OAAOE,EAACC,EAAI,CAAAC,IAAA,2CAACN,MAAOA,G","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t as e,p as t,H as s,h as a,c as n}from"./p-DkpyRqHf.js";const c=()=>`:host{display:block}.tab-panel{outline:none}`;const d=t(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow()}get hostEl(){return this}tab;value;disabled=false;icon;render(){return a(n,{key:"dec8c9d7d1f32e6f5aef0d4bfbde8d62dd91d865"},a("div",{key:"14de5c9f6ff8c8d56733fc53088da96064e6bdc6",class:"tab-panel",part:"panel",role:"tabpanel"},a("slot",{key:"9a715c140d76ef238952f5b399cb1443af399432"})))}static get style(){return c()}},[769,"ts-tab-panel",{tab:[1],value:[513],disabled:[516],icon:[1]}]);function l(){if(typeof customElements==="undefined"){return}const t=["ts-tab-panel"];t.forEach((t=>{switch(t){case"ts-tab-panel":if(!customElements.get(e(t))){customElements.define(e(t),d)}break}}))}l();export{d as T,l as d};
2
- //# sourceMappingURL=p-DFnNsZtI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["tabPanelCss","TsTabPanel","__stencil_proxyCustomElement","HTMLElement","tab","value","disabled","icon","render","h","Host","key","class","part","role"],"sources":["src/components/tabs/tab-panel.css?tag=ts-tab-panel&encapsulation=shadow","src/components/tabs/tab-panel.tsx"],"sourcesContent":["/* ==========================================================================\n ts-tab-panel — Shadow DOM Scoped Styles\n ========================================================================== */\n\n:host {\n display: block;\n}\n\n.tab-panel {\n outline: none;\n}\n","import { Component, Prop, h, Host, Element } from '@stencil/core';\n\n/**\n * @slot - Default slot for panel content.\n *\n * @part panel - The panel container element.\n */\n@Component({\n tag: 'ts-tab-panel',\n styleUrl: 'tab-panel.css',\n shadow: true,\n})\nexport class TsTabPanel {\n @Element() hostEl!: HTMLElement;\n\n /** The label text displayed in the tab button. */\n @Prop() tab!: string;\n\n /** Unique identifier for this tab panel. */\n @Prop({ reflect: true }) value!: string;\n\n /** Whether this tab is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Optional icon name displayed before the tab label. */\n @Prop() icon?: string;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host>\n <div class=\"tab-panel\" part=\"panel\" role=\"tabpanel\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAc,IAAM,+C,MCYbC,EAAUC,EAAA,MAAAD,UAAAE,E,0GAIbC,IAGiBC,MAGAC,SAAW,MAG5BC,KAGR,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,OAAAE,IAAA,2CAAKC,MAAM,YAAYC,KAAK,QAAQC,KAAK,YACvCL,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["fileUploadCss","TsFileUpload","__stencil_proxyCustomElement","HTMLElement","fileInputEl","accept","multiple","maxSize","disabled","label","name","tsChange","isDragOver","handleClick","this","click","handleKeydown","event","key","preventDefault","handleFileChange","input","target","files","validateFiles","Array","from","length","emit","value","handleDragOver","stopPropagation","handleDragLeave","handleDrop","droppedFiles","dataTransfer","validFiles","acceptedTypes","split","map","t","trim","toLowerCase","filter","file","ext","pop","mime","type","some","accepted","endsWith","startsWith","replace","size","render","h","Host","class","part","role","tabindex","undefined","onClick","onKeyDown","onDragOver","onDragLeave","onDrop","ref","el","onChange"],"sources":["src/components/file-upload/file-upload.css?tag=ts-file-upload&encapsulation=shadow","src/components/file-upload/file-upload.tsx"],"sourcesContent":["/* ==========================================================================\n ts-file-upload — Shadow DOM Scoped Styles\n\n Component tokens (Tier 3):\n --ts-file-upload-border-color Dropzone border color\n --ts-file-upload-bg Dropzone background\n --ts-file-upload-radius Dropzone border radius\n ========================================================================== */\n\n:host {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-file-upload-border-color: var(--ts-color-border-default);\n --ts-file-upload-bg: var(--ts-color-bg-surface);\n --ts-file-upload-radius: var(--ts-radius-md);\n}\n\n/* ---- Dropzone ---- */\n.file-upload__dropzone {\n display: flex;\n align-items: center;\n justify-content: center;\n min-block-size: 120px;\n padding: var(--ts-spacing-6);\n border: 2px dashed var(--ts-file-upload-border-color);\n border-radius: var(--ts-file-upload-radius);\n background-color: var(--ts-file-upload-bg);\n cursor: pointer;\n outline: none;\n transition:\n border-color var(--ts-transition-fast),\n background-color var(--ts-transition-fast),\n box-shadow var(--ts-transition-fast);\n}\n\n.file-upload__dropzone:hover:not([aria-disabled=\"true\"]) {\n border-color: var(--ts-color-interactive-primary);\n background-color: var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.05));\n}\n\n.file-upload__dropzone:focus-visible {\n box-shadow: var(--ts-focus-ring);\n border-color: var(--ts-color-interactive-primary);\n}\n\n/* ---- Drag over state ---- */\n.file-upload__dropzone--drag-over {\n border-color: var(--ts-color-interactive-primary);\n background-color: var(--ts-color-interactive-primary-subtle, rgba(59, 130, 246, 0.1));\n border-style: solid;\n}\n\n/* ---- Disabled ---- */\n:host([disabled]) .file-upload__dropzone {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---- Label ---- */\n.file-upload__label {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ts-spacing-2);\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n text-align: center;\n pointer-events: none;\n}\n\n/* ---- Hidden file input ---- */\n.file-upload__input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","import { Component, Prop, State, Event, h, Host, Element } from '@stencil/core';\nimport type { EventEmitter } from '@stencil/core';\n\n/**\n * @slot - Default slot for custom dropzone content.\n *\n * @part dropzone - The dropzone area.\n * @part label - The label text.\n * @part input - The hidden file input.\n */\n@Component({\n tag: 'ts-file-upload',\n styleUrl: 'file-upload.css',\n shadow: true,\n})\nexport class TsFileUpload {\n @Element() hostEl!: HTMLElement;\n\n private fileInputEl?: HTMLInputElement;\n\n /** Accepted file types (e.g. '.jpg,.png'). */\n @Prop() accept?: string;\n\n /** Whether multiple files can be selected. */\n @Prop() multiple = false;\n\n /** Maximum file size in bytes. */\n @Prop() maxSize?: number;\n\n /** Whether the file upload is disabled. */\n @Prop({ reflect: true }) disabled = false;\n\n /** Label text for the dropzone. */\n @Prop() label = 'Drop files here or click to upload';\n\n /** Form field name. */\n @Prop() name?: string;\n\n /** Emitted when files are selected or dropped. */\n @Event({ eventName: 'tsChange' }) tsChange!: EventEmitter<{ files: File[] }>;\n\n /** Whether a drag operation is over the dropzone. */\n @State() isDragOver = false;\n\n private handleClick = (): void => {\n if (this.disabled) return;\n this.fileInputEl?.click();\n };\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (this.disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.fileInputEl?.click();\n }\n };\n\n private handleFileChange = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const files = this.validateFiles(Array.from(input.files));\n if (files.length > 0) {\n this.tsChange.emit({ files });\n }\n }\n // Reset input so the same file can be selected again\n if (this.fileInputEl) {\n this.fileInputEl.value = '';\n }\n };\n\n private handleDragOver = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabled) {\n this.isDragOver = true;\n }\n };\n\n private handleDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n };\n\n private handleDrop = (event: DragEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n\n if (this.disabled) return;\n\n const droppedFiles = event.dataTransfer?.files;\n if (droppedFiles) {\n const files = this.validateFiles(Array.from(droppedFiles));\n if (files.length > 0) {\n this.tsChange.emit({ files });\n }\n }\n };\n\n private validateFiles(files: File[]): File[] {\n let validFiles = files;\n\n // Filter by accepted types\n if (this.accept) {\n const acceptedTypes = this.accept.split(',').map((t) => t.trim().toLowerCase());\n validFiles = validFiles.filter((file) => {\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n const mime = file.type.toLowerCase();\n return acceptedTypes.some(\n (accepted) =>\n accepted === ext ||\n accepted === mime ||\n (accepted.endsWith('/*') && mime.startsWith(accepted.replace('/*', '/'))),\n );\n });\n }\n\n // Filter by max size\n if (this.maxSize) {\n validFiles = validFiles.filter((file) => file.size <= this.maxSize!);\n }\n\n // If not multiple, take only the first\n if (!this.multiple && validFiles.length > 1) {\n validFiles = [validFiles[0]];\n }\n\n return validFiles;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-file-upload': true,\n 'ts-file-upload--drag-over': this.isDragOver,\n 'ts-file-upload--disabled': this.disabled,\n }}\n >\n <div\n class={{\n 'file-upload__dropzone': true,\n 'file-upload__dropzone--drag-over': this.isDragOver,\n }}\n part=\"dropzone\"\n role=\"button\"\n tabindex={this.disabled ? -1 : 0}\n aria-disabled={this.disabled ? 'true' : undefined}\n aria-label={this.label}\n onClick={this.handleClick}\n onKeyDown={this.handleKeydown}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n onDrop={this.handleDrop}\n >\n <span class=\"file-upload__label\" part=\"label\">\n <slot>{this.label}</slot>\n </span>\n\n <input\n ref={(el) => (this.fileInputEl = el)}\n class=\"file-upload__input\"\n part=\"input\"\n type=\"file\"\n name={this.name}\n accept={this.accept}\n multiple={this.multiple}\n disabled={this.disabled}\n tabindex={-1}\n aria-hidden=\"true\"\n onChange={this.handleFileChange}\n />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"uEAAA,MAAMA,EAAgB,IAAM,qjD,MCefC,EAAYC,EAAA,MAAAD,UAAAE,E,2IAGfC,YAGAC,OAGAC,SAAW,MAGXC,QAGiBC,SAAW,MAG5BC,MAAQ,qCAGRC,KAG0BC,SAGzBC,WAAa,MAEdC,YAAc,KACpB,GAAIC,KAAKN,SAAU,OACnBM,KAAKV,aAAaW,OAAO,EAGnBC,cAAiBC,IACvB,GAAIH,KAAKN,SAAU,OACnB,GAAIS,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CAC9CD,EAAME,iBACNL,KAAKV,aAAaW,O,GAIdK,iBAAoBH,IAC1B,MAAMI,EAAQJ,EAAMK,OACpB,GAAID,EAAME,MAAO,CACf,MAAMA,EAAQT,KAAKU,cAAcC,MAAMC,KAAKL,EAAME,QAClD,GAAIA,EAAMI,OAAS,EAAG,CACpBb,KAAKH,SAASiB,KAAK,CAAEL,S,EAIzB,GAAIT,KAAKV,YAAa,CACpBU,KAAKV,YAAYyB,MAAQ,E,GAIrBC,eAAkBb,IACxBA,EAAME,iBACNF,EAAMc,kBACN,IAAKjB,KAAKN,SAAU,CAClBM,KAAKF,WAAa,I,GAIdoB,gBAAmBf,IACzBA,EAAME,iBACNF,EAAMc,kBACNjB,KAAKF,WAAa,KAAK,EAGjBqB,WAAchB,IACpBA,EAAME,iBACNF,EAAMc,kBACNjB,KAAKF,WAAa,MAElB,GAAIE,KAAKN,SAAU,OAEnB,MAAM0B,EAAejB,EAAMkB,cAAcZ,MACzC,GAAIW,EAAc,CAChB,MAAMX,EAAQT,KAAKU,cAAcC,MAAMC,KAAKQ,IAC5C,GAAIX,EAAMI,OAAS,EAAG,CACpBb,KAAKH,SAASiB,KAAK,CAAEL,S,IAKnB,aAAAC,CAAcD,GACpB,IAAIa,EAAab,EAGjB,GAAIT,KAAKT,OAAQ,CACf,MAAMgC,EAAgBvB,KAAKT,OAAOiC,MAAM,KAAKC,KAAKC,GAAMA,EAAEC,OAAOC,gBACjEN,EAAaA,EAAWO,QAAQC,IAC9B,MAAMC,EAAM,IAAMD,EAAKlC,KAAK4B,MAAM,KAAKQ,OAAOJ,cAC9C,MAAMK,EAAOH,EAAKI,KAAKN,cACvB,OAAOL,EAAcY,MAClBC,GACCA,IAAaL,GACbK,IAAaH,GACZG,EAASC,SAAS,OAASJ,EAAKK,WAAWF,EAASG,QAAQ,KAAM,OACtE,G,CAKL,GAAIvC,KAAKP,QAAS,CAChB6B,EAAaA,EAAWO,QAAQC,GAASA,EAAKU,MAAQxC,KAAKP,S,CAI7D,IAAKO,KAAKR,UAAY8B,EAAWT,OAAS,EAAG,CAC3CS,EAAa,CAACA,EAAW,G,CAG3B,OAAOA,C,CAIT,MAAAmB,GACE,OACEC,EAACC,EAAI,CAAAvC,IAAA,2CACHwC,MAAO,CACL,iBAAkB,KAClB,4BAA6B5C,KAAKF,WAClC,2BAA4BE,KAAKN,WAGnCgD,EAAA,OAAAtC,IAAA,2CACEwC,MAAO,CACL,wBAAyB,KACzB,mCAAoC5C,KAAKF,YAE3C+C,KAAK,WACLC,KAAK,SACLC,SAAU/C,KAAKN,UAAW,EAAK,EAAC,gBACjBM,KAAKN,SAAW,OAASsD,UAAS,aACrChD,KAAKL,MACjBsD,QAASjD,KAAKD,YACdmD,UAAWlD,KAAKE,cAChBiD,WAAYnD,KAAKgB,eACjBoC,YAAapD,KAAKkB,gBAClBmC,OAAQrD,KAAKmB,YAEbuB,EAAA,QAAAtC,IAAA,2CAAMwC,MAAM,qBAAqBC,KAAK,SACpCH,EAAA,QAAAtC,IAAA,4CAAOJ,KAAKL,QAGd+C,EAAA,SAAAtC,IAAA,2CACEkD,IAAMC,GAAQvD,KAAKV,YAAciE,EACjCX,MAAM,qBACNC,KAAK,QACLX,KAAK,OACLtC,KAAMI,KAAKJ,KACXL,OAAQS,KAAKT,OACbC,SAAUQ,KAAKR,SACfE,SAAUM,KAAKN,SACfqD,UAAU,EAAE,cACA,OACZS,SAAUxD,KAAKM,oB","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as e,H as s,h as c,c as n}from"./p-DkpyRqHf.js";const a=()=>`:host{display:flex;flex-direction:column}`;const r=e(class t extends s{constructor(t){super();if(t!==false){this.__registerHost()}this.__attachShadow()}gap="3";align="stretch";render(){const t={start:"flex-start",center:"center",end:"flex-end",stretch:"stretch"};return c(n,{key:"e3a85d1cdd874e8e09e069d6d5e22502b494fbef",style:{gap:`var(--ts-spacing-${this.gap})`,alignItems:t[this.align]||"stretch"}},c("slot",{key:"eb4127e0dfded8841de2951976461f0ec2ec1f88"}))}static get style(){return a()}},[769,"ts-stack",{gap:[513],align:[513]}]);function i(){if(typeof customElements==="undefined"){return}const e=["ts-stack"];e.forEach((e=>{switch(e){case"ts-stack":if(!customElements.get(t(e))){customElements.define(t(e),r)}break}}))}i();export{r as T,i as d};
2
- //# sourceMappingURL=p-DMuI5d5r.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["stackCss","TsStack","__stencil_proxyCustomElement","HTMLElement","gap","align","render","alignMap","start","center","end","stretch","h","Host","key","style","this","alignItems"],"sources":["src/components/stack/stack.css?tag=ts-stack&encapsulation=shadow","src/components/stack/stack.tsx"],"sourcesContent":["/* ==========================================================================\n ts-stack — Shadow DOM Scoped Styles\n\n A vertical stack layout primitive with consistent gap spacing.\n ========================================================================== */\n\n:host {\n display: flex;\n flex-direction: column;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for stacked content.\n *\n * @part base - The stack container.\n */\n@Component({\n tag: 'ts-stack',\n styleUrl: 'stack.css',\n shadow: true,\n})\nexport class TsStack {\n /** Spacing token number controlling the gap between items. */\n @Prop({ reflect: true }) gap: string = '3';\n\n /** Cross-axis alignment of items. */\n @Prop({ reflect: true }) align: 'start' | 'center' | 'end' | 'stretch' = 'stretch';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const alignMap: Record<string, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n };\n\n return (\n <Host\n style={{\n gap: `var(--ts-spacing-${this.gap})`,\n alignItems: alignMap[this.align] || 'stretch',\n }}\n >\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAW,IAAM,4C,MCYVC,EAAOC,EAAA,MAAAD,UAAAE,E,iFAEOC,IAAc,IAGdC,MAAgD,UAGzE,MAAAC,GACE,MAAMC,EAAmC,CACvCC,MAAO,aACPC,OAAQ,SACRC,IAAK,WACLC,QAAS,WAGX,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACLX,IAAK,oBAAoBY,KAAKZ,OAC9Ba,WAAYV,EAASS,KAAKX,QAAU,YAGtCO,EAAA,QAAAE,IAAA,6C","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{t,p as e,H as a,h as r,c as s}from"./p-DkpyRqHf.js";const o=()=>`ts-table{display:block;font-family:var(--ts-font-family-base);--ts-table-bg:var(--ts-color-bg-surface);--ts-table-border-color:var(--ts-color-border-subtle);--ts-table-header-bg:var(--ts-color-bg-subtle);--ts-table-header-color:var(--ts-color-text-primary);--ts-table-row-hover-bg:var(--ts-color-bg-hover);--ts-table-stripe-bg:var(--ts-color-bg-subtle);--ts-table-cell-padding:var(--ts-spacing-3) var(--ts-spacing-4)}ts-table[compact]{--ts-table-cell-padding:var(--ts-spacing-1) var(--ts-spacing-2)}ts-table .table__wrapper{overflow-x:auto;background-color:var(--ts-table-bg);border-radius:var(--ts-shape-container);border:1px solid var(--ts-table-border-color)}ts-table .table__wrapper:focus-visible{box-shadow:var(--ts-focus-ring);outline:none}ts-table table{width:100%;border-collapse:collapse;border-spacing:0;font-size:var(--ts-font-size-sm);color:var(--ts-color-text-secondary)}ts-table th{padding:var(--ts-table-cell-padding);text-align:start;font-weight:var(--ts-font-weight-medium);font-size:var(--ts-font-size-xs);color:var(--ts-table-header-color);background-color:var(--ts-table-header-bg);border-bottom:1px solid var(--ts-table-border-color);white-space:nowrap;letter-spacing:var(--ts-letter-spacing-wide);text-transform:uppercase}ts-table td{padding:var(--ts-table-cell-padding);border-bottom:1px solid var(--ts-table-border-color);vertical-align:middle}ts-table tbody tr:last-child td{border-bottom:none}ts-table.ts-table--striped tbody tr:nth-child(even){background-color:var(--ts-table-stripe-bg)}ts-table.ts-table--hoverable tbody tr{transition:background-color var(--ts-transition-fast)}ts-table.ts-table--hoverable tbody tr:hover{background-color:var(--ts-table-row-hover-bg)}ts-table.ts-table--bordered th,ts-table.ts-table--bordered td{border:1px solid var(--ts-table-border-color)}ts-table.ts-table--sticky-header .table__wrapper{max-block-size:24rem;overflow-y:auto}ts-table.ts-table--sticky-header th{position:sticky;top:0;z-index:1}`;const l=e(class t extends a{constructor(t){super();if(t!==false){this.__registerHost()}}get hostEl(){return this}striped=false;bordered=false;hoverable=false;compact=false;stickyHeader=false;render(){return r(s,{key:"c866dae0b6964580df42d51748d98107e0d6baec",class:{"ts-table":true,"ts-table--striped":this.striped,"ts-table--bordered":this.bordered,"ts-table--hoverable":this.hoverable,"ts-table--compact":this.compact,"ts-table--sticky-header":this.stickyHeader}},r("div",{key:"e98054b22f0f106888cbb3751d77abf5fd55a8ee",class:"table__wrapper",role:"region",tabindex:0},r("slot",{key:"cd5b905f8142ce381442abef895daa39ef14431e"})))}static get style(){return o()}},[772,"ts-table",{striped:[516],bordered:[516],hoverable:[516],compact:[516],stickyHeader:[516,"sticky-header"]}]);function b(){if(typeof customElements==="undefined"){return}const e=["ts-table"];e.forEach((e=>{switch(e){case"ts-table":if(!customElements.get(t(e))){customElements.define(t(e),l)}break}}))}b();export{l as T,b as d};
2
- //# sourceMappingURL=p-DPQ1o4MP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["tableCss","TsTable","__stencil_proxyCustomElement","HTMLElement","striped","bordered","hoverable","compact","stickyHeader","render","h","Host","key","class","this","role","tabindex"],"sources":["src/components/table/table.css?tag=ts-table","src/components/table/table.tsx"],"sourcesContent":["/* ==========================================================================\n ts-table — Light DOM Styles\n\n Uses light DOM (no Shadow DOM) so nested <table>, <th>, <td>, <tr>\n elements can be styled directly.\n\n Component tokens (Tier 3):\n --ts-table-bg Table background color\n --ts-table-border-color Border color for cells and edges\n --ts-table-header-bg Header row background\n --ts-table-header-color Header text color\n --ts-table-row-hover-bg Row hover background\n --ts-table-stripe-bg Alternating row background\n --ts-table-cell-padding Cell padding\n ========================================================================== */\n\nts-table {\n display: block;\n font-family: var(--ts-font-family-base);\n\n --ts-table-bg: var(--ts-color-bg-surface);\n --ts-table-border-color: var(--ts-color-border-subtle);\n --ts-table-header-bg: var(--ts-color-bg-subtle);\n --ts-table-header-color: var(--ts-color-text-primary);\n --ts-table-row-hover-bg: var(--ts-color-bg-hover);\n --ts-table-stripe-bg: var(--ts-color-bg-subtle);\n --ts-table-cell-padding: var(--ts-spacing-3) var(--ts-spacing-4);\n}\n\nts-table[compact] {\n --ts-table-cell-padding: var(--ts-spacing-1) var(--ts-spacing-2);\n}\n\n/* ---- Scrollable Wrapper ---- */\nts-table .table__wrapper {\n overflow-x: auto;\n background-color: var(--ts-table-bg);\n border-radius: var(--ts-shape-container);\n border: 1px solid var(--ts-table-border-color);\n}\n\nts-table .table__wrapper:focus-visible {\n box-shadow: var(--ts-focus-ring);\n outline: none;\n}\n\n/* ---- Table ---- */\nts-table table {\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n font-size: var(--ts-font-size-sm);\n color: var(--ts-color-text-secondary);\n}\n\n/* ---- Header ---- */\nts-table th {\n padding: var(--ts-table-cell-padding);\n text-align: start;\n font-weight: var(--ts-font-weight-medium);\n font-size: var(--ts-font-size-xs);\n color: var(--ts-table-header-color);\n background-color: var(--ts-table-header-bg);\n border-bottom: 1px solid var(--ts-table-border-color);\n white-space: nowrap;\n letter-spacing: var(--ts-letter-spacing-wide);\n text-transform: uppercase;\n}\n\n/* ---- Cells ---- */\nts-table td {\n padding: var(--ts-table-cell-padding);\n border-bottom: 1px solid var(--ts-table-border-color);\n vertical-align: middle;\n}\n\n/* ---- Last row — no bottom border ---- */\nts-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n/* ---- Striped ---- */\nts-table.ts-table--striped tbody tr:nth-child(even) {\n background-color: var(--ts-table-stripe-bg);\n}\n\n/* ---- Hoverable ---- */\nts-table.ts-table--hoverable tbody tr {\n transition: background-color var(--ts-transition-fast);\n}\n\nts-table.ts-table--hoverable tbody tr:hover {\n background-color: var(--ts-table-row-hover-bg);\n}\n\n/* ---- Bordered ---- */\nts-table.ts-table--bordered th,\nts-table.ts-table--bordered td {\n border: 1px solid var(--ts-table-border-color);\n}\n\n/* ---- Sticky header ---- */\nts-table.ts-table--sticky-header .table__wrapper {\n max-block-size: 24rem;\n overflow-y: auto;\n}\n\nts-table.ts-table--sticky-header th {\n position: sticky;\n top: 0;\n z-index: 1;\n}\n","import { Component, Prop, h, Host, Element } from '@stencil/core';\n\n/**\n * A styled wrapper for native HTML tables. Consumers place standard\n * `<table>`, `<thead>`, `<tbody>`, `<tr>`, `<th>`, `<td>` elements inside.\n *\n * Uses light DOM (no Shadow DOM) so nested table elements can be\n * styled directly via the component's CSS.\n *\n * @slot - Default slot for the native `<table>` element.\n */\n@Component({\n tag: 'ts-table',\n styleUrl: 'table.css',\n shadow: false,\n})\nexport class TsTable {\n @Element() hostEl!: HTMLElement;\n\n /** Applies alternating row background colors. */\n @Prop({ reflect: true }) striped = false;\n\n /** Adds borders to all cells. */\n @Prop({ reflect: true }) bordered = false;\n\n /** Highlights rows on hover. */\n @Prop({ reflect: true }) hoverable = false;\n\n /** Reduces cell padding for denser display. */\n @Prop({ reflect: true }) compact = false;\n\n /** Makes the table header stick to the top on scroll. */\n @Prop({ reflect: true }) stickyHeader = false;\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n return (\n <Host\n class={{\n 'ts-table': true,\n 'ts-table--striped': this.striped,\n 'ts-table--bordered': this.bordered,\n 'ts-table--hoverable': this.hoverable,\n 'ts-table--compact': this.compact,\n 'ts-table--sticky-header': this.stickyHeader,\n }}\n >\n <div class=\"table__wrapper\" role=\"region\" tabindex={0}>\n <slot />\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAW,IAAM,y6D,MCgBVC,EAAOC,EAAA,MAAAD,UAAAE,E,qFAIOC,QAAU,MAGVC,SAAW,MAGXC,UAAY,MAGZC,QAAU,MAGVC,aAAe,MAGxC,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACL,WAAY,KACZ,oBAAqBC,KAAKV,QAC1B,qBAAsBU,KAAKT,SAC3B,sBAAuBS,KAAKR,UAC5B,oBAAqBQ,KAAKP,QAC1B,0BAA2BO,KAAKN,eAGlCE,EAAA,OAAAE,IAAA,2CAAKC,MAAM,iBAAiBE,KAAK,SAASC,SAAU,GAClDN,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["treeItemCss","TsTreeItem","__stencil_proxyCustomElement","HTMLElement","label","expanded","selected","disabled","icon","hasChildren","tsToggle","tsSelect","onExpandedChange","this","emit","componentDidLoad","checkForChildren","slot","hostEl","shadowRoot","querySelector","assigned","assignedElements","some","el","tagName","handleToggle","event","stopPropagation","handleSelect","tree","closest","selectable","value","handleKeyDown","key","preventDefault","handleSlotChange","render","h","Host","class","role","tabindex","String","undefined","onKeyDown","part","onClick","viewBox","fill","stroke","points","name","size","onSlotchange"],"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"],"mappings":"2GAAA,MAAMA,EAAc,IAAM,ijD,MCiBbC,EAAUC,EAAA,MAAAD,UAAAE,E,4KAIbC,MAGgCC,SAAW,MAGXC,SAAW,MAG1BC,SAAW,MAG5BC,KAGCC,YAAc,MAGWC,SAGAC,SAGlC,gBAAAC,GACEC,KAAKH,SAASI,KAAK,CAAET,SAAUQ,KAAKR,U,CAGtC,gBAAAU,GACEF,KAAKG,kB,CAGC,gBAAAA,GACN,MAAMC,EAAOJ,KAAKK,OAAOC,YAAYC,cAAc,oBACnD,GAAIH,EAAM,CACR,MAAMI,EAAWJ,EAAKK,mBACtBT,KAAKJ,YAAcY,EAASE,MAAKC,GAAMA,EAAGC,UAAY,gB,EAIlDC,aAAgBC,IACtBA,EAAMC,kBACN,GAAIf,KAAKN,SAAU,OACnBM,KAAKR,UAAYQ,KAAKR,QAAQ,EAGxBwB,aAAe,KACrB,GAAIhB,KAAKN,SAAU,OACnB,MAAMuB,EAAOjB,KAAKK,OAAOa,QAAQ,WACjC,GAAID,GAASA,EAA4CE,WAAY,CACnEnB,KAAKP,UAAYO,KAAKP,SACtBO,KAAKF,SAASG,KAAK,CAAER,SAAUO,KAAKP,SAAU2B,MAAOpB,KAAKT,OAAS,I,GAI/D8B,cAAiBP,IACvB,GAAIA,EAAMQ,MAAQ,SAAWR,EAAMQ,MAAQ,IAAK,CAC9CR,EAAMS,iBACNvB,KAAKgB,c,GAIDQ,iBAAmB,KACzBxB,KAAKG,kBAAkB,EAIzB,MAAAsB,GACE,OACEC,EAACC,EAAI,CAAAL,IAAA,2CACHM,MAAO,CACL,eAAgB,KAChB,yBAA0B5B,KAAKR,SAC/B,yBAA0BQ,KAAKP,SAC/B,yBAA0BO,KAAKN,SAC/B,6BAA8BM,KAAKJ,aAErCiC,KAAK,WACLC,SAAU9B,KAAKN,UAAW,EAAK,EAAC,gBACjBM,KAAKJ,YAAcmC,OAAO/B,KAAKR,UAAYwC,UAAS,gBACpDD,OAAO/B,KAAKP,UAAS,gBACrBO,KAAKN,SAAW,OAASsC,UACxCC,UAAWjC,KAAKqB,eAEhBK,EAAA,OAAAJ,IAAA,2CAAKM,MAAM,kBAAkBM,KAAK,OAAOC,QAASnC,KAAKgB,cACrDU,EAAA,QAAAJ,IAAA,2CACEM,MAAO,CACL,qBAAsB,KACtB,8BAA+B5B,KAAKJ,aAEtCsC,KAAK,UACLC,QAASnC,KAAKa,aAAY,cACd,QAEZa,EAAA,OAAAJ,IAAA,2CAAKc,QAAQ,YAAYC,KAAK,OAAOC,OAAO,eAAc,eAAc,IAAG,iBAAgB,QAAO,kBAAiB,SACjHZ,EAAA,YAAAJ,IAAA,2CAAUiB,OAAO,qBAIpBvC,KAAKL,MACJ+B,EAAA,QAAAJ,IAAA,2CAAMM,MAAM,kBAAkBM,KAAK,OAAM,cAAa,QACpDR,EAAA,WAAAJ,IAAA,2CAASkB,KAAMxC,KAAKL,KAAM8C,KAAK,QAInCf,EAAA,QAAAJ,IAAA,2CAAMM,MAAM,mBAAmBM,KAAK,SAClCR,EAAA,QAAAJ,IAAA,2CAAMkB,KAAK,SAASxC,KAAKT,SAI7BmC,EAAA,OAAAJ,IAAA,2CACEM,MAAO,CACL,sBAAuB,KACvB,kCAAmC5B,KAAKR,UAE1CqC,KAAK,SAELH,EAAA,QAAAJ,IAAA,2CAAMoB,aAAc1C,KAAKwB,oB","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["rowCss","TsRow","__stencil_proxyCustomElement","HTMLElement","gap","align","justify","wrap","reverse","stackAt","render","alignMap","start","center","end","stretch","baseline","justifyMap","between","around","evenly","h","Host","key","style","this","alignItems","justifyContent","flexWrap"],"sources":["src/components/row/row.css?tag=ts-row&encapsulation=shadow","src/components/row/row.tsx"],"sourcesContent":["/* ==========================================================================\n ts-row — Shadow DOM Scoped Styles\n\n A horizontal flex row layout primitive with wrap and responsive stacking.\n ========================================================================== */\n\n:host {\n display: flex;\n flex-direction: row;\n}\n\n:host([reverse]) {\n flex-direction: row-reverse;\n}\n\n/* ---- Responsive stacking ---- */\n@media (max-width: 639px) {\n :host([stack-at=\"sm\"]) {\n flex-direction: column;\n }\n :host([stack-at=\"sm\"][reverse]) {\n flex-direction: column-reverse;\n }\n}\n\n@media (max-width: 767px) {\n :host([stack-at=\"md\"]) {\n flex-direction: column;\n }\n :host([stack-at=\"md\"][reverse]) {\n flex-direction: column-reverse;\n }\n}\n\n@media (max-width: 1023px) {\n :host([stack-at=\"lg\"]) {\n flex-direction: column;\n }\n :host([stack-at=\"lg\"][reverse]) {\n flex-direction: column-reverse;\n }\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot - Default slot for row content.\n */\n@Component({\n tag: 'ts-row',\n styleUrl: 'row.css',\n shadow: true,\n})\nexport class TsRow {\n /** Spacing token number controlling the gap between items. */\n @Prop({ reflect: true }) gap: string = '2';\n\n /** Cross-axis alignment of items. */\n @Prop({ reflect: true }) align: 'start' | 'center' | 'end' | 'stretch' | 'baseline' = 'center';\n\n /** Main-axis alignment of items. */\n @Prop({ reflect: true }) justify: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly' = 'start';\n\n /** Whether items should wrap to the next line. */\n @Prop({ reflect: true }) wrap: boolean = true;\n\n /** Reverse the row direction. */\n @Prop({ reflect: true }) reverse: boolean = false;\n\n /** Breakpoint at which the row stacks vertically. */\n @Prop({ reflect: true, attribute: 'stack-at' }) stackAt: 'sm' | 'md' | 'lg' | 'never' = 'never';\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n render() {\n const alignMap: Record<string, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n };\n\n const justifyMap: Record<string, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n };\n\n return (\n <Host\n style={{\n gap: `var(--ts-spacing-${this.gap})`,\n alignItems: alignMap[this.align] || 'center',\n justifyContent: justifyMap[this.justify] || 'flex-start',\n flexWrap: this.wrap ? 'wrap' : 'nowrap',\n }}\n >\n <slot />\n </Host>\n );\n }\n}\n"],"mappings":"gEAAA,MAAMA,EAAS,IAAM,we,MCURC,EAAKC,EAAA,MAAAD,UAAAE,E,iFAESC,IAAc,IAGdC,MAA6D,SAG7DC,QAAwE,QAGxEC,KAAgB,KAGhBC,QAAmB,MAGIC,QAAwC,QAGxF,MAAAC,GACE,MAAMC,EAAmC,CACvCC,MAAO,aACPC,OAAQ,SACRC,IAAK,WACLC,QAAS,UACTC,SAAU,YAGZ,MAAMC,EAAqC,CACzCL,MAAO,aACPC,OAAQ,SACRC,IAAK,WACLI,QAAS,gBACTC,OAAQ,eACRC,OAAQ,gBAGV,OACEC,EAACC,EAAI,CAAAC,IAAA,2CACHC,MAAO,CACLpB,IAAK,oBAAoBqB,KAAKrB,OAC9BsB,WAAYf,EAASc,KAAKpB,QAAU,SACpCsB,eAAgBV,EAAWQ,KAAKnB,UAAY,aAC5CsB,SAAUH,KAAKlB,KAAO,OAAS,WAGjCc,EAAA,QAAAE,IAAA,6C","ignoreList":[]}