@fusion.dev/helix 0.184.0 → 0.186.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/types/jsx.d.ts CHANGED
@@ -107,6 +107,7 @@ import type {
107
107
  HelixIconButton,
108
108
  HelixImage,
109
109
  HelixInput,
110
+ HelixIsometricHeatmap,
110
111
  HelixKbd,
111
112
  HelixLegend,
112
113
  HelixLightbox,
@@ -11141,6 +11142,16 @@ and the grid becomes a tree grid.
11141
11142
  Reflected, because the styled tier indents a tree grid's row headers by
11142
11143
  it. No default, so a table that sets none writes nothing onto its host. */
11143
11144
  childField?: (HelixDataTable["childField"]) | undefined;
11145
+ /** The column tracks, as a grid track list such as `2fr 1fr max-content`,
11146
+ dealt out one track to a column in the order the columns are written. A
11147
+ column's own `width` wins in its place, and a column it does not reach
11148
+ takes the track a column with no `width` takes.
11149
+
11150
+ **The one track list a server can send.** A server rendering this element
11151
+ has no columns to read a `width` from, and neither has a stylesheet laying
11152
+ out the rows a page served before the table upgrades, so a table sized here
11153
+ lays those rows out at the widths it draws. */
11154
+ columns?: (HelixDataTable["columns"]) | undefined;
11144
11155
  /** The keys of the rows open at the start, separated by commas. Used until
11145
11156
  `expanded` is set. */
11146
11157
  "default-expanded"?: (HelixDataTable["defaultExpanded"]) | undefined;
@@ -11560,6 +11571,16 @@ and the grid becomes a tree grid.
11560
11571
  Reflected, because the styled tier indents a tree grid's row headers by
11561
11572
  it. No default, so a table that sets none writes nothing onto its host. */
11562
11573
  "prop:childField"?: (HelixDataTable["childField"]) | undefined;
11574
+ /** The column tracks, as a grid track list such as `2fr 1fr max-content`,
11575
+ dealt out one track to a column in the order the columns are written. A
11576
+ column's own `width` wins in its place, and a column it does not reach
11577
+ takes the track a column with no `width` takes.
11578
+
11579
+ **The one track list a server can send.** A server rendering this element
11580
+ has no columns to read a `width` from, and neither has a stylesheet laying
11581
+ out the rows a page served before the table upgrades, so a table sized here
11582
+ lays those rows out at the widths it draws. */
11583
+ "prop:columns"?: (HelixDataTable["columns"]) | undefined;
11563
11584
  /** The keys of the rows open at the start, separated by commas. Used until
11564
11585
  `expanded` is set. */
11565
11586
  "attr:default-expanded"?: (HelixDataTable["defaultExpanded"]) | undefined;
@@ -18954,10 +18975,12 @@ disagreeing with its own name for every reader who meant the left. */
18954
18975
  /** The name of the icon in the Helix set.
18955
18976
 
18956
18977
  **A lookup, and the reason both this and `icon` exist.** A name is a string,
18957
- so it is what markup can carry, and resolving one means an index that no
18958
- bundler can shake. The family's entry indexes a small set, `icon/all`
18959
- indexes the whole set at 15 kB, and `icon/root` indexes nothing, for a
18960
- page that registers the glyphs it names or hands over the value instead.
18978
+ so it is what markup can carry, and resolving one means an index of the
18979
+ whole set that no bundler can shake: 15 kB for a consumer who renders one
18980
+ mark. An attribute is the only thing an HTML author can write, and that is
18981
+ worth the index; a consumer who would rather not pay it imports the
18982
+ element from `icon/root` and registers the glyphs it names, or hands over
18983
+ the value instead.
18961
18984
 
18962
18985
  A name written `prefix:name` asks the library registered under that
18963
18986
  prefix. */
@@ -19026,10 +19049,12 @@ disagreeing with its own name for every reader who meant the left. */
19026
19049
  /** The name of the icon in the Helix set.
19027
19050
 
19028
19051
  **A lookup, and the reason both this and `icon` exist.** A name is a string,
19029
- so it is what markup can carry, and resolving one means an index that no
19030
- bundler can shake. The family's entry indexes a small set, `icon/all`
19031
- indexes the whole set at 15 kB, and `icon/root` indexes nothing, for a
19032
- page that registers the glyphs it names or hands over the value instead.
19052
+ so it is what markup can carry, and resolving one means an index of the
19053
+ whole set that no bundler can shake: 15 kB for a consumer who renders one
19054
+ mark. An attribute is the only thing an HTML author can write, and that is
19055
+ worth the index; a consumer who would rather not pay it imports the
19056
+ element from `icon/root` and registers the glyphs it names, or hands over
19057
+ the value instead.
19033
19058
 
19034
19059
  A name written `prefix:name` asks the library registered under that
19035
19060
  prefix. */
@@ -19789,6 +19814,494 @@ invalid, and `true`, `null`, or nothing to accept the value. */
19789
19814
  textContent?: (string | number) | undefined;
19790
19815
  };
19791
19816
 
19817
+ /** `HelixIsometricHeatmap` component event */
19818
+ export type HelixIsometricHeatmapElementEvent<E = Event> = TypedEvent<
19819
+ HelixIsometricHeatmap,
19820
+ E
19821
+ >;
19822
+ /** `helix-before-change` event type */
19823
+ export type HelixIsometricHeatmapHelixBeforeChangeElementEvent =
19824
+ HelixIsometricHeatmapElementEvent<HelixBeforeChangeEvent>;
19825
+ /** `helix-reading-change` event type */
19826
+ export type HelixIsometricHeatmapHelixReadingChangeElementEvent =
19827
+ HelixIsometricHeatmapElementEvent<HelixReadingChangeEvent>;
19828
+ /** `helix-reading-press` event type */
19829
+ export type HelixIsometricHeatmapHelixReadingPressElementEvent =
19830
+ HelixIsometricHeatmapElementEvent<HelixReadingPressEvent>;
19831
+ /** `helix-resize` event type */
19832
+ export type HelixIsometricHeatmapHelixResizeElementEvent =
19833
+ HelixIsometricHeatmapElementEvent<HelixResizeEvent>;
19834
+
19835
+ export type HelixIsometricHeatmapProps = {
19836
+ /** Draws every prism at no height, so the tones lie on a plane. */
19837
+ flat?: (HelixIsometricHeatmap["flat"]) | undefined;
19838
+ /** How tall the highest reading stands, in cells. Every other reading stands
19839
+ at its share of it. */
19840
+ relief?: (HelixIsometricHeatmap["relief"]) | undefined;
19841
+ /** The words shown in place of the drawing when the table has no readings,
19842
+ and the fallback of the `empty` slot. */
19843
+ "empty-text"?: (HelixIsometricHeatmap["emptyText"]) | undefined;
19844
+ /** The words shown in place of the drawing when the table has no readings,
19845
+ and the fallback of the `empty` slot. */
19846
+ emptyText?: (HelixIsometricHeatmap["emptyText"]) | undefined;
19847
+ /** Whether the readings are still on their way. The chart shows
19848
+ `loading-text` in place of an empty drawing until it has readings.
19849
+
19850
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
19851
+ that already has readings keeps drawing them, so a refresh does not
19852
+ blank it. */
19853
+ loading?: (HelixIsometricHeatmap["loading"]) | undefined;
19854
+ /** The words shown in place of the drawing while `loading` is set and
19855
+ there are no readings yet, and the fallback of the `loading` slot. */
19856
+ "loading-text"?: (HelixIsometricHeatmap["loadingText"]) | undefined;
19857
+ /** The words shown in place of the drawing while `loading` is set and
19858
+ there are no readings yet, and the fallback of the `loading` slot. */
19859
+ loadingText?: (HelixIsometricHeatmap["loadingText"]) | undefined;
19860
+ /** The id of the table to read.
19861
+
19862
+ Names a table in the same tree, so a chart inside another component's
19863
+ shadow root reads a table in that root rather than one in the document. A
19864
+ `<table>` or anything built from grid roles, including `helix-table`.
19865
+
19866
+ **In React this arrives as a property and not as an attribute**, the way
19867
+ `Tooltip.for` does, so it does not reflect and nothing styles on it. */
19868
+ for?: (HelixIsometricHeatmap["for"]) | undefined;
19869
+ /** The chart's name, which starts the chart's text summary.
19870
+
19871
+ Absent falls back to the table's own caption, which is usually the right
19872
+ words and is already written. */
19873
+ label?: (HelixIsometricHeatmap["label"]) | undefined;
19874
+ /** The locale the chart's own numbers are written in: its axis, its
19875
+ percentages and its totals, such as `de` for `1.240` and `32 %`.
19876
+
19877
+ Absent reads the nearest `lang`, then the runtime's own. The table's
19878
+ cells are shown as the table writes them, whatever this says. */
19879
+ locale?: (HelixIsometricHeatmap["locale"]) | undefined;
19880
+ /** Where a reading the keys moved to stands among the readings, said after
19881
+ it. `{position}` and `{count}` are replaced with the numbers, written in
19882
+ `locale`.
19883
+
19884
+ Set it to the words of the page's language, such as `{position} von
19885
+ {count}`, or to nothing to say no position. A slice or a series a
19886
+ legend hid is not counted. */
19887
+ "position-label"?: (HelixIsometricHeatmap["positionLabel"]) | undefined;
19888
+ /** Where a reading the keys moved to stands among the readings, said after
19889
+ it. `{position}` and `{count}` are replaced with the numbers, written in
19890
+ `locale`.
19891
+
19892
+ Set it to the words of the page's language, such as `{position} von
19893
+ {count}`, or to nothing to say no position. A slice or a series a
19894
+ legend hid is not counted. */
19895
+ positionLabel?: (HelixIsometricHeatmap["positionLabel"]) | undefined;
19896
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
19897
+ `overview-label`. */
19898
+ "busiest-label"?: (HelixIsometricHeatmap["busiestLabel"]) | undefined;
19899
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
19900
+ `overview-label`. */
19901
+ busiestLabel?: (HelixIsometricHeatmap["busiestLabel"]) | undefined;
19902
+ /** Space between cells, in CSS pixels. It is a number for the same reason
19903
+ `min-cell` is. */
19904
+ gap?: (HelixIsometricHeatmap["gap"]) | undefined;
19905
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
19906
+
19907
+ **Set this only to overrule what the strip actually draws.** The arithmetic
19908
+ needs a width in pixels and the width is a length the stylesheet resolves,
19909
+ so a number written here that disagrees with the sheet is a promise the
19910
+ consumer has to keep by hand, and the one number a summary is told to trust
19911
+ is the one it gets wrong.
19912
+
19913
+ The strip measures itself, so sizing the cells in a sheet is enough on its
19914
+ own and these two are the estimate used until the first measurement lands.
19915
+ Writing the attribute pins the value and stops the measurement being
19916
+ consulted, which is what a container query or a transition on the cell size
19917
+ wants, where what is drawn this frame is not what the arithmetic should
19918
+ plan around.
19919
+
19920
+ Zero turns the dropping off altogether, which is right for a strip in a
19921
+ container that cannot get narrow. */
19922
+ "min-cell"?: (HelixIsometricHeatmap["minCell"] | `${number}`) | undefined;
19923
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
19924
+
19925
+ **Set this only to overrule what the strip actually draws.** The arithmetic
19926
+ needs a width in pixels and the width is a length the stylesheet resolves,
19927
+ so a number written here that disagrees with the sheet is a promise the
19928
+ consumer has to keep by hand, and the one number a summary is told to trust
19929
+ is the one it gets wrong.
19930
+
19931
+ The strip measures itself, so sizing the cells in a sheet is enough on its
19932
+ own and these two are the estimate used until the first measurement lands.
19933
+ Writing the attribute pins the value and stops the measurement being
19934
+ consulted, which is what a container query or a transition on the cell size
19935
+ wants, where what is drawn this frame is not what the arithmetic should
19936
+ plan around.
19937
+
19938
+ Zero turns the dropping off altogether, which is right for a strip in a
19939
+ container that cannot get narrow. */
19940
+ minCell?: (HelixIsometricHeatmap["minCell"]) | undefined;
19941
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
19942
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
19943
+ and its reading as the table writes it, and `{total}` the total of the
19944
+ readings drawn, written in the locale. */
19945
+ "overview-label"?: (HelixIsometricHeatmap["overviewLabel"]) | undefined;
19946
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
19947
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
19948
+ and its reading as the table writes it, and `{total}` the total of the
19949
+ readings drawn, written in the locale. */
19950
+ overviewLabel?: (HelixIsometricHeatmap["overviewLabel"]) | undefined;
19951
+ /** How many rows the strip has.
19952
+
19953
+ `1` is a status strip and `7` is a calendar week, which are the two readings
19954
+ this covers. Cells fill down the column and then across, which is what a
19955
+ calendar heatmap does: a week is a column, so the strip reads along the
19956
+ line in weeks, from the right on a right-to-left page, and top to bottom in
19957
+ days. */
19958
+ rows?: (HelixIsometricHeatmap["rows"]) | undefined;
19959
+ /** What the readout added for a selected cell, under `selection-mode`. */
19960
+ "selected-label"?: (HelixIsometricHeatmap["selectedLabel"]) | undefined;
19961
+ /** What the readout added for a selected cell, under `selection-mode`. */
19962
+ selectedLabel?: (HelixIsometricHeatmap["selectedLabel"]) | undefined;
19963
+ /** What the `selection` part says after the selection changes. `{count}` is
19964
+ how many cells are selected, written in the locale, and a language that
19965
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
19966
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
19967
+ "selection-label"?: (HelixIsometricHeatmap["selectionLabel"]) | undefined;
19968
+ /** What the `selection` part says after the selection changes. `{count}` is
19969
+ how many cells are selected, written in the locale, and a language that
19970
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
19971
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
19972
+ selectionLabel?: (HelixIsometricHeatmap["selectionLabel"]) | undefined;
19973
+ /** How many cells a reader can select: `single` or `multiple`.
19974
+
19975
+ Absent selects nothing, and a press or Space does what it did. */
19976
+ "selection-mode"?: (HelixIsometricHeatmap["selectionMode"]) | undefined;
19977
+ /** How many cells a reader can select: `single` or `multiple`.
19978
+
19979
+ Absent selects nothing, and a press or Space does what it did. */
19980
+ selectionMode?: (HelixIsometricHeatmap["selectionMode"]) | undefined;
19981
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
19982
+ cell between two in the table's order, or `rectangle`, the cells between
19983
+ two corners by row and by column, as a spreadsheet selects a range. */
19984
+ "selection-shape"?: (HelixIsometricHeatmap["selectionShape"]) | undefined;
19985
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
19986
+ cell between two in the table's order, or `rectangle`, the cells between
19987
+ two corners by row and by column, as a spreadsheet selects a range. */
19988
+ selectionShape?: (HelixIsometricHeatmap["selectionShape"]) | undefined;
19989
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
19990
+ table caption. */
19991
+ "strip-label"?: (HelixIsometricHeatmap["stripLabel"]) | undefined;
19992
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
19993
+ table caption. */
19994
+ stripLabel?: (HelixIsometricHeatmap["stripLabel"]) | undefined;
19995
+ /** Lower bounds for the tone buckets, in the order the tones are given.
19996
+
19997
+ `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
19998
+ first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
19999
+ fourth. A value below the first bound gets no tone at all: an empty day in a
20000
+ contribution graph is a day with nothing in it, and painting it as the
20001
+ lowest bucket claims a reading that does not exist. */
20002
+ thresholds?: (HelixIsometricHeatmap["thresholds"]) | undefined;
20003
+ /** The tone for each bucket, in the same order as `thresholds`.
20004
+
20005
+ A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
20006
+ **`"1"` through `"5"` are a ramp and everything else is a category**, which
20007
+ is the distinction a heatmap lives or dies on: magnitude has to be one hue
20008
+ getting louder, because a reader compares two cells by weight and cannot
20009
+ compare two hues at all. `tones="surface info accent success primary"` for a
20010
+ commit count is five unrelated hues for five amounts, which is confetti with
20011
+ no order in it. */
20012
+ tones?: (HelixIsometricHeatmap["tones"]) | undefined;
20013
+ /** The name the `overview` gives the total of the readings drawn,
20014
+ `{totalLabel}` in `overview-label`. */
20015
+ "total-label"?: (HelixIsometricHeatmap["totalLabel"]) | undefined;
20016
+ /** The name the `overview` gives the total of the readings drawn,
20017
+ `{totalLabel}` in `overview-label`. */
20018
+ totalLabel?: (HelixIsometricHeatmap["totalLabel"]) | undefined;
20019
+ /** The selected cells, separated by commas: each by the date its row's
20020
+ header carries in a `<time datetime>`, such as `2026-06-11`, or by the
20021
+ header's words where it carries none.
20022
+
20023
+ Set it to start with cells selected. Written by a press or a key under
20024
+ `selection-mode`. */
20025
+ value?: (HelixIsometricHeatmap["value"]) | undefined;
20026
+ /** The readings as data, in the shape of a table, where the page has no
20027
+ table to point `for` at. `for` wins where both are set.
20028
+
20029
+ ```js
20030
+ chart.data = {
20031
+ caption: 'Sessions by channel',
20032
+ columns: ['Month', 'Direct', 'Referral'],
20033
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
20034
+ }
20035
+ ```
20036
+
20037
+ The first column holds each row's label and every column after it a
20038
+ series, as in a table. A cell is a number, words, `null` for a blank,
20039
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
20040
+ number is shown in `locale`.
20041
+
20042
+ **A table is still the better source where the page can show one**:
20043
+ it reads with no script and before hydration, and a reader can sort and
20044
+ copy it. Data is drawn on the client only, so a server serves the
20045
+ frame, and the summary, the keys and the readout are then the whole of
20046
+ what a screen reader is given. Set a new object to redraw: the chart
20047
+ does not look inside the one it has. */
20048
+ data?: (HelixIsometricHeatmap["data"]) | undefined;
20049
+
20050
+ /** Fired once a press or a key has changed which cells are selected. */
20051
+ onchange?: ((e: HelixIsometricHeatmapElementEvent) => void) | undefined;
20052
+ /** Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable. */
20053
+ "onhelix-before-change"?: ((
20054
+ e: HelixIsometricHeatmapHelixBeforeChangeElementEvent,
20055
+ ) => void) | undefined;
20056
+ /** 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. */
20057
+ "onhelix-reading-change"?: ((
20058
+ e: HelixIsometricHeatmapHelixReadingChangeElementEvent,
20059
+ ) => void) | undefined;
20060
+ /** A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
20061
+ "onhelix-reading-press"?: ((
20062
+ e: HelixIsometricHeatmapHelixReadingPressElementEvent,
20063
+ ) => void) | undefined;
20064
+ /** Fired when the number of cells drawn changes, with the new number. */
20065
+ "onhelix-resize"?: ((e: HelixIsometricHeatmapHelixResizeElementEvent) => void) | undefined;
20066
+ };
20067
+
20068
+ export type HelixIsometricHeatmapSolidJsProps = {
20069
+ /** Draws every prism at no height, so the tones lie on a plane. */
20070
+ "prop:flat"?: (HelixIsometricHeatmap["flat"]) | undefined;
20071
+ /** How tall the highest reading stands, in cells. Every other reading stands
20072
+ at its share of it. */
20073
+ "prop:relief"?: (HelixIsometricHeatmap["relief"]) | undefined;
20074
+ /** The words shown in place of the drawing when the table has no readings,
20075
+ and the fallback of the `empty` slot. */
20076
+ "attr:empty-text"?: (HelixIsometricHeatmap["emptyText"]) | undefined;
20077
+ /** The words shown in place of the drawing when the table has no readings,
20078
+ and the fallback of the `empty` slot. */
20079
+ "prop:emptyText"?: (HelixIsometricHeatmap["emptyText"]) | undefined;
20080
+ /** Whether the readings are still on their way. The chart shows
20081
+ `loading-text` in place of an empty drawing until it has readings.
20082
+
20083
+ Reflected, so a stylesheet can treat the chart while it waits. A chart
20084
+ that already has readings keeps drawing them, so a refresh does not
20085
+ blank it. */
20086
+ "prop:loading"?: (HelixIsometricHeatmap["loading"]) | undefined;
20087
+ /** The words shown in place of the drawing while `loading` is set and
20088
+ there are no readings yet, and the fallback of the `loading` slot. */
20089
+ "attr:loading-text"?: (HelixIsometricHeatmap["loadingText"]) | undefined;
20090
+ /** The words shown in place of the drawing while `loading` is set and
20091
+ there are no readings yet, and the fallback of the `loading` slot. */
20092
+ "prop:loadingText"?: (HelixIsometricHeatmap["loadingText"]) | undefined;
20093
+ /** The id of the table to read.
20094
+
20095
+ Names a table in the same tree, so a chart inside another component's
20096
+ shadow root reads a table in that root rather than one in the document. A
20097
+ `<table>` or anything built from grid roles, including `helix-table`.
20098
+
20099
+ **In React this arrives as a property and not as an attribute**, the way
20100
+ `Tooltip.for` does, so it does not reflect and nothing styles on it. */
20101
+ "prop:for"?: (HelixIsometricHeatmap["for"]) | undefined;
20102
+ /** The chart's name, which starts the chart's text summary.
20103
+
20104
+ Absent falls back to the table's own caption, which is usually the right
20105
+ words and is already written. */
20106
+ "prop:label"?: (HelixIsometricHeatmap["label"]) | undefined;
20107
+ /** The locale the chart's own numbers are written in: its axis, its
20108
+ percentages and its totals, such as `de` for `1.240` and `32 %`.
20109
+
20110
+ Absent reads the nearest `lang`, then the runtime's own. The table's
20111
+ cells are shown as the table writes them, whatever this says. */
20112
+ "prop:locale"?: (HelixIsometricHeatmap["locale"]) | undefined;
20113
+ /** Where a reading the keys moved to stands among the readings, said after
20114
+ it. `{position}` and `{count}` are replaced with the numbers, written in
20115
+ `locale`.
20116
+
20117
+ Set it to the words of the page's language, such as `{position} von
20118
+ {count}`, or to nothing to say no position. A slice or a series a
20119
+ legend hid is not counted. */
20120
+ "attr:position-label"?: (HelixIsometricHeatmap["positionLabel"]) | undefined;
20121
+ /** Where a reading the keys moved to stands among the readings, said after
20122
+ it. `{position}` and `{count}` are replaced with the numbers, written in
20123
+ `locale`.
20124
+
20125
+ Set it to the words of the page's language, such as `{position} von
20126
+ {count}`, or to nothing to say no position. A slice or a series a
20127
+ legend hid is not counted. */
20128
+ "prop:positionLabel"?: (HelixIsometricHeatmap["positionLabel"]) | undefined;
20129
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
20130
+ `overview-label`. */
20131
+ "attr:busiest-label"?: (HelixIsometricHeatmap["busiestLabel"]) | undefined;
20132
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
20133
+ `overview-label`. */
20134
+ "prop:busiestLabel"?: (HelixIsometricHeatmap["busiestLabel"]) | undefined;
20135
+ /** Space between cells, in CSS pixels. It is a number for the same reason
20136
+ `min-cell` is. */
20137
+ "prop:gap"?: (HelixIsometricHeatmap["gap"]) | undefined;
20138
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
20139
+
20140
+ **Set this only to overrule what the strip actually draws.** The arithmetic
20141
+ needs a width in pixels and the width is a length the stylesheet resolves,
20142
+ so a number written here that disagrees with the sheet is a promise the
20143
+ consumer has to keep by hand, and the one number a summary is told to trust
20144
+ is the one it gets wrong.
20145
+
20146
+ The strip measures itself, so sizing the cells in a sheet is enough on its
20147
+ own and these two are the estimate used until the first measurement lands.
20148
+ Writing the attribute pins the value and stops the measurement being
20149
+ consulted, which is what a container query or a transition on the cell size
20150
+ wants, where what is drawn this frame is not what the arithmetic should
20151
+ plan around.
20152
+
20153
+ Zero turns the dropping off altogether, which is right for a strip in a
20154
+ container that cannot get narrow. */
20155
+ "attr:min-cell"?: (HelixIsometricHeatmap["minCell"] | `${number}`) | undefined;
20156
+ /** The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
20157
+
20158
+ **Set this only to overrule what the strip actually draws.** The arithmetic
20159
+ needs a width in pixels and the width is a length the stylesheet resolves,
20160
+ so a number written here that disagrees with the sheet is a promise the
20161
+ consumer has to keep by hand, and the one number a summary is told to trust
20162
+ is the one it gets wrong.
20163
+
20164
+ The strip measures itself, so sizing the cells in a sheet is enough on its
20165
+ own and these two are the estimate used until the first measurement lands.
20166
+ Writing the attribute pins the value and stops the measurement being
20167
+ consulted, which is what a container query or a transition on the cell size
20168
+ wants, where what is drawn this frame is not what the arithmetic should
20169
+ plan around.
20170
+
20171
+ Zero turns the dropping off altogether, which is right for a strip in a
20172
+ container that cannot get narrow. */
20173
+ "prop:minCell"?: (HelixIsometricHeatmap["minCell"]) | undefined;
20174
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
20175
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
20176
+ and its reading as the table writes it, and `{total}` the total of the
20177
+ readings drawn, written in the locale. */
20178
+ "attr:overview-label"?: (HelixIsometricHeatmap["overviewLabel"]) | undefined;
20179
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
20180
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
20181
+ and its reading as the table writes it, and `{total}` the total of the
20182
+ readings drawn, written in the locale. */
20183
+ "prop:overviewLabel"?: (HelixIsometricHeatmap["overviewLabel"]) | undefined;
20184
+ /** How many rows the strip has.
20185
+
20186
+ `1` is a status strip and `7` is a calendar week, which are the two readings
20187
+ this covers. Cells fill down the column and then across, which is what a
20188
+ calendar heatmap does: a week is a column, so the strip reads along the
20189
+ line in weeks, from the right on a right-to-left page, and top to bottom in
20190
+ days. */
20191
+ "prop:rows"?: (HelixIsometricHeatmap["rows"]) | undefined;
20192
+ /** What the readout added for a selected cell, under `selection-mode`. */
20193
+ "attr:selected-label"?: (HelixIsometricHeatmap["selectedLabel"]) | undefined;
20194
+ /** What the readout added for a selected cell, under `selection-mode`. */
20195
+ "prop:selectedLabel"?: (HelixIsometricHeatmap["selectedLabel"]) | undefined;
20196
+ /** What the `selection` part says after the selection changes. `{count}` is
20197
+ how many cells are selected, written in the locale, and a language that
20198
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
20199
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
20200
+ "attr:selection-label"?: (HelixIsometricHeatmap["selectionLabel"]) | undefined;
20201
+ /** What the `selection` part says after the selection changes. `{count}` is
20202
+ how many cells are selected, written in the locale, and a language that
20203
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
20204
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
20205
+ "prop:selectionLabel"?: (HelixIsometricHeatmap["selectionLabel"]) | undefined;
20206
+ /** How many cells a reader can select: `single` or `multiple`.
20207
+
20208
+ Absent selects nothing, and a press or Space does what it did. */
20209
+ "attr:selection-mode"?: (HelixIsometricHeatmap["selectionMode"]) | undefined;
20210
+ /** How many cells a reader can select: `single` or `multiple`.
20211
+
20212
+ Absent selects nothing, and a press or Space does what it did. */
20213
+ "prop:selectionMode"?: (HelixIsometricHeatmap["selectionMode"]) | undefined;
20214
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
20215
+ cell between two in the table's order, or `rectangle`, the cells between
20216
+ two corners by row and by column, as a spreadsheet selects a range. */
20217
+ "attr:selection-shape"?: (HelixIsometricHeatmap["selectionShape"]) | undefined;
20218
+ /** What Shift takes in under `selection-mode="multiple"`: `linear`, every
20219
+ cell between two in the table's order, or `rectangle`, the cells between
20220
+ two corners by row and by column, as a spreadsheet selects a range. */
20221
+ "prop:selectionShape"?: (HelixIsometricHeatmap["selectionShape"]) | undefined;
20222
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
20223
+ table caption. */
20224
+ "attr:strip-label"?: (HelixIsometricHeatmap["stripLabel"]) | undefined;
20225
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
20226
+ table caption. */
20227
+ "prop:stripLabel"?: (HelixIsometricHeatmap["stripLabel"]) | undefined;
20228
+ /** Lower bounds for the tone buckets, in the order the tones are given.
20229
+
20230
+ `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
20231
+ first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
20232
+ fourth. A value below the first bound gets no tone at all: an empty day in a
20233
+ contribution graph is a day with nothing in it, and painting it as the
20234
+ lowest bucket claims a reading that does not exist. */
20235
+ "prop:thresholds"?: (HelixIsometricHeatmap["thresholds"]) | undefined;
20236
+ /** The tone for each bucket, in the same order as `thresholds`.
20237
+
20238
+ A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
20239
+ **`"1"` through `"5"` are a ramp and everything else is a category**, which
20240
+ is the distinction a heatmap lives or dies on: magnitude has to be one hue
20241
+ getting louder, because a reader compares two cells by weight and cannot
20242
+ compare two hues at all. `tones="surface info accent success primary"` for a
20243
+ commit count is five unrelated hues for five amounts, which is confetti with
20244
+ no order in it. */
20245
+ "prop:tones"?: (HelixIsometricHeatmap["tones"]) | undefined;
20246
+ /** The name the `overview` gives the total of the readings drawn,
20247
+ `{totalLabel}` in `overview-label`. */
20248
+ "attr:total-label"?: (HelixIsometricHeatmap["totalLabel"]) | undefined;
20249
+ /** The name the `overview` gives the total of the readings drawn,
20250
+ `{totalLabel}` in `overview-label`. */
20251
+ "prop:totalLabel"?: (HelixIsometricHeatmap["totalLabel"]) | undefined;
20252
+ /** The selected cells, separated by commas: each by the date its row's
20253
+ header carries in a `<time datetime>`, such as `2026-06-11`, or by the
20254
+ header's words where it carries none.
20255
+
20256
+ Set it to start with cells selected. Written by a press or a key under
20257
+ `selection-mode`. */
20258
+ "prop:value"?: (HelixIsometricHeatmap["value"]) | undefined;
20259
+ /** The readings as data, in the shape of a table, where the page has no
20260
+ table to point `for` at. `for` wins where both are set.
20261
+
20262
+ ```js
20263
+ chart.data = {
20264
+ caption: 'Sessions by channel',
20265
+ columns: ['Month', 'Direct', 'Referral'],
20266
+ rows: [['Jan', 10, 4], ['Feb', 20, 8]],
20267
+ }
20268
+ ```
20269
+
20270
+ The first column holds each row's label and every column after it a
20271
+ series, as in a table. A cell is a number, words, `null` for a blank,
20272
+ or `{ value, text }` for a number shown as words, such as `$128k`. A
20273
+ number is shown in `locale`.
20274
+
20275
+ **A table is still the better source where the page can show one**:
20276
+ it reads with no script and before hydration, and a reader can sort and
20277
+ copy it. Data is drawn on the client only, so a server serves the
20278
+ frame, and the summary, the keys and the readout are then the whole of
20279
+ what a screen reader is given. Set a new object to redraw: the chart
20280
+ does not look inside the one it has. */
20281
+ "prop:data"?: (HelixIsometricHeatmap["data"]) | undefined;
20282
+ /** Fired once a press or a key has changed which cells are selected. */
20283
+ "on:change"?: ((e: HelixIsometricHeatmapElementEvent) => void) | undefined;
20284
+ /** Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable. */
20285
+ "on:helix-before-change"?: ((
20286
+ e: HelixIsometricHeatmapHelixBeforeChangeElementEvent,
20287
+ ) => void) | undefined;
20288
+ /** 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. */
20289
+ "on:helix-reading-change"?: ((
20290
+ e: HelixIsometricHeatmapHelixReadingChangeElementEvent,
20291
+ ) => void) | undefined;
20292
+ /** A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`. */
20293
+ "on:helix-reading-press"?: ((
20294
+ e: HelixIsometricHeatmapHelixReadingPressElementEvent,
20295
+ ) => void) | undefined;
20296
+ /** Fired when the number of cells drawn changes, with the new number. */
20297
+ "on:helix-resize"?: ((e: HelixIsometricHeatmapHelixResizeElementEvent) => void) | undefined;
20298
+
20299
+ /** Set the innerHTML of the element */
20300
+ innerHTML?: (string) | undefined;
20301
+ /** Set the textContent of the element */
20302
+ textContent?: (string | number) | undefined;
20303
+ };
20304
+
19792
20305
  /** `HelixKbd` component event */
19793
20306
  export type HelixKbdElementEvent<E = Event> = TypedEvent<HelixKbd, E>;
19794
20307
  /** `helix-shortcut` event type */
@@ -34752,13 +35265,11 @@ and each column may say otherwise.
34752
35265
  **It is also the only track list a server can send.** The shim has no tree
34753
35266
  to walk, so a render there knows of no columns and this attribute is the
34754
35267
  whole answer: a table given one lays its grid out in the first paint, and a
34755
- table sized only by its columns is one track wide until it upgrades.
35268
+ table sized only by its columns takes, until it upgrades, a track for each
35269
+ column at the width a column with no `width` takes (`helix.css`).
34756
35270
 
34757
- **Data Table has none of this, and should not.** Its columns are its schema
34758
- rather than an option, so there is always a column to write a `width` on
34759
- and a list here would be a second way to say what that says. This table's
34760
- cells are markup, and a table written as rows of cells with no column
34761
- declared in it has nowhere else to be sized from. */
35271
+ Data Table takes the same list, for the same reason: a data table that
35272
+ serves its first page as rows is laid out by it before it upgrades. */
34762
35273
  columns?: (HelixTable["columns"]) | undefined;
34763
35274
  /** The keys of the rows whose rows are shown at the start, separated by
34764
35275
  commas. Used until `expanded` is set. */
@@ -35015,13 +35526,11 @@ and each column may say otherwise.
35015
35526
  **It is also the only track list a server can send.** The shim has no tree
35016
35527
  to walk, so a render there knows of no columns and this attribute is the
35017
35528
  whole answer: a table given one lays its grid out in the first paint, and a
35018
- table sized only by its columns is one track wide until it upgrades.
35529
+ table sized only by its columns takes, until it upgrades, a track for each
35530
+ column at the width a column with no `width` takes (`helix.css`).
35019
35531
 
35020
- **Data Table has none of this, and should not.** Its columns are its schema
35021
- rather than an option, so there is always a column to write a `width` on
35022
- and a list here would be a second way to say what that says. This table's
35023
- cells are markup, and a table written as rows of cells with no column
35024
- declared in it has nowhere else to be sized from. */
35532
+ Data Table takes the same list, for the same reason: a data table that
35533
+ serves its first page as rows is laid out by it before it upgrades. */
35025
35534
  "prop:columns"?: (HelixTable["columns"]) | undefined;
35026
35535
  /** The keys of the rows whose rows are shown at the start, separated by
35027
35536
  commas. Used until `expanded` is set. */
@@ -49411,7 +49920,9 @@ export type CustomElements = {
49411
49920
  * Write it under the columns as `helix-table-row` and `helix-table-cell`
49412
49921
  * elements. `@fusion.dev/helix-styles/helix.css` lays them out as the table
49413
49922
  * draws them before it upgrades, and the table shows them until `rows` holds a
49414
- * row.
49923
+ * row. It holds the checkbox column and the pagination's row from the first
49924
+ * paint, and takes the widths from `columns`, so nothing moves when the table
49925
+ * upgrades or draws its own rows.
49415
49926
  *
49416
49927
  * ## Attributes & Properties
49417
49928
  *
@@ -49432,6 +49943,15 @@ export type CustomElements = {
49432
49943
  *
49433
49944
  * Reflected, because the styled tier indents a tree grid's row headers by
49434
49945
  * it. No default, so a table that sets none writes nothing onto its host.
49946
+ * - `columns`: The column tracks, as a grid track list such as `2fr 1fr max-content`,
49947
+ * dealt out one track to a column in the order the columns are written. A
49948
+ * column's own `width` wins in its place, and a column it does not reach
49949
+ * takes the track a column with no `width` takes.
49950
+ *
49951
+ * **The one track list a server can send.** A server rendering this element
49952
+ * has no columns to read a `width` from, and neither has a stylesheet laying
49953
+ * out the rows a page served before the table upgrades, so a table sized here
49954
+ * lays those rows out at the widths it draws.
49435
49955
  * - `default-expanded`/`defaultExpanded`: The keys of the rows open at the start, separated by commas. Used until
49436
49956
  * `expanded` is set.
49437
49957
  * - `default-filter`/`defaultFilter`: The starting search query, used until `filter` is set.
@@ -54566,11 +55086,6 @@ export type CustomElements = {
54566
55086
  * Reduced motion stills every animation. `auto-width` gives the box the
54567
55087
  * glyph's own proportions, for a mark wider than it is tall.
54568
55088
  *
54569
- * **`@fusion.dev/helix/icon` registers thirteen glyphs by name**, the ones a
54570
- * control most often needs, and `@fusion.dev/helix/icon/all` registers the
54571
- * whole set. The headless element lists the thirteen and says how a name is
54572
- * resolved.
54573
- *
54574
55089
  * ## Attributes & Properties
54575
55090
  *
54576
55091
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -54602,10 +55117,12 @@ export type CustomElements = {
54602
55117
  * - `name`: The name of the icon in the Helix set.
54603
55118
  *
54604
55119
  * **A lookup, and the reason both this and `icon` exist.** A name is a string,
54605
- * so it is what markup can carry, and resolving one means an index that no
54606
- * bundler can shake. The family's entry indexes a small set, `icon/all`
54607
- * indexes the whole set at 15 kB, and `icon/root` indexes nothing, for a
54608
- * page that registers the glyphs it names or hands over the value instead.
55120
+ * so it is what markup can carry, and resolving one means an index of the
55121
+ * whole set that no bundler can shake: 15 kB for a consumer who renders one
55122
+ * mark. An attribute is the only thing an HTML author can write, and that is
55123
+ * worth the index; a consumer who would rather not pay it imports the
55124
+ * element from `icon/root` and registers the glyphs it names, or hands over
55125
+ * the value instead.
54609
55126
  *
54610
55127
  * A name written `prefix:name` asks the library registered under that
54611
55128
  * prefix.
@@ -55152,6 +55669,340 @@ export type CustomElements = {
55152
55669
  */
55153
55670
  "helix-input": Partial<HelixInputProps & BaseProps<HelixInput> & BaseEvents<HelixInput>>;
55154
55671
 
55672
+ /**
55673
+ * Each reading is a prism. The top face takes the cell's tone, and the two
55674
+ * sides are the same tone, shaded darker, so the whole relief follows your
55675
+ * theme's colors.
55676
+ *
55677
+ * `tones="1 2 3 4 5"` uses the same five-step ramp as `Heatmap`, so the tone
55678
+ * and the height both show the value. Set `--isometric-heatmap-cell-size` to
55679
+ * change how large a cell may grow.
55680
+ *
55681
+ * ## Attributes & Properties
55682
+ *
55683
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
55684
+ *
55685
+ * - `flat`: Draws every prism at no height, so the tones lie on a plane.
55686
+ * - `relief`: How tall the highest reading stands, in cells. Every other reading stands
55687
+ * at its share of it.
55688
+ * - `empty-text`/`emptyText`: The words shown in place of the drawing when the table has no readings,
55689
+ * and the fallback of the `empty` slot.
55690
+ * - `loading`: Whether the readings are still on their way. The chart shows
55691
+ * `loading-text` in place of an empty drawing until it has readings.
55692
+ *
55693
+ * Reflected, so a stylesheet can treat the chart while it waits. A chart
55694
+ * that already has readings keeps drawing them, so a refresh does not
55695
+ * blank it.
55696
+ * - `loading-text`/`loadingText`: The words shown in place of the drawing while `loading` is set and
55697
+ * there are no readings yet, and the fallback of the `loading` slot.
55698
+ * - `for`: The id of the table to read.
55699
+ *
55700
+ * Names a table in the same tree, so a chart inside another component's
55701
+ * shadow root reads a table in that root rather than one in the document. A
55702
+ * `<table>` or anything built from grid roles, including `helix-table`.
55703
+ *
55704
+ * **In React this arrives as a property and not as an attribute**, the way
55705
+ * `Tooltip.for` does, so it does not reflect and nothing styles on it.
55706
+ * - `label`: The chart's name, which starts the chart's text summary.
55707
+ *
55708
+ * Absent falls back to the table's own caption, which is usually the right
55709
+ * words and is already written.
55710
+ * - `locale`: The locale the chart's own numbers are written in: its axis, its
55711
+ * percentages and its totals, such as `de` for `1.240` and `32 %`.
55712
+ *
55713
+ * Absent reads the nearest `lang`, then the runtime's own. The table's
55714
+ * cells are shown as the table writes them, whatever this says.
55715
+ * - `position-label`/`positionLabel`: Where a reading the keys moved to stands among the readings, said after
55716
+ * it. `{position}` and `{count}` are replaced with the numbers, written in
55717
+ * `locale`.
55718
+ *
55719
+ * Set it to the words of the page's language, such as `{position} von
55720
+ * {count}`, or to nothing to say no position. A slice or a series a
55721
+ * legend hid is not counted.
55722
+ * - `busiest-label`/`busiestLabel`: The name the `overview` gives the busiest reading, `{busiestLabel}` in
55723
+ * `overview-label`.
55724
+ * - `gap`: Space between cells, in CSS pixels. It is a number for the same reason
55725
+ * `min-cell` is.
55726
+ * - `min-cell`/`minCell`: The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
55727
+ *
55728
+ * **Set this only to overrule what the strip actually draws.** The arithmetic
55729
+ * needs a width in pixels and the width is a length the stylesheet resolves,
55730
+ * so a number written here that disagrees with the sheet is a promise the
55731
+ * consumer has to keep by hand, and the one number a summary is told to trust
55732
+ * is the one it gets wrong.
55733
+ *
55734
+ * The strip measures itself, so sizing the cells in a sheet is enough on its
55735
+ * own and these two are the estimate used until the first measurement lands.
55736
+ * Writing the attribute pins the value and stops the measurement being
55737
+ * consulted, which is what a container query or a transition on the cell size
55738
+ * wants, where what is drawn this frame is not what the arithmetic should
55739
+ * plan around.
55740
+ *
55741
+ * Zero turns the dropping off altogether, which is right for a strip in a
55742
+ * container that cannot get narrow.
55743
+ * - `overview-label`/`overviewLabel`: The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
55744
+ * `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
55745
+ * and its reading as the table writes it, and `{total}` the total of the
55746
+ * readings drawn, written in the locale.
55747
+ * - `rows`: How many rows the strip has.
55748
+ *
55749
+ * `1` is a status strip and `7` is a calendar week, which are the two readings
55750
+ * this covers. Cells fill down the column and then across, which is what a
55751
+ * calendar heatmap does: a week is a column, so the strip reads along the
55752
+ * line in weeks, from the right on a right-to-left page, and top to bottom in
55753
+ * days.
55754
+ * - `selected-label`/`selectedLabel`: What the readout added for a selected cell, under `selection-mode`.
55755
+ * - `selection-label`/`selectionLabel`: What the `selection` part says after the selection changes. `{count}` is
55756
+ * how many cells are selected, written in the locale, and a language that
55757
+ * needs plural forms writes them: `{count, plural, one {# wybrany} few
55758
+ * {# wybrane} many {# wybranych} other {# wybranego}}`.
55759
+ * - `selection-mode`/`selectionMode`: How many cells a reader can select: `single` or `multiple`.
55760
+ *
55761
+ * Absent selects nothing, and a press or Space does what it did.
55762
+ * - `selection-shape`/`selectionShape`: What Shift takes in under `selection-mode="multiple"`: `linear`, every
55763
+ * cell between two in the table's order, or `rectangle`, the cells between
55764
+ * two corners by row and by column, as a spreadsheet selects a range.
55765
+ * - `strip-label`/`stripLabel`: The strip's name where the chart has none: no `aria-label`, `label`, or
55766
+ * table caption.
55767
+ * - `thresholds`: Lower bounds for the tone buckets, in the order the tones are given.
55768
+ *
55769
+ * `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
55770
+ * first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
55771
+ * fourth. A value below the first bound gets no tone at all: an empty day in a
55772
+ * contribution graph is a day with nothing in it, and painting it as the
55773
+ * lowest bucket claims a reading that does not exist.
55774
+ * - `tones`: The tone for each bucket, in the same order as `thresholds`.
55775
+ *
55776
+ * A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
55777
+ * **`"1"` through `"5"` are a ramp and everything else is a category**, which
55778
+ * is the distinction a heatmap lives or dies on: magnitude has to be one hue
55779
+ * getting louder, because a reader compares two cells by weight and cannot
55780
+ * compare two hues at all. `tones="surface info accent success primary"` for a
55781
+ * commit count is five unrelated hues for five amounts, which is confetti with
55782
+ * no order in it.
55783
+ * - `total-label`/`totalLabel`: The name the `overview` gives the total of the readings drawn,
55784
+ * `{totalLabel}` in `overview-label`.
55785
+ * - `value`: The selected cells, separated by commas: each by the date its row's
55786
+ * header carries in a `<time datetime>`, such as `2026-06-11`, or by the
55787
+ * header's words where it carries none.
55788
+ *
55789
+ * Set it to start with cells selected. Written by a press or a key under
55790
+ * `selection-mode`.
55791
+ * - `data`: The readings as data, in the shape of a table, where the page has no
55792
+ * table to point `for` at. `for` wins where both are set.
55793
+ *
55794
+ * ```js
55795
+ * chart.data = {
55796
+ * caption: 'Sessions by channel',
55797
+ * columns: ['Month', 'Direct', 'Referral'],
55798
+ * rows: [['Jan', 10, 4], ['Feb', 20, 8]],
55799
+ * }
55800
+ * ```
55801
+ *
55802
+ * The first column holds each row's label and every column after it a
55803
+ * series, as in a table. A cell is a number, words, `null` for a blank,
55804
+ * or `{ value, text }` for a number shown as words, such as `$128k`. A
55805
+ * number is shown in `locale`.
55806
+ *
55807
+ * **A table is still the better source where the page can show one**:
55808
+ * it reads with no script and before hydration, and a reader can sort and
55809
+ * copy it. Data is drawn on the client only, so a server serves the
55810
+ * frame, and the summary, the keys and the readout are then the whole of
55811
+ * what a screen reader is given. Set a new object to redraw: the chart
55812
+ * does not look inside the one it has. (property only)
55813
+ * - `series`: The table's columns, one series each. Empty when there is no table.
55814
+ *
55815
+ * Held by the controller between edits, so a render reading this five
55816
+ * times parses the table once. See `SourceController.series`. (property only) (readonly)
55817
+ * - `named`: The chart's name: an `aria-label` written on the chart, then `label`,
55818
+ * then the table's caption.
55819
+ *
55820
+ * The fallback is the reason this is shared rather than copied: a caption is
55821
+ * already written, already the right words, and already the thing a reader
55822
+ * of the table sees. A chart that made the consumer say it twice would be
55823
+ * asking for the second one to drift.
55824
+ *
55825
+ * **An `aria-label` on the chart comes first**, because it is how a page
55826
+ * names an element, and the chart is a generic around its plot: written
55827
+ * on the host, the name reached nobody. The plot takes it, as Heatmap's
55828
+ * strip always did. (property only) (readonly)
55829
+ * - `plottedColumns`: The positions of the cells in a row that hold numbers, in table order.
55830
+ *
55831
+ * The same test `readSeries` applies when it drops a column of notes: a
55832
+ * column is a series where any row parses, so a series survives one blank
55833
+ * cell and a column of words is never one. (property only) (readonly)
55834
+ * - `readings`: The number of readings, which the pointer position maps onto. (property only) (readonly)
55835
+ * - `visible`: How many cells are actually drawn.
55836
+ *
55837
+ * **This is the number a summary has to agree with**, and the reason it is
55838
+ * published at all: a consumer's own summary is their markup and this element
55839
+ * cannot rewrite it, so the only honest arrangement is to hand over the count
55840
+ * and say when it changed.
55841
+ *
55842
+ * **A plain getter, and the attribute is written in `updated`, because
55843
+ * `@property({ reflect: true })` on a getter with no setter reflects once and
55844
+ * then goes stale.** Lit reflects a property that is in `changedProperties`,
55845
+ * and nothing puts a derived getter there after the first update: the
55846
+ * attribute would be right on load and wrong from the first resize, which is
55847
+ * the exact failure the count exists to prevent, arriving through the
55848
+ * mechanism meant to prevent it. (property only) (readonly)
55849
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
55850
+ *
55851
+ * **Named `whenSettled` because `settled` is taken four times over**, by
55852
+ * Image, Splitter and both color controls, none of them about transitions. A
55853
+ * base class takes the name every subclass then cannot use.
55854
+ *
55855
+ * **The state it reports cannot be watched, which is why this exists.** A
55856
+ * custom state is deliberately not in the DOM, so there is no
55857
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
55858
+ * instead.
55859
+ *
55860
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
55861
+ * the suppression is still active in. That is the distinction `readyToMove`
55862
+ * in `@fusion.dev/helix-testing` is written around.
55863
+ *
55864
+ * It never resolves where `requestAnimationFrame` never fires, which is a
55865
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
55866
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
55867
+ * browser harness's awaits it alone: a browser always runs the frame, and a
55868
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
55869
+ *
55870
+ * ## Events
55871
+ *
55872
+ * Events that will be emitted by the component.
55873
+ *
55874
+ * - `change`: Fired once a press or a key has changed which cells are selected.
55875
+ * - `helix-before-change`: Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable.
55876
+ * - `helix-reading-change`: 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.
55877
+ * - `helix-reading-press`: A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.
55878
+ * - `helix-resize`: Fired when the number of cells drawn changes, with the new number.
55879
+ *
55880
+ * ## Slots
55881
+ *
55882
+ * Areas where markup can be added to the component.
55883
+ *
55884
+ * - `empty`: Content shown under the strip when the table has no readings, such as a link to add the first. Falls back to `empty-text`.
55885
+ * - `end`: Below the strip, at the trailing edge: usually the newest date.
55886
+ * - `loading`: Content shown under the strip while `loading` is set and there are no readings yet. Falls back to `loading-text`.
55887
+ * - `start`: Below the strip, at the leading edge: usually the oldest date.
55888
+ * - `summary`: Below the strip, in the middle: a summary of the range shown.
55889
+ *
55890
+ * ## Methods
55891
+ *
55892
+ * Methods that can be called to access component functionality.
55893
+ *
55894
+ * - `seriesOf(cell: number) => number | undefined`: The palette slot for the cell at this position in a row.
55895
+ *
55896
+ * **A cell's place in its row is not its series' depth, and the tooltip
55897
+ * spent a while assuming it was.** `readSeries` drops a column nothing
55898
+ * parses and `readRows` keeps it, so one column of notes among the figures
55899
+ * moves every column after it one color along in the bubble: a row reading
55900
+ * `Referral 1,080` wearing series three's green beside a legend that says
55901
+ * series three is something else, which is the one failure the dot exists
55902
+ * to prevent.
55903
+ *
55904
+ * Overridden where a chart reads the table some other way. `ScatterChart`
55905
+ * splits the first plotted column off as the measure across, so its first
55906
+ * *plotted* series is this table's second numeric column.
55907
+ * - `showsSeries(name: string) => boolean`: Whether the series of this name is drawn, which it is unless a legend
55908
+ * reading the same table hid it.
55909
+ *
55910
+ * Asked of the table rather than of a legend, the table being the one
55911
+ * thing the two share: see `SourceController.hide`. A series keeps its
55912
+ * palette slot while it is hidden, so the colors of the others do not move.
55913
+ * For a ring the names are its rows, the slices being the rows.
55914
+ * - `showsColumn(cell: number) => boolean`: Whether the series read from the cell at this place in a row is drawn,
55915
+ * by its column's heading. The keys and the readout pass over one a
55916
+ * legend hid.
55917
+ *
55918
+ * A column's heading is the cell's name in every row, so the first row
55919
+ * answers for the column.
55920
+ * - `columnName(cell: number) => string`: The heading of the column at this place in a row: a cell's name is its
55921
+ * column's heading, read from the first row that has a cell there, so a
55922
+ * short first row does not lose the heading. `''` where no row has one.
55923
+ * - `pageFrom(at: number, forward: boolean) => number | undefined`: Where PageUp or PageDown goes from the drawn cell at `at`: the same day a
55924
+ * month on or back, by the dates the rows' headers carry. Undefined where
55925
+ * they carry none, and the keys move four columns.
55926
+ *
55927
+ * ## CSS Custom Properties
55928
+ *
55929
+ * CSS variables available for styling the component.
55930
+ *
55931
+ * - `--isometric-heatmap-cell-size`: The largest a cell grows, along its edge. The strip is never wider than its box, and draws smaller cells to fit.
55932
+ * - `--isometric-heatmap-left-shade`: How much darker the left face is than the top, as a percentage mixed toward black.
55933
+ * - `--isometric-heatmap-right-shade`: How much darker the right face is than the top, as a percentage mixed toward black.
55934
+ * - `--isometric-heatmap-selected-color`: The color of the dashed edges of a selected prism, under `selection-mode`. By default, white on a dark face and black on a light one.
55935
+ * - `--isometric-heatmap-span`: 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.
55936
+ * - `--heatmap-rows`: How many rows the strip lays out. The component writes it from the data, and the stylesheet that draws the strip reads it.
55937
+ * - `--heatmap-tone`: The tone of the cell it is set on. The component writes it, and the stylesheet that paints the cell reads it.
55938
+ * - `--heatmap-tone-1`: The weakest step of the magnitude ramp, used by `tones="1 …"`.
55939
+ * - `--heatmap-tone-2`: The second step of the magnitude ramp.
55940
+ * - `--heatmap-tone-3`: The third step of the magnitude ramp.
55941
+ * - `--heatmap-tone-4`: The fourth step of the magnitude ramp.
55942
+ * - `--heatmap-tone-5`: The strongest step of the magnitude ramp.
55943
+ * - `--heatmap-tone-accent`: The color of the `accent` tone.
55944
+ * - `--heatmap-tone-danger`: The color of the `danger` tone.
55945
+ * - `--heatmap-tone-info`: The color of the `info` tone.
55946
+ * - `--heatmap-tone-muted`: The color of the `muted` tone: a quiet background, for a bucket that means nothing happened.
55947
+ * - `--heatmap-tone-primary`: The color of the `primary` tone.
55948
+ * - `--heatmap-tone-success`: The color of the `success` tone, named in `tones` or in `data-tone`.
55949
+ * - `--heatmap-tone-warning`: The color of the `warning` tone.
55950
+ *
55951
+ * ## CSS Parts
55952
+ *
55953
+ * Custom selectors for styling elements within the component.
55954
+ *
55955
+ * - `cell`: One reading.
55956
+ * - `drawing`: The SVG every prism is drawn in. It is mirrored on a right-to-left page.
55957
+ * - `left-face`: The face of a prism toward the next row, drawn at its lower left.
55958
+ * - `right-face`: The face of a prism toward the next column, drawn at its lower right.
55959
+ * - `row`: A column of cells, which a grid reads as a row, under `selection-mode`. It draws no box.
55960
+ * - `strip`: The grid of cells, which takes focus to be read by key. It is named by the host's `aria-labelledby` or `aria-label`, then by `label`, then by the caption of the table.
55961
+ * - `top-face`: The top of a prism, which carries the reading's tone.
55962
+ * - `cell-active`: The cell the pointer or the keys rest on. Set alongside `cell`.
55963
+ * - `cell-selected`: A cell that is selected, under `selection-mode`. Set alongside `cell`.
55964
+ * - `empty`: The words under the strip when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration, there being no document to resolve `for` in.
55965
+ * - `end`: The trailing slot's box.
55966
+ * - `footer`: The three-slot row under the strip.
55967
+ * - `live`: The readout: a polite live region that says the cell the keys moved to. Hide it visually.
55968
+ * - `loading`: The words under the strip while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.
55969
+ * - `mark`: The invisible point the tooltip is anchored to.
55970
+ * - `overview`: The busiest reading and the total of the readings drawn, written as a sentence for screen readers, which describes the strip. Rendered once there are cells. Hide it visually.
55971
+ * - `plot`: The same element as `strip`, under the name every chart gives the drawing that takes focus.
55972
+ * - `selection`: A polite region that says how many cells are selected after a change, rendered from the first change. Hide it visually.
55973
+ * - `start`: The leading slot's box.
55974
+ * - `summary`: The middle slot's box.
55975
+ * - `table`: The readings as a table, for a screen reader, rendered only where they were drawn from `data`. Hide it visually.
55976
+ * - `tooltip`: The bubble, forwarded from `Tooltip`.
55977
+ * - `tooltip-anchor`: The `Tooltip` element itself.
55978
+ * - `tooltip-arrow`: The bubble's point, forwarded from `Tooltip`.
55979
+ * - `tooltip-arrow-bottom`: The point while the bubble is below the reading, on its top edge. Set alongside `tooltip-arrow`.
55980
+ * - `tooltip-arrow-left`: The point while the bubble is left of the reading, on its right edge. Set alongside `tooltip-arrow`.
55981
+ * - `tooltip-arrow-right`: The point while the bubble is right of the reading, on its left edge. Set alongside `tooltip-arrow`.
55982
+ * - `tooltip-arrow-top`: The point while the bubble is above the reading, on its bottom edge. Set alongside `tooltip-arrow`.
55983
+ * - `tooltip-bottom`: The bubble while it is below the reading. Set alongside `tooltip`.
55984
+ * - `tooltip-cell`: One column's name and value inside the tooltip.
55985
+ * - `tooltip-cell-current`: The cell the series keys rest on, in the charts whose readings hold several series. A strip draws one, so it is never set here.
55986
+ * - `tooltip-label`: The reading's own name inside the tooltip.
55987
+ * - `tooltip-left`: The bubble while it is left of the reading. Set alongside `tooltip`.
55988
+ * - `tooltip-name`: A column's name inside the tooltip.
55989
+ * - `tooltip-right`: The bubble while it is right of the reading. Set alongside `tooltip`.
55990
+ * - `tooltip-top`: The bubble while it is above the reading. Set alongside `tooltip`.
55991
+ * - `tooltip-value`: A column's value inside the tooltip.
55992
+ *
55993
+ * ## CSS States
55994
+ *
55995
+ * These can be used to apply styling when a component is in a given state.
55996
+ *
55997
+ * - `active`: While a cell is shown, under the pointer or the keys, with its tooltip open.
55998
+ * - `empty`: While the `empty` part stands in place of the cells.
55999
+ * - `loading`: While the `loading` part stands in place of the cells.
56000
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
56001
+ */
56002
+ "helix-isometric-heatmap": Partial<
56003
+ HelixIsometricHeatmapProps & BaseProps<HelixIsometricHeatmap> & BaseEvents<HelixIsometricHeatmap>
56004
+ >;
56005
+
55155
56006
  /**
55156
56007
  * Drawn as a physical key, with a hairline border, a sunken fill, and one inset
55157
56008
  * shadow along the bottom edge.
@@ -66111,7 +66962,7 @@ export type CustomElements = {
66111
66962
  *
66112
66963
  * The ribbon stops moving in these cases:
66113
66964
  * - `prefers-reduced-motion` is set. The element shows one still frame, and in
66114
- * `travel` still follows the scroll, without easing.
66965
+ * `travel` still follows the scroll.
66115
66966
  * - The element is off screen or in a background tab.
66116
66967
  *
66117
66968
  * It shows a gradient from the same tokens in these cases, and matches
@@ -66840,13 +67691,11 @@ export type CustomElements = {
66840
67691
  * **It is also the only track list a server can send.** The shim has no tree
66841
67692
  * to walk, so a render there knows of no columns and this attribute is the
66842
67693
  * whole answer: a table given one lays its grid out in the first paint, and a
66843
- * table sized only by its columns is one track wide until it upgrades.
67694
+ * table sized only by its columns takes, until it upgrades, a track for each
67695
+ * column at the width a column with no `width` takes (`helix.css`).
66844
67696
  *
66845
- * **Data Table has none of this, and should not.** Its columns are its schema
66846
- * rather than an option, so there is always a column to write a `width` on
66847
- * and a list here would be a second way to say what that says. This table's
66848
- * cells are markup, and a table written as rows of cells with no column
66849
- * declared in it has nowhere else to be sized from.
67697
+ * Data Table takes the same list, for the same reason: a data table that
67698
+ * serves its first page as rows is laid out by it before it upgrades.
66850
67699
  * - `default-expanded`/`defaultExpanded`: The keys of the rows whose rows are shown at the start, separated by
66851
67700
  * commas. Used until `expanded` is set.
66852
67701
  * - `default-selected`/`defaultSelected`: The keys selected at the start, separated by commas. Used until `selected`
@@ -79254,7 +80103,9 @@ export type CustomElementsSolidJs = {
79254
80103
  * Write it under the columns as `helix-table-row` and `helix-table-cell`
79255
80104
  * elements. `@fusion.dev/helix-styles/helix.css` lays them out as the table
79256
80105
  * draws them before it upgrades, and the table shows them until `rows` holds a
79257
- * row.
80106
+ * row. It holds the checkbox column and the pagination's row from the first
80107
+ * paint, and takes the widths from `columns`, so nothing moves when the table
80108
+ * upgrades or draws its own rows.
79258
80109
  *
79259
80110
  * ## Attributes & Properties
79260
80111
  *
@@ -79275,6 +80126,15 @@ export type CustomElementsSolidJs = {
79275
80126
  *
79276
80127
  * Reflected, because the styled tier indents a tree grid's row headers by
79277
80128
  * it. No default, so a table that sets none writes nothing onto its host.
80129
+ * - `columns`: The column tracks, as a grid track list such as `2fr 1fr max-content`,
80130
+ * dealt out one track to a column in the order the columns are written. A
80131
+ * column's own `width` wins in its place, and a column it does not reach
80132
+ * takes the track a column with no `width` takes.
80133
+ *
80134
+ * **The one track list a server can send.** A server rendering this element
80135
+ * has no columns to read a `width` from, and neither has a stylesheet laying
80136
+ * out the rows a page served before the table upgrades, so a table sized here
80137
+ * lays those rows out at the widths it draws.
79278
80138
  * - `default-expanded`/`defaultExpanded`: The keys of the rows open at the start, separated by commas. Used until
79279
80139
  * `expanded` is set.
79280
80140
  * - `default-filter`/`defaultFilter`: The starting search query, used until `filter` is set.
@@ -84481,11 +85341,6 @@ export type CustomElementsSolidJs = {
84481
85341
  * Reduced motion stills every animation. `auto-width` gives the box the
84482
85342
  * glyph's own proportions, for a mark wider than it is tall.
84483
85343
  *
84484
- * **`@fusion.dev/helix/icon` registers thirteen glyphs by name**, the ones a
84485
- * control most often needs, and `@fusion.dev/helix/icon/all` registers the
84486
- * whole set. The headless element lists the thirteen and says how a name is
84487
- * resolved.
84488
- *
84489
85344
  * ## Attributes & Properties
84490
85345
  *
84491
85346
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -84517,10 +85372,12 @@ export type CustomElementsSolidJs = {
84517
85372
  * - `name`: The name of the icon in the Helix set.
84518
85373
  *
84519
85374
  * **A lookup, and the reason both this and `icon` exist.** A name is a string,
84520
- * so it is what markup can carry, and resolving one means an index that no
84521
- * bundler can shake. The family's entry indexes a small set, `icon/all`
84522
- * indexes the whole set at 15 kB, and `icon/root` indexes nothing, for a
84523
- * page that registers the glyphs it names or hands over the value instead.
85375
+ * so it is what markup can carry, and resolving one means an index of the
85376
+ * whole set that no bundler can shake: 15 kB for a consumer who renders one
85377
+ * mark. An attribute is the only thing an HTML author can write, and that is
85378
+ * worth the index; a consumer who would rather not pay it imports the
85379
+ * element from `icon/root` and registers the glyphs it names, or hands over
85380
+ * the value instead.
84524
85381
  *
84525
85382
  * A name written `prefix:name` asks the library registered under that
84526
85383
  * prefix.
@@ -85079,6 +85936,343 @@ export type CustomElementsSolidJs = {
85079
85936
  BaseEvents<HelixInput>
85080
85937
  >;
85081
85938
 
85939
+ /**
85940
+ * Each reading is a prism. The top face takes the cell's tone, and the two
85941
+ * sides are the same tone, shaded darker, so the whole relief follows your
85942
+ * theme's colors.
85943
+ *
85944
+ * `tones="1 2 3 4 5"` uses the same five-step ramp as `Heatmap`, so the tone
85945
+ * and the height both show the value. Set `--isometric-heatmap-cell-size` to
85946
+ * change how large a cell may grow.
85947
+ *
85948
+ * ## Attributes & Properties
85949
+ *
85950
+ * Component attributes and properties that can be applied to the element or by using JavaScript.
85951
+ *
85952
+ * - `flat`: Draws every prism at no height, so the tones lie on a plane.
85953
+ * - `relief`: How tall the highest reading stands, in cells. Every other reading stands
85954
+ * at its share of it.
85955
+ * - `empty-text`/`emptyText`: The words shown in place of the drawing when the table has no readings,
85956
+ * and the fallback of the `empty` slot.
85957
+ * - `loading`: Whether the readings are still on their way. The chart shows
85958
+ * `loading-text` in place of an empty drawing until it has readings.
85959
+ *
85960
+ * Reflected, so a stylesheet can treat the chart while it waits. A chart
85961
+ * that already has readings keeps drawing them, so a refresh does not
85962
+ * blank it.
85963
+ * - `loading-text`/`loadingText`: The words shown in place of the drawing while `loading` is set and
85964
+ * there are no readings yet, and the fallback of the `loading` slot.
85965
+ * - `for`: The id of the table to read.
85966
+ *
85967
+ * Names a table in the same tree, so a chart inside another component's
85968
+ * shadow root reads a table in that root rather than one in the document. A
85969
+ * `<table>` or anything built from grid roles, including `helix-table`.
85970
+ *
85971
+ * **In React this arrives as a property and not as an attribute**, the way
85972
+ * `Tooltip.for` does, so it does not reflect and nothing styles on it.
85973
+ * - `label`: The chart's name, which starts the chart's text summary.
85974
+ *
85975
+ * Absent falls back to the table's own caption, which is usually the right
85976
+ * words and is already written.
85977
+ * - `locale`: The locale the chart's own numbers are written in: its axis, its
85978
+ * percentages and its totals, such as `de` for `1.240` and `32 %`.
85979
+ *
85980
+ * Absent reads the nearest `lang`, then the runtime's own. The table's
85981
+ * cells are shown as the table writes them, whatever this says.
85982
+ * - `position-label`/`positionLabel`: Where a reading the keys moved to stands among the readings, said after
85983
+ * it. `{position}` and `{count}` are replaced with the numbers, written in
85984
+ * `locale`.
85985
+ *
85986
+ * Set it to the words of the page's language, such as `{position} von
85987
+ * {count}`, or to nothing to say no position. A slice or a series a
85988
+ * legend hid is not counted.
85989
+ * - `busiest-label`/`busiestLabel`: The name the `overview` gives the busiest reading, `{busiestLabel}` in
85990
+ * `overview-label`.
85991
+ * - `gap`: Space between cells, in CSS pixels. It is a number for the same reason
85992
+ * `min-cell` is.
85993
+ * - `min-cell`/`minCell`: The smallest a cell may get before the strip draws fewer of them, in CSS pixels.
85994
+ *
85995
+ * **Set this only to overrule what the strip actually draws.** The arithmetic
85996
+ * needs a width in pixels and the width is a length the stylesheet resolves,
85997
+ * so a number written here that disagrees with the sheet is a promise the
85998
+ * consumer has to keep by hand, and the one number a summary is told to trust
85999
+ * is the one it gets wrong.
86000
+ *
86001
+ * The strip measures itself, so sizing the cells in a sheet is enough on its
86002
+ * own and these two are the estimate used until the first measurement lands.
86003
+ * Writing the attribute pins the value and stops the measurement being
86004
+ * consulted, which is what a container query or a transition on the cell size
86005
+ * wants, where what is drawn this frame is not what the arithmetic should
86006
+ * plan around.
86007
+ *
86008
+ * Zero turns the dropping off altogether, which is right for a strip in a
86009
+ * container that cannot get narrow.
86010
+ * - `overview-label`/`overviewLabel`: The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
86011
+ * `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
86012
+ * and its reading as the table writes it, and `{total}` the total of the
86013
+ * readings drawn, written in the locale.
86014
+ * - `rows`: How many rows the strip has.
86015
+ *
86016
+ * `1` is a status strip and `7` is a calendar week, which are the two readings
86017
+ * this covers. Cells fill down the column and then across, which is what a
86018
+ * calendar heatmap does: a week is a column, so the strip reads along the
86019
+ * line in weeks, from the right on a right-to-left page, and top to bottom in
86020
+ * days.
86021
+ * - `selected-label`/`selectedLabel`: What the readout added for a selected cell, under `selection-mode`.
86022
+ * - `selection-label`/`selectionLabel`: What the `selection` part says after the selection changes. `{count}` is
86023
+ * how many cells are selected, written in the locale, and a language that
86024
+ * needs plural forms writes them: `{count, plural, one {# wybrany} few
86025
+ * {# wybrane} many {# wybranych} other {# wybranego}}`.
86026
+ * - `selection-mode`/`selectionMode`: How many cells a reader can select: `single` or `multiple`.
86027
+ *
86028
+ * Absent selects nothing, and a press or Space does what it did.
86029
+ * - `selection-shape`/`selectionShape`: What Shift takes in under `selection-mode="multiple"`: `linear`, every
86030
+ * cell between two in the table's order, or `rectangle`, the cells between
86031
+ * two corners by row and by column, as a spreadsheet selects a range.
86032
+ * - `strip-label`/`stripLabel`: The strip's name where the chart has none: no `aria-label`, `label`, or
86033
+ * table caption.
86034
+ * - `thresholds`: Lower bounds for the tone buckets, in the order the tones are given.
86035
+ *
86036
+ * `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
86037
+ * first step, 3 to 5 in the second, 6 to 8 in the third, and 9 upward in the
86038
+ * fourth. A value below the first bound gets no tone at all: an empty day in a
86039
+ * contribution graph is a day with nothing in it, and painting it as the
86040
+ * lowest bucket claims a reading that does not exist.
86041
+ * - `tones`: The tone for each bucket, in the same order as `thresholds`.
86042
+ *
86043
+ * A name, resolved as `--heatmap-tone-<name>` by whichever tier answers.
86044
+ * **`"1"` through `"5"` are a ramp and everything else is a category**, which
86045
+ * is the distinction a heatmap lives or dies on: magnitude has to be one hue
86046
+ * getting louder, because a reader compares two cells by weight and cannot
86047
+ * compare two hues at all. `tones="surface info accent success primary"` for a
86048
+ * commit count is five unrelated hues for five amounts, which is confetti with
86049
+ * no order in it.
86050
+ * - `total-label`/`totalLabel`: The name the `overview` gives the total of the readings drawn,
86051
+ * `{totalLabel}` in `overview-label`.
86052
+ * - `value`: The selected cells, separated by commas: each by the date its row's
86053
+ * header carries in a `<time datetime>`, such as `2026-06-11`, or by the
86054
+ * header's words where it carries none.
86055
+ *
86056
+ * Set it to start with cells selected. Written by a press or a key under
86057
+ * `selection-mode`.
86058
+ * - `data`: The readings as data, in the shape of a table, where the page has no
86059
+ * table to point `for` at. `for` wins where both are set.
86060
+ *
86061
+ * ```js
86062
+ * chart.data = {
86063
+ * caption: 'Sessions by channel',
86064
+ * columns: ['Month', 'Direct', 'Referral'],
86065
+ * rows: [['Jan', 10, 4], ['Feb', 20, 8]],
86066
+ * }
86067
+ * ```
86068
+ *
86069
+ * The first column holds each row's label and every column after it a
86070
+ * series, as in a table. A cell is a number, words, `null` for a blank,
86071
+ * or `{ value, text }` for a number shown as words, such as `$128k`. A
86072
+ * number is shown in `locale`.
86073
+ *
86074
+ * **A table is still the better source where the page can show one**:
86075
+ * it reads with no script and before hydration, and a reader can sort and
86076
+ * copy it. Data is drawn on the client only, so a server serves the
86077
+ * frame, and the summary, the keys and the readout are then the whole of
86078
+ * what a screen reader is given. Set a new object to redraw: the chart
86079
+ * does not look inside the one it has. (property only)
86080
+ * - `series`: The table's columns, one series each. Empty when there is no table.
86081
+ *
86082
+ * Held by the controller between edits, so a render reading this five
86083
+ * times parses the table once. See `SourceController.series`. (property only) (readonly)
86084
+ * - `named`: The chart's name: an `aria-label` written on the chart, then `label`,
86085
+ * then the table's caption.
86086
+ *
86087
+ * The fallback is the reason this is shared rather than copied: a caption is
86088
+ * already written, already the right words, and already the thing a reader
86089
+ * of the table sees. A chart that made the consumer say it twice would be
86090
+ * asking for the second one to drift.
86091
+ *
86092
+ * **An `aria-label` on the chart comes first**, because it is how a page
86093
+ * names an element, and the chart is a generic around its plot: written
86094
+ * on the host, the name reached nobody. The plot takes it, as Heatmap's
86095
+ * strip always did. (property only) (readonly)
86096
+ * - `plottedColumns`: The positions of the cells in a row that hold numbers, in table order.
86097
+ *
86098
+ * The same test `readSeries` applies when it drops a column of notes: a
86099
+ * column is a series where any row parses, so a series survives one blank
86100
+ * cell and a column of words is never one. (property only) (readonly)
86101
+ * - `readings`: The number of readings, which the pointer position maps onto. (property only) (readonly)
86102
+ * - `visible`: How many cells are actually drawn.
86103
+ *
86104
+ * **This is the number a summary has to agree with**, and the reason it is
86105
+ * published at all: a consumer's own summary is their markup and this element
86106
+ * cannot rewrite it, so the only honest arrangement is to hand over the count
86107
+ * and say when it changed.
86108
+ *
86109
+ * **A plain getter, and the attribute is written in `updated`, because
86110
+ * `@property({ reflect: true })` on a getter with no setter reflects once and
86111
+ * then goes stale.** Lit reflects a property that is in `changedProperties`,
86112
+ * and nothing puts a derived getter there after the first update: the
86113
+ * attribute would be right on load and wrong from the first resize, which is
86114
+ * the exact failure the count exists to prevent, arriving through the
86115
+ * mechanism meant to prevent it. (property only) (readonly)
86116
+ * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
86117
+ *
86118
+ * **Named `whenSettled` because `settled` is taken four times over**, by
86119
+ * Image, Splitter and both color controls, none of them about transitions. A
86120
+ * base class takes the name every subclass then cannot use.
86121
+ *
86122
+ * **The state it reports cannot be watched, which is why this exists.** A
86123
+ * custom state is deliberately not in the DOM, so there is no
86124
+ * `MutationObserver` equivalent for `ElementInternals.states`. Await this
86125
+ * instead.
86126
+ *
86127
+ * Separate from `updateComplete`, which resolves in the microtask checkpoint
86128
+ * the suppression is still active in. That is the distinction `readyToMove`
86129
+ * in `@fusion.dev/helix-testing` is written around.
86130
+ *
86131
+ * It never resolves where `requestAnimationFrame` never fires, which is a
86132
+ * server, a hidden tab, and happy-dom. Callers that must not hang there race
86133
+ * it against a timeout, as the happy-dom harness's `readyToMove` does. The
86134
+ * browser harness's awaits it alone: a browser always runs the frame, and a
86135
+ * timer beside it was a bet on how long one takes, which a busy run lost. (property only) (readonly)
86136
+ *
86137
+ * ## Events
86138
+ *
86139
+ * Events that will be emitted by the component.
86140
+ *
86141
+ * - `change`: Fired once a press or a key has changed which cells are selected.
86142
+ * - `helix-before-change`: Fired before a press or a key changes which cells are selected, with the `value` it would leave. Cancelable.
86143
+ * - `helix-reading-change`: 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.
86144
+ * - `helix-reading-press`: A reading was clicked, tapped, or pressed with Enter or Space, with the same detail as `helix-reading-change`.
86145
+ * - `helix-resize`: Fired when the number of cells drawn changes, with the new number.
86146
+ *
86147
+ * ## Slots
86148
+ *
86149
+ * Areas where markup can be added to the component.
86150
+ *
86151
+ * - `empty`: Content shown under the strip when the table has no readings, such as a link to add the first. Falls back to `empty-text`.
86152
+ * - `end`: Below the strip, at the trailing edge: usually the newest date.
86153
+ * - `loading`: Content shown under the strip while `loading` is set and there are no readings yet. Falls back to `loading-text`.
86154
+ * - `start`: Below the strip, at the leading edge: usually the oldest date.
86155
+ * - `summary`: Below the strip, in the middle: a summary of the range shown.
86156
+ *
86157
+ * ## Methods
86158
+ *
86159
+ * Methods that can be called to access component functionality.
86160
+ *
86161
+ * - `seriesOf(cell: number) => number | undefined`: The palette slot for the cell at this position in a row.
86162
+ *
86163
+ * **A cell's place in its row is not its series' depth, and the tooltip
86164
+ * spent a while assuming it was.** `readSeries` drops a column nothing
86165
+ * parses and `readRows` keeps it, so one column of notes among the figures
86166
+ * moves every column after it one color along in the bubble: a row reading
86167
+ * `Referral 1,080` wearing series three's green beside a legend that says
86168
+ * series three is something else, which is the one failure the dot exists
86169
+ * to prevent.
86170
+ *
86171
+ * Overridden where a chart reads the table some other way. `ScatterChart`
86172
+ * splits the first plotted column off as the measure across, so its first
86173
+ * *plotted* series is this table's second numeric column.
86174
+ * - `showsSeries(name: string) => boolean`: Whether the series of this name is drawn, which it is unless a legend
86175
+ * reading the same table hid it.
86176
+ *
86177
+ * Asked of the table rather than of a legend, the table being the one
86178
+ * thing the two share: see `SourceController.hide`. A series keeps its
86179
+ * palette slot while it is hidden, so the colors of the others do not move.
86180
+ * For a ring the names are its rows, the slices being the rows.
86181
+ * - `showsColumn(cell: number) => boolean`: Whether the series read from the cell at this place in a row is drawn,
86182
+ * by its column's heading. The keys and the readout pass over one a
86183
+ * legend hid.
86184
+ *
86185
+ * A column's heading is the cell's name in every row, so the first row
86186
+ * answers for the column.
86187
+ * - `columnName(cell: number) => string`: The heading of the column at this place in a row: a cell's name is its
86188
+ * column's heading, read from the first row that has a cell there, so a
86189
+ * short first row does not lose the heading. `''` where no row has one.
86190
+ * - `pageFrom(at: number, forward: boolean) => number | undefined`: Where PageUp or PageDown goes from the drawn cell at `at`: the same day a
86191
+ * month on or back, by the dates the rows' headers carry. Undefined where
86192
+ * they carry none, and the keys move four columns.
86193
+ *
86194
+ * ## CSS Custom Properties
86195
+ *
86196
+ * CSS variables available for styling the component.
86197
+ *
86198
+ * - `--isometric-heatmap-cell-size`: The largest a cell grows, along its edge. The strip is never wider than its box, and draws smaller cells to fit.
86199
+ * - `--isometric-heatmap-left-shade`: How much darker the left face is than the top, as a percentage mixed toward black.
86200
+ * - `--isometric-heatmap-right-shade`: How much darker the right face is than the top, as a percentage mixed toward black.
86201
+ * - `--isometric-heatmap-selected-color`: The color of the dashed edges of a selected prism, under `selection-mode`. By default, white on a dark face and black on a light one.
86202
+ * - `--isometric-heatmap-span`: 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.
86203
+ * - `--heatmap-rows`: How many rows the strip lays out. The component writes it from the data, and the stylesheet that draws the strip reads it.
86204
+ * - `--heatmap-tone`: The tone of the cell it is set on. The component writes it, and the stylesheet that paints the cell reads it.
86205
+ * - `--heatmap-tone-1`: The weakest step of the magnitude ramp, used by `tones="1 …"`.
86206
+ * - `--heatmap-tone-2`: The second step of the magnitude ramp.
86207
+ * - `--heatmap-tone-3`: The third step of the magnitude ramp.
86208
+ * - `--heatmap-tone-4`: The fourth step of the magnitude ramp.
86209
+ * - `--heatmap-tone-5`: The strongest step of the magnitude ramp.
86210
+ * - `--heatmap-tone-accent`: The color of the `accent` tone.
86211
+ * - `--heatmap-tone-danger`: The color of the `danger` tone.
86212
+ * - `--heatmap-tone-info`: The color of the `info` tone.
86213
+ * - `--heatmap-tone-muted`: The color of the `muted` tone: a quiet background, for a bucket that means nothing happened.
86214
+ * - `--heatmap-tone-primary`: The color of the `primary` tone.
86215
+ * - `--heatmap-tone-success`: The color of the `success` tone, named in `tones` or in `data-tone`.
86216
+ * - `--heatmap-tone-warning`: The color of the `warning` tone.
86217
+ *
86218
+ * ## CSS Parts
86219
+ *
86220
+ * Custom selectors for styling elements within the component.
86221
+ *
86222
+ * - `cell`: One reading.
86223
+ * - `drawing`: The SVG every prism is drawn in. It is mirrored on a right-to-left page.
86224
+ * - `left-face`: The face of a prism toward the next row, drawn at its lower left.
86225
+ * - `right-face`: The face of a prism toward the next column, drawn at its lower right.
86226
+ * - `row`: A column of cells, which a grid reads as a row, under `selection-mode`. It draws no box.
86227
+ * - `strip`: The grid of cells, which takes focus to be read by key. It is named by the host's `aria-labelledby` or `aria-label`, then by `label`, then by the caption of the table.
86228
+ * - `top-face`: The top of a prism, which carries the reading's tone.
86229
+ * - `cell-active`: The cell the pointer or the keys rest on. Set alongside `cell`.
86230
+ * - `cell-selected`: A cell that is selected, under `selection-mode`. Set alongside `cell`.
86231
+ * - `empty`: The words under the strip when the table has no readings: the `empty` slot, falling back to `empty-text`. Not drawn while the table cannot be read yet, on the server and during hydration, there being no document to resolve `for` in.
86232
+ * - `end`: The trailing slot's box.
86233
+ * - `footer`: The three-slot row under the strip.
86234
+ * - `live`: The readout: a polite live region that says the cell the keys moved to. Hide it visually.
86235
+ * - `loading`: The words under the strip while `loading` is set and there are no readings: the `loading` slot, falling back to `loading-text`.
86236
+ * - `mark`: The invisible point the tooltip is anchored to.
86237
+ * - `overview`: The busiest reading and the total of the readings drawn, written as a sentence for screen readers, which describes the strip. Rendered once there are cells. Hide it visually.
86238
+ * - `plot`: The same element as `strip`, under the name every chart gives the drawing that takes focus.
86239
+ * - `selection`: A polite region that says how many cells are selected after a change, rendered from the first change. Hide it visually.
86240
+ * - `start`: The leading slot's box.
86241
+ * - `summary`: The middle slot's box.
86242
+ * - `table`: The readings as a table, for a screen reader, rendered only where they were drawn from `data`. Hide it visually.
86243
+ * - `tooltip`: The bubble, forwarded from `Tooltip`.
86244
+ * - `tooltip-anchor`: The `Tooltip` element itself.
86245
+ * - `tooltip-arrow`: The bubble's point, forwarded from `Tooltip`.
86246
+ * - `tooltip-arrow-bottom`: The point while the bubble is below the reading, on its top edge. Set alongside `tooltip-arrow`.
86247
+ * - `tooltip-arrow-left`: The point while the bubble is left of the reading, on its right edge. Set alongside `tooltip-arrow`.
86248
+ * - `tooltip-arrow-right`: The point while the bubble is right of the reading, on its left edge. Set alongside `tooltip-arrow`.
86249
+ * - `tooltip-arrow-top`: The point while the bubble is above the reading, on its bottom edge. Set alongside `tooltip-arrow`.
86250
+ * - `tooltip-bottom`: The bubble while it is below the reading. Set alongside `tooltip`.
86251
+ * - `tooltip-cell`: One column's name and value inside the tooltip.
86252
+ * - `tooltip-cell-current`: The cell the series keys rest on, in the charts whose readings hold several series. A strip draws one, so it is never set here.
86253
+ * - `tooltip-label`: The reading's own name inside the tooltip.
86254
+ * - `tooltip-left`: The bubble while it is left of the reading. Set alongside `tooltip`.
86255
+ * - `tooltip-name`: A column's name inside the tooltip.
86256
+ * - `tooltip-right`: The bubble while it is right of the reading. Set alongside `tooltip`.
86257
+ * - `tooltip-top`: The bubble while it is above the reading. Set alongside `tooltip`.
86258
+ * - `tooltip-value`: A column's value inside the tooltip.
86259
+ *
86260
+ * ## CSS States
86261
+ *
86262
+ * These can be used to apply styling when a component is in a given state.
86263
+ *
86264
+ * - `active`: While a cell is shown, under the pointer or the keys, with its tooltip open.
86265
+ * - `empty`: While the `empty` part stands in place of the cells.
86266
+ * - `loading`: While the `loading` part stands in place of the cells.
86267
+ * - `settled`: Set one frame after the first render. Transitions wait for it, so an element does not animate its own arrival.
86268
+ */
86269
+ "helix-isometric-heatmap": Partial<
86270
+ HelixIsometricHeatmapProps &
86271
+ HelixIsometricHeatmapSolidJsProps &
86272
+ BaseProps<HelixIsometricHeatmap> &
86273
+ BaseEvents<HelixIsometricHeatmap>
86274
+ >;
86275
+
85082
86276
  /**
85083
86277
  * Drawn as a physical key, with a hairline border, a sunken fill, and one inset
85084
86278
  * shadow along the bottom edge.
@@ -96243,7 +97437,7 @@ export type CustomElementsSolidJs = {
96243
97437
  *
96244
97438
  * The ribbon stops moving in these cases:
96245
97439
  * - `prefers-reduced-motion` is set. The element shows one still frame, and in
96246
- * `travel` still follows the scroll, without easing.
97440
+ * `travel` still follows the scroll.
96247
97441
  * - The element is off screen or in a background tab.
96248
97442
  *
96249
97443
  * It shows a gradient from the same tokens in these cases, and matches
@@ -96987,13 +98181,11 @@ export type CustomElementsSolidJs = {
96987
98181
  * **It is also the only track list a server can send.** The shim has no tree
96988
98182
  * to walk, so a render there knows of no columns and this attribute is the
96989
98183
  * whole answer: a table given one lays its grid out in the first paint, and a
96990
- * table sized only by its columns is one track wide until it upgrades.
98184
+ * table sized only by its columns takes, until it upgrades, a track for each
98185
+ * column at the width a column with no `width` takes (`helix.css`).
96991
98186
  *
96992
- * **Data Table has none of this, and should not.** Its columns are its schema
96993
- * rather than an option, so there is always a column to write a `width` on
96994
- * and a list here would be a second way to say what that says. This table's
96995
- * cells are markup, and a table written as rows of cells with no column
96996
- * declared in it has nowhere else to be sized from.
98187
+ * Data Table takes the same list, for the same reason: a data table that
98188
+ * serves its first page as rows is laid out by it before it upgrades.
96997
98189
  * - `default-expanded`/`defaultExpanded`: The keys of the rows whose rows are shown at the start, separated by
96998
98190
  * commas. Used until `expanded` is set.
96999
98191
  * - `default-selected`/`defaultSelected`: The keys selected at the start, separated by commas. Used until `selected`
@@ -103388,6 +104580,16 @@ export type CustomCssProperties = {
103388
104580
  "--input-radius"?: (string) | undefined;
103389
104581
  /** Height of the field. */
103390
104582
  "--input-size"?: (string) | undefined;
104583
+ /** The largest a cell grows, along its edge. The strip is never wider than its box, and draws smaller cells to fit. */
104584
+ "--isometric-heatmap-cell-size"?: (string) | undefined;
104585
+ /** How much darker the left face is than the top, as a percentage mixed toward black. */
104586
+ "--isometric-heatmap-left-shade"?: (string) | undefined;
104587
+ /** How much darker the right face is than the top, as a percentage mixed toward black. */
104588
+ "--isometric-heatmap-right-shade"?: (string) | undefined;
104589
+ /** The color of the dashed edges of a selected prism, under `selection-mode`. By default, white on a dark face and black on a light one. */
104590
+ "--isometric-heatmap-selected-color"?: (string) | undefined;
104591
+ /** 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. */
104592
+ "--isometric-heatmap-span"?: (string) | undefined;
103391
104593
  /** The fill of the key. */
103392
104594
  "--kbd-background-color"?: (string) | undefined;
103393
104595
  /** The height of a key, and the least width of one, in `em` of the text around it. */