@duro-app/cli 5.30.0 → 5.32.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 +80 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duro-app/cli",
3
- "version": "5.30.0",
3
+ "version": "5.32.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.30.0"
49
+ "@duro-app/ui": "^5.32.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.30.0",
65
- "@duro-app/ui": "^5.30.0",
66
- "@duro-app/tokens": "^5.30.0"
64
+ "@duro-app/eslint-plugin": "^5.32.0",
65
+ "@duro-app/ui": "^5.32.0",
66
+ "@duro-app/tokens": "^5.32.0"
67
67
  },
68
68
  "scripts": {
69
69
  "registry": "node scripts/build-registry.mjs",
package/registry.json CHANGED
@@ -5596,7 +5596,7 @@
5596
5596
  "Item"
5597
5597
  ]
5598
5598
  },
5599
- "description": "Dropdown select for choosing one value from a list. Compound component — Root is required (throws without it). Select.Trigger takes size=\"small\" to match small Toggles and Buttons in a toolbar. Select.Popup takes label (the list's accessible name) and empty (shown in place of the list when it has no items). On the web the list opens below the trigger, or above it when it would overflow the viewport below and fits above. On React Native the trigger opens a bottom sheet (a Drawer at the medium and large detents) titled by label, with a Cancel text button (cancelLabel); the chosen option is filled with a trailing check, and a press picks an option and closes the sheet. Native has no arrow keys: each option is its own screen-reader stop. An Item can be disabled (shown, skipped by the keys, inert to a press, announced as disabled), and onOpenChange on Root reports the list opening and closing, so work such as checking which options are available starts only once someone is choosing.",
5599
+ "description": "Dropdown select for choosing one value from a list. Compound component — Root is required (throws without it). Select.Trigger takes size=\"small\" to match small Toggles and Buttons in a toolbar. Select.Popup takes label (the list's accessible name) and empty (shown in place of the list when it has no items). On the web the list opens below the trigger, or above it when it would overflow the viewport below and fits above. On React Native the trigger opens a bottom sheet (a Drawer at the medium and large detents) titled by label, with a Cancel text button (cancelLabel); the chosen option is filled with a trailing check, and a press picks an option and closes the sheet. Native has no arrow keys: each option is its own screen-reader stop. An Item can be disabled (shown, skipped by the keys, inert to a press, announced as disabled), and onOpenChange on Root reports the list opening and closing, so work such as checking which options are available starts only once someone is choosing. Root takes disabled for the whole control: the trigger is a disabled button (announced so, on native too) and does not open.",
5600
5600
  "example": "<Select.Root name=\"role\" defaultValue=\"viewer\">\n <Select.Trigger>\n <Select.Value placeholder=\"Select role\" />\n <Select.Icon />\n </Select.Trigger>\n <Select.Popup>\n <Select.Item value=\"admin\">Admin</Select.Item>\n <Select.Item value=\"editor\">Editor</Select.Item>\n <Select.Item value=\"viewer\">Viewer</Select.Item>\n </Select.Popup>\n</Select.Root>",
5601
5601
  "relatedTo": [
5602
5602
  {
@@ -5736,6 +5736,13 @@
5736
5736
  "required": false,
5737
5737
  "type": "(open: boolean) => void"
5738
5738
  },
5739
+ {
5740
+ "default": "false",
5741
+ "description": "The whole control is disabled: the trigger is a disabled button and does not open.",
5742
+ "name": "disabled",
5743
+ "required": false,
5744
+ "type": "boolean"
5745
+ },
5739
5746
  {
5740
5747
  "name": "children",
5741
5748
  "required": true,
@@ -8539,6 +8546,65 @@
8539
8546
  "props": null,
8540
8547
  "sourcePath": "packages/ui/src/components/Tree/Tree.tsx"
8541
8548
  },
8549
+ "Video": {
8550
+ "importPath": "@duro-app/ui",
8551
+ "kind": "component",
8552
+ "meta": {
8553
+ "description": "A video file with the browser's own controls: a <video> as wide as its container (never wider, at its own ratio) with one source of the given MIME type, named for assistive tech by label. preload is metadata by default (duration and first frame, not the whole file). Web only: on React Native, host your own player (expo-video) behind a .native.tsx leaf.",
8554
+ "example": "<Video src={objectUrl} type=\"video/mp4\" label={fileName} />",
8555
+ "whenNotToUse": [
8556
+ "A decorative or autoplaying background — Duro has none",
8557
+ "An image — use an img or Prose"
8558
+ ],
8559
+ "whenToUse": [
8560
+ "A video file the person opened: a screen recording, a clip in a file viewer",
8561
+ "A video an app turned into an object URL from bytes it fetched"
8562
+ ]
8563
+ },
8564
+ "name": "Video",
8565
+ "native": false,
8566
+ "props": [
8567
+ {
8568
+ "description": "The video's URL: a file URL, or an object URL an app made from bytes it fetched.",
8569
+ "name": "src",
8570
+ "required": true,
8571
+ "type": "string"
8572
+ },
8573
+ {
8574
+ "description": "Its MIME type (`video/mp4`, `video/webm`), so the browser picks a playable source.",
8575
+ "name": "type",
8576
+ "required": true,
8577
+ "type": "string"
8578
+ },
8579
+ {
8580
+ "description": "The accessible name: what the video shows (its file name, a caption).",
8581
+ "name": "label",
8582
+ "required": true,
8583
+ "type": "string"
8584
+ },
8585
+ {
8586
+ "default": "true",
8587
+ "description": "The browser's own play, seek and volume controls. Default: true.",
8588
+ "name": "controls",
8589
+ "required": false,
8590
+ "type": "boolean"
8591
+ },
8592
+ {
8593
+ "default": "'metadata'",
8594
+ "description": "How much to fetch before play: metadata (duration, first frame) by default.",
8595
+ "name": "preload",
8596
+ "required": false,
8597
+ "type": "'none' | 'metadata' | 'auto'"
8598
+ },
8599
+ {
8600
+ "description": "The video element, e.g. to pause it from elsewhere.",
8601
+ "name": "ref",
8602
+ "required": false,
8603
+ "type": "Ref<HTMLVideoElement>"
8604
+ }
8605
+ ],
8606
+ "sourcePath": "packages/ui/src/components/Video/Video.tsx"
8607
+ },
8542
8608
  "VirtualList": {
8543
8609
  "importPath": "@duro-app/ui",
8544
8610
  "kind": "component",
@@ -8547,7 +8613,7 @@
8547
8613
  "optional": [],
8548
8614
  "required": []
8549
8615
  },
8550
- "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.",
8616
+ "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. onAtEndChange(atEnd) is called once each time the reader comes within 44px of the end or leaves it, so a host can record whether the reader follows the live tail; scrollToEndKey scrolls to the end and resumes anchor=\"end\" following each time it changes to a new non-null value (the host's own send), even when the reader had scrolled up.",
8551
8617
  "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/>",
8552
8618
  "relatedTo": [
8553
8619
  {
@@ -8623,6 +8689,18 @@
8623
8689
  "required": false,
8624
8690
  "type": "() => void"
8625
8691
  },
8692
+ {
8693
+ "description": "Called once each time the reader comes within 44px (touchTarget) of the end or leaves it, with `true` at the end and `false` away from it, so a host can record whether the reader follows the live tail. It never repeats a value.",
8694
+ "name": "onAtEndChange",
8695
+ "required": false,
8696
+ "type": "(atEnd: boolean) => void"
8697
+ },
8698
+ {
8699
+ "description": "Scroll to the end, and resume `anchor=\"end\"` following, each time the key changes to a new non-null value (a host's own send), even when the reader had scrolled up. The key present at the first render does nothing; `null` does nothing.",
8700
+ "name": "scrollToEndKey",
8701
+ "required": false,
8702
+ "type": "string | number | null"
8703
+ },
8626
8704
  {
8627
8705
  "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.",
8628
8706
  "name": "scrollToKey",