@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,472 @@
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 { AriaForwardController, customElement, drawIcon, HelixFormElement, holdCaret, MixinControllerValue, MixinField, restoreValue, } from '@fusion.dev/helix-core';
8
+ import { eye, eyeSlash, x } from '@fusion.dev/helix-icons';
9
+ import { html, nothing } from 'lit';
10
+ import { property, state } from 'lit/decorators.js';
11
+ /**
12
+ * @summary A single line of text a reader types into.
13
+ *
14
+ * @description
15
+ * Renders a real `<input>`, so the caret, selection, autofill, spellcheck, the
16
+ * password manager, and the on-screen keyboard a phone chooses all come from the
17
+ * platform. `delegatesFocus` puts focus on it, and it serializes into the
18
+ * server's markup, so the field is usable before any script loads.
19
+ *
20
+ * **The input inside a shadow root submits nothing**, because the form is on the
21
+ * other side of the boundary. The host is form-associated instead and reports
22
+ * its own value through `ElementInternals`, which is also what carries validity
23
+ * and what answers a form reset.
24
+ *
25
+ * `value` and `defaultValue` are separate for the reason `checked` and
26
+ * `defaultChecked` are: `value` is what is in the field now and
27
+ * `defaultValue` is what the markup asked for, which is where a reset returns
28
+ * to and is gone the moment anyone types.
29
+ *
30
+ * **Validity is the platform's.** The `type` and `required` are set on the real
31
+ * input and its `validity` is copied onto the host, so an email field rejects
32
+ * what the browser says is not an email rather than what a regular expression
33
+ * here guesses. What this adds is the anchor, so `reportValidity` points the
34
+ * bubble at the input rather than at the host.
35
+ *
36
+ * `pattern`, `minlength` and `maxlength` are forwarded with them. They were
37
+ * promised by this paragraph and did not exist, so a consumer following the
38
+ * sentence wrote an attribute on the host that reached no input and constrained
39
+ * nothing: the field looked as though it were checked and was not.
40
+ *
41
+ * **`clearable` and `reveal` are the field's, not the consumer's.** The `end`
42
+ * slot used to be the answer to both, which meant every consumer of
43
+ * `type="search"` built the same button and every consumer of
44
+ * `type="password"` either built the same toggle or shipped a field a reader
45
+ * cannot check what they typed into. Neither is a slot's worth of variation:
46
+ * one empties the value, the other flips the type, and both want the same
47
+ * position, the same size and the same disabled behavior. The slot stays for
48
+ * what actually varies, a unit or a prefix.
49
+ *
50
+ * Both opt in rather than following from `type`, and are booleans that default
51
+ * to false. A Lit boolean property that defaults to *true* cannot be turned off
52
+ * from HTML at all, only from script, which is the wrong way round for
53
+ * revealing a password: a consumer should have to ask for it. Drawer's `modal`
54
+ * defaults true for the opposite reason, that losing a focus trap by forgetting
55
+ * a word is worse than having to say so.
56
+ *
57
+ * @since 0.1.0
58
+ * @status experimental
59
+ * @category forms
60
+ * @aliases TextField, Field, TextInput
61
+ * @documentation https://helix.fusion.dev/components/input
62
+ *
63
+ * @slot end - After the text, for an icon or a unit.
64
+ * @slot start - Before the text, for an icon or a prefix.
65
+ *
66
+ * @event {Event} change - Relayed from the input once the reader has finished.
67
+ * @event {HelixBeforeChangeEvent} helix-before-change - Fired as the text changes, and cancelable.
68
+ * @event {Event} input - Announced once the value has moved.
69
+ *
70
+ * @csspart clear - The button that empties the field.
71
+ * @csspart control - The input itself.
72
+ * @csspart feedback - What is wrong with it.
73
+ * @csspart field - The box holding everything.
74
+ * @csspart hint - Help under the field, while nothing is wrong.
75
+ * @csspart icon - A glyph this component draws.
76
+ * @csspart label - The question, over the field.
77
+ * @csspart reveal - The button that shows and hides a password.
78
+ */
79
+ let HelixHeadlessInput = class HelixHeadlessInput extends MixinControllerValue(MixinField(HelixFormElement)) {
80
+ constructor() {
81
+ super(...arguments);
82
+ /* A consumer's `aria-describedby` names ids in their own tree and the control
83
+ is in this shadow root, so the reference has to be carried down as an
84
+ element rather than copied as an id. See `AriaForwardController`: measured
85
+ in Chrome's own tree, the host held the description and the control the
86
+ reader is actually on was exposed without it. */
87
+ this.aria = new AriaForwardController(this, {
88
+ target: () => this.renderRoot?.querySelector('[part="control"]') ?? null,
89
+ });
90
+ /** Typed or dragged, so every edit is announced. See `announcesInput`. */
91
+ this.announcesInput = true;
92
+ /**
93
+ * What the browser may autofill here, as one of the platform's own tokens.
94
+ *
95
+ * Empty leaves the attribute off, which is the browser's default. Set it to
96
+ * a token like `email` or `bday` to ask for autofill, or to `off` to refuse.
97
+ */
98
+ this.autocomplete = '';
99
+ /**
100
+ * Shown while the field is empty.
101
+ *
102
+ * Not a label: it goes when typing starts.
103
+ */
104
+ this.placeholder = '';
105
+ /**
106
+ * Whether the field refuses input while still submitting its value.
107
+ *
108
+ * **`readonly`, which is the platform's spelling, and it was `read-only`
109
+ * until 28 Aug 2026.** A camelCase property needs an explicit `attribute`
110
+ * and the library had been answering that question two ways: thirteen
111
+ * attributes kept the name HTML uses (`crossorigin`, `maxlength`,
112
+ * `formnovalidate`, `dirname` and the rest) and five dash-cased a word the
113
+ * platform writes as one. `readonly` was the only one on both lists, this
114
+ * spelling on `Rating` and `read-only` on the eight other fields, so one
115
+ * library shipped both and each was inert on the other's families.
116
+ *
117
+ * The cost of the dash-cased form is the one this repository keeps writing
118
+ * down about attributes: nothing warns. `<helix-input readonly>` is what
119
+ * anybody who has written HTML types, it parsed to no property at all, and
120
+ * the field stayed editable with no error anywhere. Measured before the
121
+ * rename: `readOnly` came back `false`.
122
+ *
123
+ * Taken now for the reason [#213](../../../../../docs/19-queue.md) gives
124
+ * about the part it renamed for the same kind of reason: there is no
125
+ * `helix-v` tag, so no consumer is holding the old spelling, and this is free
126
+ * today and a deprecation after the first release.
127
+ * `check:attribute-names` holds it from here.
128
+ */
129
+ this.readOnly = false;
130
+ /**
131
+ * What the field accepts, which decides the keyboard and the validation.
132
+ *
133
+ * **Not reflected**, and it was. Reflection exists so a selector can reach a
134
+ * value, and no stylesheet in this repository selects on `type`: what it did
135
+ * instead was write `type="text"` onto every `<helix-input>` ever rendered,
136
+ * an attribute no consumer's markup had. That is precisely the fault `Button`
137
+ * had with `href`, `target` and `rel`, written up in the area rules as the
138
+ * reason the rule exists, and this was the last property in the library still
139
+ * doing it. Audited: ten reflected attributes have no selector anywhere, and
140
+ * this is the only one of them with a value that puts itself on the host.
141
+ *
142
+ * Nothing reads it from the attribute either. The real `<input>` inside takes
143
+ * it as a property binding, which is what makes the keyboard and the
144
+ * validation follow.
145
+ */
146
+ this.type = 'text';
147
+ /**
148
+ * Whether the field offers a button that empties it.
149
+ *
150
+ * Shown only while there is something to clear, because a control that does
151
+ * nothing is worse than no control: a reader who presses it and sees no
152
+ * change has to work out whether the field was already empty or the button
153
+ * is broken.
154
+ */
155
+ this.clearable = false;
156
+ /**
157
+ * What the clear button is called, since an icon has no name of its own.
158
+ */
159
+ this.clearLabel = 'Clear';
160
+ /**
161
+ * Whether a password field offers a toggle that shows what was typed.
162
+ *
163
+ * Ignored on every other type. A reveal on an email field would be a button
164
+ * that does nothing visible, and guarding it here rather than asking the
165
+ * consumer not to means the property can be set once on a component that
166
+ * changes type.
167
+ */
168
+ this.reveal = false;
169
+ /**
170
+ * What the reveal toggle is called.
171
+ *
172
+ * The state is `aria-pressed`, not this.
173
+ */
174
+ this.revealLabel = 'Show password';
175
+ /**
176
+ * Whether the password is currently showing.
177
+ *
178
+ * State rather than a property: it is a reader's momentary choice about what
179
+ * is on their own screen, it must not survive anything, and a consumer that
180
+ * could set it could reveal a password without the reader asking.
181
+ */
182
+ this.revealed = false;
183
+ /**
184
+ * Every keystroke, cancelable, and put back where it is refused.
185
+ *
186
+ * The input has already taken the character by the time this runs, so a
187
+ * consumer that refuses the change has to see the field returned to what the
188
+ * element still holds. Otherwise the text on screen and the value the form
189
+ * would submit disagree, which is the one thing a controlled field must never
190
+ * do.
191
+ */
192
+ this.handleInput = (event) => {
193
+ /* **Stopped, because the control inside this one is not a control a consumer
194
+ has.** `input` is composed by specification, so the native event from the
195
+ `<input>` in this shadow root crosses the boundary and reaches the host
196
+ beside the one the mixin announces: measured in Chrome 148, one keystroke
197
+ produced `helix-before-change`, this element's own `input`, and the inner
198
+ control's, so `onInput` ran twice and one of the two carried the value
199
+ from before the change. `handleChange` two methods down has always done
200
+ this; the pair was half applied. */
201
+ event.stopPropagation();
202
+ const control = event.target;
203
+ const next = control.value;
204
+ /* Through the mixin, which announces and then applies only if the value is
205
+ the element's to move. The native control has already changed either way,
206
+ so wherever the answer does not follow it has to be put back: that is a
207
+ refusal, and it is equally a consumer who owns the value and has not
208
+ given a new one yet. Both are "what is on screen is not the answer". */
209
+ this.requestValue(next);
210
+ restoreValue(control, this.value);
211
+ };
212
+ /**
213
+ * Empties the field and gives the caret back.
214
+ *
215
+ * Focus returns to the input rather than staying on the button, which is
216
+ * about to disappear: a reader who cleared a field is going to type in it,
217
+ * and focus resting on a control that is being removed lands on the body.
218
+ *
219
+ * Through `requestValue` like every other change, so a consumer who owns the
220
+ * value hears about it and decides, and a canceled clear leaves the text
221
+ * where it was.
222
+ */
223
+ this.handleClear = () => {
224
+ this.requestValue('');
225
+ const control = this.control;
226
+ if (control) {
227
+ restoreValue(control, this.value);
228
+ control.focus();
229
+ }
230
+ };
231
+ /** Relayed, because `change` does not cross a shadow boundary on its own. */
232
+ this.handleChange = (event) => {
233
+ event.stopPropagation();
234
+ this.dispatchEvent(new Event('change', { bubbles: true, composed: false }));
235
+ };
236
+ /**
237
+ * A regular expression the value has to match, as the platform reads it.
238
+ *
239
+ * The class documentation promised `pattern` and `minlength` "and the rest"
240
+ * were set on the real input, and no such properties existed: a consumer
241
+ * following that sentence wrote an attribute on the host, it reached no input,
242
+ * and the field constrained nothing while looking as though it did.
243
+ *
244
+ * Forwarded rather than checked here, which is the whole reason validity is
245
+ * the platform's: the browser knows what a `pattern` means, anchors it at both
246
+ * ends, and produces the message in the reader's own language.
247
+ */
248
+ this.pattern = '';
249
+ }
250
+ /**
251
+ * The type the real input is given, which is not always the type asked for.
252
+ *
253
+ * A revealed password is a text field for exactly as long as the reader is
254
+ * looking at it. Reading through a getter rather than mutating `type` keeps
255
+ * the property the consumer's: what they set is what they get back, whatever
256
+ * the button is doing.
257
+ */
258
+ get effectiveType() {
259
+ return this.revealed && this.type === 'password' ? 'text' : this.type;
260
+ }
261
+ /** Whether there is a clear button on screen right now. */
262
+ get showsClear() {
263
+ return this.clearable && this.value !== '' && !this.isDisabled && !this.readOnly;
264
+ }
265
+ /** Focus is delegated to the input, so the host is never the focus target. */
266
+ static { this.shadowRootOptions = {
267
+ ...HelixFormElement.shadowRootOptions,
268
+ delegatesFocus: true,
269
+ }; }
270
+ /**
271
+ * The caret and the selection, under the platform's own names.
272
+ *
273
+ * The `<input>` is inside this shadow root, so a consumer had no way to ask
274
+ * where the selection is, let alone move it: `querySelector` does not cross
275
+ * the boundary. An insert-at-cursor toolbar, a format button, a mask that
276
+ * repositions the caret after rewriting the value, all of them need this and
277
+ * none of them could be written. Textarea gained the same surface for the same
278
+ * reason. See 295.
279
+ *
280
+ * Zero before there is a control, which is where an empty field's caret would
281
+ * be anyway.
282
+ */
283
+ get selectionDirection() {
284
+ return this.control?.selectionDirection ?? 'none';
285
+ }
286
+ set selectionDirection(direction) {
287
+ const control = this.control;
288
+ if (control) {
289
+ control.selectionDirection = direction;
290
+ }
291
+ }
292
+ /** Where the selection ends, as an offset into the value. */
293
+ get selectionEnd() {
294
+ return this.control?.selectionEnd ?? 0;
295
+ }
296
+ set selectionEnd(at) {
297
+ const control = this.control;
298
+ if (control) {
299
+ control.selectionEnd = at;
300
+ }
301
+ }
302
+ /** Where the selection starts, as an offset into the value. */
303
+ get selectionStart() {
304
+ return this.control?.selectionStart ?? 0;
305
+ }
306
+ set selectionStart(at) {
307
+ const control = this.control;
308
+ if (control) {
309
+ control.selectionStart = at;
310
+ }
311
+ }
312
+ /**
313
+ * Selects a range, which is the one operation the three accessors above
314
+ * cannot express between them.
315
+ *
316
+ * Setting `selectionStart` past the current `selectionEnd` drags the end
317
+ * along, so the two writes a consumer would make in sequence do not compose
318
+ * into the range they asked for. The platform has this method for that reason
319
+ * and so does this.
320
+ */
321
+ setSelectionRange(start, end, direction) {
322
+ this.control?.setSelectionRange(start, end, direction);
323
+ }
324
+ get control() {
325
+ return this.renderRoot.querySelector('[part="control"]');
326
+ }
327
+ /** Reports the value and the validity the host stands behind. */
328
+ sync() {
329
+ this.internals.setFormValue(this.value);
330
+ const control = this.control;
331
+ if (!control) {
332
+ return;
333
+ }
334
+ /* The input's own verdict, copied over rather than recomputed. It knows
335
+ what an email is and what `pattern` means, and it knows it the same way
336
+ the browser will when the form is submitted. The anchor is what this adds:
337
+ without it the validity bubble points at the host, which is a box with no
338
+ text in it. */
339
+ this.internals.setValidity(control.validity, control.validationMessage, control);
340
+ // Straight after, because validity moved without any property moving.
341
+ this.refreshFeedback();
342
+ }
343
+ /** Puts the caret in the field, the way a label pointing at one would. */
344
+ focus(options) {
345
+ this.control?.focus(options);
346
+ }
347
+ /** Selects everything in the field. */
348
+ select() {
349
+ this.control?.select();
350
+ }
351
+ willUpdate(changed) {
352
+ super.willUpdate(changed);
353
+ /* Never before the first update, which is the one the server does: there is
354
+ no render root to query there, and `querySelector` is not merely empty on
355
+ Lit's element shim, it is undefined. There is also no caret to keep before
356
+ anything has rendered. */
357
+ if (!this.hasUpdated) {
358
+ return;
359
+ }
360
+ const control = this.control;
361
+ if (changed.has('value') && control && this.shadowRoot?.activeElement === control) {
362
+ this.releaseCaret = holdCaret(control);
363
+ }
364
+ }
365
+ updated(changed) {
366
+ super.updated(changed);
367
+ this.releaseCaret?.();
368
+ this.releaseCaret = undefined;
369
+ this.sync();
370
+ }
371
+ render() {
372
+ /* Label, field, and one line under it.
373
+ The hint and the feedback share that line rather than stacking, so a
374
+ field is the same height either way and nothing below it moves when the
375
+ message changes. */
376
+ return html `${this.renderLabel()}
377
+ <div part="field">
378
+ <slot name="start"></slot>
379
+ <input
380
+ part="control"
381
+ id="control"
382
+ .value=${this.value}
383
+ type=${this.effectiveType}
384
+ name=${this.name || nothing}
385
+ placeholder=${this.placeholder || nothing}
386
+ autocomplete=${this.autocomplete || nothing}
387
+ pattern=${this.pattern || nothing}
388
+ minlength=${this.minLength ?? nothing}
389
+ maxlength=${this.maxLength ?? nothing}
390
+ aria-describedby=${this.describedBy ?? nothing}
391
+ ?disabled=${this.isDisabled}
392
+ ?readonly=${this.readOnly}
393
+ ?required=${this.required}
394
+ @input=${this.handleInput}
395
+ @change=${this.handleChange}
396
+ />
397
+ <slot name="end"></slot>
398
+ <!-- In the tab order, unlike the browser's own search clear, which is not
399
+ reachable by keyboard at all. That is defensible for a native control
400
+ a reader can empty with select-all and Delete, and less so for one
401
+ whose only affordance is an icon: a control that exists on screen and
402
+ cannot be reached is one a keyboard reader is told about and cannot
403
+ use. It only exists while there is a value, so the extra stop appears
404
+ exactly when there is something to do with it. -->
405
+ ${this.showsClear
406
+ ? html `<button
407
+ part="clear"
408
+ type="button"
409
+ aria-label=${this.clearLabel}
410
+ @click=${this.handleClear}
411
+ >
412
+ ${drawIcon(x)}
413
+ </button>`
414
+ : nothing}
415
+ ${this.reveal && this.type === 'password'
416
+ ? html `<button
417
+ part="reveal"
418
+ type="button"
419
+ aria-label=${this.revealLabel}
420
+ aria-pressed=${this.revealed ? 'true' : 'false'}
421
+ ?disabled=${this.isDisabled}
422
+ @click=${() => {
423
+ this.revealed = !this.revealed;
424
+ }}
425
+ >
426
+ ${drawIcon(this.revealed ? eyeSlash : eye)}
427
+ </button>`
428
+ : nothing}
429
+ </div>
430
+ ${this.renderHint()}${this.renderFeedback()}`;
431
+ }
432
+ };
433
+ __decorate([
434
+ property()
435
+ ], HelixHeadlessInput.prototype, "autocomplete", void 0);
436
+ __decorate([
437
+ property()
438
+ ], HelixHeadlessInput.prototype, "placeholder", void 0);
439
+ __decorate([
440
+ property({ attribute: 'readonly', reflect: true, type: Boolean })
441
+ ], HelixHeadlessInput.prototype, "readOnly", void 0);
442
+ __decorate([
443
+ property()
444
+ ], HelixHeadlessInput.prototype, "type", void 0);
445
+ __decorate([
446
+ property({ type: Boolean })
447
+ ], HelixHeadlessInput.prototype, "clearable", void 0);
448
+ __decorate([
449
+ property({ attribute: 'clear-label' })
450
+ ], HelixHeadlessInput.prototype, "clearLabel", void 0);
451
+ __decorate([
452
+ property({ type: Boolean })
453
+ ], HelixHeadlessInput.prototype, "reveal", void 0);
454
+ __decorate([
455
+ property({ attribute: 'reveal-label' })
456
+ ], HelixHeadlessInput.prototype, "revealLabel", void 0);
457
+ __decorate([
458
+ state()
459
+ ], HelixHeadlessInput.prototype, "revealed", void 0);
460
+ __decorate([
461
+ property()
462
+ ], HelixHeadlessInput.prototype, "pattern", void 0);
463
+ __decorate([
464
+ property({ attribute: 'minlength', type: Number })
465
+ ], HelixHeadlessInput.prototype, "minLength", void 0);
466
+ __decorate([
467
+ property({ attribute: 'maxlength', type: Number })
468
+ ], HelixHeadlessInput.prototype, "maxLength", void 0);
469
+ HelixHeadlessInput = __decorate([
470
+ customElement('helix-headless-input')
471
+ ], HelixHeadlessInput);
472
+ export { HelixHeadlessInput };
@@ -0,0 +1 @@
1
+ export * from './root/kbd-root.js';
@@ -0,0 +1 @@
1
+ export * from './root/kbd-root.js';
@@ -0,0 +1,98 @@
1
+ import { HelixElement } from '@fusion.dev/helix-core';
2
+ import { type TemplateResult } from 'lit';
3
+ /**
4
+ * @summary A keyboard key or chord, set inline with text.
5
+ *
6
+ * @description
7
+ * Renders a real `<kbd>`, so the passage still means "press this" to anything
8
+ * reading the markup rather than only to a reader looking at it.
9
+ *
10
+ * **One key per element, with `keys` as the stated exception.** A *sequence* is
11
+ * several of these with the separator written between them as ordinary text,
12
+ * because that separator is prose: it is "then" in a sequence and "plus" in a
13
+ * simultaneous press, and a component that inserted one would have to guess
14
+ * which. `keys` cannot be guessing, since a chord written `mod+k` has said
15
+ * which it is.
16
+ *
17
+ * **`keys` exists because the glyphs were being typed by hand and were wrong.**
18
+ * A literal `⌘K` in a template tells a reader on Windows to press a key their
19
+ * keyboard does not have, and nothing catches it, a string being a string.
20
+ * Given `mod` this renders `⌘K` on Apple and `Ctrl+K` everywhere else.
21
+ *
22
+ * **`within` is what binds it, and it is absent by default.** Without it this
23
+ * draws a key and listens for nothing, which is what every existing use of this
24
+ * component wants. The two values are the two honest lifetimes:
25
+ *
26
+ * - `control` listens within the element's own parent, which is the case this
27
+ * is mostly for: a hint sitting inside the control it belongs to, where the
28
+ * shortcut should work while that control has focus and stop existing when
29
+ * the control does.
30
+ * - `document` listens on the document, for a chord that works from anywhere.
31
+ *
32
+ * *Corrected 25 Aug 2026: this said `scope`, `self` and `global` until then,
33
+ * naming a property that has never existed under that name. The rename is
34
+ * explained on the property itself, twenty lines below, and this paragraph
35
+ * above it went on teaching the old one. A reader who trusted the class doc
36
+ * wrote an attribute that binds nothing, which is also what an unset `within`
37
+ * does, so nothing about the mistake looked like one.*
38
+ *
39
+ * **A hidden `kbd` is a dead shortcut, and that is the point rather than a
40
+ * trap.** Binding here ties the key to its own advertisement, so a hint that is
41
+ * not rendered is a shortcut that is not offered. A chord that must outlive its
42
+ * label is a chord whose owner is not a label: give it to whatever owns the
43
+ * action and let this element only describe it.
44
+ *
45
+ * Nothing binds until this upgrades, so a shortcut is not available in the
46
+ * moments before hydration.
47
+ *
48
+ * @since 0.1.0
49
+ * @status stable
50
+ * @category typography
51
+ * @aliases Key, Shortcut, Hotkey
52
+ * @documentation https://helix.fusion.dev/components/kbd
53
+ *
54
+ * @slot - The key's label, where `keys` is not set.
55
+ *
56
+ * @event {HelixShortcutEvent} helix-shortcut - Fired when the chord is pressed, and cancelable.
57
+ *
58
+ * @csspart kbd - The key.
59
+ */
60
+ export declare class HelixHeadlessKbd extends HelixElement {
61
+ /**
62
+ * The chord, written plainly: `mod+k`, `shift+?`, `/`.
63
+ *
64
+ * `mod` is the platform's own command modifier, which is the reason to write
65
+ * a chord here rather than a glyph: it is the one token whose right answer
66
+ * differs per reader.
67
+ */
68
+ keys: string;
69
+ /**
70
+ * Where the chord is listened for, and whether it is listened for at all.
71
+ *
72
+ * Unset draws a key and binds nothing.
73
+ *
74
+ * **Named `within` because `scope` is taken.** `scope` is a real HTML
75
+ * attribute belonging to `<th>`, so putting one on anything else is both a
76
+ * lint failure and a word in the DOM that already means something narrower.
77
+ * `within` says the same thing and says it about this element.
78
+ */
79
+ within?: 'control' | 'document';
80
+ /** The element the listener is on, kept so it can be taken off the same one. */
81
+ private listening;
82
+ connectedCallback(): void;
83
+ disconnectedCallback(): void;
84
+ protected updated(changed: Map<string, unknown>): void;
85
+ /** The chord as this reader's keyboard labels it. */
86
+ private get label();
87
+ private listen;
88
+ private deafen;
89
+ private readonly handleKeydown;
90
+ /** Whether a press is this chord, modifiers and all. */
91
+ private matches_;
92
+ protected render(): TemplateResult;
93
+ }
94
+ declare global {
95
+ interface HTMLElementTagNameMap {
96
+ 'helix-headless-kbd': HelixHeadlessKbd;
97
+ }
98
+ }