@duro-app/cli 5.25.0 → 5.27.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 (2) hide show
  1. package/package.json +5 -5
  2. package/registry.json +35 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duro-app/cli",
3
- "version": "5.25.0",
3
+ "version": "5.27.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.25.0"
49
+ "@duro-app/ui": "^5.27.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.25.0",
65
- "@duro-app/tokens": "^5.25.0",
66
- "@duro-app/ui": "^5.25.0"
64
+ "@duro-app/tokens": "^5.27.0",
65
+ "@duro-app/ui": "^5.27.0",
66
+ "@duro-app/eslint-plugin": "^5.27.0"
67
67
  },
68
68
  "scripts": {
69
69
  "registry": "node scripts/build-registry.mjs",
package/registry.json CHANGED
@@ -1193,7 +1193,7 @@
1193
1193
  "importPath": "@duro-app/ui",
1194
1194
  "kind": "component",
1195
1195
  "meta": {
1196
- "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.",
1196
+ "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. A diff can carry a lineAction (a button beside each line inside a hunk, one tab stop, Up and Down between them; the line handed over has its old and new line numbers) and renderAfterLine (content under a line, full width: a review comment, an editor); the copied text stays the diff.",
1197
1197
  "example": "<CodeBlock copyLabel=\"Copy\" copiedLabel=\"Copied\">\n <code>pnpm add @duro-app/ui</code>\n</CodeBlock>",
1198
1198
  "relatedTo": [
1199
1199
  {
@@ -1213,7 +1213,8 @@
1213
1213
  ],
1214
1214
  "whenToUse": [
1215
1215
  "Code or a command the reader is likely to paste: a docs page, an install step",
1216
- "A Markdown renderer's pre, inside Prose"
1216
+ "A Markdown renderer's pre, inside Prose",
1217
+ "A diff people comment on line by line (lineAction, renderAfterLine)"
1217
1218
  ]
1218
1219
  },
1219
1220
  "name": "CodeBlock",
@@ -1255,6 +1256,18 @@
1255
1256
  "name": "onCopyError",
1256
1257
  "required": false,
1257
1258
  "type": "(error: unknown) => void"
1259
+ },
1260
+ {
1261
+ "description": "With `language=\"diff\"`: a button in a gutter beside each line it is available on. The gutter is one tab stop; Up and Down move between its buttons.",
1262
+ "name": "lineAction",
1263
+ "required": false,
1264
+ "type": "CodeBlockLineAction"
1265
+ },
1266
+ {
1267
+ "description": "With `language=\"diff\"`: content shown under a line, full width (a comment thread, an editor). Return null for lines with nothing under them. What is copied stays the diff text.",
1268
+ "name": "renderAfterLine",
1269
+ "required": false,
1270
+ "type": "(line: DiffLineInfo) => ReactNode"
1258
1271
  }
1259
1272
  ],
1260
1273
  "sourcePath": "packages/ui/src/components/CodeBlock/CodeBlock.tsx"
@@ -7525,7 +7538,7 @@
7525
7538
  "importPath": "@duro-app/ui",
7526
7539
  "kind": "component",
7527
7540
  "meta": {
7528
- "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.",
7541
+ "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. On the web, onFiles receives files pasted into the field or dropped on it (the drop ring shows while files are dragged over it); text pastes stay text.",
7529
7542
  "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>",
7530
7543
  "relatedTo": [
7531
7544
  {
@@ -7640,6 +7653,12 @@
7640
7653
  "required": false,
7641
7654
  "type": "(e: React.KeyboardEvent<HTMLTextAreaElement>) => void"
7642
7655
  },
7656
+ {
7657
+ "description": "Web: files pasted into the field or dropped on it (a screenshot, a log). The field shows the drop ring while files are dragged over it. Text pastes and drops stay text. Native: never called; attach with FileTrigger.",
7658
+ "name": "onFiles",
7659
+ "required": false,
7660
+ "type": "(files: readonly File[]) => void"
7661
+ },
7643
7662
  {
7644
7663
  "name": "ref",
7645
7664
  "required": false,
@@ -8508,7 +8527,7 @@
8508
8527
  "optional": [],
8509
8528
  "required": []
8510
8529
  },
8511
- "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). The scroll region is a tab stop with a focus ring, so the keyboard can scroll rows that hold no control.",
8530
+ "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). The scroll region is a tab stop with a focus ring, so the keyboard can scroll rows that hold no control. onEndReached mirrors onStartReached at the end (load newer items in a window opened on an older point); scrollToKey centres one item each time it changes to a key in the list (a link to one message), and anchor=\"end\" stops following the end while it applies.",
8512
8531
  "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/>",
8513
8532
  "relatedTo": [
8514
8533
  {
@@ -8578,6 +8597,18 @@
8578
8597
  "required": false,
8579
8598
  "type": "() => void"
8580
8599
  },
8600
+ {
8601
+ "description": "Called once each time the reader scrolls to within 44px (touchTarget) of the end (load newer items, as in a window opened on an older point). It fires again only after they move away.",
8602
+ "name": "onEndReached",
8603
+ "required": false,
8604
+ "type": "() => void"
8605
+ },
8606
+ {
8607
+ "description": "Bring this item into view, centred, each time the key changes to an item in the list (a link to one message). A key not in the list yet waits for the items that hold it; `null` or `undefined` does nothing. While it applies, `anchor=\"end\"` stops following the end.",
8608
+ "name": "scrollToKey",
8609
+ "required": false,
8610
+ "type": "string | number | null"
8611
+ },
8581
8612
  {
8582
8613
  "description": "Cap the list's height; without it, it fills its parent.",
8583
8614
  "name": "maxHeight",