@fusion.dev/helix 0.108.1 → 0.109.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.
@@ -131288,7 +131288,7 @@
131288
131288
  "text": "string"
131289
131289
  },
131290
131290
  "default": "''",
131291
- "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
131291
+ "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**A `Table` fits the columns that set neither to what they hold.** Once\nany of them holds a sentence, the columns of short values keep\n`max-content` and the columns of sentences wrap, above a floor of `14ch`,\neach taking a share of the room in proportion to its text. A table of\nvalues alone keeps the default.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nA column of sentences does not pay for this: the table sees the sentences\nand lets that column wrap. A headless consumer owns the overflow either\nway, that being paint, and gets the honest track list.",
131292
131292
  "attribute": "width",
131293
131293
  "inheritedFrom": {
131294
131294
  "name": "HelixHeadlessTableColumn",
@@ -132069,7 +132069,7 @@
132069
132069
  "text": "string"
132070
132070
  },
132071
132071
  "default": "''",
132072
- "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nThe cost is that a column of prose asks for its longest paragraph on one\nline, so a column holding sentences rather than values wants\n`width=\"minmax(0, 1fr)\"` to opt back into wrapping. A headless consumer owns\nthe overflow either way, that being paint, and gets the honest track list.",
132072
+ "description": "The track this column takes, as CSS.\n\nA single track value, so anything valid in `grid-template-columns` works:\n`16rem`, `auto`, `minmax(0, 2fr)`. Left unset the column takes the track in\nits place in a `Table`'s `columns`, where that table sets one, and\notherwise shares what is left over equally, as `minmax(max-content, 1fr)`.\nSet here, it wins over that list, which is what lets a reader resize a\ncolumn in a table that set one.\n\n**A `Table` fits the columns that set neither to what they hold.** Once\nany of them holds a sentence, the columns of short values keep\n`max-content` and the columns of sentences wrap, above a floor of `14ch`,\neach taking a share of the room in proportion to its text. A table of\nvalues alone keeps the default.\n\n**The floor is `max-content`, never `0` and never `min-content`.** A zero\nfloor lets a track shrink under its own content: at 375 the columns squeeze\nto 75px and `eu-central-1` wraps across lines, which reads as corrupt data\nrather than as a table that ran out of room. A `min-content` floor still\nbreaks it, a hyphen being a wrap opportunity.\n\nThe overflow has somewhere to go: `@fusion.dev/helix` scrolls the table's\nown box, so a long value pushes past the container and the table scrolls\ninstead of the value being destroyed. Measured at 375: tracks of 192, 89 and\n102 against a 343 box, so the table scrolls 384 and the page does not move.\n\nA column of sentences does not pay for this: the table sees the sentences\nand lets that column wrap. A headless consumer owns the overflow either\nway, that being paint, and gets the honest track list.",
132073
132073
  "fieldName": "width",
132074
132074
  "inheritedFrom": {
132075
132075
  "name": "HelixHeadlessTableColumn",
@@ -132509,6 +132509,35 @@
132509
132509
  "module": "src/table/root/table-root.ts"
132510
132510
  }
132511
132511
  },
132512
+ {
132513
+ "kind": "method",
132514
+ "name": "fitted",
132515
+ "privacy": "private",
132516
+ "return": {
132517
+ "type": {
132518
+ "text": "string[]"
132519
+ }
132520
+ },
132521
+ "parameters": [
132522
+ {
132523
+ "name": "declared",
132524
+ "type": {
132525
+ "text": "HelixHeadlessTableColumn[]"
132526
+ }
132527
+ },
132528
+ {
132529
+ "name": "listed",
132530
+ "type": {
132531
+ "text": "string[]"
132532
+ }
132533
+ }
132534
+ ],
132535
+ "description": "Tracks for the columns that set nothing, from how much text each holds.\n\n**A column of sentences wraps and a column of values does not.** Every\ncolumn left at `minmax(max-content, 1fr)` asks for its longest cell on one\nline, which is right for `eu-central-1` and wrong for a description: the\ntable grows as wide as its longest sentence and scrolls, on a phone and on\na desktop alike. So once any column holds more than `SHORT` characters,\nthe short columns keep `max-content`, and each long one wraps above a\n`FLOOR`, taking a share of the room in proportion to its text.\n\nA table with no long column keeps the default, so a table of values lays\nout as it always has. A column's `width` and a track in `columns` are both\nstatements an author made, and each wins over this.\n\nCharacters stand in for width. They only have to rank columns against each\nother, and a count needs no layout, so it reads the same before paint as\nafter. Sampled, so a table of thousands of rows reads `SAMPLE` of them.",
132536
+ "inheritedFrom": {
132537
+ "name": "HelixHeadlessTable",
132538
+ "module": "src/table/root/table-root.ts"
132539
+ }
132540
+ },
132512
132541
  {
132513
132542
  "kind": "field",
132514
132543
  "name": "handleSlotChange",
@@ -132527,7 +132556,7 @@
132527
132556
  },
132528
132557
  "privacy": "private",
132529
132558
  "default": "undefined",
132530
- "description": "Watches the light DOM for rows and columns arriving, leaving and moving.\n\n**A manually assigned slot does not announce them**, the same gap `Chat`\nand `Carousel` watch for. Under `slotAssignment: 'manual'` only `assign`\nchanges an assignment, so a row appended after the first render reached no\nslot and drew nowhere, and a column moved to another place lost its\nassignment on the way out and never got it back: measured in Chromium, both\n`assignedSlot` null a render later. A table whose definition loaded before\nits markup was parsed drew no columns at all, having rendered before any\narrived.",
132559
+ "description": "Watches the light DOM for rows and columns arriving, leaving and moving.\n\n**A manually assigned slot does not announce them**, the same gap `Chat`\nand `Carousel` watch for. Under `slotAssignment: 'manual'` only `assign`\nchanges an assignment, so a row appended after the first render reached no\nslot and drew nowhere, and a column moved to another place lost its\nassignment on the way out and never got it back: measured in Chromium, both\n`assignedSlot` null a render later. A table whose definition loaded before\nits markup was parsed drew no columns at all, having rendered before any\narrived.\n\n**The cells' text too, all the way down.** The columns that set no width\nare sized from what their cells say, so a cell whose text changes can\nchange the track it sits in.",
132531
132560
  "inheritedFrom": {
132532
132561
  "name": "HelixHeadlessTable",
132533
132562
  "module": "src/table/root/table-root.ts"
package/dist/rehype.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  /**
2
- * **A rehype plugin that gives Markdown's two missing constructs their Helix
2
+ * **A rehype plugin that gives Markdown's fences, alerts and tables their Helix
3
3
  * elements, and parses nothing.** Your Markdown library turns `###` into
4
- * `<h3>`, and `data-prose` styles the HTML it writes. Two constructs carry
4
+ * `<h3>`, and `data-prose` styles the HTML it writes. Three constructs carry
5
5
  * what plain HTML cannot: a code fence, which a reader copies and which has a
6
- * language, and a GitHub alert, which says how much a passage matters. This
7
- * rewrites those two in the tree your parser already built, after your own
8
- * sanitizing, and leaves everything else as it is.
6
+ * language; a GitHub alert, which says how much a passage matters; and a
7
+ * table, whose values must stay whole on a narrow screen. This rewrites those
8
+ * three in the tree your parser already built, after your own sanitizing, and
9
+ * leaves everything else as it is.
9
10
  *
10
11
  * - A fence becomes `helix-code-block`, labeled with its language. What is
11
12
  * inside the code is kept, so a highlighter that ran before this has its
@@ -14,6 +15,13 @@
14
15
  * note is `info`, a tip `success`, a warning `warning`, and a caution
15
16
  * `danger`. An important passage has no tone, since none of the four says
16
17
  * it. Each keeps its kind as its heading, as GitHub shows it.
18
+ * - A table becomes `helix-table`: its header row becomes its columns, each
19
+ * aligned as the Markdown aligned it, and every other row a
20
+ * `helix-table-row` of `helix-table-cell`. The table sizes its columns from
21
+ * what they hold, so a column of values stays whole and a column of
22
+ * sentences wraps. A table the grid cannot draw as written, with a caption,
23
+ * a cell spanning more than one column or row, or a heading cell outside the
24
+ * one header row, stays a table.
17
25
  *
18
26
  * Any pipeline that reaches rehype takes it: `remark` with `remark-rehype`,
19
27
  * `react-markdown`, and MDX.
@@ -45,10 +53,13 @@ export interface RehypeHelixOptions {
45
53
  fences?: boolean | undefined;
46
54
  /** An alert's heading by its kind, for a page in another language. English by default. */
47
55
  headings?: Partial<Record<AlertKind, string>> | undefined;
56
+ /** Whether tables become Helix tables. `true` by default. */
57
+ tables?: boolean | undefined;
48
58
  }
49
59
  /**
50
60
  * The plugin: rewrites the tree in place, from the top down, so a fence
51
- * inside an alert becomes a code block inside a callout.
61
+ * inside an alert becomes a code block inside a callout, and a table inside
62
+ * one a Helix table.
52
63
  */
53
64
  export default function rehypeHelix(options?: RehypeHelixOptions): (tree: HastNode) => void;
54
65
  export { rehypeHelix };
package/dist/rehype.js CHANGED
@@ -77,6 +77,48 @@ const calloutOf = (node, headings) => {
77
77
  type: 'element',
78
78
  };
79
79
  };
80
+ const EDGES = {
81
+ center: 'center',
82
+ left: 'start',
83
+ right: 'end',
84
+ };
85
+ const spans = (cell) => Number(cell.properties?.colSpan ?? 1) > 1 || Number(cell.properties?.rowSpan ?? 1) > 1;
86
+ const helix = (tagName, children, properties = {}) => ({
87
+ children,
88
+ properties,
89
+ tagName,
90
+ type: 'element',
91
+ });
92
+ const tableOf = (node) => {
93
+ if (node.tagName !== 'table') {
94
+ return undefined;
95
+ }
96
+ const head = [];
97
+ const body = [];
98
+ for (const group of elements(node)) {
99
+ const rows = group.tagName === 'tr' ? [group] : elements(group);
100
+ if (!['tbody', 'tfoot', 'thead', 'tr'].includes(group.tagName ?? '') ||
101
+ rows.some((row) => row.tagName !== 'tr')) {
102
+ return undefined;
103
+ }
104
+ ;
105
+ (group.tagName === 'thead' ? head : body).push(...rows);
106
+ }
107
+ const [heading] = head;
108
+ const headings = heading ? elements(heading) : [];
109
+ const cells = body.map((row) => elements(row));
110
+ if (head.length !== 1 ||
111
+ headings.some((cell) => cell.tagName !== 'th' || spans(cell)) ||
112
+ cells.some((row) => row.some((cell) => cell.tagName !== 'td' || spans(cell)))) {
113
+ return undefined;
114
+ }
115
+ const columns = headings.map((cell) => {
116
+ const edge = EDGES[String(cell.properties?.align)];
117
+ return helix('helix-table-column', cell.children ?? [], edge ? { 'text-align': edge } : {});
118
+ });
119
+ const rows = cells.map((row) => helix('helix-table-row', row.map((cell) => helix('helix-table-cell', cell.children ?? []))));
120
+ return helix('helix-table', [...columns, ...rows]);
121
+ };
80
122
  export default function rehypeHelix(options = {}) {
81
123
  const headings = { ...HEADINGS, ...options.headings };
82
124
  const rewrite = (node) => {
@@ -86,7 +128,8 @@ export default function rehypeHelix(options = {}) {
86
128
  }
87
129
  children.forEach((child, index) => {
88
130
  const replaced = (options.fences !== false ? codeBlockOf(child) : undefined) ??
89
- (options.alerts !== false ? calloutOf(child, headings) : undefined);
131
+ (options.alerts !== false ? calloutOf(child, headings) : undefined) ??
132
+ (options.tables !== false ? tableOf(child) : undefined);
90
133
  if (replaced) {
91
134
  children[index] = replaced;
92
135
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.108.1",
4
+ "version": "0.109.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -51,18 +51,19 @@
51
51
  },
52
52
  "bugs": "https://github.com/project-fusion/fusion/issues",
53
53
  "dependencies": {
54
- "@fusion.dev/helix-core": "0.108.1",
55
- "@fusion.dev/helix-headless": "0.108.1",
56
- "@fusion.dev/helix-styles": "0.108.1"
54
+ "@fusion.dev/helix-core": "0.109.0",
55
+ "@fusion.dev/helix-headless": "0.109.0",
56
+ "@fusion.dev/helix-styles": "0.109.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@fusion.dev/helix-cem": "0.108.1",
60
- "@fusion.dev/helix-testing": "0.108.1",
59
+ "@fusion.dev/helix-cem": "0.109.0",
60
+ "@fusion.dev/helix-testing": "0.109.0",
61
61
  "@fusion.dev/scripts": "0.0.0-dev",
62
62
  "@happy-dom/global-registrator": "^20.0.0",
63
63
  "@lit-labs/ssr": "^4.1.0",
64
64
  "@types/bun": "^1.3.0",
65
65
  "lit": "^3.2.1",
66
+ "remark-gfm": "^4.0.1",
66
67
  "remark-parse": "^11.0.0",
67
68
  "remark-rehype": "^11.1.2",
68
69
  "unified": "^11.0.5"
package/types/jsx.d.ts CHANGED
@@ -21195,6 +21195,12 @@ otherwise shares what is left over equally, as `minmax(max-content, 1fr)`.
21195
21195
  Set here, it wins over that list, which is what lets a reader resize a
21196
21196
  column in a table that set one.
21197
21197
 
21198
+ **A `Table` fits the columns that set neither to what they hold.** Once
21199
+ any of them holds a sentence, the columns of short values keep
21200
+ `max-content` and the columns of sentences wrap, above a floor of `14ch`,
21201
+ each taking a share of the room in proportion to its text. A table of
21202
+ values alone keeps the default.
21203
+
21198
21204
  **The floor is `max-content`, never `0` and never `min-content`.** A zero
21199
21205
  floor lets a track shrink under its own content: at 375 the columns squeeze
21200
21206
  to 75px and `eu-central-1` wraps across lines, which reads as corrupt data
@@ -21206,10 +21212,9 @@ own box, so a long value pushes past the container and the table scrolls
21206
21212
  instead of the value being destroyed. Measured at 375: tracks of 192, 89 and
21207
21213
  102 against a 343 box, so the table scrolls 384 and the page does not move.
21208
21214
 
21209
- The cost is that a column of prose asks for its longest paragraph on one
21210
- line, so a column holding sentences rather than values wants
21211
- `width="minmax(0, 1fr)"` to opt back into wrapping. A headless consumer owns
21212
- the overflow either way, that being paint, and gets the honest track list. */
21215
+ A column of sentences does not pay for this: the table sees the sentences
21216
+ and lets that column wrap. A headless consumer owns the overflow either
21217
+ way, that being paint, and gets the honest track list. */
21213
21218
  width?: (HelixTableColumn["width"]) | undefined;
21214
21219
  /** The text screen readers announce for the column's width. `{width}` is
21215
21220
  replaced with the width. */
@@ -21359,6 +21364,12 @@ otherwise shares what is left over equally, as `minmax(max-content, 1fr)`.
21359
21364
  Set here, it wins over that list, which is what lets a reader resize a
21360
21365
  column in a table that set one.
21361
21366
 
21367
+ **A `Table` fits the columns that set neither to what they hold.** Once
21368
+ any of them holds a sentence, the columns of short values keep
21369
+ `max-content` and the columns of sentences wrap, above a floor of `14ch`,
21370
+ each taking a share of the room in proportion to its text. A table of
21371
+ values alone keeps the default.
21372
+
21362
21373
  **The floor is `max-content`, never `0` and never `min-content`.** A zero
21363
21374
  floor lets a track shrink under its own content: at 375 the columns squeeze
21364
21375
  to 75px and `eu-central-1` wraps across lines, which reads as corrupt data
@@ -21370,10 +21381,9 @@ own box, so a long value pushes past the container and the table scrolls
21370
21381
  instead of the value being destroyed. Measured at 375: tracks of 192, 89 and
21371
21382
  102 against a 343 box, so the table scrolls 384 and the page does not move.
21372
21383
 
21373
- The cost is that a column of prose asks for its longest paragraph on one
21374
- line, so a column holding sentences rather than values wants
21375
- `width="minmax(0, 1fr)"` to opt back into wrapping. A headless consumer owns
21376
- the overflow either way, that being paint, and gets the honest track list. */
21384
+ A column of sentences does not pay for this: the table sees the sentences
21385
+ and lets that column wrap. A headless consumer owns the overflow either
21386
+ way, that being paint, and gets the honest track list. */
21377
21387
  "prop:width"?: (HelixTableColumn["width"]) | undefined;
21378
21388
  /** The text screen readers announce for the column's width. `{width}` is
21379
21389
  replaced with the width. */
@@ -43659,6 +43669,12 @@ export type CustomElements = {
43659
43669
  * Set here, it wins over that list, which is what lets a reader resize a
43660
43670
  * column in a table that set one.
43661
43671
  *
43672
+ * **A `Table` fits the columns that set neither to what they hold.** Once
43673
+ * any of them holds a sentence, the columns of short values keep
43674
+ * `max-content` and the columns of sentences wrap, above a floor of `14ch`,
43675
+ * each taking a share of the room in proportion to its text. A table of
43676
+ * values alone keeps the default.
43677
+ *
43662
43678
  * **The floor is `max-content`, never `0` and never `min-content`.** A zero
43663
43679
  * floor lets a track shrink under its own content: at 375 the columns squeeze
43664
43680
  * to 75px and `eu-central-1` wraps across lines, which reads as corrupt data
@@ -43670,10 +43686,9 @@ export type CustomElements = {
43670
43686
  * instead of the value being destroyed. Measured at 375: tracks of 192, 89 and
43671
43687
  * 102 against a 343 box, so the table scrolls 384 and the page does not move.
43672
43688
  *
43673
- * The cost is that a column of prose asks for its longest paragraph on one
43674
- * line, so a column holding sentences rather than values wants
43675
- * `width="minmax(0, 1fr)"` to opt back into wrapping. A headless consumer owns
43676
- * the overflow either way, that being paint, and gets the honest track list.
43689
+ * A column of sentences does not pay for this: the table sees the sentences
43690
+ * and lets that column wrap. A headless consumer owns the overflow either
43691
+ * way, that being paint, and gets the honest track list.
43677
43692
  * - `width-label`/`widthLabel`: The text screen readers announce for the column's width. `{width}` is
43678
43693
  * replaced with the width.
43679
43694
  * - `cell`: A function that reads the cell's content from a row, for cells that `field`
@@ -65698,6 +65713,12 @@ export type CustomElementsSolidJs = {
65698
65713
  * Set here, it wins over that list, which is what lets a reader resize a
65699
65714
  * column in a table that set one.
65700
65715
  *
65716
+ * **A `Table` fits the columns that set neither to what they hold.** Once
65717
+ * any of them holds a sentence, the columns of short values keep
65718
+ * `max-content` and the columns of sentences wrap, above a floor of `14ch`,
65719
+ * each taking a share of the room in proportion to its text. A table of
65720
+ * values alone keeps the default.
65721
+ *
65701
65722
  * **The floor is `max-content`, never `0` and never `min-content`.** A zero
65702
65723
  * floor lets a track shrink under its own content: at 375 the columns squeeze
65703
65724
  * to 75px and `eu-central-1` wraps across lines, which reads as corrupt data
@@ -65709,10 +65730,9 @@ export type CustomElementsSolidJs = {
65709
65730
  * instead of the value being destroyed. Measured at 375: tracks of 192, 89 and
65710
65731
  * 102 against a 343 box, so the table scrolls 384 and the page does not move.
65711
65732
  *
65712
- * The cost is that a column of prose asks for its longest paragraph on one
65713
- * line, so a column holding sentences rather than values wants
65714
- * `width="minmax(0, 1fr)"` to opt back into wrapping. A headless consumer owns
65715
- * the overflow either way, that being paint, and gets the honest track list.
65733
+ * A column of sentences does not pay for this: the table sees the sentences
65734
+ * and lets that column wrap. A headless consumer owns the overflow either
65735
+ * way, that being paint, and gets the honest track list.
65716
65736
  * - `width-label`/`widthLabel`: The text screen readers announce for the column's width. `{width}` is
65717
65737
  * replaced with the width.
65718
65738
  * - `cell`: A function that reads the cell's content from a row, for cells that `field`
package/types/vue.d.ts CHANGED
@@ -10929,6 +10929,12 @@ otherwise shares what is left over equally, as `minmax(max-content, 1fr)`.
10929
10929
  Set here, it wins over that list, which is what lets a reader resize a
10930
10930
  column in a table that set one.
10931
10931
 
10932
+ **A `Table` fits the columns that set neither to what they hold.** Once
10933
+ any of them holds a sentence, the columns of short values keep
10934
+ `max-content` and the columns of sentences wrap, above a floor of `14ch`,
10935
+ each taking a share of the room in proportion to its text. A table of
10936
+ values alone keeps the default.
10937
+
10932
10938
  **The floor is `max-content`, never `0` and never `min-content`.** A zero
10933
10939
  floor lets a track shrink under its own content: at 375 the columns squeeze
10934
10940
  to 75px and `eu-central-1` wraps across lines, which reads as corrupt data
@@ -10940,10 +10946,9 @@ own box, so a long value pushes past the container and the table scrolls
10940
10946
  instead of the value being destroyed. Measured at 375: tracks of 192, 89 and
10941
10947
  102 against a 343 box, so the table scrolls 384 and the page does not move.
10942
10948
 
10943
- The cost is that a column of prose asks for its longest paragraph on one
10944
- line, so a column holding sentences rather than values wants
10945
- `width="minmax(0, 1fr)"` to opt back into wrapping. A headless consumer owns
10946
- the overflow either way, that being paint, and gets the honest track list. */
10949
+ A column of sentences does not pay for this: the table sees the sentences
10950
+ and lets that column wrap. A headless consumer owns the overflow either
10951
+ way, that being paint, and gets the honest track list. */
10947
10952
  width?: (HelixTableColumn["width"]) | undefined;
10948
10953
  /** The text screen readers announce for the column's width. `{width}` is
10949
10954
  replaced with the width. */