@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,526 @@
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, drawTooltip, HelixElement, HelixResizeEvent, hostAria, MixinChartSource, slotFilled, } from '@fusion.dev/helix-core';
8
+ import { html, nothing } from 'lit';
9
+ import { property, state } from 'lit/decorators.js';
10
+ import '../../tooltip/index.js';
11
+ import { fits, numbers, toneOf, words } from './buckets.js';
12
+ /**
13
+ * @summary A strip of cells coloured by how each one went: uptime, contributions, activity.
14
+ *
15
+ * @description
16
+ * **One family covers both readings, and the split people expect does not
17
+ * exist.** It was filed as two on the argument that a contribution graph needs a
18
+ * continuous ramp where uptime needs a category. GitHub's contribution graph is
19
+ * five discrete levels rather than a gradient, so a cell that takes a tone
20
+ * covers both: `rows="1"` is a status strip, `rows="7"` is a contribution graph,
21
+ * and heatmap is the name of that.
22
+ *
23
+ * **What it cannot be is a bar chart with flat values**, and the data model is
24
+ * what closes that rather than taste: chart color is per *series* everywhere
25
+ * else here, `--chart-series-1` through `-15`, so ninety differently coloured
26
+ * cells would be ninety series.
27
+ *
28
+ * The data is a real `<table>` named by `for`, the same convention every chart
29
+ * in this library uses, which also answers the accessibility question without
30
+ * inventing anything: **the table is the accessible representation**, it is
31
+ * already in the markup, and the drawing is a picture of it. Hide it with
32
+ * `data-hidden-visually` and the reading is still there for anyone who needs it.
33
+ *
34
+ * A cell takes its tone from its own `data-tone`, or from `thresholds` and
35
+ * `tones` bucketing its value. The first is what a status page wants and the
36
+ * second is what a contribution graph wants; the cell's own wins, so a page that
37
+ * already knows a day was degraded does not have to encode that as a number for
38
+ * this component to decode again.
39
+ *
40
+ * **A tone is a name this tier never resolves.** `tone="success"` writes
41
+ * `--heatmap-tone: var(--heatmap-tone-success)` onto the cell and stops there,
42
+ * so what a name is worth is the answering tier's to say: `helix/styled` points
43
+ * the semantic names at the theme's status colors and the numbered ones at a
44
+ * ramp, and a consumer on `headless` declares the same names as whatever they
45
+ * like. It read `var(--helix-color-${tone})` until 27 Aug 2026, which is the
46
+ * dependency the tiers exist to prevent and which failed loudly rather than
47
+ * quietly: off-tier that property is not undefined, it is *invalid*, so
48
+ * `background-color: var(--heatmap-tone, …)` declined its own fallback and every
49
+ * cell came out transparent. The headless baseline was a blank page under a row
50
+ * of footer text. `shared/chart/series.css` records Bar Chart having had the
51
+ * same fault for the same reason.
52
+ *
53
+ * **On a narrow container it draws fewer cells rather than thinner ones.**
54
+ * Ninety cells in 320 pixels is three and a half pixels each, which is a smear
55
+ * and not a strip. The cells it drops are the oldest, and it reflects `visible`
56
+ * and fires `helix-resize` when the number changes, because **a summary saying
57
+ * "99.2% over 90 days" above a strip drawing 45 of them is telling the reader
58
+ * something false about the picture in front of them** and nothing about the
59
+ * picture says so.
60
+ *
61
+ * @since 0.1.0
62
+ * @status experimental
63
+ * @category charts
64
+ * @aliases Contribution graph, Uptime strip, Calendar heatmap, Activity graph
65
+ * @documentation https://helix.fusion.dev/components/heatmap
66
+ *
67
+ * @slot end - Below the strip, at the trailing edge: usually the newest date.
68
+ * @slot start - Below the strip, at the leading edge: usually the oldest date.
69
+ * @slot summary - Below the strip, in the middle: the reading over the range drawn.
70
+ *
71
+ * @event {HelixResizeEvent} helix-resize - Fired when the number of cells drawn changes, carrying that number.
72
+ *
73
+ * @csspart cell - One reading.
74
+ * @csspart empty - Shown when the table has no readings in it.
75
+ * @csspart end - The trailing slot's box.
76
+ * @csspart footer - The three-slot row under the strip.
77
+ * @csspart mark - The invisible point the tooltip is anchored to.
78
+ * @csspart start - The leading slot's box.
79
+ * @csspart strip - The grid of cells.
80
+ * @csspart summary - The middle slot's box.
81
+ * @csspart tooltip - The bubble, forwarded from `Tooltip`.
82
+ * @csspart tooltip-anchor - The `Tooltip` element itself.
83
+ * @csspart tooltip-cell - One column's name and value inside the tooltip.
84
+ * @csspart tooltip-label - The reading's own name inside the tooltip.
85
+ * @csspart tooltip-name - A column's name inside the tooltip.
86
+ * @csspart tooltip-value - A column's value inside the tooltip.
87
+ *
88
+ * @cssproperty --heatmap-cell-height - How tall a cell is. A row of a tall thin cell is what a status page draws.
89
+ * @cssproperty --heatmap-cell-inline-size - How wide a cell is. The strip fits as many as the container allows.
90
+ * @cssproperty --heatmap-cell-radius - How far a cell's corners are rounded.
91
+ * @cssproperty --heatmap-cell-size - The size a cell wants on both axes, where neither is given its own.
92
+ * @cssproperty --heatmap-gap - Space between cells. Zero is a continuous field rather than a grid of tiles.
93
+ * @cssproperty --heatmap-tone - The tone of the cell this is set on. Written by the component, read by the sheet that paints.
94
+ * @cssproperty --heatmap-tone-1 - The quietest step of the magnitude ramp, reached by `tones="1 …"`.
95
+ * @cssproperty --heatmap-tone-2 - The second step of the magnitude ramp.
96
+ * @cssproperty --heatmap-tone-3 - The third step of the magnitude ramp.
97
+ * @cssproperty --heatmap-tone-4 - The fourth step of the magnitude ramp.
98
+ * @cssproperty --heatmap-tone-5 - The loudest step of the magnitude ramp.
99
+ * @cssproperty --heatmap-tone-accent - What `accent` is worth.
100
+ * @cssproperty --heatmap-tone-danger - What `danger` is worth.
101
+ * @cssproperty --heatmap-tone-info - What `info` is worth.
102
+ * @cssproperty --heatmap-tone-muted - What `muted` is worth: the quiet ground, for a bucket that means nothing happened.
103
+ * @cssproperty --heatmap-tone-primary - What `primary` is worth.
104
+ * @cssproperty --heatmap-tone-success - What `success` is worth, as a name or a `data-tone`.
105
+ * @cssproperty --heatmap-tone-warning - What `warning` is worth.
106
+ */
107
+ let HelixHeadlessHeatmap = class HelixHeadlessHeatmap extends MixinChartSource(HelixElement) {
108
+ constructor() {
109
+ super(...arguments);
110
+ /**
111
+ * How many rows the strip has.
112
+ *
113
+ * `1` is a status strip and `7` is a calendar week, which are the two readings
114
+ * this covers. Cells fill down the column and then across, which is what a
115
+ * calendar heatmap does: a week is a column, so the strip reads left to right
116
+ * in weeks and top to bottom in days.
117
+ */
118
+ this.rows = 1;
119
+ /**
120
+ * Lower bounds for the tone buckets, in the order the tones are given.
121
+ *
122
+ * `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
123
+ * first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
124
+ * fourth. A value below the first bound gets no tone at all: an empty day in a
125
+ * contribution graph is a day with nothing in it, and painting it as the
126
+ * lowest bucket claims a reading that does not exist.
127
+ */
128
+ this.thresholds = '';
129
+ /**
130
+ * Tone per bucket, in the same order as `thresholds`.
131
+ *
132
+ * A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
133
+ * **`"1"` through `"5"` are a ramp and everything else is a category**, which
134
+ * is the distinction a heatmap lives or dies on: magnitude has to be one hue
135
+ * getting louder, because a reader compares two cells by weight and cannot
136
+ * compare two hues at all. This shipped demonstrating the opposite,
137
+ * `tones="surface info accent success primary"` for a commit count, and five
138
+ * unrelated hues for five amounts is confetti with no order in it.
139
+ */
140
+ this.tones = '';
141
+ /**
142
+ * The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
143
+ *
144
+ * **Set this only to overrule what the strip actually draws.** The arithmetic
145
+ * needs a width in pixels and the width is a length the stylesheet resolves,
146
+ * so for as long as this was the only answer it was a promise the consumer had
147
+ * to keep by hand: it sat at 8 against a sheet drawing 12, the arithmetic
148
+ * believed a cell cost 10 pixels where it cost 16, and a ninety day strip ran
149
+ * 940 pixels wide out of a 592 pixel box while `visible` reported 59. The one
150
+ * number a summary is told to trust was the number that was wrong.
151
+ *
152
+ * The strip is measured now, so `--heatmap-cell-inline-size` and `--heatmap-gap` are
153
+ * enough on their own and these two are the estimate used until the first
154
+ * measurement lands. Writing the attribute pins the value and stops the
155
+ * measurement being consulted, which is what a container query or a transition
156
+ * on the cell size wants, where what is drawn this frame is not what the
157
+ * arithmetic should plan around.
158
+ *
159
+ * Zero turns the dropping off altogether, which is right for a strip in a
160
+ * container that cannot get narrow.
161
+ */
162
+ this.minCell = 8;
163
+ /**
164
+ * Space between cells, in CSS pixels, for the same reason `min-cell` is a
165
+ * number.
166
+ */
167
+ this.gap = 2;
168
+ /**
169
+ * Shown when the table has no readings in it.
170
+ */
171
+ this.emptyText = 'No readings';
172
+ /**
173
+ * The width last measured, or nothing before the first measurement.
174
+ *
175
+ * Undefined rather than zero, because the two mean different things and the
176
+ * difference is a whole strip: unmeasured has to show everything, since a
177
+ * first paint that shows one cell and then expands is a flicker on every load.
178
+ */
179
+ this.width = undefined;
180
+ /**
181
+ * The cell and gap the strip is drawing, in pixels, once it has been read.
182
+ *
183
+ * **The arithmetic's inputs are a stylesheet's decisions, so the honest way to
184
+ * learn them is to ask the stylesheet.** A cell's size is a length that only
185
+ * the cascade can resolve: it may be a `rem` against a root font size, a
186
+ * percentage of a container, or whatever a container query chose this frame.
187
+ * Every one of those is invisible to a number typed into an attribute, and
188
+ * each of `--heatmap-cell-inline-size`, `--heatmap-cell-height` and `--heatmap-gap`
189
+ * added one more way for the two to drift apart silently.
190
+ *
191
+ * Reading it back is not styling and does not breach the tier: this asks what
192
+ * was decided rather than deciding, which is the same direction as the facts
193
+ * this component writes out as custom properties, run backwards.
194
+ */
195
+ this.metrics = undefined;
196
+ /**
197
+ * Which drawn cell the pointer is on, as an index into `drawn`, or -1 for
198
+ * none.
199
+ */
200
+ this.hovered = -1;
201
+ this.observer = undefined;
202
+ this.announced = undefined;
203
+ /**
204
+ * Which drawn cell the pointer is over, or -1.
205
+ *
206
+ * `pointerover` on the strip rather than a listener per cell: the event
207
+ * bubbles, so one handler covers however many cells there are, and unlike
208
+ * `mouseover` it is delivered for a pen and for the touch that follows a long
209
+ * press.
210
+ */
211
+ this.onPointerOver = (event) => {
212
+ const cell = event.target?.closest?.('[part="cell"]');
213
+ const index = Number(cell?.getAttribute('data-index') ?? -1);
214
+ this.hovered = Number.isInteger(index) ? index : -1;
215
+ };
216
+ this.onPointerLeave = () => {
217
+ this.hovered = -1;
218
+ };
219
+ }
220
+ /**
221
+ * How many cells are actually drawn.
222
+ *
223
+ * **This is the number a summary has to agree with**, and the reason it is
224
+ * published at all: a consumer's own summary is their markup and this element
225
+ * cannot rewrite it, so the only honest arrangement is to hand over the count
226
+ * and say when it changed.
227
+ *
228
+ * **A plain getter, and the attribute is written in `updated`, because
229
+ * `@property({ reflect: true })` on a getter with no setter reflects once and
230
+ * then goes stale.** Lit reflects a property that is in `changedProperties`,
231
+ * and nothing puts a derived getter there after the first update: the
232
+ * attribute would be right on load and wrong from the first resize, which is
233
+ * the exact failure the count exists to prevent, arriving through the
234
+ * mechanism meant to prevent it.
235
+ */
236
+ get visible() {
237
+ return Math.min(this.points.length, this.room);
238
+ }
239
+ /**
240
+ * Every reading in the table, oldest first, as the table is written.
241
+ *
242
+ * **Not `readings`, which the mixin already has and which means a count.**
243
+ * Two members of the same name meaning a number and an array is the kind of
244
+ * collision that type-checks in one direction and reads wrong in both.
245
+ */
246
+ get points() {
247
+ return this.series[0]?.points ?? [];
248
+ }
249
+ /**
250
+ * `rows` as a usable count, which is not always what the attribute says.
251
+ *
252
+ * One place rather than two: the fit arithmetic and the grid template both
253
+ * need it, and a `rows="0"` or a `rows="2.5"` that reached one of them and not
254
+ * the other would draw a strip whose columns and whose capacity disagreed.
255
+ */
256
+ get rowCount() {
257
+ return Math.max(1, Math.floor(this.rows) || 1);
258
+ }
259
+ /**
260
+ * The cell width the arithmetic should plan around, in pixels.
261
+ *
262
+ * The attribute wins where a consumer wrote one, because that is what writing
263
+ * it is for; otherwise what the strip draws, and the declared default only
264
+ * until the first measurement lands.
265
+ */
266
+ get cellPx() {
267
+ return this.hasAttribute('min-cell') ? this.minCell : (this.metrics?.cell ?? this.minCell);
268
+ }
269
+ /** The gap the arithmetic should plan around, on the same terms as `cellPx`. */
270
+ get gapPx() {
271
+ return this.hasAttribute('gap') ? this.gap : (this.metrics?.gap ?? this.gap);
272
+ }
273
+ /** How many cells the container has room for, as a whole number of columns. */
274
+ get room() {
275
+ return fits(this.points.length, this.width ?? Number.NaN, this.cellPx, this.gapPx, this.rowCount);
276
+ }
277
+ /**
278
+ * Reads back the cell and the gap the strip resolved.
279
+ *
280
+ * `gridAutoColumns` and `columnGap` rather than a cell's own box, and the
281
+ * difference matters on the frame it matters: a cell exists only once some
282
+ * have been drawn, and how many are drawn is what this is measuring *for*.
283
+ * Asking the track instead breaks the circle, since a track is sized whether
284
+ * or not anything sits in it. Neither property forces layout, so this stays a
285
+ * style read on every update rather than a reflow.
286
+ *
287
+ * Anything that does not parse to a positive number leaves the estimate alone:
288
+ * `columnGap` computes to `normal` where no gap is set, and a track given a
289
+ * keyword or a `repeat()` has no single width to report. A wrong number here
290
+ * is worse than no number, because it is the one the count is published from.
291
+ */
292
+ measure() {
293
+ const strip = this.renderRoot?.querySelector('[part="strip"]');
294
+ if (!strip || typeof getComputedStyle !== 'function') {
295
+ return;
296
+ }
297
+ const style = getComputedStyle(strip);
298
+ const cell = Number.parseFloat(style.gridAutoColumns);
299
+ const gap = Number.parseFloat(style.columnGap);
300
+ if (!Number.isFinite(cell) || cell <= 0 || !Number.isFinite(gap) || gap < 0) {
301
+ return;
302
+ }
303
+ if (this.metrics?.cell !== cell || this.metrics?.gap !== gap) {
304
+ /* A new object rather than a mutation, because `@state` compares by
305
+ identity and a mutated one schedules nothing. */
306
+ this.metrics = { cell, gap };
307
+ }
308
+ /* **Whether there is anything between the cells, which CSS cannot ask.**
309
+ A sheet can set the gap and cannot read it back, so a rule that wants to
310
+ know whether a strip is a grid of tiles or one continuous field has no
311
+ selector for it. The measurement is already here, so saying so costs
312
+ nothing. It is a fact rather than a decision, which is the line a base
313
+ component's custom properties are on the right side of too. */
314
+ strip.toggleAttribute('data-spaced', gap > 0);
315
+ }
316
+ /**
317
+ * The readings actually drawn, newest kept.
318
+ *
319
+ * The tail rather than the head: a status strip that drops the newest days to
320
+ * keep the oldest is answering a question nobody asked.
321
+ */
322
+ get drawn() {
323
+ const all = this.points;
324
+ return all.slice(Math.max(0, all.length - this.room));
325
+ }
326
+ connectedCallback() {
327
+ super.connectedCallback();
328
+ /* Guarded because Lit SSR provides no `ResizeObserver`, and a component that
329
+ measures itself to render has to render without the measurement first. */
330
+ if (typeof ResizeObserver !== 'undefined') {
331
+ this.observer = new ResizeObserver((entries) => {
332
+ const measured = entries[0]?.contentRect.width;
333
+ if (measured !== undefined && measured !== this.width) {
334
+ this.width = measured;
335
+ }
336
+ });
337
+ this.observer.observe(this);
338
+ }
339
+ }
340
+ disconnectedCallback() {
341
+ super.disconnectedCallback();
342
+ this.observer?.disconnect();
343
+ this.observer = undefined;
344
+ }
345
+ willUpdate(changed) {
346
+ super.willUpdate(changed);
347
+ hostAria(this.internals, { label: this.label || 'Heatmap', role: 'img' });
348
+ }
349
+ /**
350
+ * Says on the footer whether any of its three slots holds anything.
351
+ *
352
+ * **The stylesheet used to ask, and could not.** It read
353
+ * `[part="footer"]:not(:has(slot:has(*)))`, which is two faults at once:
354
+ * `:has()` may not be nested inside `:has()`, so the selector failed to parse
355
+ * and the rule was discarded whole; and a slot's assigned nodes are not its
356
+ * DOM children, so `slot:has(*)` reports fallback content rather than the
357
+ * fill, and would have been false either way. Both verified in a browser. A
358
+ * heatmap with no legend and no summary still reserved the row for one.
359
+ */
360
+ markEmpty() {
361
+ this.markRegion('footer', ['start', 'summary', 'end']);
362
+ }
363
+ /**
364
+ * One region, hidden when its slot holds nothing and nothing of ours fills it.
365
+ *
366
+ * `hidden` beside the `data-empty` mirror: `data-empty` is the hook the styled
367
+ * sheet reads, and this tier ships no sheet, so an empty region left in the box
368
+ * tree would be a gap a headless consumer cannot close without knowing to look
369
+ * for it. The styled rule stays too, because that sheet sets `display` on these
370
+ * parts and therefore outranks the UA's `[hidden]` one.
371
+ */
372
+ markRegion(part, slots, occupied) {
373
+ const region = this.renderRoot?.querySelector(`[part="${part}"]`);
374
+ const empty = !slots.some((name) => slotFilled(this.renderRoot?.querySelector(`slot[name="${name}"]`))) && !(occupied && this.renderRoot?.querySelector(occupied));
375
+ region?.toggleAttribute('data-empty', empty);
376
+ region?.toggleAttribute('hidden', empty);
377
+ }
378
+ updated(changed) {
379
+ super.updated(changed);
380
+ this.markEmpty();
381
+ this.measure();
382
+ /* Written here rather than reflected, and announced only on a change: a
383
+ consumer recomputing a summary from this is doing work, and an event per
384
+ resize frame is work per frame.
385
+
386
+ The attribute is set after the first render rather than during it, so a
387
+ hydrating consumer's markup and the server's output agree: neither has it,
388
+ and it appears once the element has measured something. */
389
+ /* **Nothing measured yet is the absence of the attribute.** The comment
390
+ above claimed writing here made the server's output and a hydrating
391
+ consumer's markup agree, and it does the reverse: `updated` runs in the
392
+ same microtask checkpoint as `firstUpdated`, before React need have
393
+ reached the node, so `visible="0"` was an attribute no server sent. That
394
+ is the fault `data-settled` was found for four times. */
395
+ const showing = this.visible;
396
+ const written = showing > 0 ? String(showing) : null;
397
+ if (this.getAttribute('visible') !== written) {
398
+ if (written === null) {
399
+ this.removeAttribute('visible');
400
+ }
401
+ else {
402
+ this.setAttribute('visible', written);
403
+ }
404
+ }
405
+ if (this.announced !== undefined && this.announced !== showing) {
406
+ this.dispatchEvent(new HelixResizeEvent({ size: showing }));
407
+ }
408
+ this.announced = showing;
409
+ }
410
+ render() {
411
+ const bounds = numbers(this.thresholds);
412
+ const palette = words(this.tones);
413
+ const cells = this.drawn;
414
+ return html `<div
415
+ part="strip"
416
+ id="helix-chart-plot"
417
+ style="--_heatmap-rows: ${this.rowCount}"
418
+ @pointerover=${this.onPointerOver}
419
+ @pointerleave=${this.onPointerLeave}
420
+ >
421
+ ${cells.length === 0
422
+ ? nothing
423
+ : cells.map((reading, index) => {
424
+ const tone = toneOf(reading, bounds, palette);
425
+ /* **Two templates rather than one with a conditional style, and
426
+ the reason is that an absent tone has to mean an absent
427
+ declaration.** `--heatmap-tone: var(--heatmap-tone-undefined)`
428
+ is not an unset property, it is a property set to the
429
+ guaranteed-invalid value, and `var(--heatmap-tone, …)` then
430
+ declines to use its own fallback because the property *is*
431
+ set. An untoned cell came out transparent rather than taking
432
+ the quiet ground the sheet has for it. */
433
+ return tone === undefined
434
+ ? html `<span part="cell" data-index=${index}></span>`
435
+ : html `<span
436
+ part="cell"
437
+ data-index=${index}
438
+ data-tone=${tone}
439
+ style="--heatmap-tone: var(--heatmap-tone-${tone})"
440
+ ></span>`;
441
+ })}
442
+ ${this.renderTooltip()}
443
+ </div>
444
+ ${cells.length === 0 ? html `<p part="empty">${this.emptyText}</p>` : nothing}
445
+ <div part="footer">
446
+ <span part="start"><slot name="start"></slot></span>
447
+ <span part="summary"><slot name="summary"></slot></span>
448
+ <span part="end"><slot name="end"></slot></span>
449
+ </div>`;
450
+ }
451
+ /**
452
+ * The bubble over the cell a pointer is resting on.
453
+ *
454
+ * **One tooltip that moves, which is what every other chart here does and is
455
+ * the thing the `title` attribute was kept to avoid.** The note this replaces
456
+ * read that ninety `helix-tooltip` elements was the cost of a real one, and
457
+ * that was never the shape: Bar Chart, Line Chart and Donut Chart each render
458
+ * a single anchor against an invisible mark and move the mark, so the count is
459
+ * one however many readings there are. `drawTooltip` is their shared markup
460
+ * and this is the fourth caller.
461
+ *
462
+ * What it buys over the native one is the row rather than the reading.
463
+ * `sourceRows` carries every column of the table including the ones nothing
464
+ * was plotted from, so a cell reads "11 Jun 2026 / Uptime 81.2% / Note Partial
465
+ * outage" where `title` could only ever say the two values this component
466
+ * happens to hold. It is also styleable, appears at once rather than after the
467
+ * platform's second of delay, and cannot be truncated by the window edge.
468
+ *
469
+ * The mark is placed in pixels rather than in percent, which is the one thing
470
+ * this does differently from its siblings: they divide a plot into equal
471
+ * slots, and a strip's cells are a fixed size with a fixed gap inside a box
472
+ * that is usually wider, so a percentage of the box lands between cells. The
473
+ * pitch is `cell + gap` and both are measured.
474
+ */
475
+ renderTooltip() {
476
+ const at = this.hovered;
477
+ if (at < 0) {
478
+ return nothing;
479
+ }
480
+ /* `sourceRows` is indexed over every reading and the strip draws a tail of
481
+ them, so the two agree only when nothing was dropped. Off by the length of
482
+ what was cut, a tooltip names the wrong day, and it names one that is
483
+ still on screen, so nothing about it looks wrong. */
484
+ const offset = this.points.length - this.drawn.length;
485
+ const cell = this.cellPx;
486
+ const gap = this.gapPx;
487
+ const column = Math.floor(at / this.rowCount);
488
+ const row = at % this.rowCount;
489
+ return drawTooltip(this.sourceRows, offset + at, this.tag('tooltip'), {
490
+ placement: 'top',
491
+ x: `${column * (cell + gap) + cell / 2}px`,
492
+ y: `${row * (cell + gap)}px`,
493
+ });
494
+ }
495
+ };
496
+ __decorate([
497
+ property({ type: Number })
498
+ ], HelixHeadlessHeatmap.prototype, "rows", void 0);
499
+ __decorate([
500
+ property()
501
+ ], HelixHeadlessHeatmap.prototype, "thresholds", void 0);
502
+ __decorate([
503
+ property()
504
+ ], HelixHeadlessHeatmap.prototype, "tones", void 0);
505
+ __decorate([
506
+ property({ attribute: 'min-cell', type: Number })
507
+ ], HelixHeadlessHeatmap.prototype, "minCell", void 0);
508
+ __decorate([
509
+ property({ type: Number })
510
+ ], HelixHeadlessHeatmap.prototype, "gap", void 0);
511
+ __decorate([
512
+ property({ attribute: 'empty-text' })
513
+ ], HelixHeadlessHeatmap.prototype, "emptyText", void 0);
514
+ __decorate([
515
+ state()
516
+ ], HelixHeadlessHeatmap.prototype, "width", void 0);
517
+ __decorate([
518
+ state()
519
+ ], HelixHeadlessHeatmap.prototype, "metrics", void 0);
520
+ __decorate([
521
+ state()
522
+ ], HelixHeadlessHeatmap.prototype, "hovered", void 0);
523
+ HelixHeadlessHeatmap = __decorate([
524
+ customElement('helix-headless-heatmap')
525
+ ], HelixHeadlessHeatmap);
526
+ export { HelixHeadlessHeatmap };
@@ -0,0 +1 @@
1
+ export * from './root/icon-root.js';
@@ -0,0 +1 @@
1
+ export * from './root/icon-root.js';
@@ -0,0 +1,53 @@
1
+ import { HelixElement } from '@fusion.dev/helix-core';
2
+ import { nothing, type TemplateResult } from 'lit';
3
+ /**
4
+ * @summary Renders a named icon from the Helix set.
5
+ *
6
+ * @description
7
+ * The set is Phosphor, drawn on a 256 box at stroke-width 16, and each glyph is
8
+ * rendered as its own inner markup rather than as a single path. Most icons are
9
+ * several elements at once, each with its own stroke and fill, so a one-path
10
+ * model would draw a fraction of the set and quietly drop the rest.
11
+ *
12
+ * **The markup is trusted by construction.** It is generated at build time from
13
+ * SVG files in this repository, never from anything a user supplies, which is
14
+ * what makes `unsafeSVG` the right tool rather than a risk.
15
+ *
16
+ * The `<svg>` carries `fill="currentColor"` because the generator keeps only
17
+ * the inner markup and discards the source's own root tag, and that tag is
18
+ * where Phosphor puts its fill. Without it, every solid glyph in the set, 65 of
19
+ * them, falls back to the SVG default of black and disappears on a dark page.
20
+ * Shapes that set their own `fill` or `stroke` are unaffected, which is why the
21
+ * outline icons looked fine and hid this.
22
+ *
23
+ * A name with no match renders nothing at all instead of an empty box, so a
24
+ * typo cannot leave a hole in a layout that looks deliberate.
25
+ *
26
+ * An icon is decorative by default and hidden from assistive technology. Give
27
+ * it a `label` only when the icon is the sole carrier of meaning, such as
28
+ * inside a button with no text.
29
+ *
30
+ * @since 0.1.0
31
+ * @status stable
32
+ * @category media
33
+ * @aliases Glyph, Symbol
34
+ * @documentation https://helix.fusion.dev/components/icon
35
+ *
36
+ * @csspart svg - The rendered SVG.
37
+ */
38
+ export declare class HelixHeadlessIcon extends HelixElement {
39
+ /**
40
+ * Name of the icon in the Helix set.
41
+ */
42
+ name: string;
43
+ /**
44
+ * Accessible name, for an icon that is not decorative.
45
+ */
46
+ label: string;
47
+ protected render(): TemplateResult | typeof nothing;
48
+ }
49
+ declare global {
50
+ interface HTMLElementTagNameMap {
51
+ 'helix-headless-icon': HelixHeadlessIcon;
52
+ }
53
+ }
@@ -0,0 +1,93 @@
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 { icons } from '@fusion.dev/helix-icons';
9
+ import { html, nothing } from 'lit';
10
+ import { property } from 'lit/decorators.js';
11
+ import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
12
+ /**
13
+ * @summary Renders a named icon from the Helix set.
14
+ *
15
+ * @description
16
+ * The set is Phosphor, drawn on a 256 box at stroke-width 16, and each glyph is
17
+ * rendered as its own inner markup rather than as a single path. Most icons are
18
+ * several elements at once, each with its own stroke and fill, so a one-path
19
+ * model would draw a fraction of the set and quietly drop the rest.
20
+ *
21
+ * **The markup is trusted by construction.** It is generated at build time from
22
+ * SVG files in this repository, never from anything a user supplies, which is
23
+ * what makes `unsafeSVG` the right tool rather than a risk.
24
+ *
25
+ * The `<svg>` carries `fill="currentColor"` because the generator keeps only
26
+ * the inner markup and discards the source's own root tag, and that tag is
27
+ * where Phosphor puts its fill. Without it, every solid glyph in the set, 65 of
28
+ * them, falls back to the SVG default of black and disappears on a dark page.
29
+ * Shapes that set their own `fill` or `stroke` are unaffected, which is why the
30
+ * outline icons looked fine and hid this.
31
+ *
32
+ * A name with no match renders nothing at all instead of an empty box, so a
33
+ * typo cannot leave a hole in a layout that looks deliberate.
34
+ *
35
+ * An icon is decorative by default and hidden from assistive technology. Give
36
+ * it a `label` only when the icon is the sole carrier of meaning, such as
37
+ * inside a button with no text.
38
+ *
39
+ * @since 0.1.0
40
+ * @status stable
41
+ * @category media
42
+ * @aliases Glyph, Symbol
43
+ * @documentation https://helix.fusion.dev/components/icon
44
+ *
45
+ * @csspart svg - The rendered SVG.
46
+ */
47
+ let HelixHeadlessIcon = class HelixHeadlessIcon extends HelixElement {
48
+ constructor() {
49
+ super(...arguments);
50
+ /**
51
+ * Name of the icon in the Helix set.
52
+ */
53
+ this.name = '';
54
+ /**
55
+ * Accessible name, for an icon that is not decorative.
56
+ */
57
+ this.label = '';
58
+ }
59
+ render() {
60
+ /* Own keys only. This was a truthiness check on a plain-object index, so an
61
+ inherited `Object.prototype` key passed it and the component went on to
62
+ render a sized, empty `<svg viewBox="">` rather than nothing at all. */
63
+ const icon = Object.hasOwn(icons, this.name) ? icons[this.name] : undefined;
64
+ if (!icon) {
65
+ return nothing;
66
+ }
67
+ // A labeled icon is content and needs a role to carry the label. An
68
+ // unlabelled one is decoration sitting beside text that already says the
69
+ // same thing, so it is removed from the accessibility tree rather than
70
+ // announced twice.
71
+ const labeled = this.label.length > 0;
72
+ return html `<svg
73
+ part="svg"
74
+ fill="currentColor"
75
+ viewBox=${icon.viewBox}
76
+ role=${labeled ? 'img' : nothing}
77
+ aria-label=${labeled ? this.label : nothing}
78
+ aria-hidden=${labeled ? nothing : 'true'}
79
+ >
80
+ ${unsafeSVG(icon.content)}
81
+ </svg>`;
82
+ }
83
+ };
84
+ __decorate([
85
+ property()
86
+ ], HelixHeadlessIcon.prototype, "name", void 0);
87
+ __decorate([
88
+ property()
89
+ ], HelixHeadlessIcon.prototype, "label", void 0);
90
+ HelixHeadlessIcon = __decorate([
91
+ customElement('helix-headless-icon')
92
+ ], HelixHeadlessIcon);
93
+ export { HelixHeadlessIcon };