@duro-app/cli 4.4.0 → 4.5.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 +50 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duro-app/cli",
3
- "version": "4.4.0",
3
+ "version": "4.5.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.",
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@modelcontextprotocol/sdk": ">=1.0.0",
48
- "@duro-app/ui": "^4.4.0"
48
+ "@duro-app/ui": "^4.5.0"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@duro-app/ui": {
@@ -60,9 +60,9 @@
60
60
  "@types/node": "^24.0.0",
61
61
  "ts-morph": "^26.0.0",
62
62
  "typescript": "^5.7.0",
63
- "@duro-app/eslint-plugin": "^4.4.0",
64
- "@duro-app/tokens": "^4.4.0",
65
- "@duro-app/ui": "^4.4.0"
63
+ "@duro-app/eslint-plugin": "^4.5.0",
64
+ "@duro-app/tokens": "^4.5.0",
65
+ "@duro-app/ui": "^4.5.0"
66
66
  },
67
67
  "scripts": {
68
68
  "registry": "node scripts/build-registry.mjs",
package/registry.json CHANGED
@@ -1059,6 +1059,11 @@
1059
1059
  "description": "Searchable dropdown for selecting a value from a filterable list. Combines a text input with a popup listbox. Compound component — Root is required.",
1060
1060
  "example": "<Combobox.Root name=\"country\" defaultValue=\"us\" initialLabels={{us: 'United States'}}>\n <Combobox.Input placeholder=\"Search countries…\" />\n <Combobox.Popup>\n <Combobox.Item value=\"us\">United States</Combobox.Item>\n <Combobox.Item value=\"gb\">United Kingdom</Combobox.Item>\n <Combobox.Item value=\"fr\">France</Combobox.Item>\n <Combobox.Item value=\"de\">Germany</Combobox.Item>\n <Combobox.Empty>No countries found</Combobox.Empty>\n </Combobox.Popup>\n</Combobox.Root>",
1061
1061
  "relatedTo": [
1062
+ {
1063
+ "component": "Popover",
1064
+ "kind": "composition",
1065
+ "relationship": "Inside Popover.Popup a Combobox keeps the popover open while you choose; Escape closes only the list"
1066
+ },
1062
1067
  {
1063
1068
  "component": "Select",
1064
1069
  "kind": "contrast",
@@ -1953,7 +1958,7 @@
1953
1958
  "Portal"
1954
1959
  ]
1955
1960
  },
1956
- "description": "Modal sliding panel from a screen edge (right, left, or bottom). Slides in with backdrop overlay. Supports swipe-to-dismiss gestures on mobile, backdrop click dismiss, and Escape key. Use for secondary workflows, settings panels, or mobile-friendly detail views.",
1961
+ "description": "Modal sliding panel from a screen edge (right, left, or bottom). Slides in with backdrop overlay. Supports swipe-to-dismiss gestures on mobile, backdrop click dismiss, and Escape key. Swipe yields to an inner Duro ScrollArea: a drag there scrolls it, and dismisses only toward the edge from the scroll start (a native overflow:auto child is not covered — use ScrollArea). Use for secondary workflows, settings panels, or mobile-friendly detail views.",
1957
1962
  "example": "<Drawer.Root anchor=\"right\" open={open} onOpenChange={setOpen}>\n <Drawer.Trigger>\n <Button>Open drawer</Button>\n </Drawer.Trigger>\n <Drawer.Portal size=\"md\">\n <Drawer.Header>\n <Drawer.Title>Settings</Drawer.Title>\n <Drawer.Close />\n </Drawer.Header>\n <Drawer.Body>\n <Stack gap=\"md\">\n <Text>Drawer content goes here.</Text>\n </Stack>\n </Drawer.Body>\n <Drawer.Footer>\n <Button variant=\"secondary\" onClick={() => setOpen(false)}>Done</Button>\n </Drawer.Footer>\n </Drawer.Portal>\n</Drawer.Root>",
1958
1963
  "relatedTo": [
1959
1964
  {
@@ -3767,6 +3772,11 @@
3767
3772
  "kind": "contrast",
3768
3773
  "relationship": "Drawer is the modal edge panel for phone width; Popover is anchored and non-modal"
3769
3774
  },
3775
+ {
3776
+ "component": "Select",
3777
+ "kind": "composition",
3778
+ "relationship": "A Select or Combobox inside Popover.Popup keeps the popover open while you choose; a Select backdrop press closes only its list"
3779
+ },
3770
3780
  {
3771
3781
  "component": "Field",
3772
3782
  "kind": "composition",
@@ -3782,7 +3792,8 @@
3782
3792
  ],
3783
3793
  "whenToUse": [
3784
3794
  "A small form or controls tied to one element that stay open while you work in them",
3785
- "Anchoring to a spot that is not a button (a canvas point, a text selection) with a virtual anchor"
3795
+ "Anchoring to a spot that is not a button (a canvas point, a text selection) with a virtual anchor",
3796
+ "Holding a Select or Combobox: their portalled list counts as inside the popover, so choosing an item keeps it open; Escape closes an open Select, Combobox or Menu before the popover"
3786
3797
  ]
3787
3798
  },
3788
3799
  "name": "Popover",
@@ -4011,7 +4022,7 @@
4011
4022
  "Thumb"
4012
4023
  ]
4013
4024
  },
4014
- "description": "Custom scrollbar region with draggable thumb. Supports vertical and horizontal scrolling. Compound component — Root is required.",
4025
+ "description": "Custom scrollbar region with draggable thumb. Supports vertical and horizontal scrolling. Compound component — Root is required. Inside a Drawer, a drag in the viewport scrolls it; the drawer only takes a drag toward its edge from the scroll start.",
4015
4026
  "example": "<ScrollArea.Root>\n <ScrollArea.Viewport maxHeight={300}>\n <ScrollArea.Content>\n {/* Long content here */}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar orientation=\"vertical\">\n <ScrollArea.Thumb orientation=\"vertical\" />\n </ScrollArea.Scrollbar>\n</ScrollArea.Root>",
4016
4027
  "whenNotToUse": [
4017
4028
  "Simple page-level scrolling — browser scroll is fine",
@@ -4087,6 +4098,19 @@
4087
4098
  "name": "maxHeight",
4088
4099
  "required": false,
4089
4100
  "type": "number | string"
4101
+ },
4102
+ {
4103
+ "description": "Extra styles for the viewport (e.g. a pointer-aware max height).",
4104
+ "name": "style",
4105
+ "required": false,
4106
+ "type": "ComponentProps<typeof html.div>['style']"
4107
+ },
4108
+ {
4109
+ "default": "false",
4110
+ "description": "A roving-focus group owns the keyboard: drop the viewport's own tab stop and region role.",
4111
+ "name": "rovingOwner",
4112
+ "required": false,
4113
+ "type": "boolean"
4090
4114
  }
4091
4115
  ],
4092
4116
  "sourcePath": "packages/ui/src/components/ScrollArea/ScrollArea.tsx"
@@ -4115,6 +4139,11 @@
4115
4139
  "description": "Dropdown select for choosing one value from a list. Compound component — Root is required (throws without it).",
4116
4140
  "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>",
4117
4141
  "relatedTo": [
4142
+ {
4143
+ "component": "Popover",
4144
+ "kind": "composition",
4145
+ "relationship": "Inside Popover.Popup a Select keeps the popover open while you choose; its backdrop press and Escape close only the list"
4146
+ },
4118
4147
  {
4119
4148
  "component": "Menu",
4120
4149
  "kind": "contrast",
@@ -5829,7 +5858,7 @@
5829
5858
  "importPath": "@duro-app/ui",
5830
5859
  "kind": "component",
5831
5860
  "meta": {
5832
- "description": "Toggle button with pressed/unpressed state. Works standalone or within ToggleGroup for multi/single selection.",
5861
+ "description": "Toggle button with pressed/unpressed state. Works standalone or within ToggleGroup for multi/single selection. Under a coarse pointer (touch) every Toggle is at least 44×44px; in a wrapping ToggleGroup each keeps its own border and a fixed row height.",
5833
5862
  "example": "// Standalone\n<Toggle pressed={isBold} onPressedChange={setIsBold} aria-label=\"Bold\">\n <Icon name=\"key\" size=\"sm\" />\n</Toggle>\n\n// In a group\n<ToggleGroup value={['grid']} onValueChange={setView} multiple={false}>\n <Toggle value=\"list\">List</Toggle>\n <Toggle value=\"grid\">Grid</Toggle>\n</ToggleGroup>",
5834
5863
  "relatedTo": [
5835
5864
  {
@@ -5921,7 +5950,7 @@
5921
5950
  "kind": "component",
5922
5951
  "meta": {
5923
5952
  "description": "Container for Toggle buttons enabling single or multi selection. Provides context to child Toggles.",
5924
- "example": "<ToggleGroup\n value={selected}\n onValueChange={setSelected}\n multiple={false}\n orientation=\"horizontal\"\n size=\"default\"\n>\n <Toggle value=\"list\">List view</Toggle>\n <Toggle value=\"grid\">Grid view</Toggle>\n <Toggle value=\"board\">Board view</Toggle>\n</ToggleGroup>",
5953
+ "example": "<ToggleGroup\n value={selected}\n onValueChange={setSelected}\n multiple={false}\n orientation=\"horizontal\"\n size=\"default\"\n>\n <Toggle value=\"list\">List view</Toggle>\n <Toggle value=\"grid\">Grid view</Toggle>\n <Toggle value=\"board\">Board view</Toggle>\n</ToggleGroup>\n\n// Icon choices: wraps onto rows, scrolls past three, one tab stop\n<ToggleGroup wrap maxRows={3} size=\"small\" value={[icon]} onValueChange={(v) => v[0] && setIcon(v[0])} aria-label=\"Icon\">\n {names.map((name) => (\n <Toggle key={name} value={name} aria-label={name}>\n <Icon name={name} size=\"sm\" />\n </Toggle>\n ))}\n</ToggleGroup>",
5925
5954
  "relatedTo": [
5926
5955
  {
5927
5956
  "component": "Toggle",
@@ -5936,12 +5965,13 @@
5936
5965
  ],
5937
5966
  "whenNotToUse": [
5938
5967
  "Dropdown selection — use Select",
5939
- "Many options (5+) — use Select for space efficiency",
5968
+ "Many text options (5+) — use Select for space efficiency; does not apply to icon-only choices, which keep options visible and open no layer",
5940
5969
  "Form checkboxes — use Checkbox group in Fieldset"
5941
5970
  ],
5942
5971
  "whenToUse": [
5943
5972
  "Visible option set where user picks one or more (view mode, filter categories)",
5944
- "Segmented control pattern"
5973
+ "Segmented control pattern",
5974
+ "A visible grid of icon choices: wrap + maxRows (rows scroll past maxRows, one tab stop with arrow keys, 44px touch targets)"
5945
5975
  ]
5946
5976
  },
5947
5977
  "name": "ToggleGroup",
@@ -5997,6 +6027,19 @@
5997
6027
  "small"
5998
6028
  ]
5999
6029
  },
6030
+ {
6031
+ "default": "false",
6032
+ "description": "Items wrap onto rows, each with its own border (default false). Enables roving focus: one tab stop, arrow keys move between items.",
6033
+ "name": "wrap",
6034
+ "required": false,
6035
+ "type": "boolean"
6036
+ },
6037
+ {
6038
+ "description": "Caps a wrapping group at this many rows (plus half a row, hinting more) and scrolls the rest. Only with `wrap`; ignored without it.",
6039
+ "name": "maxRows",
6040
+ "required": false,
6041
+ "type": "number"
6042
+ },
6000
6043
  {
6001
6044
  "description": "Accessible name when the group is not inside a Field.Root (inside one, the Field.Label names it).",
6002
6045
  "name": "aria-label",