@fusion.dev/helix-core 0.145.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 (254) hide show
  1. package/custom-elements.json +5203 -1777
  2. package/dist/controllers/aria-forward-controller/aria-forward-controller.d.ts +3 -2
  3. package/dist/controllers/aria-forward-controller/aria-forward-controller.js +3 -14
  4. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.d.ts +65 -3
  5. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.js +37 -9
  6. package/dist/controllers/chart-pointer-controller/reading-step.d.ts +7 -1
  7. package/dist/controllers/chart-pointer-controller/reading-step.js +5 -0
  8. package/dist/controllers/keyboard-navigation-controller/keyboard-navigation-controller.d.ts +9 -55
  9. package/dist/controllers/keyboard-navigation-controller/keyboard-navigation-controller.js +7 -39
  10. package/dist/controllers/relative-clock-controller/relative-clock-controller.d.ts +44 -0
  11. package/dist/controllers/relative-clock-controller/relative-clock-controller.js +31 -0
  12. package/dist/controllers/source-controller/source-controller.d.ts +10 -3
  13. package/dist/controllers/source-controller/source-controller.js +7 -4
  14. package/dist/controllers/virtualize-controller/virtualize-controller.d.ts +48 -1
  15. package/dist/controllers/virtualize-controller/virtualize-controller.js +50 -7
  16. package/dist/events/action.d.ts +12 -0
  17. package/dist/events/action.js +6 -0
  18. package/dist/events/activate.d.ts +22 -0
  19. package/dist/events/activate.js +11 -0
  20. package/dist/events/aura-fallback.d.ts +12 -0
  21. package/dist/events/aura-fallback.js +11 -0
  22. package/dist/events/before-activate.d.ts +24 -0
  23. package/dist/events/before-activate.js +11 -0
  24. package/dist/events/before-change.d.ts +26 -0
  25. package/dist/events/before-change.js +11 -0
  26. package/dist/events/before-close.d.ts +6 -0
  27. package/dist/events/before-close.js +11 -0
  28. package/dist/events/before-collapse.d.ts +6 -0
  29. package/dist/events/before-collapse.js +11 -0
  30. package/dist/events/before-edit.d.ts +6 -0
  31. package/dist/events/before-edit.js +11 -0
  32. package/dist/events/before-move.d.ts +17 -0
  33. package/dist/events/before-move.js +11 -0
  34. package/dist/events/before-open.d.ts +17 -0
  35. package/dist/events/before-open.js +11 -0
  36. package/dist/events/before-panel-resize.d.ts +13 -0
  37. package/dist/events/before-panel-resize.js +11 -0
  38. package/dist/events/before-pin.d.ts +6 -0
  39. package/dist/events/before-pin.js +11 -0
  40. package/dist/events/before-reconnect.d.ts +14 -0
  41. package/dist/events/before-reconnect.js +11 -0
  42. package/dist/events/before-relabel.d.ts +15 -0
  43. package/dist/events/before-relabel.js +11 -0
  44. package/dist/events/before-resize.d.ts +6 -0
  45. package/dist/events/before-resize.js +11 -0
  46. package/dist/events/before-split.d.ts +12 -0
  47. package/dist/events/before-split.js +11 -0
  48. package/dist/events/before-toggle.d.ts +23 -0
  49. package/dist/events/before-toggle.js +11 -0
  50. package/dist/events/canvas-edit.d.ts +16 -0
  51. package/dist/events/canvas-edit.js +11 -0
  52. package/dist/events/canvas-pan.d.ts +13 -0
  53. package/dist/events/canvas-pan.js +11 -0
  54. package/dist/events/canvas-view.d.ts +14 -0
  55. package/dist/events/canvas-view.js +11 -0
  56. package/dist/events/canvas-zoom.d.ts +6 -0
  57. package/dist/events/canvas-zoom.js +11 -0
  58. package/dist/events/caret.d.ts +17 -0
  59. package/dist/events/caret.js +11 -0
  60. package/dist/events/clear.d.ts +11 -0
  61. package/dist/events/clear.js +6 -0
  62. package/dist/events/collapse.d.ts +12 -0
  63. package/dist/events/collapse.js +11 -0
  64. package/dist/events/complete.d.ts +26 -0
  65. package/dist/events/complete.js +11 -0
  66. package/dist/events/connect.d.ts +14 -0
  67. package/dist/events/connect.js +11 -0
  68. package/dist/events/console.d.ts +13 -0
  69. package/dist/events/console.js +11 -0
  70. package/dist/events/copy-error.d.ts +9 -0
  71. package/dist/events/copy-error.js +6 -0
  72. package/dist/events/copy.d.ts +12 -0
  73. package/dist/events/copy.js +10 -0
  74. package/dist/events/create.d.ts +18 -0
  75. package/dist/events/create.js +11 -0
  76. package/dist/events/details.d.ts +454 -0
  77. package/dist/events/details.js +1 -0
  78. package/dist/events/dismiss.d.ts +16 -0
  79. package/dist/events/dismiss.js +11 -0
  80. package/dist/events/edit.d.ts +12 -0
  81. package/dist/events/edit.js +11 -0
  82. package/dist/events/end.d.ts +9 -0
  83. package/dist/events/end.js +6 -0
  84. package/dist/events/events.d.ts +111 -1478
  85. package/dist/events/events.js +91 -863
  86. package/dist/events/expand.d.ts +10 -0
  87. package/dist/events/expand.js +11 -0
  88. package/dist/events/facet.d.ts +17 -0
  89. package/dist/events/facet.js +11 -0
  90. package/dist/events/filter.d.ts +12 -0
  91. package/dist/events/filter.js +11 -0
  92. package/dist/events/filtered.d.ts +12 -0
  93. package/dist/events/filtered.js +11 -0
  94. package/dist/events/graph-filter.d.ts +10 -0
  95. package/dist/events/graph-filter.js +11 -0
  96. package/dist/events/graph-layout.d.ts +10 -0
  97. package/dist/events/graph-layout.js +11 -0
  98. package/dist/events/graph-pan.d.ts +9 -0
  99. package/dist/events/graph-pan.js +11 -0
  100. package/dist/events/graph-part-change.d.ts +10 -0
  101. package/dist/events/graph-part-change.js +11 -0
  102. package/dist/events/graph-ready.d.ts +8 -0
  103. package/dist/events/graph-ready.js +6 -0
  104. package/dist/events/graph-signal.d.ts +11 -0
  105. package/dist/events/graph-signal.js +11 -0
  106. package/dist/events/graph-zoom.d.ts +6 -0
  107. package/dist/events/graph-zoom.js +11 -0
  108. package/dist/events/history.d.ts +16 -0
  109. package/dist/events/history.js +11 -0
  110. package/dist/events/load-more.d.ts +12 -0
  111. package/dist/events/load-more.js +6 -0
  112. package/dist/events/load.d.ts +12 -0
  113. package/dist/events/load.js +6 -0
  114. package/dist/events/map-cluster.d.ts +15 -0
  115. package/dist/events/map-cluster.js +11 -0
  116. package/dist/events/map-pan.d.ts +18 -0
  117. package/dist/events/map-pan.js +11 -0
  118. package/dist/events/map-part-change.d.ts +16 -0
  119. package/dist/events/map-part-change.js +11 -0
  120. package/dist/events/map-ready.d.ts +15 -0
  121. package/dist/events/map-ready.js +6 -0
  122. package/dist/events/map-rotate.d.ts +9 -0
  123. package/dist/events/map-rotate.js +11 -0
  124. package/dist/events/map-tilt.d.ts +9 -0
  125. package/dist/events/map-tilt.js +11 -0
  126. package/dist/events/map-zoom.d.ts +13 -0
  127. package/dist/events/map-zoom.js +11 -0
  128. package/dist/events/move.d.ts +11 -0
  129. package/dist/events/move.js +11 -0
  130. package/dist/events/names.d.ts +15 -0
  131. package/dist/events/names.js +88 -0
  132. package/dist/events/navigate.d.ts +13 -0
  133. package/dist/events/navigate.js +11 -0
  134. package/dist/events/next.d.ts +23 -0
  135. package/dist/events/next.js +11 -0
  136. package/dist/events/panel-resize.d.ts +12 -0
  137. package/dist/events/panel-resize.js +11 -0
  138. package/dist/events/pin.d.ts +12 -0
  139. package/dist/events/pin.js +11 -0
  140. package/dist/events/press.d.ts +19 -0
  141. package/dist/events/press.js +11 -0
  142. package/dist/events/preview.d.ts +14 -0
  143. package/dist/events/preview.js +11 -0
  144. package/dist/events/previous.d.ts +6 -0
  145. package/dist/events/previous.js +11 -0
  146. package/dist/events/range-change.d.ts +10 -0
  147. package/dist/events/range-change.js +11 -0
  148. package/dist/events/read.d.ts +19 -0
  149. package/dist/events/read.js +11 -0
  150. package/dist/events/reconnect.d.ts +6 -0
  151. package/dist/events/reconnect.js +11 -0
  152. package/dist/events/reject.d.ts +13 -0
  153. package/dist/events/reject.js +11 -0
  154. package/dist/events/relabel.d.ts +6 -0
  155. package/dist/events/relabel.js +11 -0
  156. package/dist/events/remove.d.ts +12 -0
  157. package/dist/events/remove.js +11 -0
  158. package/dist/events/reorder.d.ts +18 -0
  159. package/dist/events/reorder.js +11 -0
  160. package/dist/events/reordered.d.ts +12 -0
  161. package/dist/events/reordered.js +11 -0
  162. package/dist/events/resize.d.ts +19 -0
  163. package/dist/events/resize.js +11 -0
  164. package/dist/events/resized.d.ts +16 -0
  165. package/dist/events/resized.js +11 -0
  166. package/dist/events/sample-end.d.ts +5 -0
  167. package/dist/events/sample-end.js +6 -0
  168. package/dist/events/sample-start.d.ts +18 -0
  169. package/dist/events/sample-start.js +6 -0
  170. package/dist/events/scrolled.d.ts +32 -0
  171. package/dist/events/scrolled.js +11 -0
  172. package/dist/events/select.d.ts +12 -0
  173. package/dist/events/select.js +11 -0
  174. package/dist/events/selected.d.ts +12 -0
  175. package/dist/events/selected.js +11 -0
  176. package/dist/events/send.d.ts +18 -0
  177. package/dist/events/send.js +11 -0
  178. package/dist/events/shortcut.d.ts +13 -0
  179. package/dist/events/shortcut.js +11 -0
  180. package/dist/events/sort.d.ts +17 -0
  181. package/dist/events/sort.js +11 -0
  182. package/dist/events/sorted.d.ts +15 -0
  183. package/dist/events/sorted.js +11 -0
  184. package/dist/events/split.d.ts +12 -0
  185. package/dist/events/split.js +11 -0
  186. package/dist/events/toggle.d.ts +15 -0
  187. package/dist/events/toggle.js +11 -0
  188. package/dist/events/tour-ask.d.ts +16 -0
  189. package/dist/events/tour-ask.js +11 -0
  190. package/dist/events/tour-status.d.ts +14 -0
  191. package/dist/events/tour-status.js +11 -0
  192. package/dist/events/typing.d.ts +10 -0
  193. package/dist/events/typing.js +11 -0
  194. package/dist/helix-element/react-bridge.d.ts +10 -0
  195. package/dist/helix-element/react-bridge.js +1 -1
  196. package/dist/helix-form-element/helix-form-element.d.ts +5 -20
  197. package/dist/helix-form-element/helix-form-element.js +4 -56
  198. package/dist/index.d.ts +15 -3
  199. package/dist/index.js +15 -3
  200. package/dist/mixins/mixin-chart-source/mixin-chart-source.d.ts +17 -2
  201. package/dist/mixins/mixin-chart-source/mixin-chart-source.js +22 -1
  202. package/dist/mixins/mixin-controller-active/mixin-controller-active.js +4 -3
  203. package/dist/mixins/mixin-controller-checked/mixin-controller-checked.d.ts +5 -2
  204. package/dist/mixins/mixin-controller-checked/mixin-controller-checked.js +2 -1
  205. package/dist/mixins/mixin-controller-value/mixin-controller-value.d.ts +4 -2
  206. package/dist/mixins/mixin-controller-value/mixin-controller-value.js +7 -2
  207. package/dist/mixins/mixin-dismissible/mixin-dismissible.js +20 -4
  208. package/dist/mixins/mixin-field/mixin-field.js +2 -2
  209. package/dist/mixins/mixin-picker-field/mixin-picker-field.d.ts +15 -3
  210. package/dist/mixins/mixin-picker-field/mixin-picker-field.js +11 -4
  211. package/dist/mixins/mixin-segmented-field/mixin-segmented-field.d.ts +1 -1
  212. package/dist/mixins/mixin-segmented-field/mixin-segmented-field.js +10 -4
  213. package/dist/utils/audit-name/audit-name-off.d.ts +10 -0
  214. package/dist/utils/audit-name/audit-name-off.js +1 -0
  215. package/dist/utils/audit-name/audit-name.d.ts +19 -6
  216. package/dist/utils/audit-name/audit-name.js +10 -27
  217. package/dist/utils/calendar/calendar.js +7 -7
  218. package/dist/utils/draw-tooltip/draw-tooltip.d.ts +1 -1
  219. package/dist/utils/draw-tooltip/draw-tooltip.js +3 -1
  220. package/dist/utils/draw-tooltip/spoken-reading.d.ts +6 -2
  221. package/dist/utils/draw-tooltip/spoken-reading.js +5 -4
  222. package/dist/utils/heading-level/heading-level.d.ts +8 -0
  223. package/dist/utils/heading-level/heading-level.js +4 -0
  224. package/dist/utils/implicit-submit/implicit-submit.d.ts +25 -0
  225. package/dist/utils/implicit-submit/implicit-submit.js +52 -0
  226. package/dist/utils/name-text/name-text.d.ts +12 -0
  227. package/dist/utils/name-text/name-text.js +25 -0
  228. package/dist/utils/number-format/number-format.d.ts +2 -1
  229. package/dist/utils/number-format/number-format.js +13 -5
  230. package/dist/utils/plain-click/plain-click.d.ts +10 -0
  231. package/dist/utils/plain-click/plain-click.js +1 -0
  232. package/dist/utils/press-type/press-type.d.ts +20 -0
  233. package/dist/utils/press-type/press-type.js +15 -0
  234. package/dist/utils/report-runtime/report-runtime.d.ts +6 -3
  235. package/dist/utils/row-data/row-data.d.ts +15 -0
  236. package/dist/utils/row-data/row-data.js +17 -0
  237. package/dist/utils/row-order/row-order.d.ts +141 -0
  238. package/dist/utils/row-order/row-order.js +76 -0
  239. package/dist/utils/tell-disclosure/tell-disclosure.d.ts +4 -0
  240. package/dist/utils/tree-arrow/tree-arrow.d.ts +23 -0
  241. package/dist/utils/tree-arrow/tree-arrow.js +9 -0
  242. package/dist/utils/typeahead/typeahead.d.ts +67 -0
  243. package/dist/utils/typeahead/typeahead.js +36 -0
  244. package/dist/utils/value-as/value-as.d.ts +9 -0
  245. package/dist/utils/value-as/value-as.js +9 -1
  246. package/dist/utils/watch-labels/watch-labels.d.ts +16 -0
  247. package/dist/utils/watch-labels/watch-labels.js +34 -0
  248. package/dist/utils/words-converter/words-converter.d.ts +14 -0
  249. package/dist/utils/words-converter/words-converter.js +15 -0
  250. package/dist/utils/written-list/written-list.d.ts +29 -0
  251. package/dist/utils/written-list/written-list.js +30 -0
  252. package/dist/version.d.ts +1 -1
  253. package/dist/version.js +1 -1
  254. package/package.json +18 -5
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { auditName } from '#audit-name';
1
2
  export { AriaForwardController, } from './controllers/aria-forward-controller/aria-forward-controller.js';
2
3
  export { ArrivalController, } from './controllers/arrival-controller/arrival-controller.js';
3
4
  export { ChartPointerController, } from './controllers/chart-pointer-controller/chart-pointer-controller.js';
@@ -15,12 +16,13 @@ export { FullscreenController } from './controllers/fullscreen-controller/fullsc
15
16
  export { HostClickController } from './controllers/host-click-controller/host-click-controller.js';
16
17
  export { IdleController } from './controllers/idle-controller/idle-controller.js';
17
18
  export { IndicatorController, } from './controllers/indicator-controller/indicator-controller.js';
18
- export { KeyboardNavigationController, Typeahead, typesCharacter, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
19
+ export { KeyboardNavigationController, } from './controllers/keyboard-navigation-controller/keyboard-navigation-controller.js';
19
20
  export { MediaSessionController, SKIP_SECONDS, } from './controllers/media-session-controller/media-session-controller.js';
20
21
  export { animationsSettled, OpenPhaseController, } from './controllers/open-phase-controller/open-phase-controller.js';
21
22
  export { MAX_FRAME_STEP, PaintGateController, } from './controllers/paint-gate-controller/paint-gate-controller.js';
22
23
  export { PlacementController } from './controllers/placement-controller/placement-controller.js';
23
24
  export { PopoverController, } from './controllers/popover-controller/popover-controller.js';
25
+ export { RelativeClockController, } from './controllers/relative-clock-controller/relative-clock-controller.js';
24
26
  export { RemotePlaybackController, } from './controllers/remote-playback-controller/remote-playback-controller.js';
25
27
  export { SourceController, } from './controllers/source-controller/source-controller.js';
26
28
  export { drawStatus, StatusController, } from './controllers/status-controller/status-controller.js';
@@ -28,7 +30,7 @@ export { SwipeController, } from './controllers/swipe-controller/swipe-controlle
28
30
  export { TokenColorController, } from './controllers/token-color-controller/token-color-controller.js';
29
31
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
30
32
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
31
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPinEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixToggleEvent, HelixTourAskEvent, HelixTypingEvent, } from './events/events.js';
33
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPinEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
32
34
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
33
35
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
34
36
  export { MixinChartSource, PALETTE, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, seriesNames, } from './mixins/mixin-chart-source/mixin-chart-source.js';
@@ -57,6 +59,7 @@ export { countLabel } from './utils/count-label/count-label.js';
57
59
  export { createSheet } from './utils/create-sheet/create-sheet.js';
58
60
  export { formatColor, parseColor, toCss, toHsl, toRgb, } from './utils/css-color/css-color.js';
59
61
  export { customElement, definedTags, duplicateRegistrations, } from './utils/custom-element/custom-element.js';
62
+ export { segmentName } from './utils/date-segments/date-segments.js';
60
63
  export { drawDismiss, drawDismissGlyph, } from './utils/draw-dismiss/draw-dismiss.js';
61
64
  export { drawIcon } from './utils/draw-icon/draw-icon.js';
62
65
  export { CHART_PLOT, drawTooltip } from './utils/draw-tooltip/draw-tooltip.js';
@@ -67,7 +70,9 @@ export { deepActiveElement, deepContains, focusableElements, } from './utils/foc
67
70
  export { afterLinkFollowed, followLink, } from './utils/follow-link/follow-link.js';
68
71
  export { formatNumbers } from './utils/format-numbers/format-numbers.js';
69
72
  export { headingIn, headingsIn } from './utils/heading-in/heading-in.js';
73
+ export { headingLevel } from './utils/heading-level/heading-level.js';
70
74
  export { hostAria } from './utils/host-aria/host-aria.js';
75
+ export { defaultButton, submitImplicitly, submits, submitsOnEnter, } from './utils/implicit-submit/implicit-submit.js';
71
76
  export { forgetDisabled, inheritDisabled, } from './utils/inherit-disabled/inherit-disabled.js';
72
77
  export { inlineStep } from './utils/inline-step/inline-step.js';
73
78
  export { isRtl } from './utils/is-rtl/is-rtl.js';
@@ -77,7 +82,9 @@ export { markRegion } from './utils/mark-region/mark-region.js';
77
82
  export { copiesOf, sameCopies, } from './utils/media-copy/media-copy.js';
78
83
  export { formatNumber, parseNumber } from './utils/number-format/number-format.js';
79
84
  export { onUnlessFalse } from './utils/on-unless-false/on-unless-false.js';
85
+ export { plainClick } from './utils/plain-click/plain-click.js';
80
86
  export { appleTouch, onApple } from './utils/platform/platform.js';
87
+ export { pressType } from './utils/press-type/press-type.js';
81
88
  export { rangeAdd } from './utils/range-add/range-add.js';
82
89
  export { readColor, rgbOf } from './utils/read-color/read-color.js';
83
90
  export { byRow, readRows, readSeries, seriesKey, unbroken, } from './utils/read-series/read-series.js';
@@ -91,6 +98,8 @@ export { requestChange, } from './utils/request-change/request-change.js';
91
98
  export { resolveActiveItem, } from './utils/resolve-active-item/resolve-active-item.js';
92
99
  export { holdCaret, restoreValue } from './utils/restore-value/restore-value.js';
93
100
  export { rovingStop } from './utils/roving-stop/roving-stop.js';
101
+ export { valueAt } from './utils/row-data/row-data.js';
102
+ export { arranged, cycle, filter, format, ordered, parse, sort, window_, } from './utils/row-order/row-order.js';
94
103
  export { extent, linear } from './utils/scale/scale.js';
95
104
  export { ticks } from './utils/scale/ticks.js';
96
105
  export { scrollItemIntoView, } from './utils/scroll-item-into-view/scroll-item-into-view.js';
@@ -102,8 +111,11 @@ export { edgeOffset, FLING, parseSnapPoints, settleSwipe, snapTravel, swipeAxis,
102
111
  export { tellDisclosure } from './utils/tell-disclosure/tell-disclosure.js';
103
112
  export { subscribe } from './utils/ticker/ticker.js';
104
113
  export { TONE_MARKS, toneMark, } from './utils/tone-marks/tone-marks.js';
114
+ export { treeArrow } from './utils/tree-arrow/tree-arrow.js';
115
+ export { Typeahead, typeaheadBy, typesCharacter, } from './utils/typeahead/typeahead.js';
105
116
  export { dateAsValue, isClockValue, isDateValue, isTimeValue, minutesAsValue, numberAsValue, secondsAsValue, timeAsValue, valueAsDate, valueAsMinutes, valueAsNumber, valueAsSeconds, valueAsTime, } from './utils/value-as/value-as.js';
106
117
  export { watchTheme } from './utils/watch-theme/watch-theme.js';
118
+ export { wordsConverter } from './utils/words-converter/words-converter.js';
107
119
  export { writeClock, writeTime } from './utils/write-time/write-time.js';
108
- export { commaList, toggleValue, writtenList, writtenNumbers, } from './utils/written-list/written-list.js';
120
+ export { commaList, pressedValue, prunedValue, toggleEvery, toggleValue, writtenList, writtenNumbers, } from './utils/written-list/written-list.js';
109
121
  export { VERSION } from './version.js';
@@ -136,13 +136,22 @@ export declare class MixinChartSourceInterface {
136
136
  * writes them, whatever this says.
137
137
  */
138
138
  locale: string;
139
+ /**
140
+ * Where a reading the keys moved to stands among the readings, said after
141
+ * it. `{position}` and `{count}` are replaced with the numbers, written in
142
+ * `locale`.
143
+ *
144
+ * Set it to the words of the page's language, such as `{position} von
145
+ * {count}`, or to nothing to say no position.
146
+ */
147
+ positionLabel: string;
139
148
  /**
140
149
  * The table's columns, one series each. Empty when there is no table.
141
150
  */
142
151
  get series(): Series[];
143
152
  /**
144
- * The chart's name: `label` when it is set, and the table's caption
145
- * otherwise.
153
+ * The chart's name: an `aria-label` written on the chart, then `label`,
154
+ * then the table's caption.
146
155
  */
147
156
  get named(): string;
148
157
  /**
@@ -163,6 +172,12 @@ export declare class MixinChartSourceInterface {
163
172
  * reading the same table hid it.
164
173
  */
165
174
  showsSeries(name: string): boolean;
175
+ /**
176
+ * Whether the series read from the cell at this place in a row is drawn,
177
+ * by its column's heading. The keys and the readout pass over one a legend
178
+ * hid.
179
+ */
180
+ showsColumn(cell: number): boolean;
166
181
  /**
167
182
  * The number of readings, which the pointer position maps onto.
168
183
  */
@@ -23,6 +23,17 @@ export const MixinChartSource = (Base) => {
23
23
  this.for = '';
24
24
  this.label = '';
25
25
  this.locale = '';
26
+ this.positionLabel = '{position} of {count}';
27
+ }
28
+ static get observedAttributes() {
29
+ const inherited = Reflect.get(Base, 'observedAttributes', this);
30
+ return [...(inherited ?? []), 'aria-label'];
31
+ }
32
+ attributeChangedCallback(name, old, value) {
33
+ super.attributeChangedCallback(name, old, value);
34
+ if (name === 'aria-label') {
35
+ this.requestUpdate();
36
+ }
26
37
  }
27
38
  willUpdate(changed) {
28
39
  super.willUpdate(changed);
@@ -34,7 +45,10 @@ export const MixinChartSource = (Base) => {
34
45
  return this.source.series;
35
46
  }
36
47
  get named() {
37
- return this.label || this.source.element?.querySelector('caption')?.textContent?.trim() || '';
48
+ return (this.getAttribute?.('aria-label') ||
49
+ this.label ||
50
+ this.source.element?.querySelector('caption')?.textContent?.trim() ||
51
+ '');
38
52
  }
39
53
  get sourceRows() {
40
54
  return this.source.rows;
@@ -51,6 +65,10 @@ export const MixinChartSource = (Base) => {
51
65
  showsSeries(name) {
52
66
  return !this.source.hidden.has(seriesKey(name));
53
67
  }
68
+ showsColumn(cell) {
69
+ const name = this.sourceRows[0]?.cells[cell]?.name;
70
+ return name === undefined || this.showsSeries(name);
71
+ }
54
72
  get readings() {
55
73
  return this.sourceRows.length;
56
74
  }
@@ -64,5 +82,8 @@ export const MixinChartSource = (Base) => {
64
82
  __decorate([
65
83
  property()
66
84
  ], ChartSourceElement.prototype, "locale", void 0);
85
+ __decorate([
86
+ property({ attribute: 'position-label' })
87
+ ], ChartSourceElement.prototype, "positionLabel", void 0);
67
88
  return ChartSourceElement;
68
89
  };
@@ -27,6 +27,7 @@ export const MixinControllerActive = (Base) => {
27
27
  if (next === this.active) {
28
28
  return true;
29
29
  }
30
+ const before = this.active;
30
31
  const applied = requestChange({
31
32
  apply: (value) => {
32
33
  const previous = this.active;
@@ -38,12 +39,12 @@ export const MixinControllerActive = (Base) => {
38
39
  next,
39
40
  });
40
41
  if (applied) {
41
- this.announceActivated(next);
42
+ this.announceActivated(next, before);
42
43
  }
43
44
  return applied;
44
45
  }
45
- announceActivated(value) {
46
- this.dispatchEvent(new HelixActivateEvent({ value }));
46
+ announceActivated(value, previous) {
47
+ this.dispatchEvent(new HelixActivateEvent({ previous, value }));
47
48
  }
48
49
  resolveActive(items) {
49
50
  return resolveActiveItem(this.active, items);
@@ -17,7 +17,9 @@ export declare class MixinControllerCheckedInterface {
17
17
  */
18
18
  checked: boolean;
19
19
  /**
20
- * Whether the control starts checked. A form reset returns it to this state.
20
+ * Whether the control starts checked. A form reset returns it to this state,
21
+ * and to the `checked` attribute where this one is not written, as a native
22
+ * checkbox resets to the `checked` it declares.
21
23
  */
22
24
  defaultChecked: boolean;
23
25
  /**
@@ -40,7 +42,8 @@ export declare class MixinControllerCheckedInterface {
40
42
  /** Requests the opposite of the current state. */
41
43
  toggleChecked(): boolean;
42
44
  /**
43
- * Drops the recorded state, so the control reads `defaultChecked` again.
45
+ * Returns the control to what its markup declared: `defaultChecked` where
46
+ * `default-checked` is written, and the `checked` attribute where it is not.
44
47
  *
45
48
  * A form reset has to return a control to what its markup declared, and
46
49
  * assigning `checked` cannot do it: any assignment records a state, and the
@@ -59,7 +59,8 @@ export const MixinControllerChecked = (Base) => {
59
59
  }
60
60
  resetChecked() {
61
61
  const previous = this.checked;
62
- this.checkedState = undefined;
62
+ this.checkedState =
63
+ this.hasAttribute('default-checked') || !this.hasAttribute('checked') ? undefined : true;
63
64
  this.requestUpdate('checked', previous);
64
65
  }
65
66
  }
@@ -8,7 +8,9 @@ type Constructor<T> = new (...args: any[]) => T;
8
8
  */
9
9
  export declare class MixinControllerValueInterface {
10
10
  /**
11
- * The value the control starts with. A form reset returns it to this value.
11
+ * The value the control starts with. A form reset returns it to this value,
12
+ * and to the `value` attribute where this one is not written, as a native
13
+ * control resets to the `value` it declares.
12
14
  *
13
15
  * Separate from `value`, which is where the control is now, and gone from the
14
16
  * reader's view the moment they change anything.
@@ -37,7 +39,7 @@ export declare class MixinControllerValueInterface {
37
39
  protected readonly announcesInput: boolean;
38
40
  /** Requests a new value, and returns whether the change was applied. */
39
41
  requestValue(next: string): boolean;
40
- /** Returns the control to its `defaultValue`. */
42
+ /** Returns the control to its `defaultValue`, or to its `value` attribute where there is none. */
41
43
  formResetCallback(): void;
42
44
  /** Restores the value when the browser brings a form back. */
43
45
  formStateRestoreCallback(state: string | File | FormData | null): void;
@@ -48,15 +48,20 @@ export const MixinControllerValue = (Base) => {
48
48
  }
49
49
  return applied;
50
50
  }
51
+ get declared() {
52
+ return this.hasAttribute('default-value')
53
+ ? undefined
54
+ : (this.getAttribute('value') ?? undefined);
55
+ }
51
56
  formResetCallback() {
52
57
  super.formResetCallback();
53
58
  const previous = this.value;
54
- this.valueState = undefined;
59
+ this.valueState = this.declared;
55
60
  this.requestUpdate('value', previous);
56
61
  }
57
62
  formStateRestoreCallback(state) {
58
63
  const previous = this.value;
59
- this.valueState = typeof state === 'string' ? state : undefined;
64
+ this.valueState = typeof state === 'string' ? state : this.declared;
60
65
  this.requestUpdate('value', previous);
61
66
  }
62
67
  }
@@ -7,6 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { property } from 'lit/decorators.js';
8
8
  import { HelixDismissEvent } from '../../events/events.js';
9
9
  import { deepActiveElement, deepContains, } from '../../utils/focusable-elements/focusable-elements.js';
10
+ import { tabStops } from '../../utils/tab-stops/tab-stops.js';
10
11
  export const MixinDismissible = (Base) => {
11
12
  class Dismissible extends Base {
12
13
  constructor() {
@@ -25,14 +26,26 @@ export const MixinDismissible = (Base) => {
25
26
  return this.shadowRoot?.querySelector('[part~="dismiss"]') ?? null;
26
27
  }
27
28
  dismiss() {
28
- const neighbors = deepContains(this, deepActiveElement()) ? this.neighbors() : [];
29
+ const inside = deepContains(this, deepActiveElement());
30
+ const neighbors = inside ? this.neighbors() : [];
31
+ const beside = inside && neighbors.length === 0 ? this.stopBeside() : undefined;
29
32
  const event = this.dismissEvent();
30
33
  this.dispatchEvent(event);
31
- if (neighbors.length > 0 && !event.defaultPrevented) {
32
- this.keepFocus(neighbors);
34
+ if ((neighbors.length > 0 || beside) && !event.defaultPrevented) {
35
+ this.keepFocus(neighbors, beside);
33
36
  }
34
37
  return !event.defaultPrevented;
35
38
  }
39
+ stopBeside() {
40
+ const stops = tabStops(document.body);
41
+ const own = stops.flatMap((stop, at) => (deepContains(this, stop) ? [at] : []));
42
+ const first = own[0];
43
+ const last = own.at(-1);
44
+ if (first === undefined || last === undefined) {
45
+ return undefined;
46
+ }
47
+ return stops[last + 1] ?? stops[first - 1];
48
+ }
36
49
  neighbors() {
37
50
  const same = (node) => node instanceof HTMLElement && node.localName === this.localName;
38
51
  const after = [];
@@ -49,7 +62,7 @@ export const MixinDismissible = (Base) => {
49
62
  }
50
63
  return [...after, ...before];
51
64
  }
52
- keepFocus(neighbors) {
65
+ keepFocus(neighbors, beside) {
53
66
  const settle = () => {
54
67
  const active = document.activeElement;
55
68
  if (this.isConnected || (active !== null && active !== document.body)) {
@@ -64,6 +77,9 @@ export const MixinDismissible = (Base) => {
64
77
  }
65
78
  }
66
79
  }
80
+ if (beside?.isConnected) {
81
+ beside.focus();
82
+ }
67
83
  };
68
84
  settle();
69
85
  requestAnimationFrame(settle);
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { html, nothing } from 'lit';
8
8
  import { property, state } from 'lit/decorators.js';
9
- import { auditName } from '../../utils/audit-name/audit-name.js';
9
+ import { auditName } from '#audit-name';
10
10
  import { hostAria } from '../../utils/host-aria/host-aria.js';
11
11
  const HINT_ID = 'helix-hint';
12
12
  const FEEDBACK_ID = 'helix-feedback';
@@ -167,7 +167,7 @@ export const MixinField = (Base) => {
167
167
  this.addEventListener('change', touch);
168
168
  this.renderRoot.addEventListener('slotchange', this.noteSlotted);
169
169
  auditName(this, () => this.namedControl, 'Give it a `label`, an `aria-label`, words in its label, or a `<label for>` that names it.', () => this.labeled ||
170
- [...this.children].some((child) => child.slot === 'label' && (child.textContent ?? '').trim() !== ''));
170
+ [...this.children].some((child) => child.slot === 'label' && (child.textContent ?? '').trim() !== ''), () => this.partNamed('value'));
171
171
  }
172
172
  }
173
173
  __decorate([
@@ -92,11 +92,23 @@ export declare class MixinPickerFieldInterface {
92
92
  *
93
93
  * The one check the platform cannot make: the control is `type="text"` and
94
94
  * has no idea what a date, a time or a color is, so the family says what one
95
- * looks like and `sync` reports it as `badInput`. Empty means the platform's
96
- * own verdict stands.
95
+ * looks like. A message alone is reported as `badInput`; a flag and a
96
+ * message, such as `['rangeUnderflow', 'Choose a date on or after…']`, sets
97
+ * that flag, as a native date input does for its `min`. Empty means the
98
+ * platform's own verdict stands.
97
99
  */
98
- protected validate(): string;
100
+ protected validate(): PickerVerdict;
99
101
  }
102
+ /**
103
+ * What a picker field finds wrong: a message, reported as `badInput`, or the
104
+ * validity flag to set and its message. Empty means nothing is wrong.
105
+ */
106
+ export type PickerVerdict = string | readonly [flag: keyof ValidityStateFlags, message: string];
107
+ /**
108
+ * A verdict as the flags and the message `setValidity` takes, or `null` where
109
+ * there is nothing wrong.
110
+ */
111
+ export declare const verdictFlags: (verdict: PickerVerdict) => [flags: ValidityStateFlags, message: string] | null;
100
112
  /**
101
113
  * Grafts a floating picker onto a text field, and the protocol between them.
102
114
  *
@@ -6,8 +6,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { property } from 'lit/decorators.js';
8
8
  import { PopoverController } from '../../controllers/popover-controller/popover-controller.js';
9
+ import { submitImplicitly } from '../../utils/implicit-submit/implicit-submit.js';
9
10
  import { reportValues } from '../../utils/report-values/report-values.js';
10
11
  import { tabStops } from '../../utils/tab-stops/tab-stops.js';
12
+ export const verdictFlags = (verdict) => {
13
+ if (typeof verdict === 'string') {
14
+ return verdict === '' ? null : [{ badInput: true }, verdict];
15
+ }
16
+ return [{ [verdict[0]]: true }, verdict[1]];
17
+ };
11
18
  export const MixinPickerField = (Base) => {
12
19
  class PickerFieldElement extends Base {
13
20
  constructor() {
@@ -91,7 +98,7 @@ export const MixinPickerField = (Base) => {
91
98
  this.fromTrigger = false;
92
99
  this.handleKeypress = (event) => {
93
100
  if (event.key === 'Enter' && !event.defaultPrevented) {
94
- this.submitImplicitly();
101
+ submitImplicitly(this.form);
95
102
  }
96
103
  };
97
104
  this.handleTriggerClick = () => {
@@ -136,12 +143,12 @@ export const MixinPickerField = (Base) => {
136
143
  if (!control) {
137
144
  return;
138
145
  }
139
- const message = this.validate();
140
- if (message === '') {
146
+ const fault = verdictFlags(this.validate());
147
+ if (fault === null) {
141
148
  this.copyValidity(control);
142
149
  }
143
150
  else {
144
- this.internals.setValidity({ badInput: true }, message, control);
151
+ this.internals.setValidity(fault[0], fault[1], control);
145
152
  }
146
153
  this.refreshFeedback();
147
154
  }
@@ -4,7 +4,7 @@ import { type SegmentedKind, type SegmentOptions } from '../../utils/date-segmen
4
4
  import type { MixinControllerOpenInterface } from '../mixin-controller-open/mixin-controller-open.js';
5
5
  import type { MixinControllerValueInterface } from '../mixin-controller-value/mixin-controller-value.js';
6
6
  import type { MixinFieldInterface } from '../mixin-field/mixin-field.js';
7
- import type { MixinPickerFieldInterface } from '../mixin-picker-field/mixin-picker-field.js';
7
+ import { type MixinPickerFieldInterface } from '../mixin-picker-field/mixin-picker-field.js';
8
8
  type Constructor<T> = new (...args: any[]) => T;
9
9
  /** What this is applied over: a picker field, which `MixinPickerField` makes. */
10
10
  type SegmentedBase = HelixFormElement & MixinControllerOpenInterface & MixinControllerValueInterface & MixinFieldInterface & MixinPickerFieldInterface;
@@ -8,6 +8,7 @@ import { html, nothing } from 'lit';
8
8
  import { property, state } from 'lit/decorators.js';
9
9
  import { isPartial, isTwelveHourLayout, segmentKey, segmentLayout, segmentName, segmentRange, segmentsOf, segmentsValue, segmentText, segmentValueText, shownValue, } from '../../utils/date-segments/date-segments.js';
10
10
  import { inlineStep } from '../../utils/inline-step/inline-step.js';
11
+ import { verdictFlags, } from '../mixin-picker-field/mixin-picker-field.js';
11
12
  export const MixinSegmentedField = (Base) => {
12
13
  class SegmentedFieldElement extends Base {
13
14
  constructor() {
@@ -169,7 +170,7 @@ export const MixinSegmentedField = (Base) => {
169
170
  }
170
171
  const anchor = this.anchor ?? undefined;
171
172
  const partial = isPartial(this.segmentedKind, this.parts, this.layout);
172
- const message = this.validate();
173
+ const fault = verdictFlags(this.validate());
173
174
  if (partial) {
174
175
  this.internals.setValidity({ badInput: true }, this.badInputMessage ||
175
176
  (this.segmentedKind === 'date' ? 'Enter a whole date.' : 'Enter a whole time.'), anchor);
@@ -178,8 +179,8 @@ export const MixinSegmentedField = (Base) => {
178
179
  this.internals.setValidity({ valueMissing: true }, this.valueMissingMessage ||
179
180
  (this.segmentedKind === 'date' ? 'Enter a date.' : 'Enter a time.'), anchor);
180
181
  }
181
- else if (message !== '') {
182
- this.internals.setValidity({ badInput: true }, message, anchor);
182
+ else if (fault !== null) {
183
+ this.internals.setValidity(fault[0], fault[1], anchor);
183
184
  }
184
185
  else {
185
186
  this.internals.setValidity({});
@@ -210,13 +211,18 @@ export const MixinSegmentedField = (Base) => {
210
211
  const { max, min } = segmentRange(kind, this.parts, twelve);
211
212
  const text = segmentText(kind, this.parts, twelve, locale);
212
213
  const empty = shown === undefined;
214
+ const id = `${this.controlId}-${kind}`;
215
+ const editable = !this.isDisabled && !this.readOnly;
213
216
  return html `<span
214
217
  part="segment${empty ? ' segment-placeholder' : ''}"
218
+ id=${id}
215
219
  data-segment=${kind}
216
220
  role="spinbutton"
217
221
  tabindex=${this.isDisabled ? '-1' : '0'}
218
222
  inputmode=${kind === 'dayPeriod' ? nothing : 'numeric'}
219
- aria-label=${segmentName(kind, locale)}
223
+ enterkeyhint=${editable ? 'next' : nothing}
224
+ aria-label=${this.labeled ? `${segmentName(kind, locale)},` : segmentName(kind, locale)}
225
+ aria-labelledby=${this.labeled ? `${id} ${this.labelId}` : nothing}
220
226
  aria-valuemin=${min}
221
227
  aria-valuemax=${max}
222
228
  aria-valuenow=${shown ?? nothing}
@@ -0,0 +1,10 @@
1
+ import type { auditName as audit } from './audit-name.js';
2
+ /**
3
+ * The missing-name warning in a production build: nothing.
4
+ *
5
+ * `#audit-name` resolves here unless the bundler or runtime asks for the
6
+ * `development` condition, so a production build carries none of the audit's
7
+ * code. The signature is the audit's, so a call site reads the same in both
8
+ * builds. See `audit-name.ts`.
9
+ */
10
+ export declare const auditName: typeof audit;
@@ -0,0 +1 @@
1
+ export const auditName = () => { };
@@ -6,8 +6,13 @@
6
6
  * **An estimate, cheap on purpose.** It answers whether any route holds words,
7
7
  * which is what the warning is about, and leaves the order the routes win in
8
8
  * to the browser.
9
+ *
10
+ * **What the control shows as its value is no name**, so the words in
11
+ * `shown` count for no route. A Select with no label names its trigger by the
12
+ * part that shows the choice, and while nothing is chosen that part shows the
13
+ * placeholder, "Choose", which says nothing about what is being chosen.
9
14
  */
10
- export declare const hasName: (element: HTMLElement) => boolean;
15
+ export declare const hasName: (element: HTMLElement, shown?: Element | null) => boolean;
11
16
  /**
12
17
  * Warns once, through the runtime channel, when a control has no accessible
13
18
  * name: none on the host, and none on the control inside it.
@@ -18,11 +23,19 @@ export declare const hasName: (element: HTMLElement) => boolean;
18
23
  * that task, and an element is read once in its life, so a name taken away
19
24
  * later is not reported.
20
25
  *
21
- * **In every build.** Every runtime warning in the library reports through the
22
- * same channel whatever the build, and a project that wants the console quiet
23
- * tells `@fusion.dev/helix-diagnostics` with `core.warnings: false`.
26
+ * **In a development build only.** Every field and Button calls it, so in
27
+ * production it would cost each of them about 450 bytes gzip for a sentence
28
+ * meant for the person writing the page. Core imports it as `#audit-name`,
29
+ * which `package.json` resolves here under the `development` condition (Vite
30
+ * and webpack in development, `bun --conditions development`,
31
+ * `node --conditions=development`) and to `audit-name-off.ts`, which does
32
+ * nothing, everywhere else. Like every runtime warning it reports through the
33
+ * one channel, and a project that wants the console quiet tells
34
+ * `@fusion.dev/helix-diagnostics` with `core.warnings: false`.
24
35
  *
25
36
  * `also` answers for a name the component gave through its internals, which no
26
- * attribute shows. `fix` is the sentence that says how to name it.
37
+ * attribute shows. `fix` is the sentence that says how to name it. `shown` is
38
+ * the part where the control shows its value or its placeholder, whose words
39
+ * are no name.
27
40
  */
28
- export declare const auditName: (host: HTMLElement, control: () => HTMLElement | null, fix: string, also?: () => boolean) => void;
41
+ export declare const auditName: (host: HTMLElement, control: () => HTMLElement | null, fix: string, also?: () => boolean, shown?: () => Element | null) => void;
@@ -1,31 +1,13 @@
1
+ import { nameText } from '../name-text/name-text.js';
1
2
  import { reportRuntime } from '../report-runtime/report-runtime.js';
2
- const nameText = (node) => {
3
- if (node instanceof HTMLSlotElement) {
4
- return node.assignedNodes({ flatten: true }).map(nameText).join('');
5
- }
6
- if (node.nodeType === Node.TEXT_NODE) {
7
- return node.textContent ?? '';
8
- }
9
- if (!(node instanceof Element)) {
10
- return '';
11
- }
12
- if ((node instanceof HTMLElement && node.hidden) || node.getAttribute('aria-hidden') === 'true') {
13
- return '';
14
- }
15
- const said = node.getAttribute('aria-label') ?? node.getAttribute('alt');
16
- if (said?.trim()) {
17
- return said;
18
- }
19
- return [...node.childNodes].map(nameText).join('');
20
- };
21
- const namesWithWords = (ids, from) => {
3
+ const namesWithWords = (ids, from, shown) => {
22
4
  const root = from.getRootNode();
23
5
  return (ids ?? '')
24
6
  .split(/\s+/)
25
7
  .filter(Boolean)
26
8
  .some((id) => {
27
9
  const found = root.getElementById?.(id);
28
- return found ? nameText(found).trim() !== '' : false;
10
+ return found ? nameText(found, shown).trim() !== '' : false;
29
11
  });
30
12
  };
31
13
  const NAMED_BY_CONTENT = new Set([
@@ -40,18 +22,18 @@ const NAMED_BY_CONTENT = new Set([
40
22
  'switch',
41
23
  'tab',
42
24
  ]);
43
- export const hasName = (element) => {
25
+ export const hasName = (element, shown) => {
44
26
  for (const attribute of ['aria-label', 'title', 'placeholder']) {
45
27
  if (element.getAttribute(attribute)?.trim()) {
46
28
  return true;
47
29
  }
48
30
  }
49
- if (namesWithWords(element.getAttribute('aria-labelledby'), element)) {
31
+ if (namesWithWords(element.getAttribute('aria-labelledby'), element, shown)) {
50
32
  return true;
51
33
  }
52
34
  const referenced = element
53
35
  .ariaLabelledByElements;
54
- if ((referenced ?? []).some((one) => nameText(one).trim() !== '')) {
36
+ if ((referenced ?? []).some((one) => nameText(one, shown).trim() !== '')) {
55
37
  return true;
56
38
  }
57
39
  const labels = element.labels;
@@ -59,7 +41,7 @@ export const hasName = (element) => {
59
41
  return true;
60
42
  }
61
43
  const role = element.getAttribute('role') ?? (element.localName === 'button' ? 'button' : '');
62
- return NAMED_BY_CONTENT.has(role) && nameText(element).trim() !== '';
44
+ return NAMED_BY_CONTENT.has(role) && nameText(element, shown).trim() !== '';
63
45
  };
64
46
  const audited = new WeakSet();
65
47
  const waiting = new Map();
@@ -70,7 +52,7 @@ const readWaiting = () => {
70
52
  check();
71
53
  }
72
54
  };
73
- export const auditName = (host, control, fix, also) => {
55
+ export const auditName = (host, control, fix, also, shown) => {
74
56
  if (audited.has(host) || waiting.has(host)) {
75
57
  return;
76
58
  }
@@ -83,7 +65,8 @@ export const auditName = (host, control, fix, also) => {
83
65
  }
84
66
  audited.add(host);
85
67
  const inner = control();
86
- if (also?.() || hasName(host) || (inner !== null && hasName(inner))) {
68
+ const value = shown?.();
69
+ if (also?.() || hasName(host) || (inner !== null && hasName(inner, value))) {
87
70
  return;
88
71
  }
89
72
  reportRuntime({