@duro-app/cli 4.2.0 → 4.3.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 +179 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duro-app/cli",
3
- "version": "4.2.0",
3
+ "version": "4.3.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.2.0"
48
+ "@duro-app/ui": "^4.3.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/tokens": "^4.2.0",
64
- "@duro-app/ui": "^4.2.0",
65
- "@duro-app/eslint-plugin": "^4.2.0"
63
+ "@duro-app/tokens": "^4.3.0",
64
+ "@duro-app/eslint-plugin": "^4.3.0",
65
+ "@duro-app/ui": "^4.3.0"
66
66
  },
67
67
  "scripts": {
68
68
  "registry": "node scripts/build-registry.mjs",
package/registry.json CHANGED
@@ -1334,6 +1334,11 @@
1334
1334
  "kind": "contrast",
1335
1335
  "relationship": "Drawer is modal with backdrop; DetailPanel is non-modal and in-flow"
1336
1336
  },
1337
+ {
1338
+ "component": "Popover",
1339
+ "kind": "contrast",
1340
+ "relationship": "Popover is a small anchored overlay for a few controls; DetailPanel is an in-flow panel for long editing"
1341
+ },
1337
1342
  {
1338
1343
  "component": "Table",
1339
1344
  "kind": "composition",
@@ -1579,6 +1584,11 @@
1579
1584
  "component": "DetailPanel",
1580
1585
  "kind": "contrast",
1581
1586
  "relationship": "DetailPanel is non-modal and in-flow; Dialog is modal with backdrop"
1587
+ },
1588
+ {
1589
+ "component": "Popover",
1590
+ "kind": "contrast",
1591
+ "relationship": "Popover is a small non-modal card anchored to an element; Dialog is a modal decision"
1582
1592
  }
1583
1593
  ],
1584
1594
  "whenNotToUse": [
@@ -1932,6 +1942,11 @@
1932
1942
  "component": "DetailPanel",
1933
1943
  "kind": "contrast",
1934
1944
  "relationship": "DetailPanel is non-modal and in-flow; Drawer is modal with backdrop"
1945
+ },
1946
+ {
1947
+ "component": "Popover",
1948
+ "kind": "contrast",
1949
+ "relationship": "Popover is a small card anchored to an element; Drawer takes its place at phone width"
1935
1950
  }
1936
1951
  ],
1937
1952
  "whenNotToUse": [
@@ -3343,7 +3358,8 @@
3343
3358
  ],
3344
3359
  "whenNotToUse": [
3345
3360
  "Picking a value — use Select",
3346
- "Primary navigation — use SideNav or Tabs"
3361
+ "Primary navigation — use SideNav or Tabs",
3362
+ "A small form tied to the trigger — use Popover"
3347
3363
  ],
3348
3364
  "whenToUse": [
3349
3365
  "Context menu or \"more actions\" dropdown",
@@ -3686,6 +3702,167 @@
3686
3702
  "props": null,
3687
3703
  "sourcePath": "packages/ui/src/components/Panel/Panel.tsx"
3688
3704
  },
3705
+ "Popover": {
3706
+ "importPath": "@duro-app/ui",
3707
+ "kind": "compound",
3708
+ "meta": {
3709
+ "anatomy": {
3710
+ "optional": [
3711
+ "Trigger",
3712
+ "Close"
3713
+ ],
3714
+ "required": [
3715
+ "Root",
3716
+ "Popup"
3717
+ ]
3718
+ },
3719
+ "description": "Non-modal anchored overlay for small interactive content. Compound component — Root is required (throws without it). Anchored to Popover.Trigger, or to a virtual anchor (a () => DOMRect) when there is no Trigger; call reposition() through a ref when the anchor moves.",
3720
+ "example": "const ref = useRef<PopoverHandle>(null)\nconst anchor = () => new DOMRect(point.x, point.y, 0, 0)\n\n<Popover.Root ref={ref} open={open} onOpenChange={setOpen} anchor={anchor} side=\"bottom\" align=\"start\">\n <Popover.Popup label=\"Edit label\">\n <Field.Root>\n <Field.Label>Label</Field.Label>\n <Input value={label} onChange={(e) => setLabel(e.target.value)} />\n </Field.Root>\n <Popover.Close>Done</Popover.Close>\n </Popover.Popup>\n</Popover.Root>\n// after the anchor moves: ref.current?.reposition()",
3721
+ "relatedTo": [
3722
+ {
3723
+ "component": "Menu",
3724
+ "kind": "contrast",
3725
+ "relationship": "Menu opens a list of actions; Popover holds small forms and controls"
3726
+ },
3727
+ {
3728
+ "component": "Tooltip",
3729
+ "kind": "contrast",
3730
+ "relationship": "Tooltip shows hover-only text; Popover holds interactive content and stays open"
3731
+ },
3732
+ {
3733
+ "component": "Dialog",
3734
+ "kind": "contrast",
3735
+ "relationship": "Dialog is modal and blocks the page; Popover is non-modal and anchored"
3736
+ },
3737
+ {
3738
+ "component": "DetailPanel",
3739
+ "kind": "contrast",
3740
+ "relationship": "DetailPanel is an in-flow panel for long editing; Popover is a small anchored overlay"
3741
+ },
3742
+ {
3743
+ "component": "Drawer",
3744
+ "kind": "contrast",
3745
+ "relationship": "Drawer is the modal edge panel for phone width; Popover is anchored and non-modal"
3746
+ },
3747
+ {
3748
+ "component": "Field",
3749
+ "kind": "composition",
3750
+ "relationship": "Place Field.Root with its control inside Popover.Popup for a labelled field"
3751
+ }
3752
+ ],
3753
+ "whenNotToUse": [
3754
+ "A list of actions — use Menu",
3755
+ "Hover-only text — use Tooltip",
3756
+ "A blocking decision — use Dialog or ConfirmDialog",
3757
+ "A long editor, or one that follows the selection — use DetailPanel",
3758
+ "Phone width — use Drawer"
3759
+ ],
3760
+ "whenToUse": [
3761
+ "A small form or controls tied to one element that stay open while you work in them",
3762
+ "Anchoring to a spot that is not a button (a canvas point, a text selection) with a virtual anchor"
3763
+ ]
3764
+ },
3765
+ "name": "Popover",
3766
+ "parts": {
3767
+ "Close": {
3768
+ "name": "Close",
3769
+ "props": [
3770
+ {
3771
+ "name": "children",
3772
+ "required": true,
3773
+ "type": "ReactNode"
3774
+ }
3775
+ ],
3776
+ "sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
3777
+ },
3778
+ "Popup": {
3779
+ "name": "Popup",
3780
+ "props": [
3781
+ {
3782
+ "name": "children",
3783
+ "required": true,
3784
+ "type": "ReactNode"
3785
+ },
3786
+ {
3787
+ "description": "Accessible name for the dialog.",
3788
+ "name": "label",
3789
+ "required": true,
3790
+ "type": "string"
3791
+ }
3792
+ ],
3793
+ "sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
3794
+ },
3795
+ "Root": {
3796
+ "name": "Root",
3797
+ "props": [
3798
+ {
3799
+ "name": "children",
3800
+ "required": true,
3801
+ "type": "ReactNode"
3802
+ },
3803
+ {
3804
+ "name": "open",
3805
+ "required": false,
3806
+ "type": "boolean"
3807
+ },
3808
+ {
3809
+ "default": "false",
3810
+ "name": "defaultOpen",
3811
+ "required": false,
3812
+ "type": "boolean"
3813
+ },
3814
+ {
3815
+ "name": "onOpenChange",
3816
+ "required": false,
3817
+ "type": "(open: boolean) => void"
3818
+ },
3819
+ {
3820
+ "default": "'bottom'",
3821
+ "name": "side",
3822
+ "required": false,
3823
+ "type": "PopoverSide"
3824
+ },
3825
+ {
3826
+ "default": "'start'",
3827
+ "name": "align",
3828
+ "required": false,
3829
+ "type": "PopoverAlign"
3830
+ },
3831
+ {
3832
+ "description": "Virtual anchor: a viewport rect. Replaces the Trigger as the anchor.",
3833
+ "name": "anchor",
3834
+ "required": false,
3835
+ "type": "() => DOMRect"
3836
+ },
3837
+ {
3838
+ "description": "Elements (or getters) whose pointerdown does not count as an outside press.",
3839
+ "name": "ignore",
3840
+ "required": false,
3841
+ "type": "ReadonlyArray<IgnoreEntry>"
3842
+ },
3843
+ {
3844
+ "name": "ref",
3845
+ "required": false,
3846
+ "type": "Ref<PopoverHandle>"
3847
+ }
3848
+ ],
3849
+ "sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
3850
+ },
3851
+ "Trigger": {
3852
+ "name": "Trigger",
3853
+ "props": [
3854
+ {
3855
+ "name": "children",
3856
+ "required": true,
3857
+ "type": "ReactNode"
3858
+ }
3859
+ ],
3860
+ "sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
3861
+ }
3862
+ },
3863
+ "props": null,
3864
+ "sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
3865
+ },
3689
3866
  "RadioGroup": {
3690
3867
  "importPath": "@duro-app/ui",
3691
3868
  "kind": "compound",
@@ -5831,7 +6008,7 @@
5831
6008
  "example": "<Tooltip.Root content=\"Delete this item permanently\" placement=\"top\">\n <Tooltip.Trigger>\n <Button variant=\"danger\">Delete</Button>\n </Tooltip.Trigger>\n</Tooltip.Root>",
5832
6009
  "whenNotToUse": [
5833
6010
  "Critical information that must always be visible — use Text or Callout",
5834
- "Interactive content (links, buttons) — tooltips are not interactive"
6011
+ "Interactive content (links, buttons) — tooltips are not interactive — use Popover"
5835
6012
  ],
5836
6013
  "whenToUse": [
5837
6014
  "Providing extra context on hover for icon-only buttons",