@fusion.dev/helix-headless 0.148.0 → 0.149.1

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 (240) hide show
  1. package/custom-elements.json +6966 -1798
  2. package/dist/announcement/root/announcement-root.d.ts +5 -0
  3. package/dist/announcement/root/announcement-root.js +5 -2
  4. package/dist/area-chart/root/area-chart-root.d.ts +11 -0
  5. package/dist/area-chart/root/area-chart-root.js +20 -7
  6. package/dist/avatar/group/avatar-group.d.ts +10 -2
  7. package/dist/avatar/group/avatar-group.js +10 -5
  8. package/dist/badge/count.d.ts +6 -1
  9. package/dist/badge/count.js +3 -3
  10. package/dist/badge/root/badge-root.d.ts +6 -2
  11. package/dist/badge/root/badge-root.js +3 -3
  12. package/dist/bar-chart/root/bar-chart-root.d.ts +13 -1
  13. package/dist/bar-chart/root/bar-chart-root.js +17 -4
  14. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +8 -1
  15. package/dist/breadcrumbs/root/breadcrumbs-root.js +5 -2
  16. package/dist/button/root/button-root.d.ts +10 -1
  17. package/dist/button/root/button-root.js +3 -2
  18. package/dist/button-group/root/button-group-root.d.ts +3 -0
  19. package/dist/button-group/root/button-group-root.js +2 -2
  20. package/dist/callout/root/callout-root.d.ts +16 -2
  21. package/dist/callout/root/callout-root.js +16 -4
  22. package/dist/canvas/describe.d.ts +10 -0
  23. package/dist/canvas/describe.js +9 -0
  24. package/dist/canvas/neighbor.d.ts +17 -0
  25. package/dist/canvas/neighbor.js +1 -0
  26. package/dist/canvas/node/canvas-node.js +3 -2
  27. package/dist/canvas/root/canvas-root.d.ts +65 -8
  28. package/dist/canvas/root/canvas-root.js +115 -49
  29. package/dist/carousel/root/carousel-root.d.ts +5 -0
  30. package/dist/carousel/root/carousel-root.js +16 -5
  31. package/dist/chat/composer/chat-composer.d.ts +5 -0
  32. package/dist/chat/composer/chat-composer.js +4 -1
  33. package/dist/chat/message/chat-message.d.ts +9 -5
  34. package/dist/chat/message/chat-message.js +8 -4
  35. package/dist/chat/naming.js +2 -2
  36. package/dist/chat/root/chat-root.d.ts +27 -1
  37. package/dist/chat/root/chat-root.js +37 -9
  38. package/dist/checkbox/root/checkbox-root.d.ts +11 -0
  39. package/dist/checkbox/root/checkbox-root.js +8 -2
  40. package/dist/checkbox-group/root/checkbox-group-root.d.ts +11 -0
  41. package/dist/checkbox-group/root/checkbox-group-root.js +11 -3
  42. package/dist/code-block/root/code-block-root.d.ts +12 -2
  43. package/dist/code-block/root/code-block-root.js +12 -2
  44. package/dist/color-input/root/color-input-root.d.ts +13 -0
  45. package/dist/color-input/root/color-input-root.js +18 -5
  46. package/dist/color-picker/root/color-picker-root.d.ts +19 -3
  47. package/dist/color-picker/root/color-picker-root.js +47 -13
  48. package/dist/combobox/root/combobox-root.d.ts +36 -7
  49. package/dist/combobox/root/combobox-root.js +37 -12
  50. package/dist/command/root/command-root.d.ts +15 -6
  51. package/dist/command/root/command-root.js +9 -4
  52. package/dist/copy-button/root/copy-button-root.d.ts +5 -0
  53. package/dist/copy-button/root/copy-button-root.js +7 -2
  54. package/dist/data-table/root/data-table-root.d.ts +171 -29
  55. package/dist/data-table/root/data-table-root.js +268 -118
  56. package/dist/date-input/root/date-input-root.d.ts +32 -9
  57. package/dist/date-input/root/date-input-root.js +66 -44
  58. package/dist/date-picker/root/date-picker-root.d.ts +38 -15
  59. package/dist/date-picker/root/date-picker-root.js +52 -33
  60. package/dist/dialog/root/dialog-root.d.ts +12 -1
  61. package/dist/dialog/root/dialog-root.js +11 -4
  62. package/dist/donut-chart/root/donut-chart-root.d.ts +5 -0
  63. package/dist/donut-chart/root/donut-chart-root.js +8 -5
  64. package/dist/drawer/root/drawer-root.d.ts +12 -1
  65. package/dist/drawer/root/drawer-root.js +9 -2
  66. package/dist/drilldown/root/drilldown-root.d.ts +5 -0
  67. package/dist/drilldown/root/drilldown-root.js +4 -1
  68. package/dist/element-events.generated.js +25 -3
  69. package/dist/file-input/root/file-input-root.d.ts +18 -3
  70. package/dist/file-input/root/file-input-root.js +34 -17
  71. package/dist/filter-input/chip/filter-chip.d.ts +13 -0
  72. package/dist/filter-input/chip/filter-chip.js +6 -1
  73. package/dist/filter-input/menu/filter-menu.d.ts +5 -0
  74. package/dist/filter-input/menu/filter-menu.js +3 -1
  75. package/dist/filter-input/root/filter-input-root.d.ts +20 -3
  76. package/dist/filter-input/root/filter-input-root.js +8 -4
  77. package/dist/format-date/root/format-date-root.d.ts +20 -2
  78. package/dist/format-date/root/format-date-root.js +5 -2
  79. package/dist/graph/root/graph-model.d.ts +11 -0
  80. package/dist/graph/root/graph-model.js +4 -0
  81. package/dist/graph/root/graph-root.d.ts +78 -9
  82. package/dist/graph/root/graph-root.js +124 -27
  83. package/dist/heatmap/root/heatmap-root.d.ts +25 -4
  84. package/dist/heatmap/root/heatmap-root.js +27 -7
  85. package/dist/icon-button/root/icon-button-root.d.ts +5 -0
  86. package/dist/icon-button/root/icon-button-root.js +1 -0
  87. package/dist/input/root/input-root.d.ts +5 -0
  88. package/dist/input/root/input-root.js +4 -1
  89. package/dist/lightbox/root/lightbox-root.d.ts +14 -4
  90. package/dist/lightbox/root/lightbox-root.js +25 -7
  91. package/dist/line-chart/root/line-chart-root.d.ts +5 -0
  92. package/dist/line-chart/root/line-chart-root.js +4 -2
  93. package/dist/list/item/list-item.d.ts +32 -0
  94. package/dist/list/item/list-item.js +34 -7
  95. package/dist/list/root/list-root.d.ts +87 -0
  96. package/dist/list/root/list-root.js +112 -2
  97. package/dist/listbox/reorder/index.d.ts +1 -0
  98. package/dist/listbox/reorder/index.js +4 -0
  99. package/dist/listbox/reorder/listbox-reorder.d.ts +83 -0
  100. package/dist/listbox/reorder/listbox-reorder.js +151 -0
  101. package/dist/listbox/root/listbox-root.d.ts +68 -11
  102. package/dist/listbox/root/listbox-root.js +41 -9
  103. package/dist/loader/root/loader-root.d.ts +5 -0
  104. package/dist/loader/root/loader-root.js +3 -1
  105. package/dist/map/area/map-area.d.ts +5 -0
  106. package/dist/map/area/map-area.js +3 -1
  107. package/dist/map/buildings/map-buildings.d.ts +5 -0
  108. package/dist/map/buildings/map-buildings.js +3 -1
  109. package/dist/map/contours/map-contours.d.ts +5 -0
  110. package/dist/map/contours/map-contours.js +3 -1
  111. package/dist/map/landcover/map-landcover.d.ts +5 -0
  112. package/dist/map/landcover/map-landcover.js +3 -1
  113. package/dist/map/marker/map-marker.d.ts +16 -1
  114. package/dist/map/marker/map-marker.js +13 -5
  115. package/dist/map/points/map-points.d.ts +5 -0
  116. package/dist/map/points/map-points.js +6 -4
  117. package/dist/map/position/map-position.d.ts +5 -0
  118. package/dist/map/position/map-position.js +3 -1
  119. package/dist/map/raster/map-raster.d.ts +5 -0
  120. package/dist/map/raster/map-raster.js +3 -1
  121. package/dist/map/root/map-root.d.ts +33 -14
  122. package/dist/map/root/map-root.js +59 -22
  123. package/dist/map/route/map-route.d.ts +5 -0
  124. package/dist/map/route/map-route.js +3 -1
  125. package/dist/map/terrain/map-terrain.d.ts +5 -0
  126. package/dist/map/terrain/map-terrain.js +3 -1
  127. package/dist/menu/root/menu-root.d.ts +5 -0
  128. package/dist/menu/root/menu-root.js +3 -1
  129. package/dist/meter/root/meter-root.d.ts +16 -3
  130. package/dist/meter/root/meter-root.js +12 -5
  131. package/dist/navigation/root/navigation-root.d.ts +5 -0
  132. package/dist/navigation/root/navigation-root.js +3 -1
  133. package/dist/notifications/notification/notification.d.ts +5 -0
  134. package/dist/notifications/notification/notification.js +3 -1
  135. package/dist/notifications/root/notifications-root.d.ts +8 -0
  136. package/dist/notifications/root/notifications-root.js +10 -2
  137. package/dist/number-input/root/number-input-root.d.ts +21 -8
  138. package/dist/number-input/root/number-input-root.js +26 -11
  139. package/dist/object-inspector/root/object-inspector-root.d.ts +51 -12
  140. package/dist/object-inspector/root/object-inspector-root.js +21 -20
  141. package/dist/outline/root/outline-root.d.ts +5 -0
  142. package/dist/outline/root/outline-root.js +3 -1
  143. package/dist/pagination/root/pagination-root.d.ts +7 -1
  144. package/dist/pagination/root/pagination-root.js +16 -7
  145. package/dist/pagination/size/pagination-size.d.ts +7 -3
  146. package/dist/pagination/size/pagination-size.js +4 -2
  147. package/dist/pagination/summary/pagination-summary.d.ts +8 -6
  148. package/dist/pagination/summary/pagination-summary.js +4 -9
  149. package/dist/pin-input/code.d.ts +6 -6
  150. package/dist/pin-input/code.js +1 -5
  151. package/dist/pin-input/root/pin-input-root.d.ts +9 -3
  152. package/dist/pin-input/root/pin-input-root.js +6 -2
  153. package/dist/popover/root/popover-root.d.ts +12 -2
  154. package/dist/popover/root/popover-root.js +10 -4
  155. package/dist/progress/root/progress-root.d.ts +7 -2
  156. package/dist/progress/root/progress-root.js +5 -2
  157. package/dist/qr-code/name.d.ts +3 -2
  158. package/dist/qr-code/name.js +2 -2
  159. package/dist/qr-code/root/qr-code-root.d.ts +12 -2
  160. package/dist/qr-code/root/qr-code-root.js +9 -2
  161. package/dist/radio/group/radio-group.d.ts +11 -0
  162. package/dist/radio/group/radio-group.js +8 -2
  163. package/dist/rating/root/rating-root.d.ts +12 -1
  164. package/dist/rating/root/rating-root.js +10 -3
  165. package/dist/scatter-chart/root/scatter-chart-root.d.ts +20 -2
  166. package/dist/scatter-chart/root/scatter-chart-root.js +20 -5
  167. package/dist/select/root/select-root.d.ts +11 -0
  168. package/dist/select/root/select-root.js +13 -3
  169. package/dist/skip-link/root/skip-link-root.d.ts +5 -0
  170. package/dist/skip-link/root/skip-link-root.js +3 -1
  171. package/dist/slider/root/slider-root.d.ts +7 -2
  172. package/dist/slider/root/slider-root.js +11 -5
  173. package/dist/sparkline/readings.d.ts +15 -5
  174. package/dist/sparkline/readings.js +3 -3
  175. package/dist/sparkline/root/sparkline-root.d.ts +9 -4
  176. package/dist/sparkline/root/sparkline-root.js +9 -3
  177. package/dist/speed-dial/root/speed-dial-root.d.ts +5 -0
  178. package/dist/speed-dial/root/speed-dial-root.js +4 -1
  179. package/dist/splitter/root/splitter-root.d.ts +6 -1
  180. package/dist/splitter/root/splitter-root.js +9 -4
  181. package/dist/steps/root/steps-root.d.ts +9 -2
  182. package/dist/steps/root/steps-root.js +6 -3
  183. package/dist/steps/step/step.d.ts +12 -0
  184. package/dist/steps/step/step.js +11 -2
  185. package/dist/switch/root/switch-root.d.ts +11 -0
  186. package/dist/switch/root/switch-root.js +8 -2
  187. package/dist/table/column/table-column.d.ts +11 -4
  188. package/dist/table/column/table-column.js +15 -10
  189. package/dist/table/grid-controller.d.ts +8 -3
  190. package/dist/table/grid-controller.js +17 -11
  191. package/dist/table/root/table-root.d.ts +107 -5
  192. package/dist/table/root/table-root.js +122 -20
  193. package/dist/table/row/table-row.d.ts +42 -0
  194. package/dist/table/row/table-row.js +40 -1
  195. package/dist/tabs/root/tabs-root.d.ts +5 -0
  196. package/dist/tabs/root/tabs-root.js +3 -1
  197. package/dist/tag/group/tag-group.d.ts +5 -0
  198. package/dist/tag/group/tag-group.js +3 -1
  199. package/dist/tag/root/tag-root.d.ts +14 -1
  200. package/dist/tag/root/tag-root.js +11 -8
  201. package/dist/textarea/root/textarea-root.d.ts +5 -0
  202. package/dist/textarea/root/textarea-root.js +3 -1
  203. package/dist/time-input/root/time-input-root.d.ts +14 -7
  204. package/dist/time-input/root/time-input-root.js +43 -32
  205. package/dist/time-picker/root/time-picker-root.d.ts +15 -7
  206. package/dist/time-picker/root/time-picker-root.js +25 -12
  207. package/dist/toast/item/toast-item.d.ts +7 -0
  208. package/dist/toast/item/toast-item.js +1 -0
  209. package/dist/toast/root/toast-root.d.ts +9 -1
  210. package/dist/toast/root/toast-root.js +5 -4
  211. package/dist/toolbar/root/toolbar-root.d.ts +5 -0
  212. package/dist/toolbar/root/toolbar-root.js +5 -2
  213. package/dist/tooltip/root/tooltip-root.d.ts +27 -17
  214. package/dist/tour/root/tour-root.d.ts +8 -2
  215. package/dist/tour/root/tour-root.js +4 -2
  216. package/dist/tour/stop/tour-stop.d.ts +5 -0
  217. package/dist/tour/stop/tour-stop.js +6 -1
  218. package/dist/tree/grip.d.ts +5 -0
  219. package/dist/tree/grip.js +1 -0
  220. package/dist/tree/item/tree-item.d.ts +24 -0
  221. package/dist/tree/item/tree-item.js +27 -5
  222. package/dist/tree/root/tree-root.d.ts +66 -1
  223. package/dist/tree/root/tree-root.js +77 -5
  224. package/dist/trend/root/trend-root.d.ts +20 -4
  225. package/dist/trend/root/trend-root.js +20 -5
  226. package/dist/video/root/video-root.d.ts +12 -3
  227. package/dist/video/root/video-root.js +41 -14
  228. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
  229. package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
  230. package/dist/video-playlist/root/video-playlist-root.d.ts +5 -0
  231. package/dist/video-playlist/root/video-playlist-root.js +3 -1
  232. package/dist/virtual-list/root/virtual-list-root.d.ts +19 -3
  233. package/dist/virtual-list/root/virtual-list-root.js +5 -2
  234. package/lint.json +1 -1
  235. package/package.json +9 -8
  236. package/types/jsx.d.ts +4014 -1862
  237. package/types/vue.d.ts +1266 -624
  238. package/types/words.d.ts +3280 -0
  239. package/dist/toast/hotkey.d.ts +0 -22
  240. package/dist/toast/hotkey.js +0 -23
@@ -95,6 +95,11 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
95
95
  * @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
96
96
  */
97
97
  export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base {
98
+ /**
99
+ * The key this family's words are registered under, its styled tag:
100
+ * `registerWords('de', { 'helix-file-input': { triggerLabel: 'Dateien auswählen' } })`.
101
+ */
102
+ static words: string;
98
103
  protected readonly aria: AriaForwardController;
99
104
  /**
100
105
  * Which files the picker offers and a drop takes, as a native `accept` list.
@@ -108,6 +113,11 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
108
113
  * `{count}` filled in.
109
114
  */
110
115
  addedText: string;
116
+ /**
117
+ * A file's size under a kilobyte. `{count}` is how many bytes, written in
118
+ * the locale, and each language writes the forms it has.
119
+ */
120
+ bytesLabel: string;
111
121
  /**
112
122
  * Which camera or microphone a mobile picker should offer, if any.
113
123
  */
@@ -118,9 +128,9 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
118
128
  */
119
129
  directory: boolean;
120
130
  /**
121
- * Language tag the sizes are written in.
122
- *
123
- * Absent uses the runtime's own.
131
+ * The locale the words, the sizes, and the numbers and lists in sentences
132
+ * are in, as a BCP 47 tag such as `pl`. Empty reads the nearest `lang`, then
133
+ * the browser's language.
124
134
  */
125
135
  locale: string;
126
136
  /**
@@ -219,6 +229,11 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
219
229
  * count is written as the language writes a number.
220
230
  */
221
231
  private listed;
232
+ /**
233
+ * A name about one file: `{name}` filled in, or the file's name after a
234
+ * page's label that has no `{name}`.
235
+ */
236
+ private aboutFile;
222
237
  /** The element slotted into `remove-icon`, one copy per row's remove button. */
223
238
  private readonly removeIcon;
224
239
  private readonly handleRemoveIcon;
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AriaForwardController, customElement, drawIcon, drawStatus, fillTemplate, formatNumbers, HelixBeforeChangeEvent, HelixFormElement, HelixRejectEvent, labelWith, MixinField, requestChange, restoreValue, SlottedGlyph, StatusController, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, customElement, drawIcon, drawStatus, formatWords, HelixBeforeChangeEvent, HelixFormElement, HelixRejectEvent, labelWith, MixinField, requestChange, restoreValue, SlottedGlyph, StatusController, words, wordsLocale, } from '@fusion.dev/helix-core';
8
8
  import { trash } from '@fusion.dev/helix-icons';
9
9
  import { nothing } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
@@ -12,19 +12,19 @@ import { html } from 'lit/static-html.js';
12
12
  import { screenFiles } from '../screen.js';
13
13
  import { barOf, saysStatus } from '../status.js';
14
14
  import '../../tag/index.js';
15
- const size = (bytes, locale) => {
16
- const units = ['bytes', 'KB', 'MB', 'GB', 'TB'];
15
+ const size = (bytes, locale, inBytes) => {
16
+ const units = ['', 'KB', 'MB', 'GB', 'TB'];
17
17
  let value = bytes;
18
18
  let step = 0;
19
19
  while (value >= 1024 && step < units.length - 1) {
20
20
  value /= 1024;
21
21
  step += 1;
22
22
  }
23
- const written = new Intl.NumberFormat(locale || undefined, {
24
- maximumFractionDigits: step === 0 ? 0 : 1,
25
- }).format(value);
26
- const unit = step === 0 && value === 1 ? 'byte' : units[step];
27
- return `${written} ${unit}`;
23
+ if (step === 0) {
24
+ return inBytes(value);
25
+ }
26
+ const written = new Intl.NumberFormat(locale || undefined, { maximumFractionDigits: 1 }).format(value);
27
+ return `${written} ${units[step]}`;
28
28
  };
29
29
  const kind = (file) => {
30
30
  const extension = /\.([a-z0-9]{1,6})$/i.exec(file.name)?.[1];
@@ -43,6 +43,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
43
43
  });
44
44
  this.accept = '';
45
45
  this.addedText = 'Added: {names}';
46
+ this.bytesLabel = '{count, plural, one {# byte} other {# bytes}}';
46
47
  this.directory = false;
47
48
  this.locale = '';
48
49
  this.multiple = false;
@@ -107,6 +108,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
107
108
  });
108
109
  };
109
110
  }
111
+ static { this.words = 'helix-file-input'; }
110
112
  setFileStatus(file, status) {
111
113
  const was = this.statuses.get(file);
112
114
  if (status) {
@@ -150,9 +152,9 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
150
152
  this.dispatchEvent(new HelixRejectEvent({ files: refused }));
151
153
  }
152
154
  const words = [
153
- applied && !picked && added.length > 0 ? this.listed(this.addedText, added) : '',
155
+ applied && !picked && added.length > 0 ? this.listed('addedText', added) : '',
154
156
  refused.length > 0
155
- ? this.listed(this.rejectedText, refused.map((one) => one.file))
157
+ ? this.listed('rejectedText', refused.map((one) => one.file))
156
158
  : '',
157
159
  ].filter((one) => one !== '');
158
160
  if (words.length > 0) {
@@ -160,11 +162,16 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
160
162
  }
161
163
  }
162
164
  listed(sentence, files) {
163
- return fillTemplate(sentence, {
164
- count: formatNumbers(this.lang)(files.length),
165
- names: new Intl.ListFormat(this.lang || undefined, { style: 'short', type: 'unit' }).format(files.map((file) => file.name)),
165
+ return formatWords(this, sentence, {
166
+ count: files.length,
167
+ names: new Intl.ListFormat(wordsLocale(this), { style: 'short', type: 'unit' }).format(files.map((file) => file.name)),
166
168
  });
167
169
  }
170
+ aboutFile(label, name) {
171
+ return this[label].includes('{name}')
172
+ ? formatWords(this, label, { name })
173
+ : labelWith(this[label], 'name', name);
174
+ }
168
175
  removeMark(at) {
169
176
  return this.removeIcon.copyFor(at) ?? drawIcon(trash);
170
177
  }
@@ -180,7 +187,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
180
187
  removeAt(at) {
181
188
  const gone = this.files[at];
182
189
  if (gone && this.commit(this.files.filter((_, index) => index !== at))) {
183
- this.status.say(fillTemplate(this.removedText, { name: gone.name }));
190
+ this.status.say(formatWords(this, 'removedText', { name: gone.name }));
184
191
  }
185
192
  }
186
193
  commit(next) {
@@ -262,7 +269,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
262
269
  }
263
270
  renderMeta(file) {
264
271
  return html `<${this.tag('tag')} part="size"
265
- exportparts="cell: size-cell, dismiss: size-dismiss, dismiss-mark: size-dismiss-mark, label: size-label, link: size-link, start: size-start">${size(file.size, this.locale)}</${this.tag('tag')}>
272
+ exportparts="cell: size-cell, dismiss: size-dismiss, dismiss-mark: size-dismiss-mark, label: size-label, link: size-link, start: size-start">${size(file.size, wordsLocale(this), (count) => formatWords(this, 'bytesLabel', { count }))}</${this.tag('tag')}>
266
273
  <${this.tag('tag')}
267
274
  part="kind"
268
275
  exportparts="cell: kind-cell, dismiss: kind-dismiss, dismiss-mark: kind-dismiss-mark, label: kind-label, link: kind-link, start: kind-start">${kind(file)}</${this.tag('tag')}>`;
@@ -280,7 +287,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
280
287
  part="progress"
281
288
  max="1"
282
289
  value=${bar === 'unmeasured' ? nothing : bar}
283
- aria-label=${labelWith(this.progressLabel, 'name', file.name)}
290
+ aria-label=${this.aboutFile('progressLabel', file.name)}
284
291
  ></progress>`}${status.text ? html `<span part="status-text">${status.text}</span>` : nothing}</span
285
292
  >`;
286
293
  }
@@ -345,7 +352,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
345
352
  <button
346
353
  part="remove"
347
354
  type="button"
348
- aria-label=${labelWith(this.removeLabel, 'name', file.name)}
355
+ aria-label=${this.aboutFile('removeLabel', file.name)}
349
356
  data-at=${at}
350
357
  ?disabled=${this.isDisabled}
351
358
  @click=${this.handleRemove}
@@ -361,8 +368,13 @@ __decorate([
361
368
  property()
362
369
  ], HelixHeadlessFileInput.prototype, "accept", void 0);
363
370
  __decorate([
371
+ words,
364
372
  property({ attribute: 'added-text' })
365
373
  ], HelixHeadlessFileInput.prototype, "addedText", void 0);
374
+ __decorate([
375
+ words,
376
+ property({ attribute: 'bytes-label' })
377
+ ], HelixHeadlessFileInput.prototype, "bytesLabel", void 0);
366
378
  __decorate([
367
379
  property()
368
380
  ], HelixHeadlessFileInput.prototype, "capture", void 0);
@@ -382,15 +394,19 @@ __decorate([
382
394
  property({ reflect: true, type: Boolean })
383
395
  ], HelixHeadlessFileInput.prototype, "multiple", void 0);
384
396
  __decorate([
397
+ words,
385
398
  property({ attribute: 'progress-label' })
386
399
  ], HelixHeadlessFileInput.prototype, "progressLabel", void 0);
387
400
  __decorate([
401
+ words,
388
402
  property({ attribute: 'rejected-text' })
389
403
  ], HelixHeadlessFileInput.prototype, "rejectedText", void 0);
390
404
  __decorate([
405
+ words,
391
406
  property({ attribute: 'removed-text' })
392
407
  ], HelixHeadlessFileInput.prototype, "removedText", void 0);
393
408
  __decorate([
409
+ words,
394
410
  property({ attribute: 'remove-label' })
395
411
  ], HelixHeadlessFileInput.prototype, "removeLabel", void 0);
396
412
  __decorate([
@@ -400,6 +416,7 @@ __decorate([
400
416
  property({ attribute: false })
401
417
  ], HelixHeadlessFileInput.prototype, "transformFiles", void 0);
402
418
  __decorate([
419
+ words,
403
420
  property({ attribute: 'trigger-label' })
404
421
  ], HelixHeadlessFileInput.prototype, "triggerLabel", void 0);
405
422
  __decorate([
@@ -63,6 +63,19 @@ declare const HelixHeadlessFilterChip_base: (new (...args: any[]) => import("@fu
63
63
  * @csspart values - The values the field is compared to.
64
64
  */
65
65
  export declare class HelixHeadlessFilterChip extends HelixHeadlessFilterChip_base {
66
+ /**
67
+ * The key this family's words are registered under, its styled tag:
68
+ * `registerWords('de', { 'helix-filter-chip': { dismissLabel: 'Filter entfernen' } })`.
69
+ */
70
+ static words: string;
71
+ /**
72
+ * The remove button's name, read by screen readers. The chip's own words
73
+ * follow it, so several chips are told apart.
74
+ *
75
+ * "Remove filter" rather than the mixin's "Dismiss", for the reason `Tag`
76
+ * gives its own: taking a filter out of a set is a different act from
77
+ * closing a message.
78
+ */
66
79
  dismissLabel: string;
67
80
  /**
68
81
  * The name of the field the filter is on, as shown on the chip.
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixElement, labelWith, MixinDismissible, slottedWords, } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixElement, labelWith, MixinDismissible, slottedWords, words, } from '@fusion.dev/helix-core';
8
8
  import { x } from '@fusion.dev/helix-icons';
9
9
  import { html, nothing } from 'lit';
10
10
  import { property } from 'lit/decorators.js';
@@ -16,6 +16,7 @@ let HelixHeadlessFilterChip = class HelixHeadlessFilterChip extends MixinDismiss
16
16
  this.label = '';
17
17
  this.operatorLabel = '';
18
18
  }
19
+ static { this.words = 'helix-filter-chip'; }
19
20
  get removeName() {
20
21
  const read = (slot, fallback) => (this.childrenKnown && slottedWords(this, [slot])) || fallback;
21
22
  const words = [read('field', this.label), read('operator', this.operatorLabel), read('', '')]
@@ -51,6 +52,10 @@ let HelixHeadlessFilterChip = class HelixHeadlessFilterChip extends MixinDismiss
51
52
  : nothing}`;
52
53
  }
53
54
  };
55
+ __decorate([
56
+ words,
57
+ property({ attribute: 'dismiss-label' })
58
+ ], HelixHeadlessFilterChip.prototype, "dismissLabel", void 0);
54
59
  __decorate([
55
60
  property()
56
61
  ], HelixHeadlessFilterChip.prototype, "label", void 0);
@@ -85,6 +85,11 @@ import '../../menu/index.js';
85
85
  * @csspart menu-title - The name of the field whose page is showing.
86
86
  */
87
87
  export declare class HelixHeadlessFilterMenu extends HelixElement {
88
+ /**
89
+ * The key this family's words are registered under, its styled tag:
90
+ * `registerWords('de', { 'helix-filter-menu': { label: 'Filtern' } })`.
91
+ */
92
+ static words: string;
88
93
  /**
89
94
  * The menu's name, read by screen readers.
90
95
  */
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixElement, HelixFacetEvent } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixElement, HelixFacetEvent, words } from '@fusion.dev/helix-core';
8
8
  import { nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { html } from 'lit/static-html.js';
@@ -55,6 +55,7 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
55
55
  this.apply(field, [...ticked]);
56
56
  };
57
57
  }
58
+ static { this.words = 'helix-filter-menu'; }
58
59
  get fields() {
59
60
  return this.knownChildren.filter((child) => child instanceof HelixHeadlessFilterField);
60
61
  }
@@ -203,6 +204,7 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
203
204
  }
204
205
  };
205
206
  __decorate([
207
+ words,
206
208
  property()
207
209
  ], HelixHeadlessFilterMenu.prototype, "label", void 0);
208
210
  HelixHeadlessFilterMenu = __decorate([
@@ -132,6 +132,11 @@ declare const HelixHeadlessFilterInput_base: (new (...args: any[]) => import("@f
132
132
  * @cssstate open - The suggestions are open.
133
133
  */
134
134
  export declare class HelixHeadlessFilterInput extends HelixHeadlessFilterInput_base {
135
+ /**
136
+ * The key this family's words are registered under, its styled tag:
137
+ * `registerWords('de', { 'helix-filter-input': { clearLabel: 'Leeren' } })`.
138
+ */
139
+ static words: string;
135
140
  protected readonly aria: AriaForwardController;
136
141
  /** Typed, so every keystroke is announced. See `announcesInput`. */
137
142
  protected readonly announcesInput = true;
@@ -161,9 +166,21 @@ export declare class HelixHeadlessFilterInput extends HelixHeadlessFilterInput_b
161
166
  * Not a label: it goes when typing starts.
162
167
  */
163
168
  placeholder: string;
164
- /** What a reader hears for one suggestion, with `{count}` filled in. */
165
- suggestionLabel: string;
166
- /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
169
+ /**
170
+ * What a reader hears for one suggestion, where `suggestions-label` should
171
+ * not say it. `{count}` is the count.
172
+ *
173
+ * @deprecated Write every form in `suggestions-label`, as `{count, plural,
174
+ * one {# suggestion} other {# suggestions}}`. Removed in the next major
175
+ * version.
176
+ */
177
+ suggestionLabel?: string;
178
+ /**
179
+ * What a reader hears as the panel opens on its suggestions. `{count}` is
180
+ * how many, written in the locale, and each language writes the forms it
181
+ * has: `{count, plural, one {# sugestia} few {# sugestie} many {# sugestii}
182
+ * other {# sugestii}}`.
183
+ */
167
184
  suggestionsLabel: string;
168
185
  /** The live region, rendered from the first count said. */
169
186
  private readonly status;
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AriaForwardController, countLabel, customElement, drawIcon, drawStatus, HelixFacetEvent, HelixFormElement, holdCaret, MixinControllerOpen, MixinControllerValue, MixinField, MixinTokens, PopoverController, restoreValue, StatusController, scrollItemIntoView, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, countLabel, customElement, drawIcon, drawStatus, formatWords, HelixFacetEvent, HelixFormElement, holdCaret, MixinControllerOpen, MixinControllerValue, MixinField, MixinTokens, PopoverController, restoreValue, StatusController, scrollItemIntoView, words, wordsLocale, } from '@fusion.dev/helix-core';
8
8
  import { x } from '@fusion.dev/helix-icons';
9
9
  import { html, nothing } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
@@ -25,8 +25,7 @@ let HelixHeadlessFilterInput = class HelixHeadlessFilterInput extends MixinContr
25
25
  this.clearLabel = 'Clear';
26
26
  this.filterSuggestions = false;
27
27
  this.placeholder = '';
28
- this.suggestionLabel = '{count} suggestion';
29
- this.suggestionsLabel = '{count} suggestions';
28
+ this.suggestionsLabel = '{count, plural, one {# suggestion} other {# suggestions}}';
30
29
  this.status = new StatusController(this);
31
30
  this.saidCount = -1;
32
31
  this.narrowed = new Set();
@@ -161,6 +160,7 @@ let HelixHeadlessFilterInput = class HelixHeadlessFilterInput extends MixinContr
161
160
  this.over = this.hideOverflow(this.tokens);
162
161
  };
163
162
  }
163
+ static { this.words = 'helix-filter-input'; }
164
164
  narrow() {
165
165
  const term = this.filterSuggestions
166
166
  ? currentTerm(this.value, this.control?.selectionStart ?? this.value.length)
@@ -186,7 +186,9 @@ let HelixHeadlessFilterInput = class HelixHeadlessFilterInput extends MixinContr
186
186
  if (count < 0) {
187
187
  return;
188
188
  }
189
- this.status.sayNow(countLabel(count, this.suggestionLabel, this.suggestionsLabel, this.lang));
189
+ this.status.sayNow(this.suggestionLabel
190
+ ? countLabel(count, this.suggestionLabel, this.suggestionsLabel, wordsLocale(this))
191
+ : formatWords(this, 'suggestionsLabel', { count }));
190
192
  }
191
193
  formValue() {
192
194
  const entries = (this.tokens?.assignedElements({ flatten: true }) ?? [])
@@ -443,6 +445,7 @@ __decorate([
443
445
  property({ type: Boolean })
444
446
  ], HelixHeadlessFilterInput.prototype, "clearable", void 0);
445
447
  __decorate([
448
+ words,
446
449
  property({ attribute: 'clear-label' })
447
450
  ], HelixHeadlessFilterInput.prototype, "clearLabel", void 0);
448
451
  __decorate([
@@ -455,6 +458,7 @@ __decorate([
455
458
  property({ attribute: 'suggestion-label' })
456
459
  ], HelixHeadlessFilterInput.prototype, "suggestionLabel", void 0);
457
460
  __decorate([
461
+ words,
458
462
  property({ attribute: 'suggestions-label' })
459
463
  ], HelixHeadlessFilterInput.prototype, "suggestionsLabel", void 0);
460
464
  __decorate([
@@ -1,4 +1,4 @@
1
- import { HelixElement } from '@fusion.dev/helix-core';
1
+ import { type DateCalendar, HelixElement } from '@fusion.dev/helix-core';
2
2
  import { nothing, type PropertyValues, type TemplateResult } from 'lit';
3
3
  /**
4
4
  * @summary A timestamp, formatted for the user's locale.
@@ -43,6 +43,11 @@ import { nothing, type PropertyValues, type TemplateResult } from 'lit';
43
43
  * Picker format their dates, so a reader west of UTC sees August 4 and not
44
44
  * August 3.
45
45
  *
46
+ * **A date is written in a calendar Date Picker draws**: the locale's own
47
+ * where its months are the Gregorian months, as `th-TH` writes 2569 for 2026,
48
+ * and `gregory` where they are not, as for `fa-IR`. `calendar` picks one of
49
+ * the five.
50
+ *
46
51
  * @since 0.1.0
47
52
  * @status stable
48
53
  * @category typography
@@ -65,6 +70,16 @@ import { nothing, type PropertyValues, type TemplateResult } from 'lit';
65
70
  * @cssstate past - An `elapsed` or `relative` reading of a moment gone, such as "3 hours ago".
66
71
  */
67
72
  export declare class HelixHeadlessFormatDate extends HelixElement {
73
+ /**
74
+ * The calendar a date is written in: `gregory`, `buddhist`, `japanese`,
75
+ * `roc`, or `iso8601`, the calendars Date Picker and Date Input draw.
76
+ *
77
+ * Absent is the locale's own where it is one of the five, such as
78
+ * `buddhist` for `th-TH`, and `gregory` for every other, such as `persian`
79
+ * for `fa-IR`, so a date written here reads as the same date a Date Picker
80
+ * beside it shows.
81
+ */
82
+ calendar?: DateCalendar;
68
83
  /**
69
84
  * The timestamp, in any format `Date` can parse.
70
85
  *
@@ -147,7 +162,10 @@ export declare class HelixHeadlessFormatDate extends HelixElement {
147
162
  * Shoelace and Web Awesome read it, then the runtime's own.
148
163
  */
149
164
  locale: string;
150
- /** The locale the words are written in: `locale`, or the page's `lang`. */
165
+ /**
166
+ * The locale the words are written in, `locale` or the page's `lang`, with
167
+ * the calendar.
168
+ */
151
169
  private get language();
152
170
  /**
153
171
  * How the minute is written, where a time of day is shown.
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, elapsedTime, HelixElement, localeOf, RelativeClockController, relativeTime, } from '@fusion.dev/helix-core';
7
+ import { calendarLocale, customElement, elapsedTime, HelixElement, RelativeClockController, relativeTime, wordsLocale, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { drawFields } from '../fields.js';
@@ -29,7 +29,7 @@ let HelixHeadlessFormatDate = class HelixHeadlessFormatDate extends HelixElement
29
29
  this.written = '';
30
30
  }
31
31
  get language() {
32
- return localeOf(this, this.locale);
32
+ return calendarLocale(wordsLocale(this), this.calendar);
33
33
  }
34
34
  get dateOnly() {
35
35
  return DATE_ONLY.test(this.source);
@@ -120,6 +120,9 @@ let HelixHeadlessFormatDate = class HelixHeadlessFormatDate extends HelixElement
120
120
  return html `<time part="time" datetime=${datetime} aria-label=${spoken} title=${whole}>${this.readingAt(moment, now).text}</time>`;
121
121
  }
122
122
  };
123
+ __decorate([
124
+ property()
125
+ ], HelixHeadlessFormatDate.prototype, "calendar", void 0);
123
126
  __decorate([
124
127
  property()
125
128
  ], HelixHeadlessFormatDate.prototype, "date", void 0);
@@ -87,6 +87,17 @@ export declare const within: (adjacency: Adjacency, from: string, depth: number)
87
87
  * its order instead.
88
88
  */
89
89
  export declare const entriesOf: (sorted: readonly GraphNode[], adjacency: Adjacency, active: string, query: string, shown?: ReadonlySet<string>) => Entry[];
90
+ /**
91
+ * The row the keyboard stays on once the rows are read again from changed
92
+ * notes or links: the row of the note it was on, `id`, wherever that note now
93
+ * is, or, where the note was taken away, the row at `at` that took its place,
94
+ * the last row where the list grew shorter than that.
95
+ *
96
+ * **The reader stays where they were.** A graph a page feeds as things happen
97
+ * changes its notes every few seconds, and a cursor sent to the top on each
98
+ * change threw a reader moving through the list back to its first row.
99
+ */
100
+ export declare const cursorAfter: (entries: readonly Entry[], id: string | undefined, at: number) => number;
90
101
  /** The notes in the order of their names, as the page's language orders words. */
91
102
  export declare const sortedOf: (nodes: readonly GraphNode[], lang?: string) => GraphNode[];
92
103
  /** One group the notes are in, as the legend names it. */
@@ -69,6 +69,10 @@ export const entriesOf = (sorted, adjacency, active, query, shown) => {
69
69
  }
70
70
  return [...first, ...neighbors, ...rest];
71
71
  };
72
+ export const cursorAfter = (entries, id, at) => {
73
+ const found = id === undefined ? -1 : entries.findIndex((entry) => entry.node.id === id);
74
+ return found >= 0 ? found : Math.max(0, Math.min(at, entries.length - 1));
75
+ };
72
76
  export const sortedOf = (nodes, lang) => {
73
77
  const collator = new Intl.Collator(lang || undefined, { numeric: true, sensitivity: 'base' });
74
78
  return [...nodes].sort((one, other) => collator.compare(nameOf(one), nameOf(other)));
@@ -1,4 +1,4 @@
1
- import { type GraphSignalDetail, HelixElement, type ViewportGestureLabels, type ViewportPanDetail, type ViewportZoomDetail } from '@fusion.dev/helix-core';
1
+ import { type GraphSignalDetail, HelixElement, type ViewportPanDetail, type ViewportZoomDetail } from '@fusion.dev/helix-core';
2
2
  import { nothing, type PropertyValues, type TemplateResult } from 'lit';
3
3
  import { type GraphLink, type GraphNode } from './graph-model.js';
4
4
  declare const HelixHeadlessGraph_base: (new (...args: any[]) => import("@fusion.dev/helix-core").ViewportElement) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerActiveInterface) & typeof HelixElement;
@@ -54,11 +54,11 @@ declare const HelixHeadlessGraph_base: (new (...args: any[]) => import("@fusion.
54
54
  * @event {HelixBeforeActivateEvent} helix-before-activate - A note is about to be selected. Cancelable: cancel it to keep the selection in your own state.
55
55
  * @event {HelixGraphFilterEvent} helix-graph-filter - A group in the legend was pressed, to show or hide its notes. The detail's `hidden` is every group that would be hidden. Cancelable: cancel it to keep the groups as they were, or to set `hiddenGroups` yourself.
56
56
  * @event {HelixGraphLayoutEvent} helix-graph-layout - A layout settled, with where it put each note, sent by `laidOut()`. Keep the positions and pass them back as each note's `x` and `y`, and `z` where a renderer draws in three dimensions.
57
- * @event {HelixGraphPanEvent} helix-graph-pan - A pan button or arrow key was pressed. `connectGraph` moves the drawing.
57
+ * @event {HelixGraphPanEvent} helix-graph-pan - A pan button or arrow key was pressed. `connectGraph` moves the drawing, then calls `moved()`.
58
58
  * @event {HelixGraphPartChangeEvent} helix-graph-part-change - The notes, the links, the selection, the depth or the gestures changed. Used by `connectGraph`; pages do not need to listen for it.
59
59
  * @event {HelixGraphReadyEvent} helix-graph-ready - The graph has been drawn whole, laid out and settled. Sent each time `drawn()` says it is drawn after it was not.
60
60
  * @event {HelixGraphSignalEvent} helix-graph-signal - Something passed between two notes, sent by `signal()`. Used by `connectGraph`; pages do not need to listen for it.
61
- * @event {HelixGraphZoomEvent} helix-graph-zoom - A zoom button or key was pressed. `connectGraph` zooms the drawing.
61
+ * @event {HelixGraphZoomEvent} helix-graph-zoom - A zoom button or key was pressed. `connectGraph` zooms the drawing, then calls `moved()`.
62
62
  *
63
63
  * @csspart after - The room the notes after those drawn would take, so the list scrolls its whole length.
64
64
  * @csspart before - The room the notes before those drawn would take.
@@ -77,7 +77,7 @@ declare const HelixHeadlessGraph_base: (new (...args: any[]) => import("@fusion.
77
77
  * @csspart legend-item-hidden - A group in the legend whose notes are hidden.
78
78
  * @csspart legend-swatch - The mark in a group's color, before its name.
79
79
  * @csspart list - The list of notes, which draws only the rows in view.
80
- * @csspart live - What screen readers hear when a search changes how many notes there are.
80
+ * @csspart live - What screen readers hear: how many notes there are when a search or the legend changes it, and which way the drawing went after a key or a control moved it.
81
81
  * @csspart note - One note in the list.
82
82
  * @csspart note-cursor - The note the keyboard is on in the list.
83
83
  * @csspart note-linked - A note linked to or from the selected one.
@@ -110,13 +110,36 @@ declare const HelixHeadlessGraph_base: (new (...args: any[]) => import("@fusion.
110
110
  * @cssstate using - A graph with `gestures="activate"` has been pressed and has the gestures.
111
111
  */
112
112
  export declare class HelixHeadlessGraph extends HelixHeadlessGraph_base {
113
- /** What the list says of a note's count, with `{count}`. */
113
+ /**
114
+ * The key this family's words are registered under, its styled tag:
115
+ * `registerWords('de', { 'helix-graph': { searchLabel: 'Notiz suchen' } })`.
116
+ */
117
+ static words: string;
118
+ /**
119
+ * The hint shown when the graph, waiting to be pressed with
120
+ * `gestures="activate"`, is scrolled or swiped over.
121
+ */
122
+ activateHintLabel: string;
123
+ /**
124
+ * The name of the group of controls, read by screen readers, which names
125
+ * what the controls drive rather than the mechanism.
126
+ */
127
+ controlsLabel: string;
128
+ /**
129
+ * What the list says of how many notes it holds. `{count}` is the count,
130
+ * written in the locale, and each language writes the forms it has.
131
+ */
114
132
  countLabel: string;
115
133
  /**
116
134
  * How many links from the selected note to show, for its local graph. Unset
117
135
  * shows every note. The list holds what the drawing shows.
118
136
  */
119
137
  depth?: number;
138
+ /**
139
+ * The graph's name where `label` is empty and the host has no
140
+ * `aria-label`.
141
+ */
142
+ fallbackLabel: string;
120
143
  /** The groups turned off in the legend, by name, whose notes neither the drawing nor the list shows. A property, never an attribute. */
121
144
  hiddenGroups: readonly string[];
122
145
  /**
@@ -139,6 +162,14 @@ export declare class HelixHeadlessGraph extends HelixHeadlessGraph_base {
139
162
  links: readonly GraphLink[];
140
163
  /** How a note that links to the selected one is described, with `{note}`. */
141
164
  linksToLabel: string;
165
+ /** What screen readers hear once the drawing has moved down, after `moved()`. */
166
+ movedDownLabel: string;
167
+ /** What screen readers hear once the drawing has moved left, after `moved()`. */
168
+ movedLeftLabel: string;
169
+ /** What screen readers hear once the drawing has moved right, after `moved()`. */
170
+ movedRightLabel: string;
171
+ /** What screen readers hear once the drawing has moved up, after `moved()`. */
172
+ movedUpLabel: string;
142
173
  /** The notes. A property, never an attribute. */
143
174
  nodes: readonly GraphNode[];
144
175
  /**
@@ -153,6 +184,19 @@ export declare class HelixHeadlessGraph extends HelixHeadlessGraph_base {
153
184
  searchLabel: string;
154
185
  /** How the selected note is described in the list. */
155
186
  selectedLabel: string;
187
+ /** The hint shown when one finger swipes over the graph with `gestures="cooperative"`. */
188
+ twoFingerHintLabel: string;
189
+ /** The line shown while the graph, with `gestures="activate"`, has the gestures. */
190
+ usingLabel: string;
191
+ /**
192
+ * The hint shown when the wheel scrolls past the graph with
193
+ * `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere.
194
+ */
195
+ wheelHintLabel: string;
196
+ /** What screen readers hear once the drawing has zoomed in, after `moved()`. */
197
+ zoomedInLabel: string;
198
+ /** What screen readers hear once the drawing has zoomed out, after `moved()`. */
199
+ zoomedOutLabel: string;
156
200
  /** What the search field holds. */
157
201
  private query;
158
202
  /** The row the keyboard is on, as an index into the list. */
@@ -175,8 +219,15 @@ export declare class HelixHeadlessGraph extends HelixHeadlessGraph_base {
175
219
  private groups;
176
220
  /** Whether the graph has been drawn whole, which `drawn()` says. */
177
221
  private whole;
178
- /** How many notes there were when the count was last said. */
222
+ /** What the live region says now. */
179
223
  private said;
224
+ /**
225
+ * Which way a reader last asked the drawing to go, by a key or a control,
226
+ * until `moved()` says it went: a side, `in` or `out`.
227
+ */
228
+ private asked;
229
+ /** Whether the next change of the list's rows is one a reader asked for by the legend, whose count is then said. */
230
+ private countAsked;
180
231
  private readonly virtualize;
181
232
  /**
182
233
  * @internal The notes the drawing shows, which `connectGraph` reads: those
@@ -217,16 +268,34 @@ export declare class HelixHeadlessGraph extends HelixHeadlessGraph_base {
217
268
  signal(from: string, to: string, options?: {
218
269
  tone?: GraphSignalDetail['tone'];
219
270
  }): void;
271
+ /**
272
+ * Says the drawing moved the way a reader asked, by a key or a control:
273
+ * the live region says "Moved right" or "Zoomed in" in the frame's words.
274
+ * Called by `connectGraph` once the renderer has moved; a page answering
275
+ * `helix-graph-pan` and `helix-graph-zoom` itself calls it once its view
276
+ * has moved.
277
+ *
278
+ * **Said once the drawing has moved, and only then.** The frame asks and
279
+ * the renderer moves, so a frame with nothing to answer it says nothing: a
280
+ * move said that never happened is worse than silence.
281
+ */
282
+ moved(): void;
283
+ /**
284
+ * Puts words in the live region. **The same words twice differ by a space
285
+ * no reader hears**, since a region whose text does not change is not read
286
+ * again, and a second "Moved left" is news as much as the first.
287
+ */
288
+ private say;
289
+ protected firstUpdated(changed: PropertyValues): void;
220
290
  protected willUpdate(changed: PropertyValues): void;
221
291
  protected updated(changed: PropertyValues): void;
292
+ /** The pan request, and the side it goes to, which `moved()` then says. */
222
293
  protected panEvent(detail: ViewportPanDetail): Event;
294
+ /** The zoom request, and which way it goes, which `moved()` then says. */
223
295
  protected zoomEvent(detail: ViewportZoomDetail): Event;
224
296
  protected get restingControls(): string;
225
- protected get restingControlsLabel(): string;
226
297
  /** Which gestures the renderer takes, which `connectGraph` hears from here. */
227
298
  protected gesturesChanged(): void;
228
- /** What the graph says about its gestures where the page does not say it. */
229
- protected get restingGestureLabels(): ViewportGestureLabels;
230
299
  /** How many notes the list holds, in the page's numbers. */
231
300
  private countText;
232
301
  /** How a row stands to the selected note, in words, or nothing where it does not. */