@fusion.dev/helix-headless 0.185.0 → 0.186.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 (43) hide show
  1. package/custom-elements.json +2663 -31
  2. package/dist/accordion/item/accordion-item.js +1 -1
  3. package/dist/button-group/root/button-group-root.js +1 -1
  4. package/dist/canvas/root/canvas-root.js +1 -1
  5. package/dist/dialog/root/dialog-root.js +1 -1
  6. package/dist/drawer/root/drawer-root.js +1 -1
  7. package/dist/drilldown/item/drilldown-item.js +1 -1
  8. package/dist/element-events.generated.js +7 -0
  9. package/dist/graph/root/graph-root.d.ts +6 -4
  10. package/dist/graph/root/graph-root.js +3 -3
  11. package/dist/heatmap/root/heatmap-root.d.ts +15 -15
  12. package/dist/icon/all/index.js +0 -3
  13. package/dist/icon/root/icon-root.d.ts +11 -18
  14. package/dist/icon/root/icon-root.js +4 -16
  15. package/dist/icon/set.js +2 -16
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.js +2 -1
  18. package/dist/isometric-heatmap/index.d.ts +1 -0
  19. package/dist/isometric-heatmap/index.js +1 -0
  20. package/dist/isometric-heatmap/projection.d.ts +70 -0
  21. package/dist/isometric-heatmap/projection.js +49 -0
  22. package/dist/isometric-heatmap/root/isometric-heatmap-root.d.ts +118 -0
  23. package/dist/isometric-heatmap/root/isometric-heatmap-root.js +127 -0
  24. package/dist/lightbox/root/lightbox-root.js +1 -1
  25. package/dist/list/root/list-root.js +1 -1
  26. package/dist/map/root/map-root.js +1 -1
  27. package/dist/menu/item/menu-item.js +1 -1
  28. package/dist/outline/root/outline-root.js +2 -2
  29. package/dist/popover/root/popover-root.js +1 -1
  30. package/dist/table/root/table-root.js +1 -1
  31. package/dist/tabs/root/tabs-root.js +4 -5
  32. package/dist/tabs/tab/tab.js +2 -3
  33. package/dist/time-picker/root/time-picker-root.js +1 -1
  34. package/dist/toggle/root/toggle-root.js +1 -1
  35. package/dist/tour/root/tour-root.js +1 -1
  36. package/dist/tree/root/tree-root.js +1 -1
  37. package/dist/video/root/video-root.js +1 -1
  38. package/lint.json +1 -1
  39. package/package.json +6 -6
  40. package/types/jsx.d.ts +1274 -40
  41. package/types/svelte.d.ts +1 -0
  42. package/types/vue.d.ts +264 -6
  43. package/types/words.d.ts +69 -0
package/types/svelte.d.ts CHANGED
@@ -86,6 +86,7 @@ declare module 'svelte/elements' {
86
86
  'helix-headless-icon': Helix<'helix-headless-icon'>
87
87
  'helix-headless-image': Helix<'helix-headless-image'>
88
88
  'helix-headless-input': Helix<'helix-headless-input'>
89
+ 'helix-headless-isometric-heatmap': Helix<'helix-headless-isometric-heatmap'>
89
90
  'helix-headless-kbd': Helix<'helix-headless-kbd'>
90
91
  'helix-headless-legend': Helix<'helix-headless-legend'>
91
92
  'helix-headless-lightbox-item': Helix<'helix-headless-lightbox-item'>
package/types/vue.d.ts CHANGED
@@ -74,6 +74,7 @@ import type {
74
74
  HelixHeadlessIcon,
75
75
  HelixHeadlessImage,
76
76
  HelixHeadlessInput,
77
+ HelixHeadlessIsometricHeatmap,
77
78
  HelixHeadlessKbd,
78
79
  HelixHeadlessLegend,
79
80
  HelixHeadlessLightboxItem,
@@ -8481,10 +8482,12 @@ disagreeing with its own name for every reader who meant the left. */
8481
8482
  /** The name of the icon in the Helix set.
8482
8483
 
8483
8484
  **A lookup, and the reason both this and `icon` exist.** A name is a string,
8484
- so it is what markup can carry, and resolving one means an index that no
8485
- bundler can shake. The family's entry indexes a small set, `icon/all`
8486
- indexes the whole set at 15 kB, and `icon/root` indexes nothing, for a
8487
- page that registers the glyphs it names or hands over the value instead.
8485
+ so it is what markup can carry, and resolving one means an index of the
8486
+ whole set that no bundler can shake: 15 kB for a consumer who renders one
8487
+ mark. An attribute is the only thing an HTML author can write, and that is
8488
+ worth the index; a consumer who would rather not pay it imports the
8489
+ element from `icon/root` and registers the glyphs it names, or hands over
8490
+ the value instead.
8488
8491
 
8489
8492
  A name written `prefix:name` asks the library registered under that
8490
8493
  prefix. */
@@ -8881,6 +8884,253 @@ export type HelixHeadlessInputVueEvents = {
8881
8884
  input: HelixHeadlessInputElementEvent;
8882
8885
  };
8883
8886
 
8887
+ /** `HelixHeadlessIsometricHeatmap` component event */
8888
+ export type HelixHeadlessIsometricHeatmapElementEvent<E = Event> = TypedEvent<
8889
+ HelixHeadlessIsometricHeatmap,
8890
+ E
8891
+ >;
8892
+ /** `helix-before-change` event type */
8893
+ export type HelixHeadlessIsometricHeatmapHelixBeforeChangeElementEvent =
8894
+ HelixHeadlessIsometricHeatmapElementEvent<HelixBeforeChangeEvent>;
8895
+ /** `helix-reading-change` event type */
8896
+ export type HelixHeadlessIsometricHeatmapHelixReadingChangeElementEvent =
8897
+ HelixHeadlessIsometricHeatmapElementEvent<HelixReadingChangeEvent>;
8898
+ /** `helix-reading-press` event type */
8899
+ export type HelixHeadlessIsometricHeatmapHelixReadingPressElementEvent =
8900
+ HelixHeadlessIsometricHeatmapElementEvent<HelixReadingPressEvent>;
8901
+ /** `helix-resize` event type */
8902
+ export type HelixHeadlessIsometricHeatmapHelixResizeElementEvent =
8903
+ HelixHeadlessIsometricHeatmapElementEvent<HelixResizeEvent>;
8904
+
8905
+ export type HelixHeadlessIsometricHeatmapVueProps = {
8906
+ /** Draws every prism at no height, so the tones lie on a plane. */
8907
+ flat?: (HelixHeadlessIsometricHeatmap["flat"]) | undefined;
8908
+ /** How tall the highest reading stands, in cells. Every other reading stands
8909
+ at its share of it. */
8910
+ relief?: (HelixHeadlessIsometricHeatmap["relief"]) | undefined;
8911
+ /** The words shown in place of the drawing when the table has no readings,
8912
+ and the fallback of the `empty` slot. */
8913
+ "empty-text"?: (HelixHeadlessIsometricHeatmap["emptyText"]) | undefined;
8914
+ /** The words shown in place of the drawing when the table has no readings,
8915
+ and the fallback of the `empty` slot. */
8916
+ emptyText?: (HelixHeadlessIsometricHeatmap["emptyText"]) | undefined;
8917
+ /** Whether the readings are still on their way. The chart shows
8918
+ `loading-text` in place of an empty drawing until it has readings.
8919
+
8920
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
8921
+ that already has readings keeps drawing them, so a refresh does not
8922
+ blank it. */
8923
+ loading?: (HelixHeadlessIsometricHeatmap["loading"]) | undefined;
8924
+ /** The words shown in place of the drawing while `loading` is set and
8925
+ there are no readings yet, and the fallback of the `loading` slot. */
8926
+ "loading-text"?: (HelixHeadlessIsometricHeatmap["loadingText"]) | undefined;
8927
+ /** The words shown in place of the drawing while `loading` is set and
8928
+ there are no readings yet, and the fallback of the `loading` slot. */
8929
+ loadingText?: (HelixHeadlessIsometricHeatmap["loadingText"]) | undefined;
8930
+ /** The id of the table to read.
8931
+
8932
+ Names a table in the same tree, so a chart inside another component's
8933
+ shadow root reads a table in that root rather than one in the document. A
8934
+ `<table>` or anything built from grid roles, including `helix-table`.
8935
+
8936
+ **In React this arrives as a property and not as an attribute**, the way
8937
+ `Tooltip.for` does, so it does not reflect and nothing styles on it. */
8938
+ for?: (HelixHeadlessIsometricHeatmap["for"]) | undefined;
8939
+ /** The chart's name, which starts the chart's text summary.
8940
+
8941
+ Absent falls back to the table's own caption, which is usually the right
8942
+ words and is already written. */
8943
+ label?: (HelixHeadlessIsometricHeatmap["label"]) | undefined;
8944
+ /** The locale the chart's own numbers are written in: its axis, its
8945
+ percentages and its totals, such as `de` for `1.240` and `32 %`.
8946
+
8947
+ Absent reads the nearest `lang`, then the runtime's own. The table's
8948
+ cells are shown as the table writes them, whatever this says. */
8949
+ locale?: (HelixHeadlessIsometricHeatmap["locale"]) | undefined;
8950
+ /** Where a reading the keys moved to stands among the readings, said after
8951
+ it. `{position}` and `{count}` are replaced with the numbers, written in
8952
+ `locale`.
8953
+
8954
+ Set it to the words of the page's language, such as `{position} von
8955
+ {count}`, or to nothing to say no position. A slice or a series a
8956
+ legend hid is not counted. */
8957
+ "position-label"?: (HelixHeadlessIsometricHeatmap["positionLabel"]) | undefined;
8958
+ /** Where a reading the keys moved to stands among the readings, said after
8959
+ it. `{position}` and `{count}` are replaced with the numbers, written in
8960
+ `locale`.
8961
+
8962
+ Set it to the words of the page's language, such as `{position} von
8963
+ {count}`, or to nothing to say no position. A slice or a series a
8964
+ legend hid is not counted. */
8965
+ positionLabel?: (HelixHeadlessIsometricHeatmap["positionLabel"]) | undefined;
8966
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
8967
+ `overview-label`. */
8968
+ "busiest-label"?: (HelixHeadlessIsometricHeatmap["busiestLabel"]) | undefined;
8969
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
8970
+ `overview-label`. */
8971
+ busiestLabel?: (HelixHeadlessIsometricHeatmap["busiestLabel"]) | undefined;
8972
+ /** Space between cells, in CSS pixels. It is a number for the same reason
8973
+ `min-cell` is. */
8974
+ gap?: (HelixHeadlessIsometricHeatmap["gap"]) | undefined;
8975
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
8976
+
8977
+ **Set this only to overrule what the strip actually draws.** The arithmetic
8978
+ needs a width in pixels and the width is a length the stylesheet resolves,
8979
+ so a number written here that disagrees with the sheet is a promise the
8980
+ consumer has to keep by hand, and the one number a summary is told to trust
8981
+ is the one it gets wrong.
8982
+
8983
+ The strip measures itself, so sizing the cells in a sheet is enough on its
8984
+ own and these two are the estimate used until the first measurement lands.
8985
+ Writing the attribute pins the value and stops the measurement being
8986
+ consulted, which is what a container query or a transition on the cell size
8987
+ wants, where what is drawn this frame is not what the arithmetic should
8988
+ plan around.
8989
+
8990
+ Zero turns the dropping off altogether, which is right for a strip in a
8991
+ container that cannot get narrow. */
8992
+ "min-cell"?: (HelixHeadlessIsometricHeatmap["minCell"] | `${number}`) | undefined;
8993
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
8994
+
8995
+ **Set this only to overrule what the strip actually draws.** The arithmetic
8996
+ needs a width in pixels and the width is a length the stylesheet resolves,
8997
+ so a number written here that disagrees with the sheet is a promise the
8998
+ consumer has to keep by hand, and the one number a summary is told to trust
8999
+ is the one it gets wrong.
9000
+
9001
+ The strip measures itself, so sizing the cells in a sheet is enough on its
9002
+ own and these two are the estimate used until the first measurement lands.
9003
+ Writing the attribute pins the value and stops the measurement being
9004
+ consulted, which is what a container query or a transition on the cell size
9005
+ wants, where what is drawn this frame is not what the arithmetic should
9006
+ plan around.
9007
+
9008
+ Zero turns the dropping off altogether, which is right for a strip in a
9009
+ container that cannot get narrow. */
9010
+ minCell?: (HelixHeadlessIsometricHeatmap["minCell"]) | undefined;
9011
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
9012
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
9013
+ and its reading as the table writes it, and `{total}` the total of the
9014
+ readings drawn, written in the locale. */
9015
+ "overview-label"?: (HelixHeadlessIsometricHeatmap["overviewLabel"]) | undefined;
9016
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
9017
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
9018
+ and its reading as the table writes it, and `{total}` the total of the
9019
+ readings drawn, written in the locale. */
9020
+ overviewLabel?: (HelixHeadlessIsometricHeatmap["overviewLabel"]) | undefined;
9021
+ /** How many rows the strip has.
9022
+
9023
+ `1` is a status strip and `7` is a calendar week, which are the two readings
9024
+ this covers. Cells fill down the column and then across, which is what a
9025
+ calendar heatmap does: a week is a column, so the strip reads along the
9026
+ line in weeks, from the right on a right-to-left page, and top to bottom in
9027
+ days. */
9028
+ rows?: (HelixHeadlessIsometricHeatmap["rows"]) | undefined;
9029
+ /** What the readout added for a selected cell, under `selection-mode`. */
9030
+ "selected-label"?: (HelixHeadlessIsometricHeatmap["selectedLabel"]) | undefined;
9031
+ /** What the readout added for a selected cell, under `selection-mode`. */
9032
+ selectedLabel?: (HelixHeadlessIsometricHeatmap["selectedLabel"]) | undefined;
9033
+ /** What the `selection` part says after the selection changes. `{count}` is
9034
+ how many cells are selected, written in the locale, and a language that
9035
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
9036
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
9037
+ "selection-label"?: (HelixHeadlessIsometricHeatmap["selectionLabel"]) | undefined;
9038
+ /** What the `selection` part says after the selection changes. `{count}` is
9039
+ how many cells are selected, written in the locale, and a language that
9040
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
9041
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
9042
+ selectionLabel?: (HelixHeadlessIsometricHeatmap["selectionLabel"]) | undefined;
9043
+ /** How many cells a reader can select: `single` or `multiple`.
9044
+
9045
+ Absent selects nothing, and a press or Space does what it did. */
9046
+ "selection-mode"?: (HelixHeadlessIsometricHeatmap["selectionMode"]) | undefined;
9047
+ /** How many cells a reader can select: `single` or `multiple`.
9048
+
9049
+ Absent selects nothing, and a press or Space does what it did. */
9050
+ selectionMode?: (HelixHeadlessIsometricHeatmap["selectionMode"]) | undefined;
9051
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
9052
+ cell between two in the table's order, or `rectangle`, the cells between
9053
+ two corners by row and by column, as a spreadsheet selects a range. */
9054
+ "selection-shape"?: (HelixHeadlessIsometricHeatmap["selectionShape"]) | undefined;
9055
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
9056
+ cell between two in the table's order, or `rectangle`, the cells between
9057
+ two corners by row and by column, as a spreadsheet selects a range. */
9058
+ selectionShape?: (HelixHeadlessIsometricHeatmap["selectionShape"]) | undefined;
9059
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
9060
+ table caption. */
9061
+ "strip-label"?: (HelixHeadlessIsometricHeatmap["stripLabel"]) | undefined;
9062
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
9063
+ table caption. */
9064
+ stripLabel?: (HelixHeadlessIsometricHeatmap["stripLabel"]) | undefined;
9065
+ /** Lower bounds for the tone buckets, in the order the tones are given.
9066
+
9067
+ `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
9068
+ first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
9069
+ fourth. A value below the first bound gets no tone at all: an empty day in a
9070
+ contribution graph is a day with nothing in it, and painting it as the
9071
+ lowest bucket claims a reading that does not exist. */
9072
+ thresholds?: (HelixHeadlessIsometricHeatmap["thresholds"]) | undefined;
9073
+ /** The tone for each bucket, in the same order as `thresholds`.
9074
+
9075
+ A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
9076
+ **`"1"` through `"5"` are a ramp and everything else is a category**, which
9077
+ is the distinction a heatmap lives or dies on: magnitude has to be one hue
9078
+ getting louder, because a reader compares two cells by weight and cannot
9079
+ compare two hues at all. `tones="surface info accent success primary"` for a
9080
+ commit count is five unrelated hues for five amounts, which is confetti with
9081
+ no order in it. */
9082
+ tones?: (HelixHeadlessIsometricHeatmap["tones"]) | undefined;
9083
+ /** The name the `overview` gives the total of the readings drawn,
9084
+ `{totalLabel}` in `overview-label`. */
9085
+ "total-label"?: (HelixHeadlessIsometricHeatmap["totalLabel"]) | undefined;
9086
+ /** The name the `overview` gives the total of the readings drawn,
9087
+ `{totalLabel}` in `overview-label`. */
9088
+ totalLabel?: (HelixHeadlessIsometricHeatmap["totalLabel"]) | undefined;
9089
+ /** The selected cells, separated by commas: each by the date its row's
9090
+ header carries in a `<time datetime>`, such as `2026-06-11`, or by the
9091
+ header's words where it carries none.
9092
+
9093
+ Set it to start with cells selected. Written by a press or a key under
9094
+ `selection-mode`. */
9095
+ value?: (HelixHeadlessIsometricHeatmap["value"]) | undefined;
9096
+ /** The readings as data, in the shape of a table, where the page has no
9097
+ table to point `for` at. `for` wins where both are set.
9098
+
9099
+ ```js
9100
+ chart.data = {
9101
+ caption: 'Sessions by channel',
9102
+ columns: ['Month', 'Direct', 'Referral'],
9103
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
9104
+ }
9105
+ ```
9106
+
9107
+ The first column holds each row's label and every column after it a
9108
+ series, as in a table. A cell is a number, words, `null` for a blank,
9109
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
9110
+ number is shown in `locale`.
9111
+
9112
+ **A table is still the better source where the page can show one**:
9113
+ it reads with no script and before hydration, and a reader can sort and
9114
+ copy it. Data is drawn on the client only, so a server serves the
9115
+ frame, and the summary, the keys and the readout are then the whole of
9116
+ what a screen reader is given. Set a new object to redraw: the chart
9117
+ does not look inside the one it has. */
9118
+ data?: (HelixHeadlessIsometricHeatmap["data"]) | undefined;
9119
+ };
9120
+
9121
+ export type HelixHeadlessIsometricHeatmapVueEvents = {
9122
+ /** Fired once a press or a key has changed which cells are selected. */
9123
+ change: HelixHeadlessIsometricHeatmapElementEvent;
9124
+ /** Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable. */
9125
+ "helix-before-change": HelixHeadlessIsometricHeatmapHelixBeforeChangeElementEvent;
9126
+ /** 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. */
9127
+ "helix-reading-change": HelixHeadlessIsometricHeatmapHelixReadingChangeElementEvent;
9128
+ /** A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
9129
+ "helix-reading-press": HelixHeadlessIsometricHeatmapHelixReadingPressElementEvent;
9130
+ /** Fired when the number of cells drawn changes, with the new number. */
9131
+ "helix-resize": HelixHeadlessIsometricHeatmapHelixResizeElementEvent;
9132
+ };
9133
+
8884
9134
  /** `HelixHeadlessKbd` component event */
8885
9135
  export type HelixHeadlessKbdElementEvent<E = Event> = TypedEvent<
8886
9136
  HelixHeadlessKbd,
@@ -19211,6 +19461,8 @@ export type CustomCssProperties = {
19211
19461
  "--heatmap-tone-success"?: (string) | undefined;
19212
19462
  /** The color of the `warning` tone. */
19213
19463
  "--heatmap-tone-warning"?: (string) | undefined;
19464
+ /** How many cells the drawing spans across: its columns and its rows together. The component writes it on the strip, and a stylesheet that caps the cell size reads it. */
19465
+ "--isometric-heatmap-span"?: (string) | undefined;
19214
19466
  /** How far the zoomed item is moved across from the middle of the viewport, in pixels, toward the right. Written only while zoomed. */
19215
19467
  "--lightbox-pan-x"?: (string) | undefined;
19216
19468
  /** How far the zoomed item is moved down from the middle of the viewport, in pixels. Written only while zoomed. */
@@ -19631,7 +19883,7 @@ export interface WcToolkitVueGlobalComponents {
19631
19883
  HelixHeadlessFormatDateVueProps,
19632
19884
  HelixHeadlessFormatDateVueEvents
19633
19885
  >;
19634
- /** 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. */
19886
+ /** The frame draws no graph itself. A force layout of thousands of notes is physics and WebGL, which a renderer such as Sigma.js does, and an architecture diagram is drawn by 'isometricDriver' from '@fusion.dev/helix-graph/isometric'. Put the drawing'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. */
19635
19887
  "helix-headless-graph": DefineCustomElement<
19636
19888
  HelixHeadlessGraph,
19637
19889
  HelixHeadlessGraphVueProps,
@@ -19649,7 +19901,7 @@ export interface WcToolkitVueGlobalComponents {
19649
19901
  HelixHeadlessIconButtonVueProps,
19650
19902
  HelixHeadlessIconButtonVueEvents
19651
19903
  >;
19652
- /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers a small set: the four carets, 'arrow-left', 'arrow-right', 'check', 'x', 'plus', 'minus', 'magnifying-glass', 'info' and 'warning'. 'icon/all' registers the whole set, so any name in it draws, and a name that resolves to nothing says to import it. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. **Or point 'src' at an SVG file**, such as 'src="/icons/rocket.svg"', and the element fetches it and draws its shapes in 'currentColor' where the file does not color them. A file is fetched once a page, however many icons name it, and 'load' fires when it is drawn. Scripts, event handlers and 'javascript:' links in the file are taken out before it is drawn. A server fetches nothing, so a served icon with a 'src' is drawn once the script runs. A name with no match, or a 'src' that is no SVG, renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. **A decorative icon that is all a control holds is reported.** In a development build, a button or a link whose only content is an icon with no 'label', and which has no name of its own, warns 'missing-name' once, through the runtime channel every Helix warning uses. */
19904
+ /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws, and 'icon/all' registers the same set. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. **Or point 'src' at an SVG file**, such as 'src="/icons/rocket.svg"', and the element fetches it and draws its shapes in 'currentColor' where the file does not color them. A file is fetched once a page, however many icons name it, and 'load' fires when it is drawn. Scripts, event handlers and 'javascript:' links in the file are taken out before it is drawn. A server fetches nothing, so a served icon with a 'src' is drawn once the script runs. A name with no match, or a 'src' that is no SVG, renders nothing, and the element fires 'error', so a typo in a name can be heard. It waits until the page has loaded and painted first, so a library a later module registers is not taken for a typo. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. **A decorative icon that is all a control holds is reported.** In a development build, a button or a link whose only content is an icon with no 'label', and which has no name of its own, warns 'missing-name' once, through the runtime channel every Helix warning uses. */
19653
19905
  "helix-headless-icon": DefineCustomElement<
19654
19906
  HelixHeadlessIcon,
19655
19907
  HelixHeadlessIconVueProps,
@@ -19667,6 +19919,12 @@ export interface WcToolkitVueGlobalComponents {
19667
19919
  HelixHeadlessInputVueProps,
19668
19920
  HelixHeadlessInputVueEvents
19669
19921
  >;
19922
+ /** The same strip as 'Heatmap', seen from above at an angle. Each reading is a prism: its top face takes the cell's tone, and its height repeats the value, measured from zero against the highest reading in the table. 'rows="7"' makes a contribution graph, with each week a column running down to the right. **The height says what the tone says.** Read the exact value from the tooltip or the table, and compare readings by tone. A tall reading at the front can hide a short one behind it, so the newest column stands at the front, where nothing covers it. **Everything else is 'Heatmap'.** The table named by 'for', the tones and thresholds, the keys, the tooltip, the overview, 'selection-mode', and the events all work as they do there. The class extends the headless heatmap, and its own entry point carries the drawing, so a page using only 'Heatmap' loads none of it. **'flat' lays every prism down** at no height, which leaves the tones on a plane at the same angle. **'gap' and 'min-cell' set the smallest cell.** The drawing scales as a whole, so a wider box draws larger cells and the gap grows with them. A box too narrow for every column at 'min-cell' draws the newest that fit. **The drawing is SVG and holds still.** It scales with its box through its 'viewBox', needs no WebGL, and has no motion to pause. **Keyboard.** The keys are 'Heatmap''s. Down moves to the next reading in a column, drawn down to the left, and Right to the same reading in the next column, drawn down to the right. | 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. | */
19923
+ "helix-headless-isometric-heatmap": DefineCustomElement<
19924
+ HelixHeadlessIsometricHeatmap,
19925
+ HelixHeadlessIsometricHeatmapVueProps,
19926
+ HelixHeadlessIsometricHeatmapVueEvents
19927
+ >;
19670
19928
  /** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. **'for' names the control the shortcut works**, and the key writes its chord onto that control's 'aria-keyshortcuts', in the platform's words ('Meta+K' on an Apple keyboard, 'Control+K' elsewhere), so a screen reader announces the shortcut with the control. A chord the page wrote there itself is left alone, and the key takes back only what it added. A chord is drawn with the platform's modifiers first, in its order, so one 'keys' value is right everywhere: 'mod+shift+p' is '⇧⌘P' on an Apple keyboard and 'Ctrl+Shift+P' elsewhere. Where it is drawn in glyphs, it is read in words, such as 'Shift Command P'. 'caps' draws a chord as a key per key: each is a 'key' part and the '+' between two a 'separator' part, so a sheet can draw a cap for each. 'key-labels' renames any key, on every platform, such as 'key-labels='{"mod":"Command"}''. On an Apple keyboard a word joins the next key with a hyphen, as in 'Command-K'. **'activate' makes the shortcut work the control 'for' names**, with no script: 'activate="focus"' moves focus to it, as '/' does to a search field, and 'activate="click"' presses it. It acts once 'helix-shortcut' has gone out and no listener canceled it, and only where 'within' listens. */
19671
19929
  "helix-headless-kbd": DefineCustomElement<
19672
19930
  HelixHeadlessKbd,
package/types/words.d.ts CHANGED
@@ -1911,6 +1911,75 @@ declare module '@fusion.dev/helix-core' {
1911
1911
  */
1912
1912
  revealLabel: Message
1913
1913
  }
1914
+ 'helix-isometric-heatmap': {
1915
+ /**
1916
+ * The name the `overview` gives the busiest reading, `{busiestLabel}` in
1917
+ * `overview-label`.
1918
+ *
1919
+ * English: `Busiest`
1920
+ */
1921
+ busiestLabel: Message
1922
+ /**
1923
+ * The words shown in place of the drawing when the table has no readings,
1924
+ * and the fallback of the `empty` slot.
1925
+ *
1926
+ * English: `No readings`
1927
+ */
1928
+ emptyText: Message
1929
+ /**
1930
+ * The words shown in place of the drawing while `loading` is set and
1931
+ * there are no readings yet, and the fallback of the `loading` slot.
1932
+ *
1933
+ * English: `Loading readings`
1934
+ */
1935
+ loadingText: Message
1936
+ /**
1937
+ * The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
1938
+ * `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
1939
+ * and its reading as the table writes it, and `{total}` the total of the
1940
+ * readings drawn, written in the locale.
1941
+ *
1942
+ * English: `{busiestLabel}: {busiest}; {totalLabel} {total}.`
1943
+ */
1944
+ overviewLabel: Message
1945
+ /**
1946
+ * Where a reading the keys moved to stands among the readings, said after
1947
+ * it. `{position}` and `{count}` are replaced with the numbers, written in
1948
+ * `locale`.
1949
+ *
1950
+ * English: `{position} of {count}`
1951
+ */
1952
+ positionLabel: Message
1953
+ /**
1954
+ * What the readout added for a selected cell, under `selection-mode`.
1955
+ *
1956
+ * English: `selected`
1957
+ */
1958
+ selectedLabel: Message
1959
+ /**
1960
+ * What the `selection` part says after the selection changes. `{count}` is
1961
+ * how many cells are selected, written in the locale, and a language that
1962
+ * needs plural forms writes them: `{count, plural, one {# wybrany} few
1963
+ * {# wybrane} many {# wybranych} other {# wybranego}}`.
1964
+ *
1965
+ * English: `{count, plural, one {# selected} other {# selected}}`
1966
+ */
1967
+ selectionLabel: Message
1968
+ /**
1969
+ * The strip's name where the chart has none: no `aria-label`, `label`, or
1970
+ * table caption.
1971
+ *
1972
+ * English: `Heatmap`
1973
+ */
1974
+ stripLabel: Message
1975
+ /**
1976
+ * The name the `overview` gives the total of the readings drawn,
1977
+ * `{totalLabel}` in `overview-label`.
1978
+ *
1979
+ * English: `Total`
1980
+ */
1981
+ totalLabel: Message
1982
+ }
1914
1983
  'helix-lightbox': {
1915
1984
  /**
1916
1985
  * The close control's accessible name. Translate it with the rest of your