@fusion.dev/helix-headless 0.180.0 → 0.181.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.180.0",
4
+ "version": "0.181.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -49,13 +49,13 @@
49
49
  },
50
50
  "bugs": "https://github.com/project-fusion/fusion/issues",
51
51
  "dependencies": {
52
- "@fusion.dev/helix-core": "0.180.0",
53
- "@fusion.dev/helix-icons": "0.180.0",
52
+ "@fusion.dev/helix-core": "0.181.0",
53
+ "@fusion.dev/helix-icons": "0.181.0",
54
54
  "uqr": "^0.1.3"
55
55
  },
56
56
  "devDependencies": {
57
- "@fusion.dev/helix-cem": "0.180.0",
58
- "@fusion.dev/helix-testing": "0.180.0",
57
+ "@fusion.dev/helix-cem": "0.181.0",
58
+ "@fusion.dev/helix-testing": "0.181.0",
59
59
  "@fusion.dev/scripts": "0.0.0-dev",
60
60
  "@happy-dom/global-registrator": "^20.14.5",
61
61
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -15784,6 +15784,14 @@ Absent selects nothing, and a press or Space does what it did. */
15784
15784
 
15785
15785
  Absent selects nothing, and a press or Space does what it did. */
15786
15786
  selectionMode?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
15787
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
15788
+ cell between two in the table's order, or `rectangle`, the cells between
15789
+ two corners by row and by column, as a spreadsheet selects a range. */
15790
+ "selection-shape"?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
15791
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
15792
+ cell between two in the table's order, or `rectangle`, the cells between
15793
+ two corners by row and by column, as a spreadsheet selects a range. */
15794
+ selectionShape?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
15787
15795
  /** The strip's name where the chart has none: no `aria-label`, `label`, or
15788
15796
  table caption. */
15789
15797
  "strip-label"?: (HelixHeadlessHeatmap["stripLabel"]) | undefined;
@@ -16004,6 +16012,14 @@ Absent selects nothing, and a press or Space does what it did. */
16004
16012
 
16005
16013
  Absent selects nothing, and a press or Space does what it did. */
16006
16014
  "prop:selectionMode"?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
16015
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
16016
+ cell between two in the table's order, or `rectangle`, the cells between
16017
+ two corners by row and by column, as a spreadsheet selects a range. */
16018
+ "attr:selection-shape"?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
16019
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
16020
+ cell between two in the table's order, or `rectangle`, the cells between
16021
+ two corners by row and by column, as a spreadsheet selects a range. */
16022
+ "prop:selectionShape"?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
16007
16023
  /** The strip's name where the chart has none: no `aria-label`, `label`, or
16008
16024
  table caption. */
16009
16025
  "attr:strip-label"?: (HelixHeadlessHeatmap["stripLabel"]) | undefined;
@@ -41939,6 +41955,9 @@ export type CustomElements = {
41939
41955
  * Methods that can be called to access component functionality.
41940
41956
  *
41941
41957
  * - `formResetCallback() => void`: Resets the box to the state set in its markup.
41958
+ * - `click() => void`: Ticks or clears the box, as `click()` does a native checkbox: passed to the control
41959
+ * inside, so the one click a listener hears is the control's, after it has
41960
+ * moved. See `HostClickController`.
41942
41961
  * - `requestChecked(next: boolean) => boolean`: Requests a change to `checked`, and returns whether it was applied.
41943
41962
  *
41944
41963
  * Announces before it acts, so `preventDefault()` on the
@@ -48883,6 +48902,16 @@ export type CustomElements = {
48883
48902
  * `helix-before-change` and tells with `change`, and the `selection` part says
48884
48903
  * how many are selected, in `selection-label`.
48885
48904
  *
48905
+ * **`selection-shape="rectangle"` selects a rectangle of cells** under
48906
+ * `multiple`, as a spreadsheet selects a range: the cells between two corners
48907
+ * by row and by column, such as the same weekdays across three weeks with
48908
+ * `rows="7"`. Shift with a key that moves grows or shrinks it from the cell
48909
+ * last pressed, Shift with a click takes it to the cell clicked, and a click
48910
+ * with Ctrl or Command selects one cell or lets it go and starts the next
48911
+ * rectangle there. The rectangle is the same cells on a right-to-left page,
48912
+ * where the columns run from the right, a short last column adds only the
48913
+ * cells it has, and `value` lists the selected days in the table's order.
48914
+ *
48886
48915
  * **Under `selection-mode` the strip is a grid**, so the selection is state a
48887
48916
  * reader is told rather than words alone: each column of the strip is a `row`,
48888
48917
  * a week with `rows="7"`, and each cell a `gridcell` named by its row in the
@@ -48913,6 +48942,7 @@ export type CustomElements = {
48913
48942
  * | Page Down, Page Up | Moves a month on or back where the rows carry dates, and four columns otherwise. |
48914
48943
  * | Enter, Space | Presses the cell, which sends `helix-reading-press`, and selects it or lets it go under `selection-mode`. |
48915
48944
  * | 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"`. |
48945
+ * | Shift with an arrow, Home, End, Page Up or Page Down, with `selection-shape="rectangle"` | Grows or shrinks the rectangle from the last cell pressed to where the key went, in rows and columns, under `selection-mode="multiple"`. |
48916
48946
  * | Escape | Puts the cell's tooltip away. |
48917
48947
  *
48918
48948
  * ## Attributes & Properties
@@ -48959,6 +48989,9 @@ export type CustomElements = {
48959
48989
  * - `selection-mode`/`selectionMode`: How many cells a reader can select: `single` or `multiple`.
48960
48990
  *
48961
48991
  * Absent selects nothing, and a press or Space does what it did.
48992
+ * - `selection-shape`/`selectionShape`: What Shift takes in under `selection-mode="multiple"`: `linear`, every
48993
+ * cell between two in the table's order, or `rectangle`, the cells between
48994
+ * two corners by row and by column, as a spreadsheet selects a range.
48962
48995
  * - `strip-label`/`stripLabel`: The strip's name where the chart has none: no `aria-label`, `label`, or
48963
48996
  * table caption.
48964
48997
  * - `thresholds`: Lower bounds for the tone buckets, in the order the tones are given.
@@ -57557,6 +57590,9 @@ export type CustomElements = {
57557
57590
  *
57558
57591
  * Methods that can be called to access component functionality.
57559
57592
  *
57593
+ * - `click() => void`: Chooses the radio, as `click()` does a native radio: passed to the control
57594
+ * inside, so the one click a listener hears is the control's, after it has
57595
+ * moved. See `HostClickController`.
57560
57596
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
57561
57597
  *
57562
57598
  * The set drives the keys and cannot reach the control itself, which is
@@ -60697,6 +60733,9 @@ export type CustomElements = {
60697
60733
  * Methods that can be called to access component functionality.
60698
60734
  *
60699
60735
  * - `formResetCallback() => void`: Returns the switch to the state its markup declared.
60736
+ * - `click() => void`: Turns the switch on or off, as `click()` does a native checkbox: passed to the control
60737
+ * inside, so the one click a listener hears is the control's, after it has
60738
+ * moved. See `HostClickController`.
60700
60739
  * - `requestChecked(next: boolean) => boolean`: Requests a change to `checked`, and returns whether it was applied.
60701
60740
  *
60702
60741
  * Announces before it acts, so `preventDefault()` on the
@@ -64415,6 +64454,9 @@ export type CustomElements = {
64415
64454
  *
64416
64455
  * - `select() => boolean`: Chooses the item in its group, or, on its own, flips `selected` once
64417
64456
  * `helix-select` stands and sends `change`.
64457
+ * - `click() => void`: Presses the toggle, as `click()` does a native button: passed to the control
64458
+ * inside, so the one click a listener hears is the control's, after it has
64459
+ * moved. See `HostClickController`.
64418
64460
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
64419
64461
  *
64420
64462
  * The set drives the keys and cannot reach the control itself, which is
@@ -71630,6 +71672,9 @@ export type CustomElementsSolidJs = {
71630
71672
  * Methods that can be called to access component functionality.
71631
71673
  *
71632
71674
  * - `formResetCallback() => void`: Resets the box to the state set in its markup.
71675
+ * - `click() => void`: Ticks or clears the box, as `click()` does a native checkbox: passed to the control
71676
+ * inside, so the one click a listener hears is the control's, after it has
71677
+ * moved. See `HostClickController`.
71633
71678
  * - `requestChecked(next: boolean) => boolean`: Requests a change to `checked`, and returns whether it was applied.
71634
71679
  *
71635
71680
  * Announces before it acts, so `preventDefault()` on the
@@ -78630,6 +78675,16 @@ export type CustomElementsSolidJs = {
78630
78675
  * `helix-before-change` and tells with `change`, and the `selection` part says
78631
78676
  * how many are selected, in `selection-label`.
78632
78677
  *
78678
+ * **`selection-shape="rectangle"` selects a rectangle of cells** under
78679
+ * `multiple`, as a spreadsheet selects a range: the cells between two corners
78680
+ * by row and by column, such as the same weekdays across three weeks with
78681
+ * `rows="7"`. Shift with a key that moves grows or shrinks it from the cell
78682
+ * last pressed, Shift with a click takes it to the cell clicked, and a click
78683
+ * with Ctrl or Command selects one cell or lets it go and starts the next
78684
+ * rectangle there. The rectangle is the same cells on a right-to-left page,
78685
+ * where the columns run from the right, a short last column adds only the
78686
+ * cells it has, and `value` lists the selected days in the table's order.
78687
+ *
78633
78688
  * **Under `selection-mode` the strip is a grid**, so the selection is state a
78634
78689
  * reader is told rather than words alone: each column of the strip is a `row`,
78635
78690
  * a week with `rows="7"`, and each cell a `gridcell` named by its row in the
@@ -78660,6 +78715,7 @@ export type CustomElementsSolidJs = {
78660
78715
  * | Page Down, Page Up | Moves a month on or back where the rows carry dates, and four columns otherwise. |
78661
78716
  * | Enter, Space | Presses the cell, which sends `helix-reading-press`, and selects it or lets it go under `selection-mode`. |
78662
78717
  * | 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"`. |
78718
+ * | Shift with an arrow, Home, End, Page Up or Page Down, with `selection-shape="rectangle"` | Grows or shrinks the rectangle from the last cell pressed to where the key went, in rows and columns, under `selection-mode="multiple"`. |
78663
78719
  * | Escape | Puts the cell's tooltip away. |
78664
78720
  *
78665
78721
  * ## Attributes & Properties
@@ -78706,6 +78762,9 @@ export type CustomElementsSolidJs = {
78706
78762
  * - `selection-mode`/`selectionMode`: How many cells a reader can select: `single` or `multiple`.
78707
78763
  *
78708
78764
  * Absent selects nothing, and a press or Space does what it did.
78765
+ * - `selection-shape`/`selectionShape`: What Shift takes in under `selection-mode="multiple"`: `linear`, every
78766
+ * cell between two in the table's order, or `rectangle`, the cells between
78767
+ * two corners by row and by column, as a spreadsheet selects a range.
78709
78768
  * - `strip-label`/`stripLabel`: The strip's name where the chart has none: no `aria-label`, `label`, or
78710
78769
  * table caption.
78711
78770
  * - `thresholds`: Lower bounds for the tone buckets, in the order the tones are given.
@@ -87411,6 +87470,9 @@ export type CustomElementsSolidJs = {
87411
87470
  *
87412
87471
  * Methods that can be called to access component functionality.
87413
87472
  *
87473
+ * - `click() => void`: Chooses the radio, as `click()` does a native radio: passed to the control
87474
+ * inside, so the one click a listener hears is the control's, after it has
87475
+ * moved. See `HostClickController`.
87414
87476
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
87415
87477
  *
87416
87478
  * The set drives the keys and cannot reach the control itself, which is
@@ -90594,6 +90656,9 @@ export type CustomElementsSolidJs = {
90594
90656
  * Methods that can be called to access component functionality.
90595
90657
  *
90596
90658
  * - `formResetCallback() => void`: Returns the switch to the state its markup declared.
90659
+ * - `click() => void`: Turns the switch on or off, as `click()` does a native checkbox: passed to the control
90660
+ * inside, so the one click a listener hears is the control's, after it has
90661
+ * moved. See `HostClickController`.
90597
90662
  * - `requestChecked(next: boolean) => boolean`: Requests a change to `checked`, and returns whether it was applied.
90598
90663
  *
90599
90664
  * Announces before it acts, so `preventDefault()` on the
@@ -94359,6 +94424,9 @@ export type CustomElementsSolidJs = {
94359
94424
  *
94360
94425
  * - `select() => boolean`: Chooses the item in its group, or, on its own, flips `selected` once
94361
94426
  * `helix-select` stands and sends `change`.
94427
+ * - `click() => void`: Presses the toggle, as `click()` does a native button: passed to the control
94428
+ * inside, so the one click a listener hears is the control's, after it has
94429
+ * moved. See `HostClickController`.
94362
94430
  * - `focusItem() => void`: Moves focus to the item's control, for the set's arrow keys.
94363
94431
  *
94364
94432
  * The set drives the keys and cannot reach the control itself, which is
package/types/vue.d.ts CHANGED
@@ -8116,6 +8116,14 @@ Absent selects nothing, and a press or Space does what it did. */
8116
8116
 
8117
8117
  Absent selects nothing, and a press or Space does what it did. */
8118
8118
  selectionMode?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
8119
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
8120
+ cell between two in the table's order, or `rectangle`, the cells between
8121
+ two corners by row and by column, as a spreadsheet selects a range. */
8122
+ "selection-shape"?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
8123
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
8124
+ cell between two in the table's order, or `rectangle`, the cells between
8125
+ two corners by row and by column, as a spreadsheet selects a range. */
8126
+ selectionShape?: (HelixHeadlessHeatmap["selectionShape"]) | undefined;
8119
8127
  /** The strip's name where the chart has none: no `aria-label`, `label`, or
8120
8128
  table caption. */
8121
8129
  "strip-label"?: (HelixHeadlessHeatmap["stripLabel"]) | undefined;
@@ -19576,7 +19584,7 @@ export interface WcToolkitVueGlobalComponents {
19576
19584
  HelixHeadlessGraphVueProps,
19577
19585
  HelixHeadlessGraphVueEvents
19578
19586
  >;
19579
- /** 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. | */
19587
+ /** 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'. **'selection-shape="rectangle"' selects a rectangle of cells** under 'multiple', as a spreadsheet selects a range: the cells between two corners by row and by column, such as the same weekdays across three weeks with 'rows="7"'. Shift with a key that moves grows or shrinks it from the cell last pressed, Shift with a click takes it to the cell clicked, and a click with Ctrl or Command selects one cell or lets it go and starts the next rectangle there. The rectangle is the same cells on a right-to-left page, where the columns run from the right, a short last column adds only the cells it has, and 'value' lists the selected days in the table's order. **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"'. | | Shift with an arrow, Home, End, Page Up or Page Down, with 'selection-shape="rectangle"' | Grows or shrinks the rectangle from the last cell pressed to where the key went, in rows and columns, under 'selection-mode="multiple"'. | | Escape | Puts the cell's tooltip away. | */
19580
19588
  "helix-headless-heatmap": DefineCustomElement<
19581
19589
  HelixHeadlessHeatmap,
19582
19590
  HelixHeadlessHeatmapVueProps,