@fusion.dev/helix-headless 0.0.0-dev

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 (424) hide show
  1. package/LICENSE +21 -0
  2. package/custom-elements.json +75202 -0
  3. package/dist/accordion/index.d.ts +2 -0
  4. package/dist/accordion/index.js +2 -0
  5. package/dist/accordion/item/accordion-item.d.ts +141 -0
  6. package/dist/accordion/item/accordion-item.js +214 -0
  7. package/dist/accordion/root/accordion-root.d.ts +57 -0
  8. package/dist/accordion/root/accordion-root.js +96 -0
  9. package/dist/announcement/index.d.ts +1 -0
  10. package/dist/announcement/index.js +1 -0
  11. package/dist/announcement/root/announcement-root.d.ts +106 -0
  12. package/dist/announcement/root/announcement-root.js +144 -0
  13. package/dist/app-header/index.d.ts +1 -0
  14. package/dist/app-header/index.js +1 -0
  15. package/dist/app-header/root/app-header-root.d.ts +113 -0
  16. package/dist/app-header/root/app-header-root.js +147 -0
  17. package/dist/avatar/group/avatar-group.d.ts +116 -0
  18. package/dist/avatar/group/avatar-group.js +136 -0
  19. package/dist/avatar/index.d.ts +2 -0
  20. package/dist/avatar/index.js +2 -0
  21. package/dist/avatar/root/avatar-root.d.ts +71 -0
  22. package/dist/avatar/root/avatar-root.js +147 -0
  23. package/dist/badge/index.d.ts +1 -0
  24. package/dist/badge/index.js +1 -0
  25. package/dist/badge/root/badge-root.d.ts +61 -0
  26. package/dist/badge/root/badge-root.js +121 -0
  27. package/dist/bar-chart/index.d.ts +1 -0
  28. package/dist/bar-chart/index.js +1 -0
  29. package/dist/bar-chart/root/bar-chart-root.d.ts +266 -0
  30. package/dist/bar-chart/root/bar-chart-root.js +515 -0
  31. package/dist/blockquote/index.d.ts +1 -0
  32. package/dist/blockquote/index.js +1 -0
  33. package/dist/blockquote/root/blockquote-root.d.ts +51 -0
  34. package/dist/blockquote/root/blockquote-root.js +84 -0
  35. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +104 -0
  36. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +137 -0
  37. package/dist/breadcrumbs/index.d.ts +2 -0
  38. package/dist/breadcrumbs/index.js +2 -0
  39. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +77 -0
  40. package/dist/breadcrumbs/root/breadcrumbs-root.js +94 -0
  41. package/dist/button/index.d.ts +1 -0
  42. package/dist/button/index.js +1 -0
  43. package/dist/button/root/button-root.d.ts +251 -0
  44. package/dist/button/root/button-root.js +401 -0
  45. package/dist/button-group/index.d.ts +1 -0
  46. package/dist/button-group/index.js +1 -0
  47. package/dist/button-group/root/button-group-root.d.ts +62 -0
  48. package/dist/button-group/root/button-group-root.js +62 -0
  49. package/dist/callout/index.d.ts +1 -0
  50. package/dist/callout/index.js +1 -0
  51. package/dist/callout/root/callout-root.d.ts +72 -0
  52. package/dist/callout/root/callout-root.js +90 -0
  53. package/dist/card/index.d.ts +1 -0
  54. package/dist/card/index.js +1 -0
  55. package/dist/card/root/card-root.d.ts +54 -0
  56. package/dist/card/root/card-root.js +71 -0
  57. package/dist/carousel/index.d.ts +1 -0
  58. package/dist/carousel/index.js +1 -0
  59. package/dist/carousel/root/carousel-root.d.ts +399 -0
  60. package/dist/carousel/root/carousel-root.js +723 -0
  61. package/dist/chat/composer/chat-composer.d.ts +160 -0
  62. package/dist/chat/composer/chat-composer.js +273 -0
  63. package/dist/chat/index.d.ts +3 -0
  64. package/dist/chat/index.js +3 -0
  65. package/dist/chat/message/chat-message.d.ts +170 -0
  66. package/dist/chat/message/chat-message.js +271 -0
  67. package/dist/chat/root/chat-root.d.ts +216 -0
  68. package/dist/chat/root/chat-root.js +389 -0
  69. package/dist/checkbox/index.d.ts +1 -0
  70. package/dist/checkbox/index.js +1 -0
  71. package/dist/checkbox/root/checkbox-root.d.ts +108 -0
  72. package/dist/checkbox/root/checkbox-root.js +207 -0
  73. package/dist/checkbox-group/index.d.ts +1 -0
  74. package/dist/checkbox-group/index.js +1 -0
  75. package/dist/checkbox-group/root/checkbox-group-root.d.ts +155 -0
  76. package/dist/checkbox-group/root/checkbox-group-root.js +293 -0
  77. package/dist/code/index.d.ts +1 -0
  78. package/dist/code/index.js +1 -0
  79. package/dist/code/root/code-root.d.ts +36 -0
  80. package/dist/code/root/code-root.js +43 -0
  81. package/dist/code-block/index.d.ts +1 -0
  82. package/dist/code-block/index.js +1 -0
  83. package/dist/code-block/root/code-block-root.d.ts +112 -0
  84. package/dist/code-block/root/code-block-root.js +155 -0
  85. package/dist/color-input/index.d.ts +1 -0
  86. package/dist/color-input/index.js +1 -0
  87. package/dist/color-input/root/color-input-root.d.ts +227 -0
  88. package/dist/color-input/root/color-input-root.js +456 -0
  89. package/dist/color-picker/color.d.ts +74 -0
  90. package/dist/color-picker/color.js +238 -0
  91. package/dist/color-picker/index.d.ts +2 -0
  92. package/dist/color-picker/index.js +2 -0
  93. package/dist/color-picker/root/color-picker-root.d.ts +303 -0
  94. package/dist/color-picker/root/color-picker-root.js +576 -0
  95. package/dist/combobox/index.d.ts +1 -0
  96. package/dist/combobox/index.js +1 -0
  97. package/dist/combobox/root/combobox-root.d.ts +396 -0
  98. package/dist/combobox/root/combobox-root.js +808 -0
  99. package/dist/command/index.d.ts +1 -0
  100. package/dist/command/index.js +1 -0
  101. package/dist/command/root/command-root.d.ts +166 -0
  102. package/dist/command/root/command-root.js +353 -0
  103. package/dist/copy-button/index.d.ts +1 -0
  104. package/dist/copy-button/index.js +1 -0
  105. package/dist/copy-button/root/copy-button-root.d.ts +154 -0
  106. package/dist/copy-button/root/copy-button-root.js +225 -0
  107. package/dist/data-table/index.d.ts +2 -0
  108. package/dist/data-table/index.js +2 -0
  109. package/dist/data-table/root/data-table-root.d.ts +392 -0
  110. package/dist/data-table/root/data-table-root.js +729 -0
  111. package/dist/data-table/root/order.d.ts +116 -0
  112. package/dist/data-table/root/order.js +175 -0
  113. package/dist/date-input/index.d.ts +1 -0
  114. package/dist/date-input/index.js +1 -0
  115. package/dist/date-input/root/date-input-root.d.ts +361 -0
  116. package/dist/date-input/root/date-input-root.js +791 -0
  117. package/dist/date-picker/index.d.ts +1 -0
  118. package/dist/date-picker/index.js +1 -0
  119. package/dist/date-picker/root/date-picker-root.d.ts +361 -0
  120. package/dist/date-picker/root/date-picker-root.js +837 -0
  121. package/dist/dialog/index.d.ts +1 -0
  122. package/dist/dialog/index.js +1 -0
  123. package/dist/dialog/root/dialog-root.d.ts +185 -0
  124. package/dist/dialog/root/dialog-root.js +319 -0
  125. package/dist/divider/index.d.ts +1 -0
  126. package/dist/divider/index.js +1 -0
  127. package/dist/divider/root/divider-root.d.ts +68 -0
  128. package/dist/divider/root/divider-root.js +116 -0
  129. package/dist/donut-chart/index.d.ts +1 -0
  130. package/dist/donut-chart/index.js +1 -0
  131. package/dist/donut-chart/root/donut-chart-root.d.ts +209 -0
  132. package/dist/donut-chart/root/donut-chart-root.js +395 -0
  133. package/dist/drawer/index.d.ts +1 -0
  134. package/dist/drawer/index.js +1 -0
  135. package/dist/drawer/root/drawer-root.d.ts +144 -0
  136. package/dist/drawer/root/drawer-root.js +222 -0
  137. package/dist/drilldown/index.d.ts +2 -0
  138. package/dist/drilldown/index.js +2 -0
  139. package/dist/drilldown/item/drilldown-item.d.ts +87 -0
  140. package/dist/drilldown/item/drilldown-item.js +152 -0
  141. package/dist/drilldown/root/drilldown-root.d.ts +115 -0
  142. package/dist/drilldown/root/drilldown-root.js +263 -0
  143. package/dist/element-events.generated.d.ts +1 -0
  144. package/dist/element-events.generated.js +125 -0
  145. package/dist/empty/index.d.ts +1 -0
  146. package/dist/empty/index.js +1 -0
  147. package/dist/empty/root/empty-root.d.ts +47 -0
  148. package/dist/empty/root/empty-root.js +68 -0
  149. package/dist/file-input/index.d.ts +1 -0
  150. package/dist/file-input/index.js +1 -0
  151. package/dist/file-input/root/file-input-root.d.ts +196 -0
  152. package/dist/file-input/root/file-input-root.js +488 -0
  153. package/dist/format-date/index.d.ts +1 -0
  154. package/dist/format-date/index.js +1 -0
  155. package/dist/format-date/root/format-date-root.d.ts +151 -0
  156. package/dist/format-date/root/format-date-root.js +266 -0
  157. package/dist/heatmap/index.d.ts +2 -0
  158. package/dist/heatmap/index.js +2 -0
  159. package/dist/heatmap/root/buckets.d.ts +62 -0
  160. package/dist/heatmap/root/buckets.js +85 -0
  161. package/dist/heatmap/root/heatmap-root.d.ts +330 -0
  162. package/dist/heatmap/root/heatmap-root.js +526 -0
  163. package/dist/icon/index.d.ts +1 -0
  164. package/dist/icon/index.js +1 -0
  165. package/dist/icon/root/icon-root.d.ts +53 -0
  166. package/dist/icon/root/icon-root.js +93 -0
  167. package/dist/icon-button/index.d.ts +1 -0
  168. package/dist/icon-button/index.js +1 -0
  169. package/dist/icon-button/root/icon-button-root.d.ts +40 -0
  170. package/dist/icon-button/root/icon-button-root.js +46 -0
  171. package/dist/image/index.d.ts +1 -0
  172. package/dist/image/index.js +1 -0
  173. package/dist/image/root/image-root.d.ts +213 -0
  174. package/dist/image/root/image-root.js +335 -0
  175. package/dist/index.d.ts +99 -0
  176. package/dist/index.js +99 -0
  177. package/dist/input/index.d.ts +1 -0
  178. package/dist/input/index.js +1 -0
  179. package/dist/input/root/input-root.d.ts +281 -0
  180. package/dist/input/root/input-root.js +472 -0
  181. package/dist/kbd/index.d.ts +1 -0
  182. package/dist/kbd/index.js +1 -0
  183. package/dist/kbd/root/kbd-root.d.ts +98 -0
  184. package/dist/kbd/root/kbd-root.js +230 -0
  185. package/dist/legend/index.d.ts +1 -0
  186. package/dist/legend/index.js +1 -0
  187. package/dist/legend/root/legend-root.d.ts +83 -0
  188. package/dist/legend/root/legend-root.js +125 -0
  189. package/dist/line-chart/index.d.ts +1 -0
  190. package/dist/line-chart/index.js +1 -0
  191. package/dist/line-chart/root/line-chart-root.d.ts +238 -0
  192. package/dist/line-chart/root/line-chart-root.js +365 -0
  193. package/dist/list/index.d.ts +2 -0
  194. package/dist/list/index.js +2 -0
  195. package/dist/list/item/list-item.d.ts +95 -0
  196. package/dist/list/item/list-item.js +148 -0
  197. package/dist/list/root/list-root.d.ts +72 -0
  198. package/dist/list/root/list-root.js +61 -0
  199. package/dist/listbox/index.d.ts +1 -0
  200. package/dist/listbox/index.js +1 -0
  201. package/dist/listbox/root/listbox-root.d.ts +357 -0
  202. package/dist/listbox/root/listbox-root.js +890 -0
  203. package/dist/loader/index.d.ts +1 -0
  204. package/dist/loader/index.js +1 -0
  205. package/dist/loader/root/loader-root.d.ts +52 -0
  206. package/dist/loader/root/loader-root.js +74 -0
  207. package/dist/megamenu/index.d.ts +1 -0
  208. package/dist/megamenu/index.js +1 -0
  209. package/dist/megamenu/root/megamenu-root.d.ts +254 -0
  210. package/dist/megamenu/root/megamenu-root.js +526 -0
  211. package/dist/menu/index.d.ts +2 -0
  212. package/dist/menu/index.js +2 -0
  213. package/dist/menu/item/menu-item.d.ts +231 -0
  214. package/dist/menu/item/menu-item.js +405 -0
  215. package/dist/menu/root/menu-root.d.ts +158 -0
  216. package/dist/menu/root/menu-root.js +422 -0
  217. package/dist/meter/index.d.ts +1 -0
  218. package/dist/meter/index.js +1 -0
  219. package/dist/meter/root/meter-root.d.ts +234 -0
  220. package/dist/meter/root/meter-root.js +316 -0
  221. package/dist/navigation/index.d.ts +1 -0
  222. package/dist/navigation/index.js +1 -0
  223. package/dist/navigation/root/navigation-root.d.ts +55 -0
  224. package/dist/navigation/root/navigation-root.js +130 -0
  225. package/dist/notifications/index.d.ts +2 -0
  226. package/dist/notifications/index.js +2 -0
  227. package/dist/notifications/notification/notification.d.ts +181 -0
  228. package/dist/notifications/notification/notification.js +305 -0
  229. package/dist/notifications/root/notifications-root.d.ts +168 -0
  230. package/dist/notifications/root/notifications-root.js +291 -0
  231. package/dist/number-input/index.d.ts +1 -0
  232. package/dist/number-input/index.js +1 -0
  233. package/dist/number-input/root/number-input-root.d.ts +282 -0
  234. package/dist/number-input/root/number-input-root.js +592 -0
  235. package/dist/option/group/option-group.d.ts +38 -0
  236. package/dist/option/group/option-group.js +58 -0
  237. package/dist/option/index.d.ts +2 -0
  238. package/dist/option/index.js +2 -0
  239. package/dist/option/root/option-root.d.ts +194 -0
  240. package/dist/option/root/option-root.js +247 -0
  241. package/dist/outline/index.d.ts +1 -0
  242. package/dist/outline/index.js +1 -0
  243. package/dist/outline/root/outline-root.d.ts +237 -0
  244. package/dist/outline/root/outline-root.js +519 -0
  245. package/dist/pagination/index.d.ts +3 -0
  246. package/dist/pagination/index.js +3 -0
  247. package/dist/pagination/root/pagination-root.d.ts +390 -0
  248. package/dist/pagination/root/pagination-root.js +695 -0
  249. package/dist/pagination/size/pagination-size.d.ts +127 -0
  250. package/dist/pagination/size/pagination-size.js +232 -0
  251. package/dist/pagination/summary/pagination-summary.d.ts +90 -0
  252. package/dist/pagination/summary/pagination-summary.js +145 -0
  253. package/dist/pin-input/index.d.ts +1 -0
  254. package/dist/pin-input/index.js +1 -0
  255. package/dist/pin-input/root/pin-input-root.d.ts +292 -0
  256. package/dist/pin-input/root/pin-input-root.js +553 -0
  257. package/dist/popover/index.d.ts +1 -0
  258. package/dist/popover/index.js +1 -0
  259. package/dist/popover/root/popover-root.d.ts +108 -0
  260. package/dist/popover/root/popover-root.js +231 -0
  261. package/dist/progress/index.d.ts +1 -0
  262. package/dist/progress/index.js +1 -0
  263. package/dist/progress/root/progress-root.d.ts +125 -0
  264. package/dist/progress/root/progress-root.js +212 -0
  265. package/dist/qr-code/index.d.ts +1 -0
  266. package/dist/qr-code/index.js +1 -0
  267. package/dist/qr-code/root/qr-code-root.d.ts +93 -0
  268. package/dist/qr-code/root/qr-code-root.js +233 -0
  269. package/dist/quote/index.d.ts +1 -0
  270. package/dist/quote/index.js +1 -0
  271. package/dist/quote/root/quote-root.d.ts +36 -0
  272. package/dist/quote/root/quote-root.js +50 -0
  273. package/dist/radio/group/radio-group.d.ts +84 -0
  274. package/dist/radio/group/radio-group.js +170 -0
  275. package/dist/radio/index.d.ts +2 -0
  276. package/dist/radio/index.js +2 -0
  277. package/dist/radio/root/radio-root.d.ts +102 -0
  278. package/dist/radio/root/radio-root.js +151 -0
  279. package/dist/rating/index.d.ts +1 -0
  280. package/dist/rating/index.js +1 -0
  281. package/dist/rating/root/rating-root.d.ts +242 -0
  282. package/dist/rating/root/rating-root.js +484 -0
  283. package/dist/scroll-area/index.d.ts +1 -0
  284. package/dist/scroll-area/index.js +1 -0
  285. package/dist/scroll-area/root/scroll-area-root.d.ts +96 -0
  286. package/dist/scroll-area/root/scroll-area-root.js +215 -0
  287. package/dist/select/index.d.ts +1 -0
  288. package/dist/select/index.js +1 -0
  289. package/dist/select/root/select-root.d.ts +170 -0
  290. package/dist/select/root/select-root.js +419 -0
  291. package/dist/skeleton/index.d.ts +1 -0
  292. package/dist/skeleton/index.js +1 -0
  293. package/dist/skeleton/root/skeleton-root.d.ts +31 -0
  294. package/dist/skeleton/root/skeleton-root.js +42 -0
  295. package/dist/slider/index.d.ts +1 -0
  296. package/dist/slider/index.js +1 -0
  297. package/dist/slider/root/slider-root.d.ts +235 -0
  298. package/dist/slider/root/slider-root.js +488 -0
  299. package/dist/sparkline/index.d.ts +1 -0
  300. package/dist/sparkline/index.js +1 -0
  301. package/dist/sparkline/root/sparkline-root.d.ts +147 -0
  302. package/dist/sparkline/root/sparkline-root.js +278 -0
  303. package/dist/speed-dial/index.d.ts +2 -0
  304. package/dist/speed-dial/index.js +2 -0
  305. package/dist/speed-dial/item/speed-dial-item.d.ts +71 -0
  306. package/dist/speed-dial/item/speed-dial-item.js +113 -0
  307. package/dist/speed-dial/root/speed-dial-root.d.ts +122 -0
  308. package/dist/speed-dial/root/speed-dial-root.js +251 -0
  309. package/dist/splitter/index.d.ts +1 -0
  310. package/dist/splitter/index.js +1 -0
  311. package/dist/splitter/root/splitter-root.d.ts +491 -0
  312. package/dist/splitter/root/splitter-root.js +1030 -0
  313. package/dist/stat/group/stat-group.d.ts +30 -0
  314. package/dist/stat/group/stat-group.js +47 -0
  315. package/dist/stat/index.d.ts +2 -0
  316. package/dist/stat/index.js +2 -0
  317. package/dist/stat/root/stat-root.d.ts +62 -0
  318. package/dist/stat/root/stat-root.js +51 -0
  319. package/dist/steps/index.d.ts +2 -0
  320. package/dist/steps/index.js +2 -0
  321. package/dist/steps/root/steps-root.d.ts +110 -0
  322. package/dist/steps/root/steps-root.js +130 -0
  323. package/dist/steps/step/step.d.ts +139 -0
  324. package/dist/steps/step/step.js +215 -0
  325. package/dist/switch/index.d.ts +1 -0
  326. package/dist/switch/index.js +1 -0
  327. package/dist/switch/root/switch-root.d.ts +74 -0
  328. package/dist/switch/root/switch-root.js +153 -0
  329. package/dist/table/cell/table-cell.d.ts +34 -0
  330. package/dist/table/cell/table-cell.js +52 -0
  331. package/dist/table/column/table-column.d.ts +165 -0
  332. package/dist/table/column/table-column.js +222 -0
  333. package/dist/table/index.d.ts +4 -0
  334. package/dist/table/index.js +4 -0
  335. package/dist/table/root/table-root.d.ts +98 -0
  336. package/dist/table/root/table-root.js +161 -0
  337. package/dist/table/row/table-row.d.ts +27 -0
  338. package/dist/table/row/table-row.js +42 -0
  339. package/dist/tabs/index.d.ts +3 -0
  340. package/dist/tabs/index.js +3 -0
  341. package/dist/tabs/panel/tab-panel.d.ts +67 -0
  342. package/dist/tabs/panel/tab-panel.js +98 -0
  343. package/dist/tabs/root/tabs-root.d.ts +123 -0
  344. package/dist/tabs/root/tabs-root.js +217 -0
  345. package/dist/tabs/tab/tab.d.ts +64 -0
  346. package/dist/tabs/tab/tab.js +116 -0
  347. package/dist/tag/index.d.ts +1 -0
  348. package/dist/tag/index.js +1 -0
  349. package/dist/tag/root/tag-root.d.ts +41 -0
  350. package/dist/tag/root/tag-root.js +67 -0
  351. package/dist/textarea/index.d.ts +1 -0
  352. package/dist/textarea/index.js +1 -0
  353. package/dist/textarea/root/textarea-root.d.ts +215 -0
  354. package/dist/textarea/root/textarea-root.js +380 -0
  355. package/dist/time-input/index.d.ts +1 -0
  356. package/dist/time-input/index.js +1 -0
  357. package/dist/time-input/root/time-input-root.d.ts +322 -0
  358. package/dist/time-input/root/time-input-root.js +661 -0
  359. package/dist/time-picker/index.d.ts +1 -0
  360. package/dist/time-picker/index.js +1 -0
  361. package/dist/time-picker/root/time-picker-root.d.ts +380 -0
  362. package/dist/time-picker/root/time-picker-root.js +669 -0
  363. package/dist/timeline/index.d.ts +2 -0
  364. package/dist/timeline/index.js +2 -0
  365. package/dist/timeline/item/timeline-item.d.ts +81 -0
  366. package/dist/timeline/item/timeline-item.js +128 -0
  367. package/dist/timeline/root/timeline-root.d.ts +52 -0
  368. package/dist/timeline/root/timeline-root.js +72 -0
  369. package/dist/toast/index.d.ts +2 -0
  370. package/dist/toast/index.js +2 -0
  371. package/dist/toast/item/toast-item.d.ts +183 -0
  372. package/dist/toast/item/toast-item.js +345 -0
  373. package/dist/toast/root/toast-root.d.ts +72 -0
  374. package/dist/toast/root/toast-root.js +87 -0
  375. package/dist/toggle/group/toggle-group.d.ts +140 -0
  376. package/dist/toggle/group/toggle-group.js +278 -0
  377. package/dist/toggle/index.d.ts +2 -0
  378. package/dist/toggle/index.js +2 -0
  379. package/dist/toggle/root/toggle-root.d.ts +99 -0
  380. package/dist/toggle/root/toggle-root.js +146 -0
  381. package/dist/toolbar/index.d.ts +1 -0
  382. package/dist/toolbar/index.js +1 -0
  383. package/dist/toolbar/root/toolbar-root.d.ts +105 -0
  384. package/dist/toolbar/root/toolbar-root.js +260 -0
  385. package/dist/tooltip/index.d.ts +1 -0
  386. package/dist/tooltip/index.js +1 -0
  387. package/dist/tooltip/root/tooltip-root.d.ts +388 -0
  388. package/dist/tooltip/root/tooltip-root.js +707 -0
  389. package/dist/tour/index.d.ts +2 -0
  390. package/dist/tour/index.js +2 -0
  391. package/dist/tour/root/tour-root.d.ts +161 -0
  392. package/dist/tour/root/tour-root.js +351 -0
  393. package/dist/tour/stop/tour-stop.d.ts +131 -0
  394. package/dist/tour/stop/tour-stop.js +249 -0
  395. package/dist/tree/index.d.ts +2 -0
  396. package/dist/tree/index.js +2 -0
  397. package/dist/tree/item/tree-item.d.ts +208 -0
  398. package/dist/tree/item/tree-item.js +381 -0
  399. package/dist/tree/root/tree-root.d.ts +88 -0
  400. package/dist/tree/root/tree-root.js +287 -0
  401. package/dist/trend/index.d.ts +1 -0
  402. package/dist/trend/index.js +1 -0
  403. package/dist/trend/root/trend-root.d.ts +67 -0
  404. package/dist/trend/root/trend-root.js +106 -0
  405. package/dist/video/index.d.ts +1 -0
  406. package/dist/video/index.js +1 -0
  407. package/dist/video/root/video-root.d.ts +711 -0
  408. package/dist/video/root/video-root.js +1821 -0
  409. package/dist/video-playlist/index.d.ts +3 -0
  410. package/dist/video-playlist/index.js +3 -0
  411. package/dist/video-playlist/item/video-playlist-item.d.ts +101 -0
  412. package/dist/video-playlist/item/video-playlist-item.js +162 -0
  413. package/dist/video-playlist/menu/video-playlist-menu.d.ts +121 -0
  414. package/dist/video-playlist/menu/video-playlist-menu.js +237 -0
  415. package/dist/video-playlist/root/video-playlist-root.d.ts +108 -0
  416. package/dist/video-playlist/root/video-playlist-root.js +218 -0
  417. package/dist/virtual-list/index.d.ts +1 -0
  418. package/dist/virtual-list/index.js +1 -0
  419. package/dist/virtual-list/root/virtual-list-root.d.ts +121 -0
  420. package/dist/virtual-list/root/virtual-list-root.js +221 -0
  421. package/jsx.d.ts +49767 -0
  422. package/package.json +77 -0
  423. package/svelte.d.ts +129 -0
  424. package/vue.d.ts +9242 -0
@@ -0,0 +1,27 @@
1
+ import { HelixElement } from '@fusion.dev/helix-core';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
+ /**
4
+ * @summary One row of a table.
5
+ *
6
+ * @description
7
+ * `display: contents` in the styled tier, so the row's cells become items of
8
+ * the table's own grid and every column lines up across every row. The row
9
+ * still exists as an element, which is what a `<table>` gives away when its
10
+ * cells are laid out by the table algorithm.
11
+ *
12
+ * @since 0.1.0
13
+ * @status experimental
14
+ * @aliases Row, TableRow
15
+ * @documentation https://helix.fusion.dev/components/table
16
+ *
17
+ * @slot - The row's cells.
18
+ */
19
+ export declare class HelixHeadlessTableRow extends HelixElement {
20
+ protected willUpdate(changed: PropertyValues): void;
21
+ protected render(): TemplateResult;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ 'helix-headless-table-row': HelixHeadlessTableRow;
26
+ }
27
+ }
@@ -0,0 +1,42 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { customElement, HelixElement, hostAria } from '@fusion.dev/helix-core';
8
+ import { html } from 'lit';
9
+ /**
10
+ * @summary One row of a table.
11
+ *
12
+ * @description
13
+ * `display: contents` in the styled tier, so the row's cells become items of
14
+ * the table's own grid and every column lines up across every row. The row
15
+ * still exists as an element, which is what a `<table>` gives away when its
16
+ * cells are laid out by the table algorithm.
17
+ *
18
+ * @since 0.1.0
19
+ * @status experimental
20
+ * @aliases Row, TableRow
21
+ * @documentation https://helix.fusion.dev/components/table
22
+ *
23
+ * @slot - The row's cells.
24
+ */
25
+ let HelixHeadlessTableRow = class HelixHeadlessTableRow extends HelixElement {
26
+ willUpdate(changed) {
27
+ super.willUpdate(changed);
28
+ // On the host, and required: `display: contents` removes the row's box but
29
+ // not the row from the table's structure. Without this the table has cells
30
+ // and no rows, which is a broken table rather than a plain one.
31
+ //
32
+ // Set in `willUpdate`, which the server does call, unlike `connectedCallback`.
33
+ hostAria(this.internals, { role: 'row' });
34
+ }
35
+ render() {
36
+ return html `<slot></slot>`;
37
+ }
38
+ };
39
+ HelixHeadlessTableRow = __decorate([
40
+ customElement('helix-headless-table-row')
41
+ ], HelixHeadlessTableRow);
42
+ export { HelixHeadlessTableRow };
@@ -0,0 +1,3 @@
1
+ export * from './panel/tab-panel.js';
2
+ export * from './root/tabs-root.js';
3
+ export * from './tab/tab.js';
@@ -0,0 +1,3 @@
1
+ export * from './panel/tab-panel.js';
2
+ export * from './root/tabs-root.js';
3
+ export * from './tab/tab.js';
@@ -0,0 +1,67 @@
1
+ import { HelixElement } from '@fusion.dev/helix-core';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
+ /**
4
+ * @summary The content shown for one tab.
5
+ *
6
+ * @description
7
+ * Hidden rather than unmounted when inactive, so anything typed into a panel is
8
+ * still there when the reader comes back to it, and so the content is in the
9
+ * server's markup for a crawler regardless of which tab is open.
10
+ *
11
+ * @since 0.1.0
12
+ * @status experimental
13
+ * @aliases TabPanel
14
+ * @documentation https://helix.fusion.dev/components/tabs
15
+ *
16
+ * @slot - The panel's content.
17
+ *
18
+ * @csspart panel - The panel container.
19
+ */
20
+ export declare class HelixHeadlessTabPanel extends HelixElement {
21
+ /**
22
+ * Pairs the panel with the tab of the same value.
23
+ */
24
+ value: string;
25
+ /**
26
+ * Whether this panel is the visible one.
27
+ */
28
+ selected: boolean;
29
+ /**
30
+ * The name of the panel, which is the text of the tab that opens it.
31
+ *
32
+ * Set by the root, which is the only thing that sees both. No attribute,
33
+ * because it is coordination between elements rather than anything a consumer
34
+ * writes: the tab already says it.
35
+ *
36
+ * A string where the markup wanted a reference. `aria-labelledby` named
37
+ * `tab-${value}`, an id inside the *tab's* own shadow root, and an IDREF
38
+ * resolves only in the tree it is written in, so the panel had no accessible
39
+ * name at all. An element reference cannot reach there either, a sibling
40
+ * shadow tree being neither the same tree nor an ancestor of it. A name is
41
+ * the one form that crosses, and `aria-label` on a `tabpanel` is how the
42
+ * pattern names one anyway.
43
+ */
44
+ label: string;
45
+ /**
46
+ * Mirrors the chosen state where a stylesheet can select on it.
47
+ *
48
+ * **A custom state and not the `selected` attribute it used to reflect.** The
49
+ * parent writes this: a listbox choosing a row, a tab strip moving the tab, a
50
+ * radio group answering for its set. Reflected, that put the element's own
51
+ * bookkeeping onto markup a consumer wrote and a consumer's server never sent,
52
+ * which React reconciles and reports as a mismatch, and which a serialized
53
+ * element pasted back declares as a choice nobody made. `ElementInternals`
54
+ * holds it instead, where it is not in the DOM at all.
55
+ *
56
+ * Reading `selected` is unaffected and so is writing it: the attribute still
57
+ * seeds the property, which is what `<helix-tab-panel selected>` in a consumer's
58
+ * markup means. What stops is the write back. See 302 and 304.
59
+ */
60
+ protected willUpdate(changed: PropertyValues): void;
61
+ protected render(): TemplateResult;
62
+ }
63
+ declare global {
64
+ interface HTMLElementTagNameMap {
65
+ 'helix-headless-tab-panel': HelixHeadlessTabPanel;
66
+ }
67
+ }
@@ -0,0 +1,98 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { customElement, HelixElement } from '@fusion.dev/helix-core';
8
+ import { html, nothing } from 'lit';
9
+ import { property } from 'lit/decorators.js';
10
+ /**
11
+ * @summary The content shown for one tab.
12
+ *
13
+ * @description
14
+ * Hidden rather than unmounted when inactive, so anything typed into a panel is
15
+ * still there when the reader comes back to it, and so the content is in the
16
+ * server's markup for a crawler regardless of which tab is open.
17
+ *
18
+ * @since 0.1.0
19
+ * @status experimental
20
+ * @aliases TabPanel
21
+ * @documentation https://helix.fusion.dev/components/tabs
22
+ *
23
+ * @slot - The panel's content.
24
+ *
25
+ * @csspart panel - The panel container.
26
+ */
27
+ let HelixHeadlessTabPanel = class HelixHeadlessTabPanel extends HelixElement {
28
+ constructor() {
29
+ super(...arguments);
30
+ /**
31
+ * Pairs the panel with the tab of the same value.
32
+ */
33
+ this.value = '';
34
+ /**
35
+ * Whether this panel is the visible one.
36
+ */
37
+ this.selected = false;
38
+ /**
39
+ * The name of the panel, which is the text of the tab that opens it.
40
+ *
41
+ * Set by the root, which is the only thing that sees both. No attribute,
42
+ * because it is coordination between elements rather than anything a consumer
43
+ * writes: the tab already says it.
44
+ *
45
+ * A string where the markup wanted a reference. `aria-labelledby` named
46
+ * `tab-${value}`, an id inside the *tab's* own shadow root, and an IDREF
47
+ * resolves only in the tree it is written in, so the panel had no accessible
48
+ * name at all. An element reference cannot reach there either, a sibling
49
+ * shadow tree being neither the same tree nor an ancestor of it. A name is
50
+ * the one form that crosses, and `aria-label` on a `tabpanel` is how the
51
+ * pattern names one anyway.
52
+ */
53
+ this.label = '';
54
+ }
55
+ /**
56
+ * Mirrors the chosen state where a stylesheet can select on it.
57
+ *
58
+ * **A custom state and not the `selected` attribute it used to reflect.** The
59
+ * parent writes this: a listbox choosing a row, a tab strip moving the tab, a
60
+ * radio group answering for its set. Reflected, that put the element's own
61
+ * bookkeeping onto markup a consumer wrote and a consumer's server never sent,
62
+ * which React reconciles and reports as a mismatch, and which a serialized
63
+ * element pasted back declares as a choice nobody made. `ElementInternals`
64
+ * holds it instead, where it is not in the DOM at all.
65
+ *
66
+ * Reading `selected` is unaffected and so is writing it: the attribute still
67
+ * seeds the property, which is what `<helix-tab-panel selected>` in a consumer's
68
+ * markup means. What stops is the write back. See 302 and 304.
69
+ */
70
+ willUpdate(changed) {
71
+ super.willUpdate(changed);
72
+ this.toggleState('selected', this.selected);
73
+ }
74
+ render() {
75
+ return html `<div
76
+ part="panel"
77
+ role="tabpanel"
78
+ aria-label=${this.label || nothing}
79
+ ?hidden=${!this.selected}
80
+ tabindex="0"
81
+ >
82
+ <slot></slot>
83
+ </div>`;
84
+ }
85
+ };
86
+ __decorate([
87
+ property()
88
+ ], HelixHeadlessTabPanel.prototype, "value", void 0);
89
+ __decorate([
90
+ property({ type: Boolean })
91
+ ], HelixHeadlessTabPanel.prototype, "selected", void 0);
92
+ __decorate([
93
+ property({ attribute: false })
94
+ ], HelixHeadlessTabPanel.prototype, "label", void 0);
95
+ HelixHeadlessTabPanel = __decorate([
96
+ customElement('helix-headless-tab-panel')
97
+ ], HelixHeadlessTabPanel);
98
+ export { HelixHeadlessTabPanel };
@@ -0,0 +1,123 @@
1
+ import { HelixElement, KeyboardNavigationController } from '@fusion.dev/helix-core';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
+ declare const HelixHeadlessTabs_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerActiveInterface) & typeof HelixElement;
4
+ /**
5
+ * @summary A row of tabs and the panel each one shows.
6
+ *
7
+ * @description
8
+ * Selection is coordinated by event, the same shape the accordion and the tree
9
+ * use: a tab dispatches `SelectionChange` and the root pairs it with the panel
10
+ * of the same value. Nothing registers with anything, so tabs added later work
11
+ * without the root being told.
12
+ *
13
+ * The tab list is a single tab stop, moved with the arrow keys through
14
+ * `KeyboardNavigationController`, the same one the radio and toggle groups use.
15
+ * Selection follows focus, which is the right default for a small set where
16
+ * showing a panel is cheap; a set where it is not should use `manual`.
17
+ *
18
+ * @since 0.1.0
19
+ * @status experimental
20
+ * @category navigation
21
+ * @aliases TabList, Segmented control
22
+ * @documentation https://helix.fusion.dev/components/tabs
23
+ *
24
+ * @slot - The tabs.
25
+ * @slot panels - The panels.
26
+ *
27
+ * @event {HelixActivateEvent} helix-activate - Fired once the current one has moved, so the element already holds it.
28
+ * @event {HelixBeforeActivateEvent} helix-before-activate - Fired before the current tab moves, and cancelable. The only way to refuse one.
29
+ * @event {HelixSelectEvent} helix-select - Fired when a tab is chosen. Dispatched by the tab and listened for here, because the root is what a consumer holds. Cancelable: refusing it takes the decision and nothing moves.
30
+ *
31
+ * @csspart indicator - The mark that travels to the selected tab.
32
+ * @csspart panels - The panel container.
33
+ * @csspart tabs - The tab list.
34
+ */
35
+ export declare class HelixHeadlessTabs extends HelixHeadlessTabs_base {
36
+ protected readonly keys: KeyboardNavigationController;
37
+ private readonly indicator;
38
+ /**
39
+ * How the row reads.
40
+ *
41
+ * Unset is a raised pill on the selected tab with nothing behind the row,
42
+ * which is what a set sitting inside other chrome wants. `underlined` is a
43
+ * rule under the row and a thicker one under the selected tab, for a set that
44
+ * heads a page. `segmented` puts the pill in a framed, sunken track, which
45
+ * reads as one control rather than as a row.
46
+ *
47
+ * `segmented` and not `toggle`, which is what this was called. An appearance
48
+ * value that is another component's name says "it looks like that one", which
49
+ * a reader can only act on if they already know what that one looks like, and
50
+ * every other appearance in the library describes itself: `outlined`,
51
+ * `spaced`, `plain`. This component's own comments called it segmented in
52
+ * both places it explained itself, which is the name that was doing the work.
53
+ *
54
+ * `underlined` and not `underline` for the shape of the word rather than the
55
+ * sense: the two values sit in one list and read as a pair, and `segmented`
56
+ * is a participle. `outlined` on Accordion is the same word doing the same
57
+ * job. The example file was already `underlined.html`, which is what a reader
58
+ * meets first.
59
+ *
60
+ * Reflected and left unset by default, so the host carries nothing a
61
+ * consumer's server markup does not already have.
62
+ */
63
+ variant?: 'segmented' | 'underlined';
64
+ /**
65
+ * Accessible name for the tab list.
66
+ */
67
+ label: string;
68
+ /**
69
+ * Whether arrowing to a tab also selects it.
70
+ *
71
+ * Automatic is the default because showing a panel is usually cheap. Set this
72
+ * where it is not, so a reader arrowing past four tabs does not load four
73
+ * panels on the way.
74
+ */
75
+ manual: boolean;
76
+ /** Watches for anything that moves a tab, since none of it is a property. */
77
+ private observer;
78
+ private get tabs();
79
+ private get panels();
80
+ private readonly handleSelection;
81
+ /** Pushes the current value down to whichever tab and panel own it. */
82
+ private sync;
83
+ connectedCallback(): void;
84
+ disconnectedCallback(): void;
85
+ protected firstUpdated(changed: PropertyValues): void;
86
+ /** The host's own size, which moves every tab and therefore the mark. */
87
+ private measure;
88
+ /**
89
+ * Watches every tab for a change of size.
90
+ *
91
+ * Called again whenever the set changes, because `tabs` reads `this.children`
92
+ * and filters on `instanceof`, so it is empty until the tab elements upgrade.
93
+ * At `firstUpdated` it frequently is empty, and observing nothing is silent.
94
+ *
95
+ * `observe` is idempotent per element, so re-running this costs nothing and
96
+ * needs no bookkeeping about which tabs are already watched.
97
+ */
98
+ private watch;
99
+ /**
100
+ * The set changed: pair it up, watch it, and measure it.
101
+ *
102
+ * All three, where this used to be `sync()` alone, and the missing `place()`
103
+ * is why an indicator could stay unplaced for the life of the page. The order
104
+ * of events is what does it: the host renders and measures before its tabs
105
+ * have upgraded, so there is no selected tab to measure and `place` refuses;
106
+ * the ResizeObserver's one initial callback lands in that same gap; and then
107
+ * the tabs upgrade, `slotchange` pairs them, nothing measures, and nothing
108
+ * ever will again, because the host's size never changes.
109
+ *
110
+ * Invisible in every example, because a tab strip that is only tabs is
111
+ * exactly as tall as its tabs, so a mark at the top of the strip is a mark on
112
+ * the tab. It showed up where something gives the strip a height of its own.
113
+ */
114
+ private readonly handleSlotChange;
115
+ protected updated(changed: PropertyValues): void;
116
+ protected render(): TemplateResult;
117
+ }
118
+ declare global {
119
+ interface HTMLElementTagNameMap {
120
+ 'helix-headless-tabs': HelixHeadlessTabs;
121
+ }
122
+ }
123
+ export {};
@@ -0,0 +1,217 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { customElement, HelixElement, IndicatorController, KeyboardNavigationController, MixinControllerActive, } from '@fusion.dev/helix-core';
8
+ import { html } from 'lit';
9
+ import { property } from 'lit/decorators.js';
10
+ import { HelixHeadlessTabPanel } from '../panel/tab-panel.js';
11
+ import { HelixHeadlessTab } from '../tab/tab.js';
12
+ /**
13
+ * @summary A row of tabs and the panel each one shows.
14
+ *
15
+ * @description
16
+ * Selection is coordinated by event, the same shape the accordion and the tree
17
+ * use: a tab dispatches `SelectionChange` and the root pairs it with the panel
18
+ * of the same value. Nothing registers with anything, so tabs added later work
19
+ * without the root being told.
20
+ *
21
+ * The tab list is a single tab stop, moved with the arrow keys through
22
+ * `KeyboardNavigationController`, the same one the radio and toggle groups use.
23
+ * Selection follows focus, which is the right default for a small set where
24
+ * showing a panel is cheap; a set where it is not should use `manual`.
25
+ *
26
+ * @since 0.1.0
27
+ * @status experimental
28
+ * @category navigation
29
+ * @aliases TabList, Segmented control
30
+ * @documentation https://helix.fusion.dev/components/tabs
31
+ *
32
+ * @slot - The tabs.
33
+ * @slot panels - The panels.
34
+ *
35
+ * @event {HelixActivateEvent} helix-activate - Fired once the current one has moved, so the element already holds it.
36
+ * @event {HelixBeforeActivateEvent} helix-before-activate - Fired before the current tab moves, and cancelable. The only way to refuse one.
37
+ * @event {HelixSelectEvent} helix-select - Fired when a tab is chosen. Dispatched by the tab and listened for here, because the root is what a consumer holds. Cancelable: refusing it takes the decision and nothing moves.
38
+ *
39
+ * @csspart indicator - The mark that travels to the selected tab.
40
+ * @csspart panels - The panel container.
41
+ * @csspart tabs - The tab list.
42
+ */
43
+ let HelixHeadlessTabs = class HelixHeadlessTabs extends MixinControllerActive(HelixElement) {
44
+ constructor() {
45
+ super(...arguments);
46
+ /* Arrow keys, Home and End. Same controller as the radio group and the toggle
47
+ group, which is what the audit asked for once the indicator controller had
48
+ landed, and this is the traversal that had to grow it: `origin: 'focus'`
49
+ because `manual` lets focus and selection diverge, and `selects` because
50
+ `manual` is what decides whether arriving chooses.
51
+
52
+ Roughly thirty lines of index arithmetic went, and with them the last copy
53
+ of a wrap that had to be right in four places. */
54
+ this.keys = new KeyboardNavigationController(this, {
55
+ items: () => this.tabs,
56
+ origin: 'focus',
57
+ selects: () => !this.manual,
58
+ });
59
+ /* The mark. Same controller as the nav bar, the toggle group and the page nav. */
60
+ this.indicator = new IndicatorController(this, {
61
+ active: () => this.tabs.find((tab) => tab.selected),
62
+ indicator: () => this.renderRoot?.querySelector('[part="indicator"]'),
63
+ surface: () => this.renderRoot?.querySelector('[part="tabs"]'),
64
+ });
65
+ /**
66
+ * Accessible name for the tab list.
67
+ */
68
+ this.label = 'Tabs';
69
+ /**
70
+ * Whether arrowing to a tab also selects it.
71
+ *
72
+ * Automatic is the default because showing a panel is usually cheap. Set this
73
+ * where it is not, so a reader arrowing past four tabs does not load four
74
+ * panels on the way.
75
+ */
76
+ this.manual = false;
77
+ /* Through the mixin, so a consumer can refuse the change. It was written
78
+ straight from the event, which meant `helix-before-activate` was an announcement
79
+ nobody could answer, while `Radio.Group` two folders away could be. */
80
+ this.handleSelection = (event) => {
81
+ this.requestActive(event.detail.value);
82
+ };
83
+ /**
84
+ * The set changed: pair it up, watch it, and measure it.
85
+ *
86
+ * All three, where this used to be `sync()` alone, and the missing `place()`
87
+ * is why an indicator could stay unplaced for the life of the page. The order
88
+ * of events is what does it: the host renders and measures before its tabs
89
+ * have upgraded, so there is no selected tab to measure and `place` refuses;
90
+ * the ResizeObserver's one initial callback lands in that same gap; and then
91
+ * the tabs upgrade, `slotchange` pairs them, nothing measures, and nothing
92
+ * ever will again, because the host's size never changes.
93
+ *
94
+ * Invisible in every example, because a tab strip that is only tabs is
95
+ * exactly as tall as its tabs, so a mark at the top of the strip is a mark on
96
+ * the tab. It showed up where something gives the strip a height of its own.
97
+ */
98
+ this.handleSlotChange = () => {
99
+ this.sync();
100
+ this.watch();
101
+ this.indicator.place();
102
+ };
103
+ }
104
+ get tabs() {
105
+ return [...this.children].filter((child) => child instanceof HelixHeadlessTab);
106
+ }
107
+ get panels() {
108
+ return [...this.children].filter((child) => child instanceof HelixHeadlessTabPanel);
109
+ }
110
+ /** Pushes the current value down to whichever tab and panel own it. */
111
+ sync() {
112
+ const tabs = this.tabs;
113
+ /* Through the mixin, which also skips a disabled first tab. The
114
+ hand-written fallback did not, so a set opening on a disabled tab showed
115
+ it as current and its panel with it. */
116
+ const value = this.resolveActive(tabs)?.value ?? '';
117
+ for (const tab of tabs) {
118
+ tab.selected = tab.value === value;
119
+ }
120
+ /* The panel's name comes from its tab, and only this element sees both.
121
+ Read from the tab's light DOM, which is where the consumer wrote the
122
+ words, so it is whatever the reader sees on the tab. */
123
+ const names = new Map(tabs.map((tab) => [tab.value, (tab.textContent ?? '').trim()]));
124
+ for (const panel of this.panels) {
125
+ panel.selected = panel.value === value;
126
+ panel.label = names.get(panel.value) ?? '';
127
+ }
128
+ }
129
+ connectedCallback() {
130
+ super.connectedCallback();
131
+ this.addEventListener('helix-select', this.handleSelection);
132
+ /* The observer is rebuilt here, because nothing else does it.
133
+ *
134
+ * `firstUpdated` runs once for the life of the element and
135
+ * `disconnectedCallback` runs every time it moves, so a framework
136
+ * reordering a list left this permanently dead: the observer gone, nothing
137
+ * to rebuild it, and the component still rendering as though it were
138
+ * watching. Guarded on `hasUpdated`, because the first connection happens
139
+ * before the first render and there is nothing to watch yet.
140
+ * `check:observers` holds it. */
141
+ if (this.hasUpdated) {
142
+ this.measure();
143
+ this.watch();
144
+ }
145
+ }
146
+ disconnectedCallback() {
147
+ super.disconnectedCallback();
148
+ this.removeEventListener('helix-select', this.handleSelection);
149
+ this.observer?.disconnect();
150
+ this.observer = undefined;
151
+ }
152
+ firstUpdated(changed) {
153
+ super.firstUpdated(changed);
154
+ this.sync();
155
+ /* Straight away, and again after a frame. The first call is what places it
156
+ in a document that is already laid out; the second covers a first paint
157
+ that has not happened yet, where every tab measures zero and `place`
158
+ refuses rather than writing a wrong position.
159
+
160
+ Not the frame alone: `requestAnimationFrame` does not run in a document
161
+ the browser is not painting, so a tab set rendered in a hidden tab or an
162
+ inactive pane would never place its mark at all and would slide in from
163
+ the origin the moment the page was looked at. */
164
+ this.indicator.place();
165
+ requestAnimationFrame(() => this.indicator.place());
166
+ this.measure();
167
+ this.watch();
168
+ }
169
+ /** The host's own size, which moves every tab and therefore the mark. */
170
+ measure() {
171
+ this.observer?.disconnect();
172
+ this.observer = new ResizeObserver(() => this.indicator.place());
173
+ this.observer.observe(this);
174
+ }
175
+ /**
176
+ * Watches every tab for a change of size.
177
+ *
178
+ * Called again whenever the set changes, because `tabs` reads `this.children`
179
+ * and filters on `instanceof`, so it is empty until the tab elements upgrade.
180
+ * At `firstUpdated` it frequently is empty, and observing nothing is silent.
181
+ *
182
+ * `observe` is idempotent per element, so re-running this costs nothing and
183
+ * needs no bookkeeping about which tabs are already watched.
184
+ */
185
+ watch() {
186
+ for (const tab of this.tabs) {
187
+ this.observer?.observe(tab);
188
+ }
189
+ }
190
+ updated(changed) {
191
+ super.updated(changed);
192
+ if (changed.has('active')) {
193
+ this.sync();
194
+ }
195
+ this.indicator.place();
196
+ }
197
+ render() {
198
+ return html `<div part="tabs" role="tablist" aria-label=${this.label}>
199
+ <slot @slotchange=${this.handleSlotChange}></slot>
200
+ <span part="indicator" aria-hidden="true"></span>
201
+ </div>
202
+ <div part="panels"><slot name="panels" @slotchange=${this.handleSlotChange}></slot></div>`;
203
+ }
204
+ };
205
+ __decorate([
206
+ property({ reflect: true })
207
+ ], HelixHeadlessTabs.prototype, "variant", void 0);
208
+ __decorate([
209
+ property()
210
+ ], HelixHeadlessTabs.prototype, "label", void 0);
211
+ __decorate([
212
+ property({ reflect: true, type: Boolean })
213
+ ], HelixHeadlessTabs.prototype, "manual", void 0);
214
+ HelixHeadlessTabs = __decorate([
215
+ customElement('helix-headless-tabs')
216
+ ], HelixHeadlessTabs);
217
+ export { HelixHeadlessTabs };
@@ -0,0 +1,64 @@
1
+ import { HelixElement } from '@fusion.dev/helix-core';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
+ /**
4
+ * @summary One tab in a tab list.
5
+ *
6
+ * @description
7
+ * An element rather than a slot because it owns selection and its own tab stop.
8
+ *
9
+ * Its id and the id it controls are both derived from `value`, so the pairing
10
+ * between a tab and its panel survives server rendering. A generated id would
11
+ * differ between the server's render and the client's and break the link, and
12
+ * `aria-controls` pointing at nothing is worse than not being there.
13
+ *
14
+ * @since 0.1.0
15
+ * @status experimental
16
+ * @aliases Tab
17
+ * @documentation https://helix.fusion.dev/components/tabs
18
+ *
19
+ * @slot - The tab's label.
20
+ *
21
+ * @event {HelixSelectEvent} helix-select - Fired when the tab is chosen. Cancelable: refusing it takes the decision and nothing moves.
22
+ *
23
+ * @csspart tab - The tab itself.
24
+ */
25
+ export declare class HelixHeadlessTab extends HelixElement {
26
+ /**
27
+ * Identifies the tab, and pairs it with the panel of the same value.
28
+ */
29
+ value: string;
30
+ /**
31
+ * Whether this tab is the current one.
32
+ */
33
+ selected: boolean;
34
+ /**
35
+ * Whether the tab can be chosen.
36
+ */
37
+ disabled: boolean;
38
+ /** Moves focus to this tab, for the list's arrow keys. */
39
+ focusItem(): void;
40
+ /** Selects this tab and announces it. */
41
+ select(): void;
42
+ /**
43
+ * Mirrors the chosen state where a stylesheet can select on it.
44
+ *
45
+ * **A custom state and not the `selected` attribute it used to reflect.** The
46
+ * parent writes this: a listbox choosing a row, a tab strip moving the tab, a
47
+ * radio group answering for its set. Reflected, that put the element's own
48
+ * bookkeeping onto markup a consumer wrote and a consumer's server never sent,
49
+ * which React reconciles and reports as a mismatch, and which a serialized
50
+ * element pasted back declares as a choice nobody made. `ElementInternals`
51
+ * holds it instead, where it is not in the DOM at all.
52
+ *
53
+ * Reading `selected` is unaffected and so is writing it: the attribute still
54
+ * seeds the property, which is what `<helix-tab selected>` in a consumer's
55
+ * markup means. What stops is the write back. See 302 and 304.
56
+ */
57
+ protected willUpdate(changed: PropertyValues): void;
58
+ protected render(): TemplateResult;
59
+ }
60
+ declare global {
61
+ interface HTMLElementTagNameMap {
62
+ 'helix-headless-tab': HelixHeadlessTab;
63
+ }
64
+ }