@smwb/ui-mcp-react 2.10.0 → 2.12.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.
@@ -29,7 +29,7 @@
29
29
  "src": {
30
30
  "type": "string",
31
31
  "required": false,
32
- "description": "Image source. Falls back to children (initials / icon) on error or when absent."
32
+ "description": "Image source. Falls back to children (initials / icon) on error or when absent. While the image is shown the\navatar paints no background under it, so a transparent PNG/SVG shows what is behind the avatar."
33
33
  },
34
34
  "alt": {
35
35
  "type": "string",
@@ -49,7 +49,7 @@
49
49
  "color": {
50
50
  "type": "string",
51
51
  "required": false,
52
- "description": "Background color for the fallback (initials / icon)."
52
+ "description": "Background color for the fallback (initials / icon); not painted under an image."
53
53
  },
54
54
  "imgProps": {
55
55
  "type": "ImgHTMLAttributes<HTMLImageElement>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Chart",
3
- "description": "An ECharts chart in the theme's palette (import from @smwb/ui-react/chart; echarts is an optional peer): option or option(palette), lazy-loaded ECharts or your own loader, a skeleton until it draws, redrawn on theme switches and resizes (not at zero size).",
3
+ "description": "An ECharts chart in the theme's palette (import from @smwb/ui-react/chart, which loads the whole of echarts unless you pass a loader, or from @smwb/ui-react/chart/core, where loader is required and the whole of echarts is never bundled; echarts is an optional peer): option or option(palette), lazy-loaded ECharts or your own loader (a module built on echarts/core), a skeleton until it draws, redrawn on theme switches and resizes (not at zero size).",
4
4
  "ssr": {
5
5
  "safe": true,
6
6
  "rendering": "universal",
@@ -52,7 +52,7 @@
52
52
  "loader": {
53
53
  "type": "() => Promise<ChartModule>",
54
54
  "required": false,
55
- "description": "Loads ECharts in the browser: `import(\"echarts\")` by default, the whole\nlibrary. For a smaller bundle pass `() => import(\"./my-echarts\")`, a module\nthat registers only the charts you use with `echarts/core`."
55
+ "description": "Loads ECharts in the browser. Optional in `@smwb/ui-react/chart`, where\n`import(\"echarts\")` — the whole library — is the default; required in\n`@smwb/ui-react/chart/core`, which has no default and so never puts the\nwhole library in your bundle. For a smaller bundle pass\n`() => import(\"./my-echarts\")`, a module that registers only the charts\nyou use with `echarts/core`."
56
56
  },
57
57
  "renderer": {
58
58
  "type": "\"canvas\" | \"svg\"",
@@ -66,6 +66,21 @@
66
66
  "required": false,
67
67
  "description": "The bar only; the text stays available to assistive technology."
68
68
  },
69
+ "textPosition": {
70
+ "type": "MeterTextPosition",
71
+ "required": false,
72
+ "description": "Where the text sits against the bar: `after` it (the default) or `before` it."
73
+ },
74
+ "size": {
75
+ "type": "MeterSize",
76
+ "required": false,
77
+ "description": "`compact`: a fixed-width bar and small secondary text, and the block shrinks to its\ncontent instead of filling the parent. `medium` (the default) fills the parent."
78
+ },
79
+ "aria-valuetext": {
80
+ "type": "string",
81
+ "required": false,
82
+ "description": "What assistive technology reads as the value, e.g. the text you format for the\neye (\"$4.18 / $20\"); \"X of Y\" built from `value`, `ofLabel` and `max` unless given."
83
+ },
69
84
  "data-testid": {
70
85
  "type": "string",
71
86
  "required": false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "StatusDot",
3
- "description": "Small status marker dot coloured by status or theme colour, with a pulse for active (role=img).",
3
+ "description": "Small status marker, a dot or a diamond, coloured by status or theme colour, with a pulse for active (role=img).",
4
4
  "ssr": {
5
5
  "safe": true,
6
6
  "rendering": "universal"
@@ -41,6 +41,11 @@
41
41
  "required": false,
42
42
  "description": "`md` (12px) unless given; `sm` is 8px."
43
43
  },
44
+ "shape": {
45
+ "type": "StatusDotShape | undefined",
46
+ "required": false,
47
+ "description": "The marker's outline, `dot` unless given: `diamond` turns the same square corner-up. The shape is the caller's\nchoice, not the status's — a diamond takes its colour from `color` or `status`, its size from `size` and its\npulse from `pulse` exactly as the dot does, so `unknown` is a ring and `active` pulses in either shape. Its box\nis the box of a dot of the same `size`, so the two swap places without moving a row."
48
+ },
44
49
  "pulse": {
45
50
  "type": "boolean | undefined",
46
51
  "required": false,
@@ -24,14 +24,24 @@
24
24
  },
25
25
  "props": {
26
26
  "nodeIcon": {
27
- "type": "{ opened?: string; closed?: string; }",
27
+ "type": "{ opened?: string; closed?: string } | false",
28
28
  "required": false,
29
- "description": "Node Icon. Optional. Type: { opened?: string; closed?: string; }."
29
+ "description": "Icons of the nodes that have children, by state; `{ closed: \"folder\", opened: \"folder_open\" }` unless given.\n`false` draws none, and the label starts where the icon did."
30
30
  },
31
31
  "listIcon": {
32
- "type": "string",
32
+ "type": "string | false",
33
+ "required": false,
34
+ "description": "Icon of a node without children; \"draft\" unless given. `false` draws none."
35
+ },
36
+ "dense": {
37
+ "type": "boolean",
38
+ "required": false,
39
+ "description": "Compact look: the row is as tall as the small control (`--smui-control-h-sm`, 32px) instead of the medium one\n(40px), and a level steps 16px (`@treeViewIndentDense`) instead of 40px. A tree with `--smwb-tree-row-h` or\n`--smwb-tree-indent` set on it (the `style` prop) takes those values, e.g. a 26px row."
40
+ },
41
+ "guides": {
42
+ "type": "boolean",
33
43
  "required": false,
34
- "description": "List Icon. Optional. Type: string."
44
+ "description": "Whether the vertical lines and corners that join a node to its parent are drawn. They are by default; turning\nthem off leaves the levels where they were."
35
45
  },
36
46
  "data": {
37
47
  "type": "ITreeNodeItem[]",
@@ -46,7 +46,7 @@
46
46
  "trigger": {
47
47
  "type": "TooltipTrigger",
48
48
  "required": false,
49
- "description": "What shows the tooltip. `hover` (default): the pointer over the target or keyboard focus\nin it, until both have left. Keyboard focus is focus with a focus ring (`:focus-visible`),\nnot the focus a mouse press gives a button. `click`: a click on the target shows or hides\nit. `manual`: `open` alone. Escape hides a `hover` or `click` tooltip."
49
+ "description": "What shows the tooltip. `hover` (default): the pointer over the target or keyboard focus\nin it, until both have left. Keyboard focus is focus with a focus ring (`:focus-visible`),\nnot the focus a mouse press gives a button. `click`: a click on the target shows or hides\nit. `manual`: `open` alone. `auto`: `hover` where the primary pointer is precise (a mouse), and\na tap on the target where it is coarse (`(pointer: coarse)`, a touch screen), which also hides on\na press outside the target. Escape hides a `hover`, `click` or `auto` tooltip."
50
50
  },
51
51
  "openDelay": {
52
52
  "type": "number",
@@ -44,6 +44,11 @@
44
44
  "required": false,
45
45
  "description": "Icon node or image source."
46
46
  },
47
+ "iconOnly": {
48
+ "type": "boolean",
49
+ "required": false,
50
+ "description": "Icon-only button: a square of its size's control height (`--smui-control-h-sm/md/lg`), with no `min-width` and no padding. Works for every `variant` and for a link (`href`). It has no text, so its name comes from `aria-label` (or `aria-labelledby`); without one the component warns in the console. Apart from `fullWidth`: a square does not stretch."
51
+ },
47
52
  "iconProps": {
48
53
  "type": "Omit<IconProps, \"name\">",
49
54
  "required": false,
@@ -89,6 +89,11 @@
89
89
  "type": "boolean",
90
90
  "required": false,
91
91
  "description": "Whether the control is in an error state."
92
+ },
93
+ "compact": {
94
+ "type": "boolean",
95
+ "required": false,
96
+ "description": "A compact look for a status row or a toolbar: the label shares the line with the switch (\"top\", the default,\ncounts as \"left\"), no line is kept for helper text unless `helperText` is set, and the row is the theme's small\ncontrol height, at most 28px. The default look is unchanged."
92
97
  }
93
98
  }
94
99
  }
@@ -81,7 +81,7 @@
81
81
  "stickyHeader": {
82
82
  "type": "boolean",
83
83
  "required": false,
84
- "description": "Keep the header pinned while content scrolls."
84
+ "description": "Keep the header pinned while content scrolls. A pinned header's height is published as `--smui-sheet-offset-top`\non the document element, so a `Sheet` opens below it and leaves it visible and clickable (a `Sheet` with its own\n`offsetTop` ignores it). The height is taken from the top of the window, so the layout is assumed to start\nthere; with several layouts the most recent one wins."
85
85
  },
86
86
  "className": {
87
87
  "type": "string",
@@ -51,6 +51,21 @@
51
51
  "type": "string",
52
52
  "required": false,
53
53
  "description": "Accessible label for the resizer handle."
54
+ },
55
+ "minSizeFirst": {
56
+ "type": "number | string",
57
+ "required": false,
58
+ "description": "Smallest size of the first pane that dragging and the keyboard (arrows, Home, End) leave it:\na number is pixels, a string is `\"120px\"` or `\"20%\"`; any other unit is ignored. Unset means no minimum."
59
+ },
60
+ "minSizeSecond": {
61
+ "type": "number | string",
62
+ "required": false,
63
+ "description": "Smallest size of the second pane, same units as `minSizeFirst`. If both minimums do not fit, the first one wins."
64
+ },
65
+ "collapsed": {
66
+ "type": "\"first\" | \"second\"",
67
+ "required": false,
68
+ "description": "Folds one pane to zero and hides the resizer; the other pane takes the whole divider. Both panes stay mounted,\nand clearing it brings back the split the divider had. `onSizeChange` is not called for the fold."
54
69
  }
55
70
  }
56
71
  }
@@ -91,6 +91,11 @@
91
91
  "required": false,
92
92
  "description": "Visual size preset."
93
93
  },
94
+ "offsetTop": {
95
+ "type": "number | string",
96
+ "required": false,
97
+ "description": "Gap between the top edge of the window and the top of the sheet and of its modal scrim (px, or any CSS length),\nso a panel can start below a fixed app bar and leave it visible and clickable. It applies to the `top`, `left`\nand `right` placements and to the scrim of every placement. Without it the sheet takes the page's\n`--smui-sheet-offset-top`, which `AppLayout` sets to the height of its sticky header and which is 0 elsewhere;\n`offsetTop={0}` covers the header anyway. A press in the strip above a modal scrim belongs to the page and does\nnot close the sheet, so a header button can toggle it. The modal sheet keeps `aria-modal`, though that strip can\nstill be reached by pointer and Tab; for a header that must stay available to assistive technology, use\n`variant=\"default\"`."
98
+ },
94
99
  "disableOutsideClick": {
95
100
  "type": "boolean",
96
101
  "required": false,
@@ -77,11 +77,21 @@
77
77
  "required": false,
78
78
  "description": "Draw each group's actions button and its menu; true by default."
79
79
  },
80
+ "stripActions": {
81
+ "type": "((group: TabGroupsStripGroup) => React.ReactNode) | undefined",
82
+ "required": false,
83
+ "description": "Content at the end of a group's tab row, before the group's actions button: buttons that act on\nthe group (\"new terminal\", \"split\"). Called for every group with `{ index, count, active }`:\nits place from 0, how many groups there are and whether it is the one in use, so the app can\nreturn content for some groups only; `null`, `undefined`, `false` or an empty fragment draws\nnothing, not even a wrapper. A component that renders nothing cannot be told from outside: its\nwrapper is in the DOM, empty, and drawn as nothing (`:empty`); return `null` from the function\ninstead to leave it out. The tabs scroll beside the content while it stays in view; in a header\ntoo narrow for both, the tabs give way first, then the content is clipped at its end, and the\ngroup's actions button stays. It comes after the tabs in the Tab order, and the tab row's arrow\nkeys neither enter it nor read the keys pressed in it.\n\nThe function runs on every render, and React keeps the nodes it returns from one call to the\nnext as usual (the same element types in the same places).\n\nA slot control that has the focus when a change takes it out of the document (a split or a\nclose from the slot, the slot going to the group in use) hands the focus on: to the control at\nthe same place in its group's slot, else in the slot of the group in use (the last one when\nthere are fewer), else to that group's selected tab."
84
+ },
80
85
  "dense": {
81
86
  "type": "boolean",
82
87
  "required": false,
83
88
  "description": "Compact tab rows (`Tabs`' `dense`); false by default."
84
89
  },
90
+ "fit": {
91
+ "type": "boolean",
92
+ "required": false,
93
+ "description": "Content-width tabs (`Tabs`' `fit`); false by default. Each tab is as wide as its marker, label\nand close button, between `--smui-tabFitMinWidth` and `--smui-tabFitMaxWidth`, and what is left\nof the header stays empty: `stripActions` and the group's actions button keep the end of it. A\nlong label is cut with an ellipsis and shows its text as a tooltip: a string label is its own,\nand the tab's `title` is the tooltip of a label that is not a string."
94
+ },
85
95
  "labels": {
86
96
  "type": "Partial<TabGroupsLabels> | undefined",
87
97
  "required": false,
@@ -54,7 +54,7 @@
54
54
  "midContent": {
55
55
  "type": "React.ReactNode",
56
56
  "required": false,
57
- "description": "Mid Content. Optional. Type: React.ReactNode."
57
+ "description": "Content of the middle area, e.g. a search field. The area takes only the room the title and the right group leave\nfree (`flex: 1 1 0`), so it is the first to narrow when the bar does. A direct child narrows with it (`max-width: 100%`)\nonly as far as its own content can: a control with a minimum width, or a nowrap row of buttons or tabs, keeps it and\nruns under the right group when the title takes the whole bar, so give such content `min-width: 0` or let it shrink."
58
58
  },
59
59
  "rightContent": {
60
60
  "type": "React.ReactNode",
@@ -64,7 +64,7 @@
64
64
  "title": {
65
65
  "type": "React.ReactNode | string",
66
66
  "required": false,
67
- "description": "Accessible title or tooltip text."
67
+ "description": "Title in the left group. It keeps its content size while the middle area has room to give up; when the bar is\nnarrower than the title and the right group together, a text title is cut with an ellipsis and the right group stays\ninside the bar. The cut leaves a margin for a focus ring (`overflow: clip`), so a link or a button in the title keeps\nits ring."
68
68
  },
69
69
  "titleAs": {
70
70
  "type": "\"div\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
@@ -19,5 +19,11 @@
19
19
  "dependencies": [],
20
20
  "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/bottomBar/bottomBar.entry.less\";"
21
21
  },
22
- "props": {}
22
+ "props": {
23
+ "badge": {
24
+ "type": "number | string",
25
+ "required": false,
26
+ "description": "A count (or a short text) drawn as a `Badge` at the item's icon, or after the title when the item has no icon.\n`0`, `\"0\"`, an empty string and `undefined` draw nothing. The item's accessible name reads `\"<title> <badge>\"`."
27
+ }
28
+ }
23
29
  }
@@ -18,12 +18,13 @@
18
18
  "@smwb/ui-styles/less/components/bottomBar/bottomBar.entry.less"
19
19
  ],
20
20
  "dependencies": [
21
+ "@smwb/ui-styles/less/components/badge/badge.entry.less",
21
22
  "@smwb/ui-styles/less/components/icon/icon.entry.less",
22
23
  "@smwb/ui-styles/less/components/menu/menu.entry.less",
23
24
  "@smwb/ui-styles/less/components/ripple/ripple.entry.less",
24
25
  "@smwb/ui-styles/less/components/sidebar/sidebar.entry.less"
25
26
  ],
26
- "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/bottomBar/bottomBar.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/menu/menu.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/ripple/ripple.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/sidebar/sidebar.entry.less\";"
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/bottomBar/bottomBar.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/badge/badge.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/menu/menu.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/ripple/ripple.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/sidebar/sidebar.entry.less\";"
27
28
  },
28
29
  "props": {
29
30
  "className": {
@@ -32,9 +33,9 @@
32
33
  "description": "Additional CSS class name(s) for the root element."
33
34
  },
34
35
  "menuItems": {
35
- "type": "SidebarMenuItemProps[]",
36
+ "type": "BottomBarMenuItemProps[]",
36
37
  "required": false,
37
- "description": "Menu Items. Optional. Type: SidebarMenuItemProps[]."
38
+ "description": "Menu Items. Optional. Type: BottomBarMenuItemProps[]."
38
39
  },
39
40
  "visibleCount": {
40
41
  "type": "number",
@@ -61,6 +61,11 @@
61
61
  "required": false,
62
62
  "description": "Accessible label for the expand button."
63
63
  },
64
+ "noWrap": {
65
+ "type": "boolean",
66
+ "required": false,
67
+ "description": "Keep the trail on one line: the crumbs do not wrap, they shrink and cut their text with an ellipsis, the last one\ngiving way last, and a cut crumb shows its full text as a `title` on hover. Plain text and a block child (a heading,\n`Typography`) are cut with an ellipsis; a crumb laid out as a row (an icon with a label, say) is clipped as far as\nits own layout allows. A leading crumb is never narrower than `@breadcrumbsLeadingMinWidth`, so a one- or\ntwo-letter one takes that width even when everything fits, and the last one is never narrower than\n`@breadcrumbsLastMinWidth`: in a box smaller than those floors the trail runs past it instead of shrinking further."
68
+ },
64
69
  "data-testid": {
65
70
  "type": "string",
66
71
  "required": false,
@@ -19,9 +19,10 @@
19
19
  ],
20
20
  "dependencies": [
21
21
  "@smwb/ui-styles/less/components/icon/icon.entry.less",
22
- "@smwb/ui-styles/less/components/ripple/ripple.entry.less"
22
+ "@smwb/ui-styles/less/components/ripple/ripple.entry.less",
23
+ "@smwb/ui-styles/less/components/tabs/tabs.entry.less"
23
24
  ],
24
- "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/tabs/tab/tab.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/ripple/ripple.entry.less\";"
25
+ "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/tabs/tab/tab.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/ripple/ripple.entry.less\";\n@import (less) \"node_modules/@smwb/ui-styles/less/components/tabs/tabs.entry.less\";"
25
26
  },
26
27
  "props": {
27
28
  "label": {
@@ -84,6 +84,11 @@
84
84
  "required": false,
85
85
  "description": "Compact tabs: a shorter row — `--smui-tabDenseHeight` (36px) — with labels as written (no\ncapitals, no letter spacing) and less padding."
86
86
  },
87
+ "fit": {
88
+ "type": "boolean",
89
+ "required": false,
90
+ "description": "Content-width tabs: each tab is as wide as what it holds (marker, label, close button) and the\nrow does not stretch them, so what is left of the row stays empty; a plain row shares its whole\nwidth between its tabs. A tab stays between `--smui-tabFitMinWidth` (80px) and\n`--smui-tabFitMaxWidth` (256px), set in the theme; a longer label is cut with an ellipsis, and a\nstring `label` is also the label's `title`, so the full text shows on hover (a `Tab` whose label\nis not a string takes a `title` of its own, which is the tooltip of the whole tab). The indicator, `scrollable`, `scrollButtons`, the\noverflow menu and the close button need nothing more. Dropping a dragged tab on the row's empty\npart does nothing."
91
+ },
87
92
  "scrollBackAriaLabel": {
88
93
  "type": "string",
89
94
  "required": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smwb/ui-mcp-react",
3
- "version": "2.10.0",
3
+ "version": "2.12.0",
4
4
  "description": "Model Context Protocol server exposing the @smwb/ui-react (React) component catalog and customization guide.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,8 +28,8 @@
28
28
  "zod": "^4.4.3"
29
29
  },
30
30
  "devDependencies": {
31
- "@smwb/ui-react": "^2.10.0",
32
- "@smwb/ui-styles": "^2.1.0",
31
+ "@smwb/ui-react": "^2.12.0",
32
+ "@smwb/ui-styles": "^2.3.0",
33
33
  "glob": "^13.0.6",
34
34
  "typescript": "^6.0.3",
35
35
  "vitest": "^2.1.9"