@fusion.dev/helix-headless 0.177.2 → 0.179.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.
- package/custom-elements.json +826 -104
- package/dist/button/root/button-root.d.ts +12 -0
- package/dist/button/root/button-root.js +9 -0
- package/dist/drilldown/item/drilldown-item.d.ts +6 -0
- package/dist/drilldown/item/drilldown-item.js +9 -0
- package/dist/element-events.generated.js +7 -1
- package/dist/filter-input/index.d.ts +1 -0
- package/dist/filter-input/root/filter-input-root.d.ts +92 -6
- package/dist/filter-input/root/filter-input-root.js +182 -10
- package/dist/filter-input/suggest.d.ts +47 -0
- package/dist/filter-input/suggest.js +17 -0
- package/dist/graph/root/graph-root.d.ts +101 -3
- package/dist/graph/root/graph-root.js +188 -9
- package/dist/heatmap/root/heatmap-root.d.ts +54 -42
- package/dist/heatmap/root/heatmap-root.js +72 -54
- package/dist/menu/item/menu-item.d.ts +6 -0
- package/dist/menu/item/menu-item.js +9 -0
- package/dist/notifications/notification/notification.d.ts +37 -9
- package/dist/notifications/notification/notification.js +21 -4
- package/dist/speed-dial/item/speed-dial-item.d.ts +6 -0
- package/dist/speed-dial/item/speed-dial-item.js +9 -0
- package/dist/tabs/tab/tab.d.ts +6 -0
- package/dist/tabs/tab/tab.js +9 -0
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +460 -132
- package/types/vue.d.ts +83 -43
- package/types/words.d.ts +30 -6
package/types/vue.d.ts
CHANGED
|
@@ -7245,6 +7245,14 @@ an icon. */
|
|
|
7245
7245
|
/** The name of the clear button, read by screen readers. The button shows only
|
|
7246
7246
|
an icon. */
|
|
7247
7247
|
clearLabel?: (HelixHeadlessFilterInput["clearLabel"]) | undefined;
|
|
7248
|
+
/** How long typing rests before `source` is asked, in milliseconds. A delay
|
|
7249
|
+
sends one request for a word in place of one for each letter. The arrow
|
|
7250
|
+
keys and Enter ask at once. `0` asks on every keystroke. */
|
|
7251
|
+
"filter-delay"?: (HelixHeadlessFilterInput["filterDelay"] | `${number}`) | undefined;
|
|
7252
|
+
/** How long typing rests before `source` is asked, in milliseconds. A delay
|
|
7253
|
+
sends one request for a word in place of one for each letter. The arrow
|
|
7254
|
+
keys and Enter ask at once. `0` asks on every keystroke. */
|
|
7255
|
+
filterDelay?: (HelixHeadlessFilterInput["filterDelay"]) | undefined;
|
|
7248
7256
|
/** Whether the panel narrows itself to the suggestions that hold the term
|
|
7249
7257
|
being typed, as React Aria's Autocomplete filters. Off, the panel shows
|
|
7250
7258
|
what you slot and you narrow it. */
|
|
@@ -7438,6 +7446,13 @@ imperatively later, and nothing is hydrating by then.
|
|
|
7438
7446
|
|
|
7439
7447
|
Here rather than on each control. */
|
|
7440
7448
|
name?: (HelixHeadlessFilterInput["name"]) | undefined;
|
|
7449
|
+
/** Where the suggestions come from: a function given the term at the caret,
|
|
7450
|
+
the field it is a value of, the whole text, and an `AbortSignal`, which
|
|
7451
|
+
returns the suggestions or a promise of them. Each is a string, or a
|
|
7452
|
+
`value` with a `label` and `disabled`. The field draws them as options in
|
|
7453
|
+
the panel, beside any you slot. A property only, there being no way to
|
|
7454
|
+
write a function in markup. See the class description. */
|
|
7455
|
+
source?: (HelixHeadlessFilterInput["source"]) | undefined;
|
|
7441
7456
|
};
|
|
7442
7457
|
|
|
7443
7458
|
export type HelixHeadlessFilterInputVueEvents = {
|
|
@@ -7453,7 +7468,7 @@ export type HelixHeadlessFilterInputVueEvents = {
|
|
|
7453
7468
|
"helix-dismiss": HelixHeadlessFilterInputHelixDismissElementEvent;
|
|
7454
7469
|
/** Fired when a filter changes, whether it was typed, picked, or removed. Cancelable: call `preventDefault()` to leave the text and the chip as they were. */
|
|
7455
7470
|
"helix-facet": HelixHeadlessFilterInputHelixFacetElementEvent;
|
|
7456
|
-
/** Fired by an option in `suggestions` when it is chosen, and bubbles out of the field. Cancelable: call `preventDefault()` to stop other listeners acting on it. The field takes no action on
|
|
7471
|
+
/** Fired by an option in `suggestions` when it is chosen, and bubbles out of the field. Cancelable: call `preventDefault()` to stop other listeners acting on it. The field takes no action on an option you slotted, and you decide what it does. A suggestion from `source` is written over the term at the caret unless you cancel it. */
|
|
7457
7472
|
"helix-select": HelixHeadlessFilterInputHelixSelectElementEvent;
|
|
7458
7473
|
/** Fired when the text changes. */
|
|
7459
7474
|
input: HelixHeadlessFilterInputElementEvent;
|
|
@@ -7685,6 +7700,14 @@ or hides its notes. Drawn where the notes have two groups or more. */
|
|
|
7685
7700
|
"legend-label"?: (HelixHeadlessGraph["legendLabel"]) | undefined;
|
|
7686
7701
|
/** The legend's name, read by screen readers. */
|
|
7687
7702
|
legendLabel?: (HelixHeadlessGraph["legendLabel"]) | undefined;
|
|
7703
|
+
/** What screen readers hear when a walk along the links reaches a note that
|
|
7704
|
+
has no link to follow, or goes back to a note: `{note}` for its name and
|
|
7705
|
+
`{count}` for how many notes the list holds that it links to or from. */
|
|
7706
|
+
"link-count-label"?: (HelixHeadlessGraph["linkCountLabel"]) | undefined;
|
|
7707
|
+
/** What screen readers hear when a walk along the links reaches a note that
|
|
7708
|
+
has no link to follow, or goes back to a note: `{note}` for its name and
|
|
7709
|
+
`{count}` for how many notes the list holds that it links to or from. */
|
|
7710
|
+
linkCountLabel?: (HelixHeadlessGraph["linkCountLabel"]) | undefined;
|
|
7688
7711
|
/** How a note linked both to and from the selected one is described, with `{note}`. */
|
|
7689
7712
|
"linked-both-label"?: (HelixHeadlessGraph["linkedBothLabel"]) | undefined;
|
|
7690
7713
|
/** How a note linked both to and from the selected one is described, with `{note}`. */
|
|
@@ -7764,6 +7787,16 @@ the list then holds, written with `count-label`. */
|
|
|
7764
7787
|
"using-label"?: (HelixHeadlessGraph["usingLabel"]) | undefined;
|
|
7765
7788
|
/** The line shown while the graph, with `gestures="activate"`, has the gestures. */
|
|
7766
7789
|
usingLabel?: (HelixHeadlessGraph["usingLabel"]) | undefined;
|
|
7790
|
+
/** What screen readers hear when a walk along the links moves to a note:
|
|
7791
|
+
`{note}` for its name, `{relation}` for how it stands to the note the
|
|
7792
|
+
step came from, such as "Linked from Roadmap", and `{index}` and `{count}`
|
|
7793
|
+
for its place among that note's links. */
|
|
7794
|
+
"walk-label"?: (HelixHeadlessGraph["walkLabel"]) | undefined;
|
|
7795
|
+
/** What screen readers hear when a walk along the links moves to a note:
|
|
7796
|
+
`{note}` for its name, `{relation}` for how it stands to the note the
|
|
7797
|
+
step came from, such as "Linked from Roadmap", and `{index}` and `{count}`
|
|
7798
|
+
for its place among that note's links. */
|
|
7799
|
+
walkLabel?: (HelixHeadlessGraph["walkLabel"]) | undefined;
|
|
7767
7800
|
/** The hint shown when the wheel scrolls past the graph with
|
|
7768
7801
|
`gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
|
|
7769
7802
|
"wheel-hint-label"?: (HelixHeadlessGraph["wheelHintLabel"]) | undefined;
|
|
@@ -7956,7 +7989,7 @@ export type HelixHeadlessGraphVueEvents = {
|
|
|
7956
7989
|
"helix-graph-layout": HelixHeadlessGraphHelixGraphLayoutElementEvent;
|
|
7957
7990
|
/** A pan button or arrow key was pressed. `connectGraph` moves the drawing, then calls `moved()`. */
|
|
7958
7991
|
"helix-graph-pan": HelixHeadlessGraphHelixGraphPanElementEvent;
|
|
7959
|
-
/** The notes, the links, the selection, the depth or the gestures changed. Used by `connectGraph`; pages do not need to listen for it. */
|
|
7992
|
+
/** The notes, the links, the selection, the depth, the note the keys are on, or the gestures changed. Used by `connectGraph`; pages do not need to listen for it. */
|
|
7960
7993
|
"helix-graph-part-change": HelixHeadlessGraphHelixGraphPartChangeElementEvent;
|
|
7961
7994
|
/** The graph has been drawn whole, laid out and settled. Sent each time `drawn()` says it is drawn after it was not. */
|
|
7962
7995
|
"helix-graph-ready": HelixHeadlessGraphHelixGraphReadyElementEvent;
|
|
@@ -7974,6 +8007,12 @@ export type HelixHeadlessHeatmapElementEvent<E = Event> = TypedEvent<
|
|
|
7974
8007
|
/** `helix-before-change` event type */
|
|
7975
8008
|
export type HelixHeadlessHeatmapHelixBeforeChangeElementEvent =
|
|
7976
8009
|
HelixHeadlessHeatmapElementEvent<HelixBeforeChangeEvent>;
|
|
8010
|
+
/** `helix-reading-change` event type */
|
|
8011
|
+
export type HelixHeadlessHeatmapHelixReadingChangeElementEvent =
|
|
8012
|
+
HelixHeadlessHeatmapElementEvent<HelixReadingChangeEvent>;
|
|
8013
|
+
/** `helix-reading-press` event type */
|
|
8014
|
+
export type HelixHeadlessHeatmapHelixReadingPressElementEvent =
|
|
8015
|
+
HelixHeadlessHeatmapElementEvent<HelixReadingPressEvent>;
|
|
7977
8016
|
/** `helix-resize` event type */
|
|
7978
8017
|
export type HelixHeadlessHeatmapHelixResizeElementEvent =
|
|
7979
8018
|
HelixHeadlessHeatmapElementEvent<HelixResizeEvent>;
|
|
@@ -7985,16 +8024,6 @@ export type HelixHeadlessHeatmapVueProps = {
|
|
|
7985
8024
|
/** The name the `overview` gives the busiest reading, `{busiestLabel}` in
|
|
7986
8025
|
`overview-label`. */
|
|
7987
8026
|
busiestLabel?: (HelixHeadlessHeatmap["busiestLabel"]) | undefined;
|
|
7988
|
-
/** Shown when the table has no readings in it.
|
|
7989
|
-
|
|
7990
|
-
Never shown while the table cannot be read at all, which is a server render
|
|
7991
|
-
and the hydrating one after it: see `sourceKnown`. */
|
|
7992
|
-
"empty-text"?: (HelixHeadlessHeatmap["emptyText"]) | undefined;
|
|
7993
|
-
/** Shown when the table has no readings in it.
|
|
7994
|
-
|
|
7995
|
-
Never shown while the table cannot be read at all, which is a server render
|
|
7996
|
-
and the hydrating one after it: see `sourceKnown`. */
|
|
7997
|
-
emptyText?: (HelixHeadlessHeatmap["emptyText"]) | undefined;
|
|
7998
8027
|
/** Space between cells, in CSS pixels. It is a number for the same reason
|
|
7999
8028
|
`min-cell` is. */
|
|
8000
8029
|
gap?: (HelixHeadlessHeatmap["gap"]) | undefined;
|
|
@@ -8052,13 +8081,9 @@ calendar heatmap does: a week is a column, so the strip reads along the
|
|
|
8052
8081
|
line in weeks, from the right on a right-to-left page, and top to bottom in
|
|
8053
8082
|
days. */
|
|
8054
8083
|
rows?: (HelixHeadlessHeatmap["rows"]) | undefined;
|
|
8055
|
-
/** What the readout
|
|
8056
|
-
where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
|
|
8057
|
-
nothing. */
|
|
8084
|
+
/** What the readout added for a selected cell, under `selection-mode`. */
|
|
8058
8085
|
"selected-label"?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
|
|
8059
|
-
/** What the readout
|
|
8060
|
-
where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
|
|
8061
|
-
nothing. */
|
|
8086
|
+
/** What the readout added for a selected cell, under `selection-mode`. */
|
|
8062
8087
|
selectedLabel?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
|
|
8063
8088
|
/** What the `selection` part says after the selection changes. `{count}` is
|
|
8064
8089
|
how many cells are selected, written in the locale, and a language that
|
|
@@ -8115,6 +8140,25 @@ header's words where it carries none.
|
|
|
8115
8140
|
Set it to start with cells selected. Written by a press or a key under
|
|
8116
8141
|
`selection-mode`. */
|
|
8117
8142
|
value?: (HelixHeadlessHeatmap["value"]) | undefined;
|
|
8143
|
+
/** The words shown in place of the drawing when the table has no readings,
|
|
8144
|
+
and the fallback of the `empty` slot. */
|
|
8145
|
+
"empty-text"?: (HelixHeadlessHeatmap["emptyText"]) | undefined;
|
|
8146
|
+
/** The words shown in place of the drawing when the table has no readings,
|
|
8147
|
+
and the fallback of the `empty` slot. */
|
|
8148
|
+
emptyText?: (HelixHeadlessHeatmap["emptyText"]) | undefined;
|
|
8149
|
+
/** Whether the readings are still on their way. The chart shows
|
|
8150
|
+
`loading-text` in place of an empty drawing until it has readings.
|
|
8151
|
+
|
|
8152
|
+
Reflected, so a stylesheet can treat the chart while it waits. A chart
|
|
8153
|
+
that already has readings keeps drawing them, so a refresh does not
|
|
8154
|
+
blank it. */
|
|
8155
|
+
loading?: (HelixHeadlessHeatmap["loading"]) | undefined;
|
|
8156
|
+
/** The words shown in place of the drawing while `loading` is set and
|
|
8157
|
+
there are no readings yet, and the fallback of the `loading` slot. */
|
|
8158
|
+
"loading-text"?: (HelixHeadlessHeatmap["loadingText"]) | undefined;
|
|
8159
|
+
/** The words shown in place of the drawing while `loading` is set and
|
|
8160
|
+
there are no readings yet, and the fallback of the `loading` slot. */
|
|
8161
|
+
loadingText?: (HelixHeadlessHeatmap["loadingText"]) | undefined;
|
|
8118
8162
|
/** The id of the table to read.
|
|
8119
8163
|
|
|
8120
8164
|
Names a table in the same tree, so a chart inside another component's
|
|
@@ -8181,6 +8225,10 @@ export type HelixHeadlessHeatmapVueEvents = {
|
|
|
8181
8225
|
change: HelixHeadlessHeatmapElementEvent;
|
|
8182
8226
|
/** Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable. */
|
|
8183
8227
|
"helix-before-change": HelixHeadlessHeatmapHelixBeforeChangeElementEvent;
|
|
8228
|
+
/** The reading shown moved, or was put away: `index` is the row, or `-1` for none, with its `label`, the `series` the keys rest on, and the `pointerType` that moved it. */
|
|
8229
|
+
"helix-reading-change": HelixHeadlessHeatmapHelixReadingChangeElementEvent;
|
|
8230
|
+
/** A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
|
|
8231
|
+
"helix-reading-press": HelixHeadlessHeatmapHelixReadingPressElementEvent;
|
|
8184
8232
|
/** Fired when the number of cells drawn changes, with the new number. */
|
|
8185
8233
|
"helix-resize": HelixHeadlessHeatmapHelixResizeElementEvent;
|
|
8186
8234
|
};
|
|
@@ -11388,6 +11436,20 @@ empty string would give. */
|
|
|
11388
11436
|
"default-read"?: (HelixHeadlessNotification["defaultRead"]) | undefined;
|
|
11389
11437
|
/** Whether the notification starts as read, used until `read` is set. */
|
|
11390
11438
|
defaultRead?: (HelixHeadlessNotification["defaultRead"]) | undefined;
|
|
11439
|
+
/** The dismiss control's name, read by screen readers, with `{label}` for the
|
|
11440
|
+
row's own words.
|
|
11441
|
+
|
|
11442
|
+
One sentence with the words in it, so a translation puts them where its
|
|
11443
|
+
language does: `registerWords('de', { 'helix-notification': { dismissLabel:
|
|
11444
|
+
'{label} schließen' } })`. */
|
|
11445
|
+
"dismiss-label"?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
|
|
11446
|
+
/** The dismiss control's name, read by screen readers, with `{label}` for the
|
|
11447
|
+
row's own words.
|
|
11448
|
+
|
|
11449
|
+
One sentence with the words in it, so a translation puts them where its
|
|
11450
|
+
language does: `registerWords('de', { 'helix-notification': { dismissLabel:
|
|
11451
|
+
'{label} schließen' } })`. */
|
|
11452
|
+
dismissLabel?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
|
|
11391
11453
|
/** Locale for the timestamp.
|
|
11392
11454
|
|
|
11393
11455
|
Empty is the runtime's own. */
|
|
@@ -11418,28 +11480,6 @@ its place. Translate it with the rest of your interface. */
|
|
|
11418
11480
|
unreadLabel?: (HelixHeadlessNotification["unreadLabel"]) | undefined;
|
|
11419
11481
|
/** Whether the element shows a control that dismisses it. */
|
|
11420
11482
|
dismissible?: (HelixHeadlessNotification["dismissible"]) | undefined;
|
|
11421
|
-
/** The dismiss control's label, read by screen readers.
|
|
11422
|
-
|
|
11423
|
-
`attribute` is spelled out because Lit lowercases a property name to
|
|
11424
|
-
derive one rather than dash-casing it, so this would otherwise be
|
|
11425
|
-
reachable only as `dismisslabel`, which nobody would guess and no linter
|
|
11426
|
-
would catch.
|
|
11427
|
-
|
|
11428
|
-
A word property: register it for a locale under the host's key. A family
|
|
11429
|
-
that names the control otherwise, such as Tag's `Remove {label}`,
|
|
11430
|
-
declares its own English with `@words` above the override. */
|
|
11431
|
-
"dismiss-label"?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
|
|
11432
|
-
/** The dismiss control's label, read by screen readers.
|
|
11433
|
-
|
|
11434
|
-
`attribute` is spelled out because Lit lowercases a property name to
|
|
11435
|
-
derive one rather than dash-casing it, so this would otherwise be
|
|
11436
|
-
reachable only as `dismisslabel`, which nobody would guess and no linter
|
|
11437
|
-
would catch.
|
|
11438
|
-
|
|
11439
|
-
A word property: register it for a locale under the host's key. A family
|
|
11440
|
-
that names the control otherwise, such as Tag's `Remove {label}`,
|
|
11441
|
-
declares its own English with `@words` above the override. */
|
|
11442
|
-
dismissLabel?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
|
|
11443
11483
|
};
|
|
11444
11484
|
|
|
11445
11485
|
export type HelixHeadlessNotificationVueEvents = {
|
|
@@ -19504,7 +19544,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
19504
19544
|
HelixHeadlessFilterOperatorVueProps,
|
|
19505
19545
|
HelixHeadlessFilterOperatorVueEvents
|
|
19506
19546
|
>;
|
|
19507
|
-
/** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **What a form receives.** The text under 'name', and then one more entry under 'name' for each token, in the order the tokens stand: | Token | Entry | |---|---| | Any element with a 'value' attribute | The value as written: 'saved:mine' | | 'FilterChip' with 'name' and values | 'status:open,pending' | | The same, with 'operator="none"' (what a typed '-status:' makes) | '-status:open,pending' | | The same, with any other 'operator' except 'any' | 'created[after]:2024' | | A token with neither | Nothing | The values are the chip's text outside its 'field' and 'operator' slots, with the spaces around each comma removed. A server splits an entry at its first colon, reads a leading '-' as the negation, and reads a word in brackets before the colon as the comparison. **Keyboard.** Focus stays in the text, which is the field's one tab stop. The text names the highlighted suggestion as its 'aria-activedescendant', and the arrow keys reach the tokens. | Key | What it does | |---|---| | Enter | Presses the highlighted suggestion. With none highlighted, reads the typed filters into chips, or submits the form when there are none. | | Down, Up | Moves the highlight through the suggestions, wrapping, and opens the panel. | | Home, End | Highlights the first or the last suggestion while the panel is open. | | Escape | Closes the panel and stops there, so a dialog around the field stays open. With the panel closed, empties the text. In an empty field, does nothing, so the page hears it. | | Backspace | In an empty field, asks the last token to go. | | Left | With the caret at the start of the text, moves to the last token's remove button. Right on a right-to-left page. | | Left, Right on a token | Move between the tokens, and past the last back to the text. | | Delete, Backspace on a token | Asks the token to go. | **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them, and a paste is read the same way as soon as it lands. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **The picker has an entry of its own.** 'FilterMenu' draws its pages with 'Menu', which a field without a picker does not need, so this family's entry leaves it out. A page that writes
|
|
19547
|
+
/** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **What a form receives.** The text under 'name', and then one more entry under 'name' for each token, in the order the tokens stand: | Token | Entry | |---|---| | Any element with a 'value' attribute | The value as written: 'saved:mine' | | 'FilterChip' with 'name' and values | 'status:open,pending' | | The same, with 'operator="none"' (what a typed '-status:' makes) | '-status:open,pending' | | The same, with any other 'operator' except 'any' | 'created[after]:2024' | | A token with neither | Nothing | The values are the chip's text outside its 'field' and 'operator' slots, with the spaces around each comma removed. A server splits an entry at its first colon, reads a leading '-' as the negation, and reads a word in brackets before the colon as the comparison. **Keyboard.** Focus stays in the text, which is the field's one tab stop. The text names the highlighted suggestion as its 'aria-activedescendant', and the arrow keys reach the tokens. | Key | What it does | |---|---| | Enter | Presses the highlighted suggestion. With none highlighted, reads the typed filters into chips, or submits the form when there are none. | | Down, Up | Moves the highlight through the suggestions, wrapping, and opens the panel. | | Home, End | Highlights the first or the last suggestion while the panel is open. | | Escape | Closes the panel and stops there, so a dialog around the field stays open. With the panel closed, empties the text. In an empty field, does nothing, so the page hears it. | | Backspace | In an empty field, asks the last token to go. | | Left | With the caret at the start of the text, moves to the last token's remove button. Right on a right-to-left page. | | Left, Right on a token | Move between the tokens, and past the last back to the text. | | Delete, Backspace on a token | Asks the token to go. | **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them, and a paste is read the same way as soon as it lands. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **The picker has an entry of its own.** 'FilterMenu' draws its pages with 'Menu', which a field without a picker does not need, so this family's entry leaves it out. A page that writes a 'FilterMenu' imports both entries: '''js import '@fusion.dev/helix/filter-input' import '@fusion.dev/helix/filter-input/menu' ''' A picker written without the second is reported once the page has loaded, with the entry to add. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'filter-suggestions' narrows the panel to the options whose words hold the term at the caret, after its colon, ignoring case and accents, and hides the rest. 'readFilterText' is exported so you can narrow it yourself against partly typed text. While the panel is open, a reader hears how many suggestions it offers. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **Suggestions from a source.** Set 'source' to a function, and the field asks it for suggestions as the text changes and draws them as options in the panel. It is given the term at the caret, the field the term is a value of, the whole text, and an 'AbortSignal', and returns the suggestions or a promise of them. 'filter-delay' waits for typing to rest before asking, and a later keystroke aborts a request still out. While a promise is pending, the panel shows 'loading-text' and a screen reader hears it, then the count. Choosing a suggestion writes its value over the term at the caret, and a finished 'field:value' is read into a chip as Enter would. Cancel its 'helix-select' to write it yourself. '''js filter.source = async ({ field, term, signal }) => { const response = await fetch('/values?field=${field}&q=${term}', { signal }) return response.json() } ''' **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. Set 'chips' and the field adds, updates, and removes those chips itself, from every 'helix-facet' you do not cancel. */
|
|
19508
19548
|
"helix-headless-filter-input": DefineCustomElement<
|
|
19509
19549
|
HelixHeadlessFilterInput,
|
|
19510
19550
|
HelixHeadlessFilterInputVueProps,
|
|
@@ -19516,13 +19556,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
19516
19556
|
HelixHeadlessFormatDateVueProps,
|
|
19517
19557
|
HelixHeadlessFormatDateVueEvents
|
|
19518
19558
|
>;
|
|
19519
|
-
/** Helix draws no graph. A force layout of thousands of notes is physics and WebGL, which a renderer such as Sigma.js does. Put the renderer's box in the frame, and 'connectGraph' from '@fusion.dev/helix-graph' draws 'nodes' and 'links' in it and keeps it in step with the frame. What the frame adds is what a drawing of a graph cannot do: a list of every note beside it, which is the graph for a screen reader and a quick way to find a note for anyone. The selected note comes first, then the notes it links to and from, then every other note, and the search field narrows it. Selecting a note in the list or in the drawing is the same selection. Set 'depth' to show the local graph: only the notes within that many links of the selected one. Set 'legend' to name the groups over the drawing, each a button that shows or hides its notes. 'hiddenGroups' holds the groups turned off, and the list holds only what the drawing shows. The legend is a toolbar and one tab stop: the arrow keys, Home, End and a group's first letters move between its buttons, and Space or Enter presses one. 'nodes' and 'links' are properties, never markup: a graph of ten thousand notes as ten thousand elements would cost what the renderer exists to save. The list draws only the rows in view. The list scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root. You still need to set a block size on the list, or it grows to hold every row. */
|
|
19559
|
+
/** Helix draws no graph. A force layout of thousands of notes is physics and WebGL, which a renderer such as Sigma.js does. Put the renderer's box in the frame, and 'connectGraph' from '@fusion.dev/helix-graph' draws 'nodes' and 'links' in it and keeps it in step with the frame. What the frame adds is what a drawing of a graph cannot do: a list of every note beside it, which is the graph for a screen reader and a quick way to find a note for anyone. The selected note comes first, then the notes it links to and from, then every other note, and the search field narrows it. Selecting a note in the list or in the drawing is the same selection. Set 'depth' to show the local graph: only the notes within that many links of the selected one. The search field is a combobox over the list. Down and Up move through the notes while the focus stays in the field, and Enter selects one. **Walk the links with Alt and the arrow keys**, in the list or in the search field once its keys are on a note. The note the keys are on is marked in the drawing. | Key | What it does | |---|---| | Alt+Right | Follows a link, to the first note the one the keys are on links to or from. | | Alt+Down, Alt+Up | Moves to the next or the previous note linked to the one the step came from, wrapping. | | Alt+Left | Goes back along the links walked. | Right and Left swap on a right-to-left page. Each step says the note, how it stands to the note it came from, and its place among that note's links, such as "Hiring plan. Linked from Roadmap. 2 of 3". Enter selects the note. Set 'legend' to name the groups over the drawing, each a button that shows or hides its notes. 'hiddenGroups' holds the groups turned off, and the list holds only what the drawing shows. The legend is a toolbar and one tab stop: the arrow keys, Home, End and a group's first letters move between its buttons, and Space or Enter presses one. 'nodes' and 'links' are properties, never markup: a graph of ten thousand notes as ten thousand elements would cost what the renderer exists to save. The list draws only the rows in view. The list scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root. You still need to set a block size on the list, or it grows to hold every row. */
|
|
19520
19560
|
"helix-headless-graph": DefineCustomElement<
|
|
19521
19561
|
HelixHeadlessGraph,
|
|
19522
19562
|
HelixHeadlessGraphVueProps,
|
|
19523
19563
|
HelixHeadlessGraphVueEvents
|
|
19524
19564
|
>;
|
|
19525
|
-
/** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move a month, to the same day, where each row's header carries its date as a '<time datetime>', and four columns otherwise, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun, 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. **'selection-mode' lets a reader select cells**: 'single' one at a time and 'multiple' any number. Space, Enter or a press selects the cell the keys or the pointer rest on, or lets it go, and under 'multiple' Shift with an arrow, Home, End, PageUp or PageDown takes in every cell from the last one pressed to where the key went. 'value' holds the selected days, separated by commas: each by its row's '<time datetime>', such as '2026-06-11', or by its row's name where the row carries no date. A change asks with 'helix-before-change' and tells with 'change', and the 'selection' part says how many are selected, in 'selection-label'. **Keyboard.** The strip is one tab stop once it has cells. | Key | What it does | |---|---| | Tab | Moves focus to the strip and shows the first cell. | | Down, Up | Moves to the next or the previous cell. | | Right, Left | Moves a column on or back, a week with 'rows="7"'. On a right-to-left page, Left moves on. | | Home, End | Moves to the first or the last cell. | | Page Down, Page Up | Moves a month on or back where the rows carry dates, and four columns otherwise. | | Enter, Space |
|
|
19565
|
+
/** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. PageUp and PageDown move a month, to the same day, where each row's header carries its date as a '<time datetime>', and four columns otherwise, which is four weeks with 'rows="7"'. **The strip describes itself.** The 'overview' part says the busiest reading and the total of the readings drawn, "Busiest: 11 Jun, 12; Total 84", and the strip is described by it, as every chart is by its summary. Hide it visually. The 'summary' slot is still yours, for words of your own. **'selection-mode' lets a reader select cells**: 'single' one at a time and 'multiple' any number. Space, Enter or a press selects the cell the keys or the pointer rest on, or lets it go, and under 'multiple' Shift with an arrow, Home, End, PageUp or PageDown takes in every cell from the last one pressed to where the key went. 'value' holds the selected days, separated by commas: each by its row's '<time datetime>', such as '2026-06-11', or by its row's name where the row carries no date. A change asks with 'helix-before-change' and tells with 'change', and the 'selection' part says how many are selected, in 'selection-label'. **Under 'selection-mode' the strip is a grid**, so the selection is state a reader is told rather than words alone: each column of the strip is a 'row', a week with 'rows="7"', and each cell a 'gridcell' named by its row in the table and carrying 'aria-selected'. The strip says 'aria-multiselectable' under 'multiple' and points at the cell the keys rest on with 'aria-activedescendant', so a screen reader reads that cell, and the 'live' part stays quiet. Without 'selection-mode' nothing is selectable, and the strip is an application with the readout, as every chart's plot is. **Readings are sent as every chart sends them.** 'helix-reading-change' says each move of the reading, by pointer, tap or key, and 'helix-reading-press' a reading clicked, tapped, or pressed with Enter or Space, each with the row of the table in 'index'. **Nothing to draw.** A table with no readings shows 'empty-text', "No readings", under the strip, and 'loading' shows 'loading-text' there until readings arrive. The 'empty' and 'loading' slots take markup in place of either, as on every chart. **Keyboard.** The strip is one tab stop once it has cells. | Key | What it does | |---|---| | Tab | Moves focus to the strip and shows the first cell. | | Down, Up | Moves to the next or the previous cell. | | Right, Left | Moves a column on or back, a week with 'rows="7"'. On a right-to-left page, Left moves on. | | Home, End | Moves to the first or the last cell. | | Page Down, Page Up | Moves a month on or back where the rows carry dates, and four columns otherwise. | | Enter, Space | Presses the cell, which sends 'helix-reading-press', and selects it or lets it go under 'selection-mode'. | | Shift with an arrow, Home, End, Page Up or Page Down | Selects every cell from the last one pressed to where the key went, under 'selection-mode="multiple"'. | | Escape | Puts the cell's tooltip away. | */
|
|
19526
19566
|
"helix-headless-heatmap": DefineCustomElement<
|
|
19527
19567
|
HelixHeadlessHeatmap,
|
|
19528
19568
|
HelixHeadlessHeatmapVueProps,
|
package/types/words.d.ts
CHANGED
|
@@ -1639,6 +1639,14 @@ declare module '@fusion.dev/helix-core' {
|
|
|
1639
1639
|
* English: `Groups`
|
|
1640
1640
|
*/
|
|
1641
1641
|
legendLabel: Message
|
|
1642
|
+
/**
|
|
1643
|
+
* What screen readers hear when a walk along the links reaches a note that
|
|
1644
|
+
* has no link to follow, or goes back to a note: `{note}` for its name and
|
|
1645
|
+
* `{count}` for how many notes the list holds that it links to or from.
|
|
1646
|
+
*
|
|
1647
|
+
* English: `{note}. {count, plural, =0 {No links} one {# link} other {# links}}`
|
|
1648
|
+
*/
|
|
1649
|
+
linkCountLabel: Message
|
|
1642
1650
|
/**
|
|
1643
1651
|
* How a note linked both to and from the selected one is described, with `{note}`.
|
|
1644
1652
|
*
|
|
@@ -1757,6 +1765,15 @@ declare module '@fusion.dev/helix-core' {
|
|
|
1757
1765
|
* English: `Using the graph. Press Escape to scroll the page again.`
|
|
1758
1766
|
*/
|
|
1759
1767
|
usingLabel: Message
|
|
1768
|
+
/**
|
|
1769
|
+
* What screen readers hear when a walk along the links moves to a note:
|
|
1770
|
+
* `{note}` for its name, `{relation}` for how it stands to the note the
|
|
1771
|
+
* step came from, such as "Linked from Roadmap", and `{index}` and `{count}`
|
|
1772
|
+
* for its place among that note's links.
|
|
1773
|
+
*
|
|
1774
|
+
* English: `{note}. {relation}. {index} of {count}`
|
|
1775
|
+
*/
|
|
1776
|
+
walkLabel: Message
|
|
1760
1777
|
/**
|
|
1761
1778
|
* The hint shown when the wheel scrolls past the graph with
|
|
1762
1779
|
* `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere.
|
|
@@ -1798,11 +1815,19 @@ declare module '@fusion.dev/helix-core' {
|
|
|
1798
1815
|
*/
|
|
1799
1816
|
busiestLabel: Message
|
|
1800
1817
|
/**
|
|
1801
|
-
*
|
|
1818
|
+
* The words shown in place of the drawing when the table has no readings,
|
|
1819
|
+
* and the fallback of the `empty` slot.
|
|
1802
1820
|
*
|
|
1803
1821
|
* English: `No readings`
|
|
1804
1822
|
*/
|
|
1805
1823
|
emptyText: Message
|
|
1824
|
+
/**
|
|
1825
|
+
* The words shown in place of the drawing while `loading` is set and
|
|
1826
|
+
* there are no readings yet, and the fallback of the `loading` slot.
|
|
1827
|
+
*
|
|
1828
|
+
* English: `Loading readings`
|
|
1829
|
+
*/
|
|
1830
|
+
loadingText: Message
|
|
1806
1831
|
/**
|
|
1807
1832
|
* The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
|
|
1808
1833
|
* `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
|
|
@@ -1821,9 +1846,7 @@ declare module '@fusion.dev/helix-core' {
|
|
|
1821
1846
|
*/
|
|
1822
1847
|
positionLabel: Message
|
|
1823
1848
|
/**
|
|
1824
|
-
* What the readout
|
|
1825
|
-
* where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
|
|
1826
|
-
* nothing.
|
|
1849
|
+
* What the readout added for a selected cell, under `selection-mode`.
|
|
1827
1850
|
*
|
|
1828
1851
|
* English: `selected`
|
|
1829
1852
|
*/
|
|
@@ -2441,9 +2464,10 @@ declare module '@fusion.dev/helix-core' {
|
|
|
2441
2464
|
}
|
|
2442
2465
|
'helix-notification': {
|
|
2443
2466
|
/**
|
|
2444
|
-
* The dismiss control's
|
|
2467
|
+
* The dismiss control's name, read by screen readers, with `{label}` for the
|
|
2468
|
+
* row's own words.
|
|
2445
2469
|
*
|
|
2446
|
-
* English: `Dismiss`
|
|
2470
|
+
* English: `Dismiss {label}`
|
|
2447
2471
|
*/
|
|
2448
2472
|
dismissLabel: Message
|
|
2449
2473
|
/**
|