@smwb/ui-mcp-react 2.8.0 → 2.10.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 (25) hide show
  1. package/component-meta/dataDisplay/badge/badge.json +2 -2
  2. package/component-meta/dataDisplay/chat/chat.chatFooterComposer.json +24 -0
  3. package/component-meta/dataDisplay/chat/chat.json +24 -3
  4. package/component-meta/dataDisplay/chat/chatComposer.json +1 -1
  5. package/component-meta/dataDisplay/chat/chatLayout.json +2 -1
  6. package/component-meta/dataDisplay/chat/chatOverlayLayout.json +2 -1
  7. package/component-meta/dataDisplay/dagView/dagView.json +165 -0
  8. package/component-meta/dataDisplay/diffStat/diffStat.json +65 -0
  9. package/component-meta/dataDisplay/kbd/kbd.json +55 -0
  10. package/component-meta/dataDisplay/list/listItem.json +18 -3
  11. package/component-meta/dataDisplay/qrCode/qrCode.json +60 -0
  12. package/component-meta/dataDisplay/statusDot/statusDot.json +60 -0
  13. package/component-meta/dataDisplay/swimlanes/swimlanes.json +90 -0
  14. package/component-meta/dataDisplay/treeView/treeView.json +16 -1
  15. package/component-meta/inputs/button/button.json +10 -0
  16. package/component-meta/inputs/composer/composer.json +222 -0
  17. package/component-meta/layout/sheet/sheet.json +20 -0
  18. package/component-meta/layout/tabGroups/tabGroups.json +101 -0
  19. package/component-meta/navigation/appBar/appBar.json +15 -0
  20. package/component-meta/navigation/commandPalette/commandPalette.json +161 -0
  21. package/component-meta/navigation/sidebar/sidebar.json +5 -0
  22. package/component-meta/navigation/tabs/tab/tab.json +30 -4
  23. package/component-meta/navigation/tabs/tabPanel/tabPanel.json +42 -0
  24. package/component-meta/navigation/tabs/tabs.json +39 -6
  25. package/package.json +3 -3
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "Swimlanes",
3
+ "description": "Participant lanes: a virtualised grid (role=grid) with one row per lane, a fixed rowheader column (avatar, name, role) and a content cell that scrolls sideways; fixed rowHeight, single selection (selectedId/defaultSelectedId/onSelectedChange), arrow/Home/End/Page keys with one Tab stop.",
4
+ "ssr": {
5
+ "safe": true,
6
+ "rendering": "universal"
7
+ },
8
+ "extends": [
9
+ "Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\" | \"role\" | \"children\">"
10
+ ],
11
+ "inheritedAttributes": "Also accepts standard HTML attributes for the underlying element (see extends clause in TypeScript).",
12
+ "styles": {
13
+ "base": [
14
+ "@smwb/ui-styles/less/foundation.less",
15
+ "@smwb/ui-styles/less/theme.less"
16
+ ],
17
+ "entries": [
18
+ "@smwb/ui-styles/less/components/swimlanes/swimlanes.entry.less"
19
+ ],
20
+ "dependencies": [],
21
+ "importExample": "@import (less) \"node_modules/@smwb/ui-styles/less/foundation.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/theme.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/swimlanes/swimlanes.entry.less\";"
22
+ },
23
+ "props": {
24
+ "lanes": {
25
+ "type": "readonly SwimlanesLane[]",
26
+ "required": true,
27
+ "description": "The lanes, one row each, in the order they are drawn."
28
+ },
29
+ "label": {
30
+ "type": "string | undefined",
31
+ "required": false,
32
+ "description": "Accessible name of the grid (aria-label); `aria-labelledby` wins when given."
33
+ },
34
+ "selectedId": {
35
+ "type": "string | null | undefined",
36
+ "required": false,
37
+ "description": "The selected lane's id (controlled); null selects nothing."
38
+ },
39
+ "defaultSelectedId": {
40
+ "type": "string | null | undefined",
41
+ "required": false,
42
+ "description": "The lane selected at first (uncontrolled)."
43
+ },
44
+ "onSelectedChange": {
45
+ "type": "((id: string | null) => void) | undefined",
46
+ "required": false,
47
+ "description": "A lane was selected (its id) or the selection was cleared (null)."
48
+ },
49
+ "selectable": {
50
+ "type": "boolean | undefined",
51
+ "required": false,
52
+ "description": "Whether lanes can be selected; true by default. False: no aria-selected, no selected look,\nand Enter, Space, Escape and a click select nothing; a `selectedId` given anyway is ignored."
53
+ },
54
+ "rowHeight": {
55
+ "type": "number | undefined",
56
+ "required": false,
57
+ "description": "Row height in px (every lane is this tall; virtualisation needs a fixed height). 64 by default."
58
+ },
59
+ "headerWidth": {
60
+ "type": "number | string | undefined",
61
+ "required": false,
62
+ "description": "Width of the fixed header column: px or any CSS length; 240px by default from the stylesheet."
63
+ },
64
+ "contentMinWidth": {
65
+ "type": "number | string | undefined",
66
+ "required": false,
67
+ "description": "Narrowest width of the content column; when the grid is narrower, it scrolls sideways. 0 by default."
68
+ },
69
+ "height": {
70
+ "type": "number | string | undefined",
71
+ "required": false,
72
+ "description": "The grid's height (the scroller): a number of pixels or any CSS length; 480\nby default, from the stylesheet, so a height in `style` works too."
73
+ },
74
+ "overscan": {
75
+ "type": "number | undefined",
76
+ "required": false,
77
+ "description": "Lanes rendered above and below the visible ones. 4 by default."
78
+ },
79
+ "emptyLabel": {
80
+ "type": "React.ReactNode",
81
+ "required": false,
82
+ "description": "Shown instead of the grid when `lanes` is empty."
83
+ },
84
+ "data-testid": {
85
+ "type": "string | undefined",
86
+ "required": false,
87
+ "description": "Test id of the root `<div>`; `swimlanes` unless given."
88
+ }
89
+ }
90
+ }
@@ -71,18 +71,33 @@
71
71
  "selectable": {
72
72
  "type": "boolean",
73
73
  "required": false,
74
- "description": "Enables label click selection."
74
+ "description": "Enables row selection: a click, Enter or Space on a row toggles its selection. The chevron and the\nLeft/Right keys never change it."
75
75
  },
76
76
  "checkboxes": {
77
77
  "type": "boolean",
78
78
  "required": false,
79
79
  "description": "Renders a checkbox per node bound to selection."
80
80
  },
81
+ "toggleOnRowClick": {
82
+ "type": "boolean",
83
+ "required": false,
84
+ "description": "Whether a click, Enter or Space on a row also expands or collapses its children. The chevron and the\nRight/Left keys always do. Defaults to `true` while the tree is not `selectable` (a row has nothing else to\ndo) and to `false` otherwise, so that selecting a row leaves it open or closed."
85
+ },
81
86
  "renderLabel": {
82
87
  "type": "(item: ITreeNodeItem, nodeId: string) => ReactNode",
83
88
  "required": false,
84
89
  "description": "Custom node renderer."
85
90
  },
91
+ "renderActions": {
92
+ "type": "(item: ITreeNodeItem, nodeId: string) => ReactNode",
93
+ "required": false,
94
+ "description": "Per-node actions (buttons, a menu trigger), drawn at the end of the row. They sit beside the row's\nbutton, not inside it, so they take their own clicks, Enter and Space, focus and accessible names."
95
+ },
96
+ "loadingText": {
97
+ "type": "string",
98
+ "required": false,
99
+ "description": "Text shown while `loadChildren` is pending; \"Loading…\" unless given."
100
+ },
86
101
  "loadChildren": {
87
102
  "type": "(item: ITreeNodeItem, nodeId: string) => Promise<ITreeNodeItem[]>",
88
103
  "required": false,
@@ -64,6 +64,16 @@
64
64
  "required": false,
65
65
  "description": "Link URL when rendered as an anchor."
66
66
  },
67
+ "target": {
68
+ "type": "string | null",
69
+ "required": false,
70
+ "description": "Where a link (with `href`) opens. By default `\"_blank\"`: a new tab. `null` leaves the `target`\nattribute out, so the link opens in place, like an internal one; an empty string does the same, and\nany other string is used as is."
71
+ },
72
+ "rel": {
73
+ "type": "string",
74
+ "required": false,
75
+ "description": "The `rel` of a link (with `href`). By default `\"noreferrer\"` for a link that opens another tab or\nwindow, and none for one that opens in place. Your own value replaces the default, so add `noreferrer` yourself\nif you still want it; an empty string drops the attribute."
76
+ },
67
77
  "disabled": {
68
78
  "type": "boolean",
69
79
  "required": false,
@@ -0,0 +1,222 @@
1
+ {
2
+ "name": "Composer",
3
+ "description": "A task input: a multi-line field that grows from minRows to maxRows, a toolbar slot under it for chip selectors, a send button that becomes Stop while busy, keyboard send (Ctrl/⌘+Enter by default), optional attach button and drop target, and a character counter.",
4
+ "ssr": {
5
+ "safe": true,
6
+ "rendering": "universal"
7
+ },
8
+ "extends": [
9
+ "Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\" | \"onKeyDown\" | \"onFocus\" | \"onBlur\" | \"children\"\n>"
10
+ ],
11
+ "inheritedAttributes": "Also accepts standard HTML attributes for the underlying element (see extends clause in TypeScript).",
12
+ "styles": {
13
+ "base": [
14
+ "@smwb/ui-styles/less/foundation.less",
15
+ "@smwb/ui-styles/less/theme.less"
16
+ ],
17
+ "entries": [
18
+ "@smwb/ui-styles/less/components/composer/composer.entry.less"
19
+ ],
20
+ "dependencies": [
21
+ "@smwb/ui-styles/less/components/icon/icon.entry.less"
22
+ ],
23
+ "importExample": "@import (less) \"node_modules/@smwb/ui-styles/less/foundation.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/theme.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/composer/composer.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/icon/icon.entry.less\";"
24
+ },
25
+ "props": {
26
+ "value": {
27
+ "type": "string",
28
+ "required": false,
29
+ "description": "Controlled text. The composer is controlled while this is not `undefined` (checked on every render); a parent\nthat ignores `onValueChange` keeps the field showing this value."
30
+ },
31
+ "defaultValue": {
32
+ "type": "string",
33
+ "required": false,
34
+ "description": "Initial text while uncontrolled. Defaults to an empty string."
35
+ },
36
+ "onValueChange": {
37
+ "type": "(value: string) => void",
38
+ "required": false,
39
+ "description": "Called on every text change: typing, a newline, and the clear after a send. Called in both modes."
40
+ },
41
+ "onSend": {
42
+ "type": "(text: string) => void",
43
+ "required": false,
44
+ "description": "Called with the trimmed text when the user sends it: the send key (see `sendKey`) or a click on the action\nbutton. Nothing is called while sending is not allowed: no `onSend`, an empty or whitespace-only text, `disabled`,\n`readOnly`, `busy`, or a text over `maxLength`. Async work is shown with `busy`; the return value is ignored."
45
+ },
46
+ "sendKey": {
47
+ "type": "ComposerSendKey",
48
+ "required": false,
49
+ "description": "Which Enter sends. `\"modEnter\"` (default): Ctrl/⌘+Enter sends and Enter inserts a newline. `\"enter\"`: Enter sends,\nShift+Enter inserts a newline, Ctrl/⌘+Enter sends too. An Enter that commits an IME composition never sends."
50
+ },
51
+ "clearOnSend": {
52
+ "type": "boolean",
53
+ "required": false,
54
+ "description": "Clear the text after `onSend`: the composer's own state while uncontrolled, `onValueChange(\"\")` while controlled.\nDefaults to `true`."
55
+ },
56
+ "busy": {
57
+ "type": "boolean",
58
+ "required": false,
59
+ "description": "The agent is working: the action button turns into Stop and calls `onStop`, and the keys and the button do not\nsend. The text stays editable. The composer never changes `busy` itself, the parent owns it."
60
+ },
61
+ "onStop": {
62
+ "type": "() => void",
63
+ "required": false,
64
+ "description": "Called when Stop is pressed (click, Enter or Space on the button) while `busy` and not `disabled`. Without it the\nStop button does nothing, so pass it whenever `busy` can be set."
65
+ },
66
+ "placeholder": {
67
+ "type": "string",
68
+ "required": false,
69
+ "description": "Placeholder of the textarea. It is not a name for the field, set `aria-label` or `aria-labelledby` as well."
70
+ },
71
+ "maxLength": {
72
+ "type": "number",
73
+ "required": false,
74
+ "description": "Hard limit on the text (the native `maxlength` of the textarea, counted in UTF-16 units, so an emoji is 2).\nTurns the counter on."
75
+ },
76
+ "counter": {
77
+ "type": "boolean",
78
+ "required": false,
79
+ "description": "Show the counter (`n / maxLength`, or `n` without `maxLength`). Defaults to `true` when `maxLength` is set."
80
+ },
81
+ "counterAnnouncement": {
82
+ "type": "(remaining: number, maxLength: number) => string",
83
+ "required": false,
84
+ "description": "Text for the polite status region that announces how many characters are left. It is spoken only near the limit\n(within the larger of 10 characters and 10% of `maxLength`) and when the text is over it, with a negative\n`remaining`. Defaults to \"N characters left\" / \"N characters over the limit\"."
85
+ },
86
+ "minRows": {
87
+ "type": "number",
88
+ "required": false,
89
+ "description": "Height of the empty field in rows, and the `rows` of the textarea. Defaults to `1`."
90
+ },
91
+ "maxRows": {
92
+ "type": "number",
93
+ "required": false,
94
+ "description": "Rows the field grows to before it scrolls. Clamped to at least `minRows`. Defaults to `8`."
95
+ },
96
+ "layout": {
97
+ "type": "ComposerLayout",
98
+ "required": false,
99
+ "description": "`\"stacked\"` (default): the field on top, a bar under it with the attach button, the toolbar, the counter and the\naction. `\"inline\"`: the attach button, the field, the counter and the action in one row, the toolbar (if any)\nin a row under it."
100
+ },
101
+ "toolbar": {
102
+ "type": "React.ReactNode",
103
+ "required": false,
104
+ "description": "Slot under the field for chips and selectors (agent, model, mode, …). Drawn in every state. It is a plain `div`,\nnot `role=\"toolbar\"`: the content brings its own keyboard handling and disabled state."
105
+ },
106
+ "attachments": {
107
+ "type": "React.ReactNode",
108
+ "required": false,
109
+ "description": "Slot above the field for the app's file chips. The composer keeps no file state: the app lists what `onAttach`\ngave it here."
110
+ },
111
+ "onAttach": {
112
+ "type": "(files: File[]) => void",
113
+ "required": false,
114
+ "description": "Turns on the attach button, the hidden file input and the drop target (the whole composer). Called with the files\nof a pick or a drop that are left after `accept`, `multiple` and `maxFiles`, never with an empty list. Only a drag\nof files is taken: dragged text or a link still goes into the field."
115
+ },
116
+ "accept": {
117
+ "type": "DropzoneAccept",
118
+ "required": false,
119
+ "description": "Accepted file types, as a record of mime type to extensions or a raw `accept` string (`image/*`, `.pdf`, an exact\nmime type). It sets the picker's filter, and the files of a pick or a drop that do not match are left out."
120
+ },
121
+ "multiple": {
122
+ "type": "boolean",
123
+ "required": false,
124
+ "description": "Allow several files per pick or drop. When `false` the picker takes one and a drop keeps the first. Defaults to `true`."
125
+ },
126
+ "maxFiles": {
127
+ "type": "number",
128
+ "required": false,
129
+ "description": "Files beyond this number are dropped from a pick or a drop (counted after `accept`)."
130
+ },
131
+ "dropTarget": {
132
+ "type": "boolean",
133
+ "required": false,
134
+ "description": "Whether `onAttach` also makes the composer a drop target for files. Set `false` when a parent already takes drops\n(a chat panel): the attach button and the picker stay, and a drop on the composer bubbles to the parent untouched.\nDefaults to `true`."
135
+ },
136
+ "disabled": {
137
+ "type": "boolean",
138
+ "required": false,
139
+ "description": "Disables the textarea, the attach button, the action button and the drop target. Toolbar content is the app's to\ndisable."
140
+ },
141
+ "readOnly": {
142
+ "type": "boolean",
143
+ "required": false,
144
+ "description": "The textarea is `readonly`: sending is unavailable, Stop still works."
145
+ },
146
+ "autoFocus": {
147
+ "type": "boolean",
148
+ "required": false,
149
+ "description": "Focus the textarea on mount."
150
+ },
151
+ "name": {
152
+ "type": "string",
153
+ "required": false,
154
+ "description": "Name of the textarea."
155
+ },
156
+ "id": {
157
+ "type": "string",
158
+ "required": false,
159
+ "description": "Id of the textarea (the root keeps no id). Generated when not given."
160
+ },
161
+ "aria-label": {
162
+ "type": "string",
163
+ "required": false,
164
+ "description": "Accessible name of the textarea. Set this or `aria-labelledby`: a placeholder is not a name."
165
+ },
166
+ "aria-labelledby": {
167
+ "type": "string",
168
+ "required": false,
169
+ "description": "Id(s) of the element(s) that name the textarea."
170
+ },
171
+ "aria-describedby": {
172
+ "type": "string",
173
+ "required": false,
174
+ "description": "Id(s) that describe the textarea. They come first, the counter's id is appended."
175
+ },
176
+ "onKeyDown": {
177
+ "type": "React.KeyboardEventHandler<HTMLTextAreaElement>",
178
+ "required": false,
179
+ "description": "Key handler of the textarea. It runs before the composer's own; if it calls `preventDefault()`, the composer does nothing for that key."
180
+ },
181
+ "onFocus": {
182
+ "type": "React.FocusEventHandler<HTMLTextAreaElement>",
183
+ "required": false,
184
+ "description": "Focus handler of the textarea."
185
+ },
186
+ "onBlur": {
187
+ "type": "React.FocusEventHandler<HTMLTextAreaElement>",
188
+ "required": false,
189
+ "description": "Blur handler of the textarea."
190
+ },
191
+ "inputRef": {
192
+ "type": "React.Ref<HTMLTextAreaElement>",
193
+ "required": false,
194
+ "description": "Ref of the textarea (the root takes the component's own `ref`)."
195
+ },
196
+ "sendLabel": {
197
+ "type": "string",
198
+ "required": false,
199
+ "description": "Accessible name of the action button while it sends. Defaults to \"Send\"."
200
+ },
201
+ "stopLabel": {
202
+ "type": "string",
203
+ "required": false,
204
+ "description": "Accessible name of the action button while `busy`. Defaults to \"Stop\"."
205
+ },
206
+ "attachLabel": {
207
+ "type": "string",
208
+ "required": false,
209
+ "description": "Accessible name of the attach button. Defaults to \"Attach file\"."
210
+ },
211
+ "className": {
212
+ "type": "string",
213
+ "required": false,
214
+ "description": "Class name(s) for the root `<div>`. `style`, `ref`, `data-*` attributes and every other HTML attribute or event\nhandler go to the root too; the root's drag handlers run after yours."
215
+ },
216
+ "data-testid": {
217
+ "type": "string",
218
+ "required": false,
219
+ "description": "Test id of the root `<div>`. Defaults to `composer`; the parts inside have their own (`composer-input`, `composer-action`, …)."
220
+ }
221
+ }
222
+ }
@@ -66,6 +66,26 @@
66
66
  "required": false,
67
67
  "description": "Reverse Header Actions. Optional. Type: boolean."
68
68
  },
69
+ "closeAriaLabel": {
70
+ "type": "string",
71
+ "required": false,
72
+ "description": "Accessible name of the header close button (default \"Close sheet\")."
73
+ },
74
+ "expandAriaLabel": {
75
+ "type": "string",
76
+ "required": false,
77
+ "description": "Accessible name of the size toggle while the sheet is at its normal size (default \"Expand sheet\"). The toggle\ncycles normal, expanded, collapsed and back, and its name always says what the next press does; the\nname changing is how it exposes its state. It shows the `open_in_full` icon, and `close_fullscreen` while expanded."
78
+ },
79
+ "collapseAriaLabel": {
80
+ "type": "string",
81
+ "required": false,
82
+ "description": "Accessible name of the size toggle while the sheet is expanded (default \"Collapse sheet\")."
83
+ },
84
+ "restoreAriaLabel": {
85
+ "type": "string",
86
+ "required": false,
87
+ "description": "Accessible name of the size toggle while the sheet is collapsed to its header (default \"Restore sheet size\")."
88
+ },
69
89
  "size": {
70
90
  "type": "string",
71
91
  "required": false,
@@ -0,0 +1,101 @@
1
+ {
2
+ "name": "TabGroups",
3
+ "description": "Tab groups in a split area: move tabs between groups by drag and drop or keyboard, split right or down, resize, close the last tab to close a group; the layout is a versioned JSON (layout/onLayoutChange).",
4
+ "ssr": {
5
+ "safe": true,
6
+ "rendering": "universal",
7
+ "note": "Renders the groups, tab rows and selected panels on the server; drag and drop and resizing run in the browser."
8
+ },
9
+ "extends": [
10
+ "Omit<React.HTMLAttributes<HTMLDivElement>, \"children\" | \"onChange\">"
11
+ ],
12
+ "inheritedAttributes": "Also accepts standard HTML attributes for the underlying element (see extends clause in TypeScript).",
13
+ "styles": {
14
+ "base": [
15
+ "@smwb/ui-styles/less/foundation.less",
16
+ "@smwb/ui-styles/less/theme.less"
17
+ ],
18
+ "entries": [
19
+ "@smwb/ui-styles/less/components/tabGroups/tabGroups.entry.less"
20
+ ],
21
+ "dependencies": [
22
+ "@smwb/ui-styles/less/components/icon/icon.entry.less",
23
+ "@smwb/ui-styles/less/components/kbd/kbd.entry.less",
24
+ "@smwb/ui-styles/less/components/menu/menu.entry.less",
25
+ "@smwb/ui-styles/less/components/tabs/tabs.entry.less"
26
+ ],
27
+ "importExample": "@import (less) \"node_modules/@smwb/ui-styles/less/foundation.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/theme.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/tabGroups/tabGroups.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/icon/icon.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/kbd/kbd.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/menu/menu.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/tabs/tabs.entry.less\";"
28
+ },
29
+ "props": {
30
+ "layout": {
31
+ "type": "TabGroupsLayout | undefined",
32
+ "required": false,
33
+ "description": "The arrangement to draw: the split tree, the tabs of every group and which of them is\nselected. Controlled while it is not `undefined` — the component then draws what it is given\nand an owner that ignores `onLayoutChange` sees nothing move."
34
+ },
35
+ "defaultLayout": {
36
+ "type": "TabGroupsLayout | undefined",
37
+ "required": false,
38
+ "description": "The layout of the uncontrolled mode's first render: one empty group by default."
39
+ },
40
+ "onLayoutChange": {
41
+ "type": "((layout: TabGroupsLayout, change: TabGroupsChange) => void) | undefined",
42
+ "required": false,
43
+ "description": "Called with the new layout and what changed (`select`, `activate`, `move`, `split`, `close`,\n`resize`) in the controlled and the uncontrolled mode alike. Store the layout here; the\n`change` says which of them are worth writing (an `activate` is a focus move, not an edit)."
44
+ },
45
+ "getTab": {
46
+ "type": "(tabId: string) => TabGroupsTab | undefined",
47
+ "required": true,
48
+ "description": "What a tab shows, by its id: `undefined` draws the id as the label."
49
+ },
50
+ "renderPanel": {
51
+ "type": "(tabId: string) => React.ReactNode",
52
+ "required": true,
53
+ "description": "The content of a tab's panel, by its id. Called from the first time the tab is selected and\nkept mounted after that, so a panel keeps its state while hidden and while its tab moves."
54
+ },
55
+ "onTabClose": {
56
+ "type": "| ((tabId: string, event: React.SyntheticEvent<HTMLElement>, reason: TabCloseReason) => boolean | void) | undefined",
57
+ "required": false,
58
+ "description": "Asked before a tab closes (its close button, Delete or Backspace, a middle press or its\n`actions`), with what asked for it. Return `false` to keep the tab; anything else closes it."
59
+ },
60
+ "empty": {
61
+ "type": "React.ReactNode",
62
+ "required": false,
63
+ "description": "Drawn, centred, when nothing is open: the only group has no tabs."
64
+ },
65
+ "minGroupSize": {
66
+ "type": "number",
67
+ "required": false,
68
+ "description": "The smallest a group can be resized to, in px of its split; 120 by default."
69
+ },
70
+ "keyboardStep": {
71
+ "type": "number",
72
+ "required": false,
73
+ "description": "A separator's arrow-key step, in percent of its split; 5 by default, as `ScreenDivider`."
74
+ },
75
+ "groupActions": {
76
+ "type": "boolean",
77
+ "required": false,
78
+ "description": "Draw each group's actions button and its menu; true by default."
79
+ },
80
+ "dense": {
81
+ "type": "boolean",
82
+ "required": false,
83
+ "description": "Compact tab rows (`Tabs`' `dense`); false by default."
84
+ },
85
+ "labels": {
86
+ "type": "Partial<TabGroupsLabels> | undefined",
87
+ "required": false,
88
+ "description": "The component's texts, to localise them. English by default."
89
+ },
90
+ "id": {
91
+ "type": "string",
92
+ "required": false,
93
+ "description": "Base of the generated ids and the root's own id. Generated by default."
94
+ },
95
+ "data-testid": {
96
+ "type": "string",
97
+ "required": false,
98
+ "description": "Test id of the root element; \"tab-groups\" by default."
99
+ }
100
+ }
101
+ }
@@ -66,11 +66,26 @@
66
66
  "required": false,
67
67
  "description": "Accessible title or tooltip text."
68
68
  },
69
+ "titleAs": {
70
+ "type": "\"div\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
71
+ "required": false,
72
+ "description": "Tag the `title` is rendered in: a `div` (default) or a heading, `h1`–`h6`,\nfor the page's main heading. Only the tag changes — a heading is drawn with\nthe bar's own font size, weight and no margins, so it looks exactly like the\ndiv. The heading's text is the `title` itself, so pass a string or plain\nmarkup rather than a `Typography` heading."
73
+ },
69
74
  "midContentAlign": {
70
75
  "type": "\"middle\" | \"left\" | \"right\"",
71
76
  "required": false,
72
77
  "description": "Mid Content Align. Optional. Type: \"middle\" | \"left\" | \"right\"."
73
78
  },
79
+ "variant": {
80
+ "type": "\"default\" | \"window\"",
81
+ "required": false,
82
+ "description": "`window`: the bar is the title bar of a desktop app window (Electron, Tauri, an installed PWA with Window\nControls Overlay). The bar drags the window; buttons, links, fields and other controls in it stay clickable,\nand room is left for the OS window buttons (`windowControls`). In a plain browser tab it looks like `default`."
83
+ },
84
+ "windowControls": {
85
+ "type": "\"auto\" | \"left\" | \"right\" | \"none\"",
86
+ "required": false,
87
+ "description": "With `variant=\"window\"`: where the OS window buttons are, so the bar's content keeps clear of them.\n`auto` (default) takes the area from the shell's `env(titlebar-area-*)` (Window Controls Overlay, Electron\n`titleBarOverlay`) and reserves nothing without it; `left` is macOS (traffic lights, `titleBarStyle: \"hiddenInset\"`),\n`right` is Windows/Linux caption buttons drawn by the OS; `none` reserves nothing. The reserved width is\nthe `--smui-appBarWindowControlsWidth` custom property (64px on the left, 138px on the right by default)."
88
+ },
74
89
  "color": {
75
90
  "type": "AppBarColor",
76
91
  "required": false,