@fusion.dev/helix-headless 0.144.0 → 0.146.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/custom-elements.json +15195 -4240
  2. package/dist/accordion/item/accordion-item.d.ts +62 -12
  3. package/dist/accordion/item/accordion-item.js +41 -10
  4. package/dist/accordion/root/accordion-root.d.ts +14 -5
  5. package/dist/accordion/root/accordion-root.js +7 -1
  6. package/dist/announcement/root/announcement-root.d.ts +24 -3
  7. package/dist/announcement/root/announcement-root.js +39 -2
  8. package/dist/app-header/root/app-header-root.d.ts +12 -0
  9. package/dist/app-header/root/app-header-root.js +13 -1
  10. package/dist/app-header/sectioning.d.ts +9 -0
  11. package/dist/app-header/sectioning.js +27 -0
  12. package/dist/avatar/group/avatar-group.d.ts +20 -14
  13. package/dist/avatar/group/avatar-group.js +17 -19
  14. package/dist/badge/root/badge-root.d.ts +3 -1
  15. package/dist/badge/root/badge-root.js +2 -2
  16. package/dist/bar-chart/root/bar-chart-root.d.ts +18 -1
  17. package/dist/bar-chart/root/bar-chart-root.js +52 -15
  18. package/dist/bar-chart/stack.d.ts +15 -0
  19. package/dist/bar-chart/stack.js +19 -0
  20. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +57 -1
  21. package/dist/breadcrumbs/root/breadcrumbs-root.js +73 -3
  22. package/dist/button/root/button-root.d.ts +26 -0
  23. package/dist/button/root/button-root.js +38 -18
  24. package/dist/button-group/root/button-group-root.d.ts +2 -1
  25. package/dist/button-group/root/button-group-root.js +5 -1
  26. package/dist/canvas/node/canvas-node.d.ts +4 -3
  27. package/dist/canvas/node/canvas-node.js +3 -2
  28. package/dist/canvas/root/canvas-root.d.ts +38 -3
  29. package/dist/canvas/root/canvas-root.js +123 -42
  30. package/dist/card/root/card-root.d.ts +24 -3
  31. package/dist/card/root/card-root.js +20 -8
  32. package/dist/carousel/root/carousel-root.d.ts +133 -4
  33. package/dist/carousel/root/carousel-root.js +174 -24
  34. package/dist/carousel/stops.d.ts +20 -0
  35. package/dist/carousel/stops.js +30 -0
  36. package/dist/chat/composer/chat-composer.d.ts +38 -6
  37. package/dist/chat/composer/chat-composer.js +42 -9
  38. package/dist/chat/message/chat-message.d.ts +32 -1
  39. package/dist/chat/message/chat-message.js +27 -10
  40. package/dist/chat/naming.d.ts +26 -0
  41. package/dist/chat/naming.js +14 -0
  42. package/dist/chat/root/chat-root.d.ts +58 -0
  43. package/dist/chat/root/chat-root.js +43 -3
  44. package/dist/checkbox/root/checkbox-root.d.ts +20 -0
  45. package/dist/checkbox/root/checkbox-root.js +14 -1
  46. package/dist/checkbox-group/root/checkbox-group-root.d.ts +8 -2
  47. package/dist/checkbox-group/root/checkbox-group-root.js +12 -10
  48. package/dist/checkbox-group/select-all.d.ts +27 -0
  49. package/dist/checkbox-group/select-all.js +12 -0
  50. package/dist/code-block/highlight.d.ts +15 -0
  51. package/dist/code-block/highlight.js +4 -0
  52. package/dist/code-block/root/code-block-root.d.ts +57 -2
  53. package/dist/code-block/root/code-block-root.js +63 -8
  54. package/dist/color-input/root/color-input-root.d.ts +3 -0
  55. package/dist/color-input/root/color-input-root.js +6 -3
  56. package/dist/color-picker/root/color-picker-root.d.ts +33 -4
  57. package/dist/color-picker/root/color-picker-root.js +80 -21
  58. package/dist/color-picker/swatches.d.ts +12 -0
  59. package/dist/color-picker/swatches.js +26 -0
  60. package/dist/combobox/root/combobox-root.d.ts +43 -0
  61. package/dist/combobox/root/combobox-root.js +79 -15
  62. package/dist/command/root/command-root.d.ts +16 -1
  63. package/dist/command/root/command-root.js +22 -4
  64. package/dist/copy-button/root/copy-button-root.d.ts +26 -1
  65. package/dist/copy-button/root/copy-button-root.js +12 -5
  66. package/dist/data-table/index.d.ts +1 -1
  67. package/dist/data-table/index.js +1 -1
  68. package/dist/data-table/keys.d.ts +24 -0
  69. package/dist/data-table/keys.js +24 -0
  70. package/dist/data-table/root/data-table-root.d.ts +170 -13
  71. package/dist/data-table/root/data-table-root.js +294 -52
  72. package/dist/data-table/tree.d.ts +55 -0
  73. package/dist/data-table/tree.js +54 -0
  74. package/dist/date-input/root/date-input-root.d.ts +3 -1
  75. package/dist/date-input/root/date-input-root.js +18 -7
  76. package/dist/date-picker/root/date-picker-root.js +12 -6
  77. package/dist/description-list/item/description-list-item.d.ts +17 -2
  78. package/dist/description-list/item/description-list-item.js +15 -2
  79. package/dist/description-list/root/description-list-root.d.ts +27 -1
  80. package/dist/description-list/root/description-list-root.js +26 -1
  81. package/dist/dialog/description.js +15 -1
  82. package/dist/dialog/root/dialog-root.d.ts +8 -2
  83. package/dist/dialog/root/dialog-root.js +16 -1
  84. package/dist/divider/root/divider-root.d.ts +3 -0
  85. package/dist/divider/root/divider-root.js +2 -1
  86. package/dist/donut-chart/root/donut-chart-root.d.ts +31 -0
  87. package/dist/donut-chart/root/donut-chart-root.js +48 -1
  88. package/dist/drawer/reveal.d.ts +8 -0
  89. package/dist/drawer/reveal.js +1 -0
  90. package/dist/drawer/root/drawer-root.d.ts +59 -0
  91. package/dist/drawer/root/drawer-root.js +63 -4
  92. package/dist/drilldown/item/drilldown-item.d.ts +11 -6
  93. package/dist/drilldown/item/drilldown-item.js +8 -5
  94. package/dist/drilldown/root/drilldown-root.d.ts +29 -0
  95. package/dist/drilldown/root/drilldown-root.js +28 -5
  96. package/dist/element-events.generated.js +83 -12
  97. package/dist/empty/root/empty-root.d.ts +3 -1
  98. package/dist/empty/root/empty-root.js +3 -2
  99. package/dist/file-input/root/file-input-root.d.ts +69 -6
  100. package/dist/file-input/root/file-input-root.js +82 -19
  101. package/dist/file-input/screen.d.ts +2 -1
  102. package/dist/filter-input/menu/filter-menu.d.ts +5 -0
  103. package/dist/filter-input/menu/filter-menu.js +16 -4
  104. package/dist/filter-input/root/filter-input-root.d.ts +30 -6
  105. package/dist/filter-input/root/filter-input-root.js +1 -1
  106. package/dist/filter-input/suggest.d.ts +28 -3
  107. package/dist/filter-input/suggest.js +18 -8
  108. package/dist/format-date/root/format-date-root.d.ts +9 -16
  109. package/dist/format-date/root/format-date-root.js +10 -27
  110. package/dist/heatmap/root/heatmap-root.d.ts +24 -13
  111. package/dist/heatmap/root/heatmap-root.js +34 -12
  112. package/dist/icon/root/icon-root.d.ts +12 -1
  113. package/dist/icon/root/icon-root.js +21 -10
  114. package/dist/icon/settle.d.ts +7 -0
  115. package/dist/icon/settle.js +10 -0
  116. package/dist/icon-button/root/icon-button-root.d.ts +2 -0
  117. package/dist/image/root/image-root.d.ts +5 -1
  118. package/dist/image/root/image-root.js +10 -2
  119. package/dist/input/root/input-root.d.ts +13 -3
  120. package/dist/input/root/input-root.js +12 -3
  121. package/dist/kbd/root/kbd-root.d.ts +35 -1
  122. package/dist/kbd/root/kbd-root.js +23 -4
  123. package/dist/legend/root/legend-root.d.ts +55 -8
  124. package/dist/legend/root/legend-root.js +55 -13
  125. package/dist/lightbox/root/lightbox-root.d.ts +49 -6
  126. package/dist/lightbox/root/lightbox-root.js +86 -19
  127. package/dist/lightbox/zoom-controller.d.ts +59 -0
  128. package/dist/lightbox/zoom-controller.js +128 -0
  129. package/dist/lightbox/zoom.d.ts +22 -0
  130. package/dist/lightbox/zoom.js +16 -0
  131. package/dist/line-chart/root/line-chart-root.d.ts +22 -1
  132. package/dist/line-chart/root/line-chart-root.js +21 -1
  133. package/dist/list/item/list-item.d.ts +70 -1
  134. package/dist/list/item/list-item.js +77 -6
  135. package/dist/list/numbering.d.ts +14 -0
  136. package/dist/list/numbering.js +8 -0
  137. package/dist/list/root/list-root.d.ts +155 -9
  138. package/dist/list/root/list-root.js +246 -4
  139. package/dist/list/selection.d.ts +49 -0
  140. package/dist/list/selection.js +30 -0
  141. package/dist/listbox/root/listbox-root.d.ts +37 -1
  142. package/dist/listbox/root/listbox-root.js +49 -4
  143. package/dist/loader/busy.d.ts +10 -0
  144. package/dist/loader/busy.js +11 -0
  145. package/dist/loader/root/loader-root.d.ts +9 -2
  146. package/dist/loader/root/loader-root.js +23 -3
  147. package/dist/map/root/map-root.d.ts +6 -2
  148. package/dist/map/root/map-root.js +5 -2
  149. package/dist/megamenu/root/megamenu-root.d.ts +62 -0
  150. package/dist/megamenu/root/megamenu-root.js +90 -5
  151. package/dist/menu/index.d.ts +1 -0
  152. package/dist/menu/index.js +1 -0
  153. package/dist/menu/item/menu-item.d.ts +87 -11
  154. package/dist/menu/item/menu-item.js +78 -22
  155. package/dist/menu/root/menu-root.d.ts +39 -1
  156. package/dist/menu/root/menu-root.js +65 -8
  157. package/dist/menu/section/menu-section.d.ts +55 -0
  158. package/dist/menu/section/menu-section.js +60 -0
  159. package/dist/meter/root/meter-root.d.ts +20 -1
  160. package/dist/meter/root/meter-root.js +11 -15
  161. package/dist/navigation/root/navigation-root.d.ts +18 -2
  162. package/dist/navigation/root/navigation-root.js +29 -3
  163. package/dist/notifications/root/notifications-root.d.ts +25 -0
  164. package/dist/notifications/root/notifications-root.js +33 -5
  165. package/dist/number-input/root/number-input-root.d.ts +17 -8
  166. package/dist/number-input/root/number-input-root.js +2 -7
  167. package/dist/object-inspector/root/object-inspector-root.d.ts +161 -32
  168. package/dist/object-inspector/root/object-inspector-root.js +264 -123
  169. package/dist/object-inspector/rows.d.ts +75 -0
  170. package/dist/object-inspector/rows.js +119 -0
  171. package/dist/option/root/option-root.d.ts +5 -3
  172. package/dist/outline/levels.d.ts +31 -0
  173. package/dist/outline/levels.js +23 -0
  174. package/dist/outline/root/outline-root.d.ts +86 -3
  175. package/dist/outline/root/outline-root.js +95 -12
  176. package/dist/pagination/size/pagination-size.d.ts +12 -2
  177. package/dist/pagination/size/pagination-size.js +20 -5
  178. package/dist/pin-input/code.d.ts +10 -0
  179. package/dist/pin-input/code.js +13 -0
  180. package/dist/pin-input/root/pin-input-root.d.ts +25 -1
  181. package/dist/pin-input/root/pin-input-root.js +10 -11
  182. package/dist/popover/hide-outside.d.ts +14 -0
  183. package/dist/popover/hide-outside.js +41 -0
  184. package/dist/popover/root/popover-root.d.ts +57 -7
  185. package/dist/popover/root/popover-root.js +58 -3
  186. package/dist/progress/root/progress-root.d.ts +20 -0
  187. package/dist/progress/root/progress-root.js +15 -15
  188. package/dist/qr-code/export.d.ts +26 -1
  189. package/dist/qr-code/export.js +14 -0
  190. package/dist/qr-code/root/qr-code-root.d.ts +19 -5
  191. package/dist/qr-code/root/qr-code-root.js +58 -9
  192. package/dist/quote/marks.d.ts +8 -0
  193. package/dist/quote/marks.js +5 -0
  194. package/dist/quote/root/quote-root.d.ts +14 -2
  195. package/dist/quote/root/quote-root.js +23 -1
  196. package/dist/radio/group/radio-group.d.ts +4 -10
  197. package/dist/radio/group/radio-group.js +5 -10
  198. package/dist/radio/root/radio-root.d.ts +6 -2
  199. package/dist/radio/root/radio-root.js +6 -1
  200. package/dist/rating/root/rating-root.d.ts +10 -5
  201. package/dist/rating/root/rating-root.js +32 -8
  202. package/dist/rating/steps.d.ts +7 -0
  203. package/dist/rating/steps.js +9 -0
  204. package/dist/scatter-chart/fit.d.ts +15 -0
  205. package/dist/scatter-chart/fit.js +35 -0
  206. package/dist/scatter-chart/root/scatter-chart-root.d.ts +21 -1
  207. package/dist/scatter-chart/root/scatter-chart-root.js +30 -17
  208. package/dist/scroll-area/root/scroll-area-root.d.ts +84 -0
  209. package/dist/scroll-area/root/scroll-area-root.js +106 -7
  210. package/dist/scroll-area/scrollbar-controller.d.ts +111 -0
  211. package/dist/scroll-area/scrollbar-controller.js +172 -0
  212. package/dist/scroll-area/scrollbar.d.ts +92 -0
  213. package/dist/scroll-area/scrollbar.js +33 -0
  214. package/dist/select/root/select-root.d.ts +15 -0
  215. package/dist/select/root/select-root.js +18 -6
  216. package/dist/skeleton/root/skeleton-root.d.ts +3 -0
  217. package/dist/skeleton/root/skeleton-root.js +4 -2
  218. package/dist/skip-link/root/skip-link-root.js +2 -2
  219. package/dist/slider/root/slider-root.d.ts +41 -4
  220. package/dist/slider/root/slider-root.js +23 -3
  221. package/dist/sparkline/readings.d.ts +18 -0
  222. package/dist/sparkline/readings.js +19 -0
  223. package/dist/sparkline/root/sparkline-root.d.ts +78 -7
  224. package/dist/sparkline/root/sparkline-root.js +118 -23
  225. package/dist/speed-dial/root/speed-dial-root.js +2 -2
  226. package/dist/splitter/root/splitter-root.d.ts +20 -12
  227. package/dist/splitter/root/splitter-root.js +226 -203
  228. package/dist/splitter/snap.d.ts +9 -0
  229. package/dist/splitter/snap.js +12 -0
  230. package/dist/stat/root/stat-root.d.ts +14 -5
  231. package/dist/stat/root/stat-root.js +21 -5
  232. package/dist/steps/reach.d.ts +20 -0
  233. package/dist/steps/reach.js +15 -0
  234. package/dist/steps/root/steps-root.d.ts +76 -0
  235. package/dist/steps/root/steps-root.js +93 -1
  236. package/dist/steps/step/step.d.ts +45 -2
  237. package/dist/steps/step/step.js +33 -6
  238. package/dist/switch/root/switch-root.d.ts +10 -0
  239. package/dist/table/column/table-column.d.ts +11 -10
  240. package/dist/table/column/table-column.js +8 -19
  241. package/dist/table/root/table-root.d.ts +126 -4
  242. package/dist/table/root/table-root.js +156 -6
  243. package/dist/table/row/table-row.d.ts +47 -1
  244. package/dist/table/row/table-row.js +39 -2
  245. package/dist/tabs/panel/tab-panel.d.ts +22 -5
  246. package/dist/tabs/panel/tab-panel.js +34 -6
  247. package/dist/tabs/root/tabs-root.d.ts +37 -1
  248. package/dist/tabs/root/tabs-root.js +22 -4
  249. package/dist/tabs/tab/tab.d.ts +41 -4
  250. package/dist/tabs/tab/tab.js +49 -3
  251. package/dist/tag/group/tag-group.d.ts +31 -4
  252. package/dist/tag/group/tag-group.js +46 -7
  253. package/dist/tag/root/tag-root.js +9 -2
  254. package/dist/textarea/root/textarea-root.d.ts +28 -1
  255. package/dist/textarea/root/textarea-root.js +40 -1
  256. package/dist/time-input/root/time-input-root.d.ts +5 -1
  257. package/dist/time-input/root/time-input-root.js +16 -8
  258. package/dist/time-picker/root/time-picker-root.d.ts +18 -4
  259. package/dist/time-picker/root/time-picker-root.js +7 -10
  260. package/dist/time-picker/wheel-name.d.ts +9 -0
  261. package/dist/time-picker/wheel-name.js +15 -0
  262. package/dist/timeline/group/timeline-group.d.ts +46 -0
  263. package/dist/timeline/group/timeline-group.js +37 -0
  264. package/dist/timeline/index.d.ts +1 -0
  265. package/dist/timeline/index.js +1 -0
  266. package/dist/timeline/root/timeline-root.d.ts +10 -3
  267. package/dist/toast/item/toast-item.d.ts +24 -18
  268. package/dist/toast/item/toast-item.js +36 -40
  269. package/dist/toast/root/toast-root.d.ts +6 -0
  270. package/dist/toast/root/toast-root.js +16 -1
  271. package/dist/toggle/group/toggle-group.d.ts +24 -3
  272. package/dist/toggle/group/toggle-group.js +34 -5
  273. package/dist/toolbar/root/toolbar-root.d.ts +13 -0
  274. package/dist/toolbar/root/toolbar-root.js +15 -5
  275. package/dist/tooltip/root/tooltip-root.d.ts +13 -2
  276. package/dist/tooltip/root/tooltip-root.js +9 -1
  277. package/dist/tour/back.d.ts +10 -0
  278. package/dist/tour/back.js +8 -0
  279. package/dist/tour/root/tour-root.d.ts +30 -2
  280. package/dist/tour/root/tour-root.js +34 -8
  281. package/dist/tree/item/tree-item.d.ts +61 -4
  282. package/dist/tree/item/tree-item.js +92 -20
  283. package/dist/tree/root/tree-root.d.ts +58 -0
  284. package/dist/tree/root/tree-root.js +80 -16
  285. package/dist/tree/selection.d.ts +24 -0
  286. package/dist/tree/selection.js +13 -0
  287. package/dist/trend/root/trend-root.d.ts +43 -18
  288. package/dist/trend/root/trend-root.js +31 -6
  289. package/dist/video/media-events.d.ts +44 -0
  290. package/dist/video/media-events.js +35 -0
  291. package/dist/video/root/video-root.d.ts +117 -18
  292. package/dist/video/root/video-root.js +93 -47
  293. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
  294. package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
  295. package/dist/video-playlist/order.d.ts +41 -0
  296. package/dist/video-playlist/order.js +34 -0
  297. package/dist/video-playlist/root/video-playlist-root.d.ts +77 -3
  298. package/dist/video-playlist/root/video-playlist-root.js +60 -16
  299. package/dist/virtual-list/controls.d.ts +4 -0
  300. package/dist/virtual-list/controls.js +30 -0
  301. package/dist/virtual-list/fill.d.ts +22 -0
  302. package/dist/virtual-list/fill.js +23 -0
  303. package/dist/virtual-list/keys.d.ts +15 -0
  304. package/dist/virtual-list/keys.js +24 -0
  305. package/dist/virtual-list/plan.d.ts +49 -0
  306. package/dist/virtual-list/plan.js +16 -0
  307. package/dist/virtual-list/root/virtual-list-root.d.ts +259 -26
  308. package/dist/virtual-list/root/virtual-list-root.js +333 -49
  309. package/lint.json +1 -1
  310. package/package.json +8 -8
  311. package/types/jsx.d.ts +8113 -1394
  312. package/types/svelte.d.ts +2 -0
  313. package/types/vue.d.ts +1678 -353
  314. package/dist/data-table/root/order.d.ts +0 -141
  315. package/dist/data-table/root/order.js +0 -76
  316. package/dist/listbox/range.d.ts +0 -17
  317. package/dist/listbox/range.js +0 -5
  318. package/dist/tag/selection.d.ts +0 -10
  319. package/dist/tag/selection.js +0 -12
@@ -1,23 +1,30 @@
1
1
  import { HelixElement } from '@fusion.dev/helix-core';
2
- import { type TemplateResult } from 'lit';
2
+ import { type PropertyValues, type TemplateResult } from 'lit';
3
3
  /**
4
4
  * @summary An indicator that shows which way a measurement moved, and whether the change is good.
5
5
  *
6
6
  * @description
7
- * A trend has three parts: a direction of up, down, or neutral, the metric that
8
- * moved, and a label for the period it moved over. The arrow shows the
9
- * direction and its color shows whether the change is good. Direction and
7
+ * A trend has three parts: a `movement` of up, down, or neutral, the metric
8
+ * that moved, and a label for the period it moved over. The arrow shows the
9
+ * movement and its color shows whether the change is good. Movement and
10
10
  * judgment are separate properties because they are separate facts.
11
11
  *
12
12
  * `good` is unset by default, so a trend with no judgment is gray. For churn,
13
13
  * latency, error rate, cost, and bounce rate, up is bad. Set the metric's
14
14
  * polarity once with `good`, and the component picks the color from the
15
- * direction.
15
+ * movement. The judgment is also a custom state, `better` or `worse`, for a
16
+ * sheet of your own.
16
17
  *
17
- * The direction is also written as a word, so a screen reader reads it. The
18
+ * The movement is also written as a word, so a screen reader reads it. The
18
19
  * styled tier hides `part="direction"` visually and keeps it in the
19
20
  * accessibility tree. The words are properties, `up-label` through
20
- * `worse-label`, so a page in another language can set its own.
21
+ * `worse-label`, so a page in another language can set its own. The arrow and
22
+ * any glyph slotted in its place are hidden from screen readers.
23
+ *
24
+ * Slot one glyph per movement into `up-icon`, `down-icon` and `neutral-icon`,
25
+ * and the trend shows the one that matches; a glyph in `icon` stands in for
26
+ * all three. Inside a `Stat`, put the trend in the stat's `trend` slot so it is
27
+ * read with the figure it qualifies.
21
28
  *
22
29
  * The metric and the label are bare slots. An element that assigned its own
23
30
  * slot on connect would add an attribute to its host after upgrade, which the
@@ -30,11 +37,17 @@ import { type TemplateResult } from 'lit';
30
37
  * @documentation https://fusion.dev/helix/components/trend
31
38
  *
32
39
  * @slot - The metric that moved.
33
- * @slot icon - Replaces the arrow, such as with a glyph of your own set. Slot the one for the current direction.
40
+ * @slot down-icon - Replaces the arrow while `movement` is `down`. Hidden from screen readers.
41
+ * @slot icon - Replaces the arrow for every movement, such as with a glyph of your own set. Hidden from screen readers, since the movement is also a word.
34
42
  * @slot label - The period the metric moved over.
43
+ * @slot neutral-icon - Replaces the bar while the trend has not moved. Hidden from screen readers.
44
+ * @slot up-icon - Replaces the arrow while `movement` is `up`. Hidden from screen readers.
35
45
  *
36
- * @csspart direction - The direction as a word, for people who cannot see the arrow.
46
+ * @csspart direction - The movement as a word, for people who cannot see the arrow.
37
47
  * @csspart icon - The arrow.
48
+ *
49
+ * @cssstate better - The trend moved the way `good` names.
50
+ * @cssstate worse - The trend moved against the way `good` names.
38
51
  */
39
52
  export declare class HelixHeadlessTrend extends HelixElement {
40
53
  /**
@@ -42,14 +55,11 @@ export declare class HelixHeadlessTrend extends HelixElement {
42
55
  */
43
56
  betterLabel: string;
44
57
  /**
45
- * Which way the measurement moved.
58
+ * Which way the measurement moved, as `movement` says it.
46
59
  *
47
- * Absent is neutral, so a trend with nothing to report draws a bar rather
48
- * than picking a direction. Optional rather than defaulted for the reason
49
- * `Stat.direction` is: a reflecting property with a default writes its
50
- * attribute onto the host the moment the element upgrades, and the host is
51
- * markup the consumer rendered, which React compares against what it rendered
52
- * and reports as a hydration mismatch.
60
+ * @deprecated Use `movement`. `direction` is a layout on `Stat` and `Flex`,
61
+ * which are written beside a trend, so one word meant two things. Still read
62
+ * when `movement` is absent.
53
63
  */
54
64
  direction?: 'down' | 'neutral' | 'up';
55
65
  /**
@@ -57,14 +67,24 @@ export declare class HelixHeadlessTrend extends HelixElement {
57
67
  */
58
68
  downLabel: string;
59
69
  /**
60
- * Which direction counts as an improvement for this metric.
70
+ * Which movement counts as an improvement for this metric.
61
71
  *
62
72
  * Absent states the movement without judging it, which is the honest default:
63
73
  * revenue up is good news and latency up is bad news, and only the consumer
64
74
  * knows which one this is. Set it once per metric and it holds while the
65
- * direction changes underneath.
75
+ * movement changes underneath.
66
76
  */
67
77
  good?: 'down' | 'up';
78
+ /**
79
+ * Which way the measurement moved.
80
+ *
81
+ * Absent is neutral, so a trend with nothing to report draws a bar rather
82
+ * than picking a direction. Optional rather than defaulted: a reflecting
83
+ * property with a default writes its attribute onto the host the moment the
84
+ * element upgrades, and the host is markup the consumer rendered, which React
85
+ * compares against what it rendered and reports as a hydration mismatch.
86
+ */
87
+ movement?: 'down' | 'neutral' | 'up';
68
88
  /**
69
89
  * The word read out for no move, or for a direction that is not one of the
70
90
  * three.
@@ -90,6 +110,11 @@ export declare class HelixHeadlessTrend extends HelixElement {
90
110
  content: string;
91
111
  viewBox: string;
92
112
  }): TemplateResult;
113
+ /** The movement, read from `movement` and then from the old `direction`. */
114
+ private get moved();
115
+ /** Better or worse, or neither when `good` is unset or nothing moved. */
116
+ private get judged();
117
+ protected willUpdate(changed: PropertyValues): void;
93
118
  protected render(): TemplateResult;
94
119
  }
95
120
  declare global {
@@ -25,7 +25,7 @@ let HelixHeadlessTrend = class HelixHeadlessTrend extends HelixElement {
25
25
  this.worseLabel = 'worse';
26
26
  }
27
27
  renderIcon(icon) {
28
- return html `<slot name="icon"
28
+ return html `<slot aria-hidden="true" name="icon"
29
29
  ><svg
30
30
  aria-hidden="true"
31
31
  data-glyph
@@ -37,12 +37,34 @@ let HelixHeadlessTrend = class HelixHeadlessTrend extends HelixElement {
37
37
  </svg></slot
38
38
  >`;
39
39
  }
40
+ get moved() {
41
+ return this.movement ?? this.direction;
42
+ }
43
+ get judged() {
44
+ const moved = this.moved;
45
+ if (!this.good || !moved || !(moved in DIRECTIONS) || moved === 'neutral') {
46
+ return undefined;
47
+ }
48
+ return this.good === moved ? 'better' : 'worse';
49
+ }
50
+ willUpdate(changed) {
51
+ super.willUpdate(changed);
52
+ const judged = this.judged;
53
+ this.toggleState('better', judged === 'better');
54
+ this.toggleState('worse', judged === 'worse');
55
+ }
40
56
  render() {
41
- const direction = readDirection(this.direction);
42
- const judgment = this.good && this.direction && this.direction !== 'neutral'
43
- ? `, ${this.good === this.direction ? this.betterLabel : this.worseLabel}`
44
- : '';
45
- return html `${this.renderIcon(direction.icon)}
57
+ const moved = this.moved;
58
+ const direction = readDirection(moved);
59
+ const judged = this.judged;
60
+ const judgment = judged ? `, ${judged === 'better' ? this.betterLabel : this.worseLabel}` : '';
61
+ const icon = this.renderIcon(direction.icon);
62
+ const glyph = moved === 'up'
63
+ ? html `<slot aria-hidden="true" name="up-icon">${icon}</slot>`
64
+ : moved === 'down'
65
+ ? html `<slot aria-hidden="true" name="down-icon">${icon}</slot>`
66
+ : html `<slot aria-hidden="true" name="neutral-icon">${icon}</slot>`;
67
+ return html `${glyph}
46
68
  <span part="direction">${`${this[direction.word]}${judgment}`}</span>
47
69
  <slot></slot>
48
70
  <slot name="label"></slot>`;
@@ -60,6 +82,9 @@ __decorate([
60
82
  __decorate([
61
83
  property({ reflect: true })
62
84
  ], HelixHeadlessTrend.prototype, "good", void 0);
85
+ __decorate([
86
+ property({ reflect: true })
87
+ ], HelixHeadlessTrend.prototype, "movement", void 0);
63
88
  __decorate([
64
89
  property({ attribute: 'unchanged-label' })
65
90
  ], HelixHeadlessTrend.prototype, "unchangedLabel", void 0);
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The media events a player sends on from its inner `<video>`, and how.
3
+ *
4
+ * Separable because the set is a decision about the platform, and nothing in it
5
+ * draws. It is the HTML standard's own summary of the events a media element
6
+ * fires, every one of them, so a consumer who listened on a `<video>` listens
7
+ * on the player with the same names and hears the same things. A shorter list
8
+ * would be one more list for a consumer to learn.
9
+ *
10
+ * None of these crosses a shadow boundary on its own. The video is inside the
11
+ * player's shadow root, so a listener on the element a consumer wrote hears
12
+ * nothing at all without the relay.
13
+ */
14
+ /**
15
+ * Every event a media element fires, by the standard's names, sorted.
16
+ *
17
+ * `resize` is on the list because the standard puts it there: it fires when the
18
+ * video's own width or height changes, which is the moment a consumer sizing
19
+ * something to the picture needs.
20
+ */
21
+ export declare const MEDIA_EVENTS: readonly ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'resize', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting'];
22
+ /** One of the media events the player relays. */
23
+ export type MediaEventName = (typeof MEDIA_EVENTS)[number];
24
+ /**
25
+ * Hands each media event the video fires to `relay`, and returns what stops
26
+ * it. The player relays through `relayNativeEvent`, which sends the same name
27
+ * with the same `bubbles`, `cancelable` and `composed`.
28
+ *
29
+ * **As the platform sends it, neither bubbling nor composed, which is what
30
+ * makes it reach a React consumer at all.** These names are in react-dom's
31
+ * `nonDelegatedEvents`, which React wires on a `<video>` and never on a custom
32
+ * element, so its root listener hears none of them. `bindReactHandler` closes
33
+ * that for an event that does not bubble, and skips one that does, on the
34
+ * grounds that a bubbling relay already reaches React's delegated listener and
35
+ * binding it again would double every call. A copy sent with `bubbles: true`
36
+ * would land in the branch that refuses to bind, and `onPlay` on the player
37
+ * would be silent.
38
+ *
39
+ * Bound once, after the first render, so the player's own listeners in its
40
+ * template are ahead of it on the same video: what a consumer reads off the
41
+ * player in a handler (`paused`, `volume`, `currentTime`) is already the
42
+ * player's state by the time the copy reaches them.
43
+ */
44
+ export declare const relayMedia: (video: EventTarget, relay: (event: Event) => void) => (() => void);
@@ -0,0 +1,35 @@
1
+ export const MEDIA_EVENTS = [
2
+ 'abort',
3
+ 'canplay',
4
+ 'canplaythrough',
5
+ 'durationchange',
6
+ 'emptied',
7
+ 'ended',
8
+ 'error',
9
+ 'loadeddata',
10
+ 'loadedmetadata',
11
+ 'loadstart',
12
+ 'pause',
13
+ 'play',
14
+ 'playing',
15
+ 'progress',
16
+ 'ratechange',
17
+ 'resize',
18
+ 'seeked',
19
+ 'seeking',
20
+ 'stalled',
21
+ 'suspend',
22
+ 'timeupdate',
23
+ 'volumechange',
24
+ 'waiting',
25
+ ];
26
+ export const relayMedia = (video, relay) => {
27
+ for (const name of MEDIA_EVENTS) {
28
+ video.addEventListener(name, relay);
29
+ }
30
+ return () => {
31
+ for (const name of MEDIA_EVENTS) {
32
+ video.removeEventListener(name, relay);
33
+ }
34
+ };
35
+ };
@@ -17,11 +17,22 @@ import '../../menu/index.js';
17
17
  * not drawn, and the keys below are not bound, so a key press does not seek
18
18
  * twice.
19
19
  *
20
- * The keys match other players, and they are bound on the element only:
21
- * - Space and `k` play or pause.
22
- * - The arrow keys seek and change the volume.
23
- * - `m` mutes.
24
- * - `f` toggles fullscreen.
20
+ * **Keyboard.** The keys match other players, and they are bound on the
21
+ * element only, so they work while focus is on the player.
22
+ *
23
+ * | Key | What it does |
24
+ * |---|---|
25
+ * | Space, `k` | Plays or pauses. Space on a button presses the button. |
26
+ * | Right, Left | Moves 5 seconds forward or back. |
27
+ * | Shift with Right or Left | Moves 10 seconds forward or back. |
28
+ * | `l`, `j` | Moves 10 seconds forward or back, as the skip buttons do. |
29
+ * | Up, Down | Raises or lowers the volume by a tenth. |
30
+ * | `m` | Mutes or unmutes. |
31
+ * | `f` | Enters or leaves fullscreen. |
32
+ * | Tab | Moves through the controls on the bar. |
33
+ *
34
+ * On the scrubber and the volume slider, the arrow keys, Page Up, Page Down,
35
+ * Home, and End move the slider, as on any range input.
25
36
  *
26
37
  * `<source>` and `<track>` children are copied into the video. A media element
27
38
  * selects resources from its own child nodes, and a slot is one node, so
@@ -29,6 +40,11 @@ import '../../menu/index.js';
29
40
  * `readyState` of zero, and it would not play. They are copied so your light
30
41
  * DOM stays intact, and are copied again whenever the slot changes.
31
42
  *
43
+ * The player sends every media event of its inner video under the same name,
44
+ * without bubbling, as a `<video>` sends it. Listen on the player as you would
45
+ * on a video: `timeupdate`, `volumechange`, `loadedmetadata`, `error`, and the
46
+ * rest.
47
+ *
32
48
  * @since 0.1.0
33
49
  * @status stable
34
50
  * @category media
@@ -36,15 +52,52 @@ import '../../menu/index.js';
36
52
  * @documentation https://fusion.dev/helix/components/video
37
53
  *
38
54
  * @slot - `<source>` and `<track>` elements, which are copied into the video.
55
+ * @slot captions-icon - Replaces the glyph on the captions control.
39
56
  * @slot controls - Extra controls, added to the control bar before the fullscreen button.
57
+ * @slot download-icon - Replaces the glyph on the download control, on the bar or in the `overflow` menu.
58
+ * @slot exit-fullscreen-icon - Replaces the glyph on the fullscreen control while the player fills the screen.
59
+ * @slot forward-icon - Replaces the glyph on the control that skips forward, on the bar or in the `overflow` menu.
60
+ * @slot fullscreen-icon - Replaces the glyph on the fullscreen control.
40
61
  * @slot header - Content over the top left of the picture, such as a heading and a back button.
62
+ * @slot more-icon - Replaces the glyph on the button that opens the `overflow` menu.
63
+ * @slot mute-icon - Replaces the glyph on the mute control while there is no sound.
64
+ * @slot next-icon - Replaces the glyph on the control that asks for the next video, on the bar or in the `overflow` menu.
65
+ * @slot pause-icon - Replaces the glyph on the play control while the video plays.
66
+ * @slot pip-icon - Replaces the glyph on the picture-in-picture control, on the bar or in the `overflow` menu.
67
+ * @slot play-icon - Replaces the glyph on the play control while the video is paused.
41
68
  * @slot poster - Shown over the video until it starts.
69
+ * @slot previous-icon - Replaces the glyph on the control that asks for the previous video, on the bar or in the `overflow` menu.
70
+ * @slot remote-icon - Replaces the glyph on the control that plays on another device, on the bar or in the `overflow` menu.
71
+ * @slot rewind-icon - Replaces the glyph on the control that skips back, on the bar or in the `overflow` menu.
72
+ * @slot speed-icon - Replaces the glyph beside the playback speed in the `overflow` menu. On the bar, the speed is shown as a number.
73
+ * @slot start-icon - Replaces the glyph on the large play button over the picture.
74
+ * @slot volume-icon - Replaces the glyph on the mute control while there is sound.
42
75
  *
43
- * @event {Event} ended - The video reached its end. Relayed from the inner video, since the native event does not cross the shadow boundary.
76
+ * @event {Event} abort - The media stopped loading before it finished, without an error.
77
+ * @event {Event} canplay - Enough has loaded to start playing.
78
+ * @event {Event} canplaythrough - Enough has loaded to play to the end without stopping, at the current rate.
79
+ * @event {Event} durationchange - The duration changed, which it does once the metadata is in.
80
+ * @event {Event} emptied - The media was reset, as when `src` changes.
81
+ * @event {Event} ended - The video reached its end.
82
+ * @event {Event} error - The source could not be loaded or played. The player shows `error-label` as well.
44
83
  * @event {HelixNextEvent} helix-next - The next video was requested. Load it in response.
45
84
  * @event {HelixPreviousEvent} helix-previous - The previous video was requested. Load it in response.
46
- * @event {Event} pause - Playback paused. Relayed from the inner video.
47
- * @event {Event} play - Playback started. Relayed from the inner video.
85
+ * @event {Event} loadeddata - The frame at the current position has loaded.
86
+ * @event {Event} loadedmetadata - The duration and the size of the video are known.
87
+ * @event {Event} loadstart - The video started looking for its media.
88
+ * @event {Event} pause - Playback paused.
89
+ * @event {Event} play - Playback was asked to start.
90
+ * @event {Event} playing - Playback started, or started again after waiting for data.
91
+ * @event {Event} progress - More of the media has downloaded.
92
+ * @event {Event} ratechange - The playback rate changed. Read `playbackRate`.
93
+ * @event {Event} resize - The video's own width or height changed. Read `videoWidth` and `videoHeight`.
94
+ * @event {Event} seeked - A move to a new position finished.
95
+ * @event {Event} seeking - A move to a new position started.
96
+ * @event {Event} stalled - The browser is trying to load more data and none is arriving.
97
+ * @event {Event} suspend - Loading paused on purpose, as when `preload` asks for no more.
98
+ * @event {Event} timeupdate - The position changed. Read `currentTime`.
99
+ * @event {Event} volumechange - The volume or the mute changed. Read `volume` and `muted`.
100
+ * @event {Event} waiting - Playback stopped to wait for more data.
48
101
  *
49
102
  * @csspart captions - The button that turns captions on and off.
50
103
  * @csspart captions-menu - The menu of caption languages, when the video has more than one track.
@@ -60,8 +113,13 @@ import '../../menu/index.js';
60
113
  * @csspart cue - The caption currently on screen, drawn by this element.
61
114
  * @csspart download - The button that downloads the file, when `extra-controls` includes it.
62
115
  * @csspart entry - One row in a menu that the player opens.
116
+ * @csspart entry-end - The trailing column of a row, which holds its shortcut. It is always rendered.
63
117
  * @csspart entry-item - The row, which is an `<a>` where `href` is set.
64
118
  * @csspart entry-mark - The trailing mark: a check mark when the row is checked, or a caret when it opens a submenu.
119
+ * @csspart entry-shortcut - The key drawn for a row's shortcut. The player's rows set none.
120
+ * @csspart entry-shortcut-kbd - The key inside `entry-shortcut`.
121
+ * @csspart entry-shortcut-key - One key of a row's shortcut chord, inside `entry-shortcut`. The player's rows set none.
122
+ * @csspart entry-shortcut-separator - The `+` between two keys of a row's shortcut, where the platform writes one.
65
123
  * @csspart entry-start - The leading column that holds the `start` slot. It is always rendered.
66
124
  * @csspart failure - The message shown when the source cannot be played.
67
125
  * @csspart forward - The button that skips forward ten seconds.
@@ -109,10 +167,10 @@ export declare class HelixHeadlessVideo extends HelixElement {
109
167
  * Whether the video starts playing on its own. Browsers allow this only while
110
168
  * it is muted.
111
169
  *
112
- * Forwarded rather than acted on. Whether an unprompted play is permitted is
113
- * the browser's policy and not this element's, and `play()` already swallows
114
- * the refusal: what follows a refused autoplay is a paused player showing its
115
- * start control, which is the correct thing to be looking at.
170
+ * Forwarded to the video, which decides. Whether an unprompted play is
171
+ * permitted is the browser's policy, and what follows a refused autoplay is a
172
+ * paused player showing its start control, which is the correct thing to be
173
+ * looking at.
116
174
  */
117
175
  autoplay: boolean;
118
176
  /**
@@ -282,6 +340,11 @@ export declare class HelixHeadlessVideo extends HelixElement {
282
340
  * What the control that floats the video over other windows is called.
283
341
  */
284
342
  pipLabel: string;
343
+ /**
344
+ * The name of the player when `label` is not set. The player is a group, and
345
+ * this is what a screen reader calls it on arriving.
346
+ */
347
+ playerLabel: string;
285
348
  /**
286
349
  * The name of the play control while pressing it would start the video.
287
350
  */
@@ -340,6 +403,14 @@ export declare class HelixHeadlessVideo extends HelixElement {
340
403
  * behind a hero, a grid of eight thumbnails, anything where the video is
341
404
  * decoration rather than something to start.
342
405
  *
406
+ * **It is for the pointer, and the bar's Play is for everyone else.** Both
407
+ * play the video, so a keyboard met two stops called "Play" one after the
408
+ * other and a screen reader read the same button twice. The large one is out
409
+ * of the tab order and hidden from assistive technology while the bar is
410
+ * drawn, which is whenever it is: it shows only while the video is not
411
+ * playing, and the bar does not fade then. A press on it leaves focus on the
412
+ * player, so the keys go on working once it has gone.
413
+ *
343
414
  * A value rather than a boolean, so the resting state is the attribute's
344
415
  * absence: a boolean defaulting to on would have to be spelled as its own
345
416
  * negation.
@@ -510,14 +581,19 @@ export declare class HelixHeadlessVideo extends HelixElement {
510
581
  set volume(level: number);
511
582
  private get video();
512
583
  /**
513
- * Starts playback, if the browser allows it.
584
+ * Starts playback, and returns the video's own promise: it settles when
585
+ * playback starts, and rejects when the browser refuses.
586
+ *
587
+ * **A refusal is not reported as an unhandled rejection.** A browser refuses
588
+ * `play()` when nothing the reader did asked for it, and that is a policy
589
+ * answer: what follows is a paused player showing its start control. So the
590
+ * promise is marked handled here, and a caller who awaits it still hears the
591
+ * refusal.
514
592
  *
515
- * The rejection is swallowed on purpose: a browser refuses `play()` when
516
- * nothing the reader did asked for it, and that is a policy answer rather than
517
- * a fault. What follows a refused play is a paused player showing its start
518
- * control, which is the correct thing to be looking at.
593
+ * Before the first render there is no video yet, and the promise waits for
594
+ * one.
519
595
  */
520
- play(): void;
596
+ play(): Promise<void>;
521
597
  /** Pauses playback and leaves the current frame showing. */
522
598
  pause(): void;
523
599
  /**
@@ -645,6 +721,16 @@ export declare class HelixHeadlessVideo extends HelixElement {
645
721
  * mouse left resting until the bar faded.
646
722
  */
647
723
  private readonly handlePicture;
724
+ /**
725
+ * A press on the large play button plays, and leaves focus on the player.
726
+ *
727
+ * The button takes focus from the press and is gone once the video plays,
728
+ * which drops focus to the page, and the keys bound to the player stop
729
+ * answering. Moved to the stage first, they keep working. The press came from
730
+ * a pointer, the button being out of the tab order, so the stage draws no
731
+ * ring for it.
732
+ */
733
+ private readonly handleStart;
648
734
  /**
649
735
  * The keys every player uses, bound to this element rather than the document.
650
736
  *
@@ -716,6 +802,19 @@ export declare class HelixHeadlessVideo extends HelixElement {
716
802
  private heardMenu;
717
803
  protected renderOverflowItem(one: string): TemplateResult;
718
804
  protected renderBar(): TemplateResult;
805
+ /**
806
+ * The large play button over the picture, or nothing.
807
+ *
808
+ * Drawn whenever the video is not playing, which is what the mark means:
809
+ * press this to play. Not only before the first play, which would make the
810
+ * mark mean two different things at two moments that are the same state.
811
+ * Every player a reader has used shows it on pause, and the one who paused to
812
+ * study a frame clears it by pressing the thing in the way.
813
+ *
814
+ * Not drawn at all where the browser draws its own controls, since that bar
815
+ * has a play button and two would be two.
816
+ */
817
+ protected renderStart(): TemplateResult | typeof nothing;
719
818
  protected render(): TemplateResult;
720
819
  }
721
820
  declare global {