@duro-app/cli 5.21.0 → 5.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/registry.json +52 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duro-app/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.22.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Machine-queryable docs for the Duro design system: components, props, recipes, tokens and rules as CLI output, JSON, or an MCP server.",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"@modelcontextprotocol/sdk": ">=1.0.0",
|
|
49
|
-
"@duro-app/ui": "^5.
|
|
49
|
+
"@duro-app/ui": "^5.22.0"
|
|
50
50
|
},
|
|
51
51
|
"peerDependenciesMeta": {
|
|
52
52
|
"@duro-app/ui": {
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"@types/node": "^24.0.0",
|
|
62
62
|
"ts-morph": "^26.0.0",
|
|
63
63
|
"typescript": "^5.7.0",
|
|
64
|
-
"@duro-app/eslint-plugin": "^5.
|
|
65
|
-
"@duro-app/ui": "^5.
|
|
66
|
-
"@duro-app/tokens": "^5.
|
|
64
|
+
"@duro-app/eslint-plugin": "^5.22.0",
|
|
65
|
+
"@duro-app/ui": "^5.22.0",
|
|
66
|
+
"@duro-app/tokens": "^5.22.0"
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"registry": "node scripts/build-registry.mjs",
|
package/registry.json
CHANGED
|
@@ -1182,7 +1182,7 @@
|
|
|
1182
1182
|
"importPath": "@duro-app/ui",
|
|
1183
1183
|
"kind": "component",
|
|
1184
1184
|
"meta": {
|
|
1185
|
-
"description": "A block of code with a copy button: a pre that scrolls sideways when a line is long, and a Button that copies its text, shows the copied label for copiedDuration ms and announces it through a polite LiveRegion. Labels come from props.",
|
|
1185
|
+
"description": "A block of code with a copy button: a pre that scrolls sideways when a line is long, and a Button that copies its text, shows the copied label for copiedDuration ms and announces it through a polite LiveRegion. Labels come from props. With language=\"diff\", added, removed and hunk lines are coloured from tokens. On native the text is selectable and scrolls sideways; there is no copy button.",
|
|
1186
1186
|
"example": "<CodeBlock copyLabel=\"Copy\" copiedLabel=\"Copied\">\n <code>pnpm add @duro-app/ui</code>\n</CodeBlock>",
|
|
1187
1187
|
"relatedTo": [
|
|
1188
1188
|
{
|
|
@@ -1206,7 +1206,7 @@
|
|
|
1206
1206
|
]
|
|
1207
1207
|
},
|
|
1208
1208
|
"name": "CodeBlock",
|
|
1209
|
-
"native":
|
|
1209
|
+
"native": true,
|
|
1210
1210
|
"props": [
|
|
1211
1211
|
{
|
|
1212
1212
|
"description": "The code: text, or the `<code>` element a Markdown renderer produced (highlighted spans included). What is copied is its text content.",
|
|
@@ -1214,6 +1214,12 @@
|
|
|
1214
1214
|
"required": true,
|
|
1215
1215
|
"type": "ReactNode"
|
|
1216
1216
|
},
|
|
1217
|
+
{
|
|
1218
|
+
"description": "The code's language (\"diff\", \"ts\"), exposed as `data-language` on the `pre`. `\"diff\"` also gives each added (`+`), removed (`-`) and hunk (`@@`) line its own colour; what is copied stays the raw text. Diff rendering works on the text content, so highlighted spans inside `children` are flattened to plain text. The language is a data attribute only: it is not announced to assistive technology.",
|
|
1219
|
+
"name": "language",
|
|
1220
|
+
"required": false,
|
|
1221
|
+
"type": "string"
|
|
1222
|
+
},
|
|
1217
1223
|
{
|
|
1218
1224
|
"description": "The copy button's label (\"Copy\"), from your text catalog.",
|
|
1219
1225
|
"name": "copyLabel",
|
|
@@ -5238,7 +5244,7 @@
|
|
|
5238
5244
|
"importPath": "@duro-app/ui",
|
|
5239
5245
|
"kind": "component",
|
|
5240
5246
|
"meta": {
|
|
5241
|
-
"description": "The container for HTML Duro does not author — rendered Markdown, CMS output: headings, paragraphs, lists, tables, blockquotes, inline code, links and images are styled from tokens by descendant rules scoped to it (plain CSS in dist/index.css, :where() and its own cascade layer). Duro components inside it keep their styles, and an app's own CSS wins over every Prose rule.
|
|
5247
|
+
"description": "The container for HTML Duro does not author — rendered Markdown, CMS output: headings, paragraphs, lists, tables, blockquotes, inline code, links and images are styled from tokens by descendant rules scoped to it (plain CSS in dist/index.css, :where() and its own cascade layer). Duro components inside it keep their styles, and an app's own CSS wins over every Prose rule. On native it is a reading-width column with a token gap; the renderer maps Markdown to Duro primitives.",
|
|
5242
5248
|
"example": "<Prose>\n <ReactMarkdown components={{pre: ({children}) => <CodeBlock copyLabel=\"Copy\" copiedLabel=\"Copied\">{children}</CodeBlock>}}>\n {body}\n </ReactMarkdown>\n</Prose>",
|
|
5243
5249
|
"relatedTo": [
|
|
5244
5250
|
{
|
|
@@ -5262,7 +5268,7 @@
|
|
|
5262
5268
|
]
|
|
5263
5269
|
},
|
|
5264
5270
|
"name": "Prose",
|
|
5265
|
-
"native":
|
|
5271
|
+
"native": true,
|
|
5266
5272
|
"props": [
|
|
5267
5273
|
{
|
|
5268
5274
|
"description": "HTML Duro does not author: the output of a Markdown renderer.",
|
|
@@ -5938,7 +5944,7 @@
|
|
|
5938
5944
|
"Pane"
|
|
5939
5945
|
]
|
|
5940
5946
|
},
|
|
5941
|
-
"description": "Two panes side by side with a resizable separator: the first Pane is sized by the Handle (pointer drag, arrow keys, Shift for larger steps, Home and End), the second takes the rest. Min, max and starting widths are size tokens. Below collapseBelow, measured on its own width, the panes stack in one column and the handle goes; on native they always stack. The Handle is a hairline that thickens to the accent on hover, keyboard focus or drag.",
|
|
5947
|
+
"description": "Two panes side by side with a resizable separator: the first Pane is sized by the Handle (pointer drag, arrow keys, Shift for larger steps, Home and End), the second takes the rest. Min, max and starting widths are size tokens. Below collapseBelow, measured on its own width, the panes stack in one column and the handle goes; on native they always stack. A controlled collapsed prop shrinks the first pane to a strip (the iconButton size) that shows collapsedContent, removes the Handle, and keeps the first pane’s own children mounted but inert and hidden (state kept, no tab stops, out of the accessibility tree); the prior width returns when it turns false. Native ignores both. The Handle is a hairline that thickens to the accent on hover, keyboard focus or drag.",
|
|
5942
5948
|
"example": "<SplitPane.Root aria-label=\"Resize the session list\" minSize=\"sidebarW\" maxSize=\"panelLg\">\n <SplitPane.Pane>\n <List.Root aria-label=\"Sessions\">…</List.Root>\n </SplitPane.Pane>\n <SplitPane.Handle />\n <SplitPane.Pane>\n <Panel.Root>…</Panel.Root>\n </SplitPane.Pane>\n</SplitPane.Root>",
|
|
5943
5949
|
"relatedTo": [
|
|
5944
5950
|
{
|
|
@@ -6036,6 +6042,19 @@
|
|
|
6036
6042
|
"xl"
|
|
6037
6043
|
]
|
|
6038
6044
|
},
|
|
6045
|
+
{
|
|
6046
|
+
"default": "false",
|
|
6047
|
+
"description": "Controlled: shrink the primary pane to a strip (the `iconButton` size), show `collapsedContent` in it and remove the handle. The pane's own children stay mounted (their state is kept) but are inert and hidden. When it turns false the pane returns to its prior width. Ignored when stacked.",
|
|
6048
|
+
"name": "collapsed",
|
|
6049
|
+
"required": false,
|
|
6050
|
+
"type": "boolean"
|
|
6051
|
+
},
|
|
6052
|
+
{
|
|
6053
|
+
"description": "What the strip shows while `collapsed` (an expand button, icons).",
|
|
6054
|
+
"name": "collapsedContent",
|
|
6055
|
+
"required": false,
|
|
6056
|
+
"type": "ReactNode"
|
|
6057
|
+
},
|
|
6039
6058
|
{
|
|
6040
6059
|
"description": "The handle's accessible name (\"Resize list\").",
|
|
6041
6060
|
"name": "aria-label",
|
|
@@ -7489,7 +7508,7 @@
|
|
|
7489
7508
|
"importPath": "@duro-app/ui",
|
|
7490
7509
|
"kind": "component",
|
|
7491
7510
|
"meta": {
|
|
7492
|
-
"description": "Multi-line text input with automatic Field/Form integration. Same Field binding behavior as Input.",
|
|
7511
|
+
"description": "Multi-line text input with automatic Field/Form integration. Same Field binding behavior as Input. autoGrow makes the height follow the content from rows up to maxRows, then it scrolls (CSS field-sizing, with a scrollHeight fallback; native grows with the content and caps at maxRows). The anchor props of Listbox.getAnchorProps() (role combobox, aria-controls, aria-expanded, aria-activedescendant) are forwarded as ARIA attributes on web and as the matching accessibility props on native, so a Listbox can be anchored to it while the editor keeps focus.",
|
|
7493
7512
|
"example": "<Field.Root name=\"message\">\n <Field.Label>Message</Field.Label>\n <Textarea placeholder=\"Tell us what you think...\" rows={4} />\n <Field.Description>At least 10 characters</Field.Description>\n <Field.Error />\n</Field.Root>",
|
|
7494
7513
|
"relatedTo": [
|
|
7495
7514
|
{
|
|
@@ -7507,12 +7526,26 @@
|
|
|
7507
7526
|
"Single-line input — use Input"
|
|
7508
7527
|
],
|
|
7509
7528
|
"whenToUse": [
|
|
7510
|
-
"Multi-line text entry (comments, messages, descriptions)"
|
|
7529
|
+
"Multi-line text entry (comments, messages, descriptions)",
|
|
7530
|
+
"A composer that grows with its text (autoGrow, maxRows)",
|
|
7531
|
+
"An editor a Listbox is anchored to for mentions or slash commands (spread Listbox.getAnchorProps())"
|
|
7511
7532
|
]
|
|
7512
7533
|
},
|
|
7513
7534
|
"name": "Textarea",
|
|
7514
7535
|
"native": true,
|
|
7515
7536
|
"props": [
|
|
7537
|
+
{
|
|
7538
|
+
"description": "The height follows the content, from `rows` up to `maxRows`, then it scrolls.",
|
|
7539
|
+
"name": "autoGrow",
|
|
7540
|
+
"required": false,
|
|
7541
|
+
"type": "true | false"
|
|
7542
|
+
},
|
|
7543
|
+
{
|
|
7544
|
+
"description": "The most rows the field shows before it scrolls. Default: no limit",
|
|
7545
|
+
"name": "maxRows",
|
|
7546
|
+
"required": false,
|
|
7547
|
+
"type": "number"
|
|
7548
|
+
},
|
|
7516
7549
|
{
|
|
7517
7550
|
"default": "'default'",
|
|
7518
7551
|
"name": "variant",
|
|
@@ -8159,7 +8192,7 @@
|
|
|
8159
8192
|
"aria-label"
|
|
8160
8193
|
]
|
|
8161
8194
|
},
|
|
8162
|
-
"description": "A row of controls with one tab stop (the WAI-ARIA toolbar pattern): Tab enters at the last focused control, Left/Right move across every control inside — through attached ButtonGroups too — and Home/End jump to the ends. A Select or Menu trigger keeps its own keys, and a control whose popup is open keeps Left/Right.",
|
|
8195
|
+
"description": "A row of controls with one tab stop (the WAI-ARIA toolbar pattern): Tab enters at the last focused control, Left/Right move across every control inside — through attached ButtonGroups too — and Home/End jump to the ends. A Select or Menu trigger keeps its own keys, and a control whose popup is open keeps Left/Right. On native it is the same row of controls without the roving tab stop and arrow keys.",
|
|
8163
8196
|
"example": "<Toolbar aria-label=\"Formatting\">\n <ButtonGroup attached aria-label=\"Text style\">\n <Toggle aria-label=\"Bold\" pressed={bold} onPressedChange={setBold}>B</Toggle>\n <Toggle aria-label=\"Italic\" pressed={italic} onPressedChange={setItalic}>I</Toggle>\n </ButtonGroup>\n <Menu.Root>\n <Menu.Trigger>Insert</Menu.Trigger>\n <Menu.Popup>…</Menu.Popup>\n </Menu.Root>\n</Toolbar>",
|
|
8164
8197
|
"relatedTo": [
|
|
8165
8198
|
{
|
|
@@ -8189,7 +8222,7 @@
|
|
|
8189
8222
|
]
|
|
8190
8223
|
},
|
|
8191
8224
|
"name": "Toolbar",
|
|
8192
|
-
"native":
|
|
8225
|
+
"native": true,
|
|
8193
8226
|
"props": [
|
|
8194
8227
|
{
|
|
8195
8228
|
"description": "Names the toolbar (\"Formatting\"). Required: a toolbar is a landmark-like widget.",
|
|
@@ -8452,7 +8485,7 @@
|
|
|
8452
8485
|
"optional": [],
|
|
8453
8486
|
"required": []
|
|
8454
8487
|
},
|
|
8455
|
-
"description": "A windowed list on @tanstack/react-virtual: only the rows in view (plus overscan) are mounted, and rows are measured so they may differ in height. role=\"list\" with listitem rows carrying aria-setsize and aria-posinset. anchor=\"end\" opens at the last item and stays pinned to the bottom while new items arrive and the reader is at the bottom (a transcript, a log). It fills its parent, or stops at maxHeight.
|
|
8488
|
+
"description": "A windowed list on @tanstack/react-virtual: only the rows in view (plus overscan) are mounted, and rows are measured so they may differ in height. role=\"list\" with listitem rows carrying aria-setsize and aria-posinset. anchor=\"end\" opens at the last item and stays pinned to the bottom while new items arrive and the reader is at the bottom (a transcript, a log). It fills its parent, or stops at maxHeight. onStartReached fires once each time the reader scrolls to the start (load older history), and prepending items keeps the first visible row in place. On native it is a FlatList with the same props (role list; rows carry no listitem role, which React Native lacks) (maintainVisibleContentPosition for prepend).",
|
|
8456
8489
|
"example": "<VirtualList\n aria-label=\"Transcript\"\n items={messages}\n getKey={(m) => m.id}\n estimateSize=\"controlLg\"\n anchor=\"end\"\n renderItem={(m) => <Text>{m.text}</Text>}\n/>",
|
|
8457
8490
|
"relatedTo": [
|
|
8458
8491
|
{
|
|
@@ -8473,11 +8506,12 @@
|
|
|
8473
8506
|
],
|
|
8474
8507
|
"whenToUse": [
|
|
8475
8508
|
"Hundreds to tens of thousands of rows: sessions, a chat transcript, log lines",
|
|
8476
|
-
"A list that grows at the bottom while the reader follows it (anchor=\"end\")"
|
|
8509
|
+
"A list that grows at the bottom while the reader follows it (anchor=\"end\")",
|
|
8510
|
+
"A transcript that pages older history in at the top (onStartReached, then prepend items)"
|
|
8477
8511
|
]
|
|
8478
8512
|
},
|
|
8479
8513
|
"name": "VirtualList",
|
|
8480
|
-
"native":
|
|
8514
|
+
"native": true,
|
|
8481
8515
|
"props": [
|
|
8482
8516
|
{
|
|
8483
8517
|
"name": "items",
|
|
@@ -8515,6 +8549,12 @@
|
|
|
8515
8549
|
"required": false,
|
|
8516
8550
|
"type": "'start' | 'end'"
|
|
8517
8551
|
},
|
|
8552
|
+
{
|
|
8553
|
+
"description": "Called once each time the reader scrolls to within 44px (touchTarget) of the start (load older history). It fires again only after they move away. A list too short to scroll calls it once for each new first item or length, until it fills. Prepending items keeps the first visible row where it was on screen.",
|
|
8554
|
+
"name": "onStartReached",
|
|
8555
|
+
"required": false,
|
|
8556
|
+
"type": "() => void"
|
|
8557
|
+
},
|
|
8518
8558
|
{
|
|
8519
8559
|
"description": "Cap the list's height; without it, it fills its parent.",
|
|
8520
8560
|
"name": "maxHeight",
|