@handamade/psi-react 0.14.0 → 0.15.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.
Files changed (63) hide show
  1. package/dist/AspectRatio/AspectRatio.d.ts +3 -1
  2. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  3. package/dist/Button/Button.d.ts +3 -1
  4. package/dist/Button/Button.d.ts.map +1 -1
  5. package/dist/Card/Card.d.ts +2 -0
  6. package/dist/Card/Card.d.ts.map +1 -1
  7. package/dist/DescriptionList/DescriptionItem.d.ts +2 -0
  8. package/dist/DescriptionList/DescriptionItem.d.ts.map +1 -1
  9. package/dist/DescriptionList/DescriptionList.d.ts +3 -1
  10. package/dist/DescriptionList/DescriptionList.d.ts.map +1 -1
  11. package/dist/Dialog/Dialog.d.ts +2 -0
  12. package/dist/Dialog/Dialog.d.ts.map +1 -1
  13. package/dist/Field/Field.d.ts +2 -0
  14. package/dist/Field/Field.d.ts.map +1 -1
  15. package/dist/IconButton/IconButton.d.ts +3 -1
  16. package/dist/IconButton/IconButton.d.ts.map +1 -1
  17. package/dist/Menu/Menu.d.ts +1 -0
  18. package/dist/Menu/Menu.d.ts.map +1 -1
  19. package/dist/Menu/MenuItem.d.ts +1 -0
  20. package/dist/Menu/MenuItem.d.ts.map +1 -1
  21. package/dist/Panel/Panel.d.ts +3 -1
  22. package/dist/Panel/Panel.d.ts.map +1 -1
  23. package/dist/Select/Select.d.ts +3 -1
  24. package/dist/Select/Select.d.ts.map +1 -1
  25. package/dist/Table/Table.d.ts +1 -0
  26. package/dist/Table/Table.d.ts.map +1 -1
  27. package/dist/Table/TableBody.d.ts +1 -0
  28. package/dist/Table/TableBody.d.ts.map +1 -1
  29. package/dist/Table/TableCell.d.ts +1 -0
  30. package/dist/Table/TableCell.d.ts.map +1 -1
  31. package/dist/Table/TableHead.d.ts +1 -0
  32. package/dist/Table/TableHead.d.ts.map +1 -1
  33. package/dist/Table/TableHeaderCell.d.ts +1 -0
  34. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  35. package/dist/Table/TableRow.d.ts +1 -0
  36. package/dist/Table/TableRow.d.ts.map +1 -1
  37. package/dist/Toolbar/Toolbar.d.ts +3 -1
  38. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +122 -114
  42. package/dist/manifest.json +161 -0
  43. package/dist/patterns.json +8 -2
  44. package/docs/AspectRatio.md +1 -0
  45. package/docs/Button.md +1 -0
  46. package/docs/Card.md +1 -0
  47. package/docs/DescriptionItem.md +1 -0
  48. package/docs/DescriptionList.md +1 -0
  49. package/docs/Dialog.md +1 -0
  50. package/docs/Field.md +1 -0
  51. package/docs/IconButton.md +1 -0
  52. package/docs/Menu.md +1 -0
  53. package/docs/MenuItem.md +1 -0
  54. package/docs/Panel.md +1 -0
  55. package/docs/Select.md +1 -0
  56. package/docs/Table.md +1 -0
  57. package/docs/TableBody.md +1 -0
  58. package/docs/TableCell.md +1 -0
  59. package/docs/TableHead.md +1 -0
  60. package/docs/TableHeaderCell.md +1 -0
  61. package/docs/TableRow.md +1 -0
  62. package/docs/Toolbar.md +1 -0
  63. package/package.json +2 -2
@@ -5,6 +5,13 @@
5
5
  "description": "Action trigger. With `href` renders an anchor with identical styling (D33); `disabled` then maps to `aria-disabled`.",
6
6
  "slots": [],
7
7
  "props": [
8
+ {
9
+ "name": "children",
10
+ "type": "ReactNode",
11
+ "required": false,
12
+ "default": null,
13
+ "description": "Label content."
14
+ },
8
15
  {
9
16
  "name": "variant",
10
17
  "type": "\"accent\" | \"accent-subtle\" | \"neutral\" | \"neutral-subtle\" | \"ghost\" | \"danger\" | \"danger-subtle\" | \"outline\"",
@@ -61,6 +68,13 @@
61
68
  "description": "Square icon-only button; same variant/size/href contract as Button. Give it an accessible name (`aria-label`).",
62
69
  "slots": [],
63
70
  "props": [
71
+ {
72
+ "name": "children",
73
+ "type": "ReactNode",
74
+ "required": false,
75
+ "default": null,
76
+ "description": "The icon element — an Icon* component."
77
+ },
64
78
  {
65
79
  "name": "aria-label",
66
80
  "type": "string",
@@ -124,6 +138,13 @@
124
138
  "description": "Content container with an optional edge-to-edge media slot; `stacked` (media above body) or `featured` (media beside body) layout.",
125
139
  "slots": [],
126
140
  "props": [
141
+ {
142
+ "name": "children",
143
+ "type": "ReactNode",
144
+ "required": false,
145
+ "default": null,
146
+ "description": "Body content, beside or below the media slot."
147
+ },
127
148
  {
128
149
  "name": "variant",
129
150
  "type": "\"stacked\" | \"featured\"",
@@ -173,6 +194,13 @@
173
194
  }
174
195
  ],
175
196
  "props": [
197
+ {
198
+ "name": "children",
199
+ "type": "ReactNode",
200
+ "required": false,
201
+ "default": null,
202
+ "description": "Panel contents."
203
+ },
176
204
  {
177
205
  "name": "padding",
178
206
  "type": "16 | 24",
@@ -212,6 +240,13 @@
212
240
  }
213
241
  ],
214
242
  "props": [
243
+ {
244
+ "name": "children",
245
+ "type": "ReactNode",
246
+ "required": false,
247
+ "default": null,
248
+ "description": "One DescriptionItem per field."
249
+ },
215
250
  {
216
251
  "name": "layout",
217
252
  "type": "\"stacked\" | \"inline\"",
@@ -247,6 +282,13 @@
247
282
  "description": "One term/value pair. The term is a prop and the value is children, matching Field's `label` idiom rather than inventing a two-slot shape. Renders `<div><dt/><dd/></div>`. The wrapper is the HTML5-sanctioned grouping element for a `<dl>`, so the `<dt>`/`<dd>` association assistive tech relies on is intact — and it keeps both layouts to one CSS rule each instead of fighting a single grid to space pairs differently from the term/value inside a pair.",
248
283
  "slots": [],
249
284
  "props": [
285
+ {
286
+ "name": "children",
287
+ "type": "ReactNode",
288
+ "required": false,
289
+ "default": null,
290
+ "description": "The value — renders the <dd>."
291
+ },
250
292
  {
251
293
  "name": "term",
252
294
  "type": "ReactNode",
@@ -324,6 +366,13 @@
324
366
  "description": "Styled native `<select>` with pixel-true heights (24–48) and an error state. Inside a Field, id/aria-describedby/aria-invalid/required are wired automatically (D49).",
325
367
  "slots": [],
326
368
  "props": [
369
+ {
370
+ "name": "children",
371
+ "type": "ReactNode",
372
+ "required": false,
373
+ "default": null,
374
+ "description": "The <option> elements."
375
+ },
327
376
  {
328
377
  "name": "size",
329
378
  "type": "24 | 32 | 40 | 48",
@@ -378,6 +427,13 @@
378
427
  }
379
428
  ],
380
429
  "props": [
430
+ {
431
+ "name": "children",
432
+ "type": "ReactNode",
433
+ "required": false,
434
+ "default": null,
435
+ "description": "The control this field labels."
436
+ },
381
437
  {
382
438
  "name": "label",
383
439
  "type": "ReactNode",
@@ -471,6 +527,13 @@
471
527
  }
472
528
  ],
473
529
  "props": [
530
+ {
531
+ "name": "children",
532
+ "type": "ReactNode",
533
+ "required": false,
534
+ "default": null,
535
+ "description": "Body content, between the title and footer slots."
536
+ },
474
537
  {
475
538
  "name": "open",
476
539
  "type": "boolean",
@@ -660,6 +723,13 @@
660
723
  }
661
724
  ],
662
725
  "props": [
726
+ {
727
+ "name": "children",
728
+ "type": "ReactNode",
729
+ "required": false,
730
+ "default": null,
731
+ "description": "The controls."
732
+ },
663
733
  {
664
734
  "name": "gap",
665
735
  "type": "8 | 12 | 16",
@@ -758,6 +828,13 @@
758
828
  "description": "Fixed-aspect-ratio box that sizes its child media.",
759
829
  "slots": [],
760
830
  "props": [
831
+ {
832
+ "name": "children",
833
+ "type": "ReactNode",
834
+ "required": false,
835
+ "default": null,
836
+ "description": "Content constrained to the ratio."
837
+ },
761
838
  {
762
839
  "name": "ratio",
763
840
  "type": "number",
@@ -843,6 +920,13 @@
843
920
  "default": null,
844
921
  "description": "Accessible name for the menu when there is no visible label."
845
922
  },
923
+ {
924
+ "name": "children",
925
+ "type": "ReactNode",
926
+ "required": true,
927
+ "default": null,
928
+ "description": "MenuItem and MenuSeparator children."
929
+ },
846
930
  {
847
931
  "name": "className",
848
932
  "type": "string",
@@ -864,6 +948,13 @@
864
948
  "description": "One action in a Menu. Renders a real <button> so activation, Enter and Space come from the platform; the roving tabindex is applied by Menu's keyboard hook, which finds items via [data-psi-menu-item] (D53).",
865
949
  "slots": [],
866
950
  "props": [
951
+ {
952
+ "name": "children",
953
+ "type": "ReactNode",
954
+ "required": true,
955
+ "default": null,
956
+ "description": "Item label."
957
+ },
867
958
  {
868
959
  "name": "onSelect",
869
960
  "type": "() => void",
@@ -966,6 +1057,13 @@
966
1057
  "default": null,
967
1058
  "description": "Called with the next selection. See `onSortChange` on why it is optional."
968
1059
  },
1060
+ {
1061
+ "name": "children",
1062
+ "type": "ReactNode",
1063
+ "required": true,
1064
+ "default": null,
1065
+ "description": "TableHead and TableBody."
1066
+ },
969
1067
  {
970
1068
  "name": "className",
971
1069
  "type": "string",
@@ -987,6 +1085,13 @@
987
1085
  "description": "`<thead>`. When the table is selectable, prepends the select-all cell to the FIRST header row so the header's column count matches the body's — the checkbox column is Table's, not the consumer's schema. Clones the row rather than rebuilding it, so the consumer's own props on that `TableRow` survive.",
988
1086
  "slots": [],
989
1087
  "props": [
1088
+ {
1089
+ "name": "children",
1090
+ "type": "ReactNode",
1091
+ "required": true,
1092
+ "default": null,
1093
+ "description": "The header TableRow."
1094
+ },
990
1095
  {
991
1096
  "name": "className",
992
1097
  "type": "string",
@@ -1001,6 +1106,13 @@
1001
1106
  "description": "`<tbody>` wrapper.",
1002
1107
  "slots": [],
1003
1108
  "props": [
1109
+ {
1110
+ "name": "children",
1111
+ "type": "ReactNode",
1112
+ "required": true,
1113
+ "default": null,
1114
+ "description": "The body TableRows."
1115
+ },
1004
1116
  {
1005
1117
  "name": "className",
1006
1118
  "type": "string",
@@ -1029,6 +1141,13 @@
1029
1141
  "default": null,
1030
1142
  "description": "Accessible name for this row's selection checkbox."
1031
1143
  },
1144
+ {
1145
+ "name": "children",
1146
+ "type": "ReactNode",
1147
+ "required": true,
1148
+ "default": null,
1149
+ "description": "The row's cells."
1150
+ },
1032
1151
  {
1033
1152
  "name": "className",
1034
1153
  "type": "string",
@@ -1057,6 +1176,13 @@
1057
1176
  "default": null,
1058
1177
  "description": "Right-aligns and renders tabular figures (D62)."
1059
1178
  },
1179
+ {
1180
+ "name": "children",
1181
+ "type": "ReactNode",
1182
+ "required": false,
1183
+ "default": null,
1184
+ "description": "Header label."
1185
+ },
1060
1186
  {
1061
1187
  "name": "className",
1062
1188
  "type": "string",
@@ -1078,6 +1204,13 @@
1078
1204
  "default": null,
1079
1205
  "description": "Right-aligns and renders tabular figures (D62)."
1080
1206
  },
1207
+ {
1208
+ "name": "children",
1209
+ "type": "ReactNode",
1210
+ "required": false,
1211
+ "default": null,
1212
+ "description": "Cell content."
1213
+ },
1081
1214
  {
1082
1215
  "name": "className",
1083
1216
  "type": "string",
@@ -1462,5 +1595,33 @@
1462
1595
  }
1463
1596
  ]
1464
1597
  }
1598
+ ],
1599
+ "icons": [
1600
+ "IconAlertCircle",
1601
+ "IconAlertTriangle",
1602
+ "IconArrowDown",
1603
+ "IconArrowUpRight",
1604
+ "IconCheck",
1605
+ "IconChevronDown",
1606
+ "IconChevronRight",
1607
+ "IconClose",
1608
+ "IconCopy",
1609
+ "IconEdit",
1610
+ "IconExternalLink",
1611
+ "IconEye",
1612
+ "IconEyeOff",
1613
+ "IconGitHub",
1614
+ "IconInfo",
1615
+ "IconInstagram",
1616
+ "IconLinkedIn",
1617
+ "IconLoader",
1618
+ "IconMinus",
1619
+ "IconMoreHorizontal",
1620
+ "IconPlus",
1621
+ "IconSearch",
1622
+ "IconSettings",
1623
+ "IconTrash",
1624
+ "IconUser",
1625
+ "IconX"
1465
1626
  ]
1466
1627
  }
@@ -477,11 +477,15 @@
477
477
  "component": "Input",
478
478
  "props": {
479
479
  "type": "search",
480
+ "aria-label": "{content:search-label}",
480
481
  "placeholder": "{content:search-placeholder}"
481
482
  }
482
483
  },
483
484
  {
484
- "component": "Select"
485
+ "component": "Select",
486
+ "props": {
487
+ "aria-label": "{content:select-label}"
488
+ }
485
489
  },
486
490
  {
487
491
  "component": "Tag",
@@ -492,12 +496,14 @@
492
496
  },
493
497
  "parameters": [],
494
498
  "content": {
499
+ "search-label": "Search transactions",
495
500
  "search-placeholder": "Search transactions",
501
+ "select-label": "Category",
496
502
  "example-filter": "[active filter]"
497
503
  },
498
504
  "gaps": [],
499
505
  "blocked": false,
500
- "preset": "<Toolbar>\n <Input placeholder=\"Search transactions\" type=\"search\" />\n <Select />\n <Tag>[active filter]</Tag>\n</Toolbar>\n"
506
+ "preset": "<Toolbar>\n <Input aria-label=\"Search transactions\" placeholder=\"Search transactions\" type=\"search\" />\n <Select aria-label=\"Category\" />\n <Tag>[active filter]</Tag>\n</Toolbar>\n"
501
507
  },
502
508
  {
503
509
  "id": "row-actions",
@@ -7,6 +7,7 @@ Fixed-aspect-ratio box that sizes its child media.
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | Content constrained to the ratio. |
10
11
  | `ratio` | `number` | — | yes | Width/height ratio, e.g. 16/10 or 4/5. |
11
12
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the frame element. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
package/docs/Button.md CHANGED
@@ -7,6 +7,7 @@ Action trigger. With `href` renders an anchor with identical styling (D33); `dis
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | Label content. |
10
11
  | `variant` | `"accent" \| "accent-subtle" \| "neutral" \| "neutral-subtle" \| "ghost" \| "danger" \| "danger-subtle" \| "outline"` | neutral | no | Visual variant. |
11
12
  | `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Height in px (24 \| 32 \| 40 \| 48). |
12
13
  | `href` | `string` | — | no | Render as an anchor with this href (D33). disabled → aria-disabled, no href attribute, pointer-events: none. |
package/docs/Card.md CHANGED
@@ -7,6 +7,7 @@ Content container with an optional edge-to-edge media slot; `stacked` (media abo
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | Body content, beside or below the media slot. |
10
11
  | `variant` | `"stacked" \| "featured"` | stacked | no | stacked = media above body; featured = media beside body (~1.6fr/1fr), stacks under md. |
11
12
  | `media` | `ReactNode` | — | no | Media slot rendered edge-to-edge (img, AspectRatio, …). |
12
13
  | `hoverLift` | `boolean` | false | no | Lift on hover: translateY(-6px) over --psi-duration-350. |
@@ -7,6 +7,7 @@ One term/value pair. The term is a prop and the value is children, matching Fiel
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | The value — renders the <dd>. |
10
11
  | `term` | `ReactNode` | — | yes | The term — renders the `<dt>`. |
11
12
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the group wrapper. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
@@ -7,6 +7,7 @@ Key/value display (D70): a `<dl>` of term/value pairs, the body `detail-drawer`
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | One DescriptionItem per field. |
10
11
  | `layout` | `"stacked" \| "inline"` | stacked | no | `stacked` puts the term above its value; `inline` puts them in a two-column grid, which is what a detail drawer wants. |
11
12
  | `gap` | `8 \| 12 \| 16` | 12 | no | Gap between pairs, in px. |
12
13
  | `ref` | `Ref<HTMLDListElement>` | — | no | Forwarded ref to the root element. |
package/docs/Dialog.md CHANGED
@@ -7,6 +7,7 @@ Modal dialog on the native <dialog> top layer: focus trap, aria-modal and focus
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | Body content, between the title and footer slots. |
10
11
  | `open` | `boolean` | — | yes | Controlled open state; syncs to showModal()/close(). |
11
12
  | `onClose` | `(reason: "esc" \| "backdrop" \| "close-button") => void` | — | yes | Called on every dismissal attempt with its source; the consumer flips `open`. |
12
13
  | `title` | `ReactNode` | — | no | Heading; renders an <h2> wired to aria-labelledby. Without it, pass aria-label. |
package/docs/Field.md CHANGED
@@ -7,6 +7,7 @@ Labeled form-row wrapper: label above, control, one message line below — descr
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | The control this field labels. |
10
11
  | `label` | `ReactNode` | — | no | Label content; renders a <label> (or <legend> in group mode). |
11
12
  | `description` | `ReactNode` | — | no | Helper line under the control; replaced by error when error is set. |
12
13
  | `error` | `ReactNode` | — | no | Error content; when truthy it replaces the description and switches the field (and a wrapped Input/Select) into error state. |
@@ -7,6 +7,7 @@ Square icon-only button; same variant/size/href contract as Button. Give it an a
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | The icon element — an Icon* component. |
10
11
  | `aria-label` | `string` | — | yes | Accessible name for the icon-only control. Required: an IconButton has no text to name it, so omitting this ships an unnameable button (D60). If you also pass `aria-labelledby`, that wins per the accname algorithm. |
11
12
  | `variant` | `"accent" \| "neutral" \| "ghost" \| "danger"` | neutral | no | Visual variant. |
12
13
  | `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Square size in px (24 \| 32 \| 40 \| 48). |
package/docs/Menu.md CHANGED
@@ -12,6 +12,7 @@ Action menu on the native Popover API top layer: the top layer and light dismiss
12
12
  | `trigger` | `ReactElement<Record<string, unknown>, string \| JSXElementConstructor<any>>` | — | yes | The trigger element. Must be a single React element that spreads unknown props onto a focusable node (a Psi `Button`, say): Menu clones it to add `aria-haspopup="menu"` and `aria-expanded`, so assistive tech associates the menu with the control users actually focus. |
13
13
  | `placement` | `"bottom-start" \| "bottom-end" \| "top-start" \| "top-end"` | bottom-start | no | Placement relative to the trigger. |
14
14
  | `aria-label` | `string` | — | no | Accessible name for the menu when there is no visible label. |
15
+ | `children` | `ReactNode` | — | yes | MenuItem and MenuSeparator children. |
15
16
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
16
17
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the popover element. |
17
18
 
package/docs/MenuItem.md CHANGED
@@ -7,6 +7,7 @@ One action in a Menu. Renders a real <button> so activation, Enter and Space com
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | yes | Item label. |
10
11
  | `onSelect` | `() => void` | — | yes | Fires on activation; Menu then reports the dismissal via onClose("item-select") (D50). |
11
12
  | `variant` | `"neutral" \| "danger"` | neutral | no | danger is for destructive actions only (house rule). |
12
13
  | `disabled` | `boolean` | false | no | |
package/docs/Panel.md CHANGED
@@ -7,6 +7,7 @@ Elevated surface panel (D51): secondary background, faint hairline, radius-12
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | Panel contents. |
10
11
  | `padding` | `16 \| 24` | 24 | no | Inner padding in px. |
11
12
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the root element. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
package/docs/Select.md CHANGED
@@ -7,6 +7,7 @@ Styled native `<select>` with pixel-true heights (24–48) and an error state. I
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | The <option> elements. |
10
11
  | `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Height in px (24 \| 32 \| 40 \| 48). Replaces the native `size` attribute (which sets the visible option-row count on a listbox-style `<select>`) with the design system's control height in pixels. |
11
12
  | `error` | `boolean` | false | no | Show error styling. Inside a Field, the Field's error also lights this. |
12
13
  | `ref` | `Ref<HTMLSelectElement>` | — | no | Forwarded ref to the underlying `<select>` element. |
package/docs/Table.md CHANGED
@@ -15,6 +15,7 @@ Data table on native table semantics. Holds no state: sorting, selection and pag
15
15
  | `selectable` | `boolean` | false | no | Renders the row-selection checkbox column. |
16
16
  | `selected` | `ReadonlySet<string>` | new Set<string>() | no | Controlled selection, keyed by each `TableRow`'s `rowId`. |
17
17
  | `onSelectionChange` | `((selected: ReadonlySet<string>) => void)` | — | no | Called with the next selection. See `onSortChange` on why it is optional. |
18
+ | `children` | `ReactNode` | — | yes | TableHead and TableBody. |
18
19
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
19
20
  | `ref` | `Ref<HTMLTableElement>` | — | no | Forwarded ref to the underlying `<table>` element. |
20
21
 
package/docs/TableBody.md CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | yes | The body TableRows. |
10
11
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
11
12
 
12
13
  ## Theming
package/docs/TableCell.md CHANGED
@@ -8,6 +8,7 @@
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
10
  | `numeric` | `boolean` | — | no | Right-aligns and renders tabular figures (D62). |
11
+ | `children` | `ReactNode` | — | no | Cell content. |
11
12
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
12
13
 
13
14
  ## Theming
package/docs/TableHead.md CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | yes | The header TableRow. |
10
11
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
11
12
 
12
13
  ## Theming
@@ -9,6 +9,7 @@
9
9
  |---|---|---|---|---|
10
10
  | `sortKey` | `string` | — | no | Sort key this column emits. Enables the sort control when the table is `sortable`. |
11
11
  | `numeric` | `boolean` | — | no | Right-aligns and renders tabular figures (D62). |
12
+ | `children` | `ReactNode` | — | no | Header label. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
13
14
 
14
15
  ## Theming
package/docs/TableRow.md CHANGED
@@ -9,6 +9,7 @@
9
9
  |---|---|---|---|---|
10
10
  | `rowId` | `string` | — | no | Stable identity for selection. Required for selectable tables (D62). |
11
11
  | `selectLabel` | `string` | — | no | Accessible name for this row's selection checkbox. |
12
+ | `children` | `ReactNode` | — | yes | The row's cells. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
13
14
 
14
15
  ## Theming
package/docs/Toolbar.md CHANGED
@@ -7,6 +7,7 @@ Horizontal grouping row for filter/search controls (D52). Wraps on overflow; zer
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | no | The controls. |
10
11
  | `gap` | `8 \| 12 \| 16` | 8 | no | Gap between controls in px. |
11
12
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the root element. |
12
13
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@handamade/psi-react",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,7 +46,7 @@
46
46
  "tsx": "^4.22.4",
47
47
  "vite": "^6.0.0",
48
48
  "vitest": "^3.2.6",
49
- "@handamade/psi-tokens": "0.14.0"
49
+ "@handamade/psi-tokens": "0.15.0"
50
50
  },
51
51
  "scripts": {
52
52
  "build": "vite build && tsc -p tsconfig.build.json && tsx scripts/emit-styles-dts.ts && tsx scripts/emit-manifest.ts && tsx scripts/emit-patterns.ts && tsx scripts/emit-docs.ts",