shapes-ui 0.4.0 → 0.4.2

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 (85) hide show
  1. package/.idea/compiler.xml +6 -0
  2. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  3. package/.idea/vcs.xml +6 -0
  4. package/CHANGELOG.md +18 -0
  5. package/content/components/menu.mdx +29 -2
  6. package/content/components/menubar.mdx +4 -2
  7. package/content/components/meter.mdx +13 -1
  8. package/content/components/navigation-menu.mdx +6 -0
  9. package/content/components/number-field.mdx +24 -0
  10. package/content/components/popover.mdx +20 -0
  11. package/content/components/preview-card.mdx +11 -0
  12. package/content/components/progress.mdx +2 -0
  13. package/examples/__index.tsx +141 -96
  14. package/examples/menu-advanced.tsx +131 -0
  15. package/examples/menu-align.tsx +33 -0
  16. package/examples/menu-checkbox.tsx +28 -0
  17. package/examples/menu-demo.tsx +43 -12
  18. package/examples/menu-group.tsx +41 -0
  19. package/examples/menu-radio.tsx +23 -0
  20. package/examples/menu-submenu.tsx +43 -0
  21. package/examples/menubar-advanced.tsx +91 -0
  22. package/examples/meter-demo.tsx +1 -22
  23. package/examples/meter-flip.tsx +13 -0
  24. package/examples/meter-no-label.tsx +5 -0
  25. package/examples/meter-no-value.tsx +13 -0
  26. package/examples/navigation-menu-demo.tsx +113 -1
  27. package/examples/number-field-buttons-end.tsx +20 -0
  28. package/examples/number-field-demo.tsx +17 -1
  29. package/examples/number-field-scrub.tsx +38 -0
  30. package/examples/popover-demo.tsx +18 -1
  31. package/examples/popover-form.tsx +46 -0
  32. package/examples/popover-positions.tsx +54 -0
  33. package/examples/preview-card-demo.tsx +26 -1
  34. package/examples/preview-card-links.tsx +38 -0
  35. package/examples/progress-demo.tsx +33 -1
  36. package/package.json +1 -1
  37. package/public/r/accordion.json +5 -2
  38. package/public/r/alert-dialog.json +7 -3
  39. package/public/r/alert.json +4 -2
  40. package/public/r/autocomplete.json +18 -0
  41. package/public/r/avatar.json +15 -0
  42. package/public/r/badge.json +4 -2
  43. package/public/r/button-group.json +7 -3
  44. package/public/r/button.json +5 -2
  45. package/public/r/card.json +1 -1
  46. package/public/r/checkbox.json +5 -2
  47. package/public/r/collapsible.json +4 -2
  48. package/public/r/combobox.json +9 -3
  49. package/public/r/context-menu.json +5 -2
  50. package/public/r/dialog.json +9 -4
  51. package/public/r/drawer.json +8 -3
  52. package/public/r/field.json +5 -2
  53. package/public/r/fieldset.json +4 -2
  54. package/public/r/form.json +15 -0
  55. package/public/r/index.json +21 -2
  56. package/public/r/input-group.json +9 -3
  57. package/public/r/input.json +4 -2
  58. package/public/r/menu.json +16 -0
  59. package/public/r/menubar.json +16 -0
  60. package/public/r/meter.json +15 -0
  61. package/public/r/navigation-menu.json +16 -0
  62. package/public/r/number-field.json +18 -0
  63. package/public/r/popover.json +15 -0
  64. package/public/r/preview-card.json +15 -0
  65. package/public/r/progress.json +15 -0
  66. package/public/r/radio.json +16 -0
  67. package/public/r/scroll-area.json +5 -3
  68. package/public/r/select.json +16 -0
  69. package/public/r/separator.json +4 -2
  70. package/public/r/slider.json +15 -0
  71. package/public/r/switch.json +15 -0
  72. package/public/r/tabs.json +16 -0
  73. package/public/r/textarea.json +1 -1
  74. package/public/r/toast.json +16 -0
  75. package/public/r/toggle.json +16 -0
  76. package/public/r/toolbar.json +15 -0
  77. package/src/components/ui/menu.tsx +42 -16
  78. package/src/components/ui/menubar.tsx +52 -18
  79. package/src/components/ui/meter.tsx +7 -5
  80. package/src/components/ui/navigation-menu.tsx +121 -38
  81. package/src/components/ui/number-field.tsx +42 -46
  82. package/src/components/ui/popover.tsx +7 -2
  83. package/src/components/ui/preview-card.tsx +4 -2
  84. package/src/components/ui/progress.tsx +7 -18
  85. package/src/routeTree.gen.ts +79 -78
@@ -0,0 +1,28 @@
1
+ import { useState } from "react";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Menu, MenuTrigger, MenuPopup, MenuCheckboxItem } from "@/components/ui/menu";
5
+
6
+ export default function MenuCheckboxDemo() {
7
+ const [showHidden, setShowHidden] = useState(true);
8
+ const [compact, setCompact] = useState(false);
9
+
10
+ return (
11
+ <Menu>
12
+ <MenuTrigger>
13
+ <Button variant="outline">Checkbox items</Button>
14
+ </MenuTrigger>
15
+ <MenuPopup>
16
+ <MenuCheckboxItem
17
+ checked={showHidden}
18
+ onCheckedChange={(val) => setShowHidden(Boolean(val))}
19
+ >
20
+ Show hidden files
21
+ </MenuCheckboxItem>
22
+ <MenuCheckboxItem checked={compact} onCheckedChange={(val) => setCompact(Boolean(val))}>
23
+ Compact mode
24
+ </MenuCheckboxItem>
25
+ </MenuPopup>
26
+ </Menu>
27
+ );
28
+ }
@@ -1,32 +1,63 @@
1
- import { useState } from "react";
1
+ import { BellRingIcon, CreditCardIcon, LogOutIcon, TargetIcon, UserPenIcon } from "lucide-react";
2
2
 
3
+ import { Avatar, AvatarFallback } from "@/components/ui/avatar";
4
+ import { Badge } from "@/components/ui/badge";
3
5
  import { Button } from "@/components/ui/button";
4
6
  import {
5
7
  Menu,
6
8
  MenuTrigger,
7
9
  MenuPopup,
8
- MenuItem,
10
+ MenuGroup,
11
+ MenuLabel,
9
12
  MenuSeparator,
10
- MenuCheckboxItem,
13
+ MenuItem,
11
14
  } from "@/components/ui/menu";
12
15
 
13
16
  export default function MenuDemo() {
14
- const [checked, setChecked] = useState(false);
15
-
16
17
  return (
17
18
  <Menu>
18
- <MenuTrigger asChild>
19
+ <MenuTrigger>
19
20
  <Button variant="outline">Open Menu</Button>
20
21
  </MenuTrigger>
21
22
  <MenuPopup>
22
- <MenuItem>New Tab</MenuItem>
23
- <MenuItem>New Window</MenuItem>
23
+ <div className="flex items-center justify-between gap-2 p-3">
24
+ <Avatar size="sm">
25
+ <AvatarFallback>TA</AvatarFallback>
26
+ </Avatar>
27
+ <div className="flex flex-col">
28
+ <p className="text-sm font-medium">Tim Apple</p>
29
+ <p className="text-xs text-muted-foreground">tim.apple@example.com</p>
30
+ </div>
31
+ </div>
24
32
  <MenuSeparator />
25
- <MenuCheckboxItem checked={checked} onCheckedChange={setChecked}>
26
- Dark Mode
27
- </MenuCheckboxItem>
33
+ <MenuGroup>
34
+ <MenuLabel>My account</MenuLabel>
35
+ <MenuItem>
36
+ <TargetIcon />
37
+ Set status
38
+ </MenuItem>
39
+ <MenuSeparator />
40
+ <MenuItem>
41
+ <UserPenIcon />
42
+ Profile
43
+ </MenuItem>
44
+ <MenuItem>
45
+ <BellRingIcon />
46
+ Notifications{" "}
47
+ <Badge variant={"info"} className="ml-auto">
48
+ 2
49
+ </Badge>
50
+ </MenuItem>
51
+ <MenuItem>
52
+ <CreditCardIcon />
53
+ Subscription settings
54
+ </MenuItem>
55
+ </MenuGroup>
28
56
  <MenuSeparator />
29
- <MenuItem variant="destructive">Close All Tabs</MenuItem>
57
+ <MenuItem>
58
+ <LogOutIcon />
59
+ Sign out
60
+ </MenuItem>
30
61
  </MenuPopup>
31
62
  </Menu>
32
63
  );
@@ -0,0 +1,41 @@
1
+ import { UserIcon, SettingsIcon } from "lucide-react";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import {
5
+ Menu,
6
+ MenuTrigger,
7
+ MenuPopup,
8
+ MenuGroup,
9
+ MenuLabel,
10
+ MenuItem,
11
+ MenuSeparator,
12
+ } from "@/components/ui/menu";
13
+
14
+ export default function MenuGroupDemo() {
15
+ return (
16
+ <Menu>
17
+ <MenuTrigger>
18
+ <Button variant="outline">Group menu</Button>
19
+ </MenuTrigger>
20
+ <MenuPopup>
21
+ <MenuGroup>
22
+ <MenuLabel>Account</MenuLabel>
23
+ <MenuItem>
24
+ <UserIcon />
25
+ Profile
26
+ </MenuItem>
27
+ <MenuItem>
28
+ <SettingsIcon />
29
+ Settings
30
+ </MenuItem>
31
+ </MenuGroup>
32
+ <MenuSeparator />
33
+ <MenuGroup>
34
+ <MenuLabel>Actions</MenuLabel>
35
+ <MenuItem>Export</MenuItem>
36
+ <MenuItem>Duplicate</MenuItem>
37
+ </MenuGroup>
38
+ </MenuPopup>
39
+ </Menu>
40
+ );
41
+ }
@@ -0,0 +1,23 @@
1
+ import { useState } from "react";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Menu, MenuTrigger, MenuPopup, MenuRadioGroup, MenuRadioItem } from "@/components/ui/menu";
5
+
6
+ export default function MenuRadioDemo() {
7
+ const [view, setView] = useState<"list" | "grid" | "compact">("list");
8
+
9
+ return (
10
+ <Menu>
11
+ <MenuTrigger>
12
+ <Button variant="outline">Radio items</Button>
13
+ </MenuTrigger>
14
+ <MenuPopup>
15
+ <MenuRadioGroup value={view} onValueChange={(v) => setView(v as any)}>
16
+ <MenuRadioItem value="list">List view</MenuRadioItem>
17
+ <MenuRadioItem value="grid">Grid view</MenuRadioItem>
18
+ <MenuRadioItem value="compact">Compact</MenuRadioItem>
19
+ </MenuRadioGroup>
20
+ </MenuPopup>
21
+ </Menu>
22
+ );
23
+ }
@@ -0,0 +1,43 @@
1
+ import { FileTextIcon, FolderIcon } from "lucide-react";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import {
5
+ Menu,
6
+ MenuTrigger,
7
+ MenuPopup,
8
+ MenuSub,
9
+ MenuSubTrigger,
10
+ MenuSubPopup,
11
+ MenuItem,
12
+ } from "@/components/ui/menu";
13
+
14
+ export default function MenuSubmenuDemo() {
15
+ return (
16
+ <Menu>
17
+ <MenuTrigger>
18
+ <Button variant="outline">Submenu</Button>
19
+ </MenuTrigger>
20
+ <MenuPopup>
21
+ <MenuItem>New file</MenuItem>
22
+ <MenuItem>Open…</MenuItem>
23
+ <MenuSub>
24
+ <MenuSubTrigger>
25
+ <FolderIcon />
26
+ Open recent
27
+ </MenuSubTrigger>
28
+ <MenuSubPopup>
29
+ <MenuItem>
30
+ <FileTextIcon />
31
+ project-a.docx
32
+ </MenuItem>
33
+ <MenuItem>
34
+ <FileTextIcon />
35
+ project-b.pdf
36
+ </MenuItem>
37
+ </MenuSubPopup>
38
+ </MenuSub>
39
+ <MenuItem>Save</MenuItem>
40
+ </MenuPopup>
41
+ </Menu>
42
+ );
43
+ }
@@ -0,0 +1,91 @@
1
+ import { FolderIcon, FileTextIcon, FileCode2Icon } from "lucide-react";
2
+ import { useState } from "react";
3
+
4
+ import {
5
+ Menubar,
6
+ Menu,
7
+ MenuTrigger,
8
+ MenuPopup,
9
+ MenuItem,
10
+ MenuSeparator,
11
+ MenuCheckboxItem,
12
+ MenuShortcut,
13
+ MenuSub,
14
+ MenuSubPopup,
15
+ MenuSubTrigger,
16
+ } from "@/components/ui/menubar";
17
+
18
+ export default function MenubarDemo() {
19
+ const [autosave, setAutosave] = useState(true);
20
+
21
+ return (
22
+ <Menubar>
23
+ <Menu>
24
+ <MenuTrigger>File</MenuTrigger>
25
+ <MenuPopup>
26
+ <MenuItem>
27
+ New <MenuShortcut>⌘N</MenuShortcut>
28
+ </MenuItem>
29
+ <MenuItem>
30
+ Open <MenuShortcut>⌘O</MenuShortcut>{" "}
31
+ </MenuItem>
32
+ <MenuSeparator />
33
+ <MenuItem>
34
+ Exit <MenuShortcut>⌘Q</MenuShortcut>
35
+ </MenuItem>
36
+ </MenuPopup>
37
+ </Menu>
38
+ <Menu>
39
+ <MenuTrigger>Edit</MenuTrigger>
40
+ <MenuPopup>
41
+ <MenuItem>
42
+ Undo <MenuShortcut>⌘N</MenuShortcut>
43
+ </MenuItem>
44
+ <MenuItem>
45
+ Redo <MenuShortcut>⇧⌘R</MenuShortcut>
46
+ </MenuItem>
47
+ <MenuSeparator />
48
+ <MenuItem>
49
+ Cut <MenuShortcut>⌘X</MenuShortcut>
50
+ </MenuItem>
51
+ <MenuItem>
52
+ Copy <MenuShortcut>⌘C</MenuShortcut>
53
+ </MenuItem>
54
+ <MenuItem>
55
+ Paste <MenuShortcut>⌘V</MenuShortcut>
56
+ </MenuItem>
57
+ <MenuSeparator />
58
+ <MenuSub>
59
+ <MenuSubTrigger>
60
+ <FolderIcon />
61
+ Open recent
62
+ </MenuSubTrigger>
63
+ <MenuSubPopup>
64
+ <MenuItem>
65
+ <FileCode2Icon />
66
+ button.tsx
67
+ </MenuItem>
68
+ <MenuItem>
69
+ <FileCode2Icon />
70
+ build-script.ts
71
+ </MenuItem>
72
+ <MenuItem>
73
+ <FileTextIcon />
74
+ feature-spec.md
75
+ </MenuItem>
76
+ </MenuSubPopup>
77
+ </MenuSub>
78
+ </MenuPopup>
79
+ </Menu>
80
+ <Menu>
81
+ <MenuTrigger>View</MenuTrigger>
82
+ <MenuPopup>
83
+ <MenuCheckboxItem checked={autosave} onCheckedChange={setAutosave}>
84
+ Auto Save
85
+ </MenuCheckboxItem>
86
+ <MenuItem>Full Screen</MenuItem>
87
+ </MenuPopup>
88
+ </Menu>
89
+ </Menubar>
90
+ );
91
+ }
@@ -1,26 +1,5 @@
1
- import { useState } from "react";
2
-
3
1
  import { Meter } from "@/components/ui/meter";
4
2
 
5
3
  export default function MeterDemo() {
6
- const [value, setValue] = useState(65);
7
-
8
- return (
9
- <div className="space-y-6">
10
- <div>
11
- <Meter value={value} label="Storage" showLabel showValue />
12
- <input
13
- type="range"
14
- min="0"
15
- max="100"
16
- value={value}
17
- onChange={(e) => setValue(Number(e.target.value))}
18
- className="mt-4 w-80"
19
- />
20
- </div>
21
- <div>
22
- <Meter value={75} label="Memory" showLabel showValue />
23
- </div>
24
- </div>
25
- );
4
+ return <Meter className={"w-72"} value={54} label="Storage" showLabel showValue />;
26
5
  }
@@ -0,0 +1,13 @@
1
+ import { Meter } from "@/components/ui/meter";
2
+
3
+ export default function MeterIndicatorDemo() {
4
+ return (
5
+ <Meter
6
+ className={"w-72 flex-col-reverse"}
7
+ value={32}
8
+ label="Request usage"
9
+ showLabel
10
+ showValue
11
+ />
12
+ );
13
+ }
@@ -0,0 +1,5 @@
1
+ import { Meter } from "@/components/ui/meter";
2
+
3
+ export default function MeterNoLabelDemo() {
4
+ return <Meter className={"w-72"} value={32} label="Storage" showLabel={false} showValue />;
5
+ }
@@ -0,0 +1,13 @@
1
+ import { Meter } from "@/components/ui/meter";
2
+
3
+ export default function MeterNoValueDemo() {
4
+ return (
5
+ <Meter
6
+ className={"w-72"}
7
+ value={69.3}
8
+ label="Daily allowance"
9
+ showLabel={true}
10
+ showValue={false}
11
+ />
12
+ );
13
+ }
@@ -1,3 +1,115 @@
1
+ import {
2
+ NavigationMenu,
3
+ NavigationMenuTrigger,
4
+ NavigationMenuItem,
5
+ NavigationMenuContent,
6
+ NavigationMenuLink,
7
+ NavigationMenuPopup,
8
+ NavigationMenuList,
9
+ } from "@/components/ui/navigation-menu";
10
+
1
11
  export default function NavigationMenuDemo() {
2
- return <div></div>;
12
+ return (
13
+ <div>
14
+ <NavigationMenu>
15
+ <NavigationMenuList>
16
+ <NavigationMenuItem>
17
+ <NavigationMenuTrigger>Overview</NavigationMenuTrigger>
18
+ <NavigationMenuContent>
19
+ <ul className="grid max-w-md grid-cols-2 gap-4 p-2">
20
+ {overviewLinks.map((item) => (
21
+ <li key={item.href}>
22
+ <NavigationMenuLink href={item.href}>
23
+ <div className="flex flex-col">
24
+ <h3 className="text-sm leading-5 font-medium">{item.title}</h3>
25
+ <p className="text-xs leading-tight text-muted-foreground">
26
+ {item.description}
27
+ </p>
28
+ </div>
29
+ </NavigationMenuLink>
30
+ </li>
31
+ ))}
32
+ </ul>
33
+ </NavigationMenuContent>
34
+ </NavigationMenuItem>
35
+
36
+ <NavigationMenuItem>
37
+ <NavigationMenuTrigger>Handbook</NavigationMenuTrigger>
38
+ <NavigationMenuContent>
39
+ <ul className="grid max-w-md grid-cols-2 gap-2 p-2">
40
+ {handbookLinks.map((item) => (
41
+ <li key={item.href}>
42
+ <NavigationMenuLink href={item.href}>
43
+ <div className="flex flex-col">
44
+ <h3 className="text-sm leading-5 font-medium">{item.title}</h3>
45
+ <p className="text-xs leading-tight text-muted-foreground">
46
+ {item.description}
47
+ </p>
48
+ </div>
49
+ </NavigationMenuLink>
50
+ </li>
51
+ ))}
52
+ </ul>
53
+ </NavigationMenuContent>
54
+ </NavigationMenuItem>
55
+
56
+ <NavigationMenuItem>
57
+ <NavigationMenuLink
58
+ className={
59
+ "flex items-center gap-1 rounded-lg px-3 py-1.5 text-sm font-medium transition-all duration-50 hover:bg-accent/60 hover:text-accent-foreground focus:bg-accent/60"
60
+ }
61
+ >
62
+ About
63
+ </NavigationMenuLink>
64
+ </NavigationMenuItem>
65
+ </NavigationMenuList>
66
+
67
+ <NavigationMenuPopup />
68
+ </NavigationMenu>
69
+ </div>
70
+ );
3
71
  }
72
+
73
+ const overviewLinks = [
74
+ {
75
+ href: "/react/overview/quick-start",
76
+ title: "Quick Start",
77
+ description: "Install and assemble your first component.",
78
+ },
79
+ {
80
+ href: "/react/overview/accessibility",
81
+ title: "Accessibility",
82
+ description: "Learn how we build accessible components.",
83
+ },
84
+ {
85
+ href: "/react/overview/releases",
86
+ title: "Releases",
87
+ description: "See what’s new in the latest Base UI versions.",
88
+ },
89
+ {
90
+ href: "/react/overview/about",
91
+ title: "About",
92
+ description: "Learn more about Base UI and our mission.",
93
+ },
94
+ ] as const;
95
+
96
+ const handbookLinks = [
97
+ {
98
+ href: "/react/handbook/styling",
99
+ title: "Styling",
100
+ description:
101
+ "Base UI components can be styled with plain CSS, Tailwind CSS, CSS-in-JS, or CSS Modules.",
102
+ },
103
+ {
104
+ href: "/react/handbook/animation",
105
+ title: "Animation",
106
+ description:
107
+ "Base UI components can be animated with CSS transitions, CSS animations, or JavaScript libraries.",
108
+ },
109
+ {
110
+ href: "/react/handbook/composition",
111
+ title: "Composition",
112
+ description:
113
+ "Base UI components can be replaced and composed with your own existing components.",
114
+ },
115
+ ] as const;
@@ -0,0 +1,20 @@
1
+ import {
2
+ NumberField,
3
+ NumberFieldGroup,
4
+ NumberFieldInput,
5
+ NumberFieldDecrement,
6
+ NumberFieldIncrement,
7
+ } from "@/components/ui/number-field";
8
+
9
+ export default function NumberFieldButtonsEndExample() {
10
+ return (
11
+ <NumberField defaultValue={8} className="w-40">
12
+ <NumberFieldGroup>
13
+ <NumberFieldInput />
14
+ {/* align props aren't required — data-align/read-order handled by props in component */}
15
+ <NumberFieldDecrement align="end" />
16
+ <NumberFieldIncrement align="end" />
17
+ </NumberFieldGroup>
18
+ </NumberField>
19
+ );
20
+ }
@@ -1,3 +1,19 @@
1
+ import {
2
+ NumberField,
3
+ NumberFieldDecrement,
4
+ NumberFieldGroup,
5
+ NumberFieldIncrement,
6
+ NumberFieldInput,
7
+ } from "@/components/ui/number-field";
8
+
1
9
  export default function NumberFieldDemo() {
2
- return <div></div>;
10
+ return (
11
+ <NumberField defaultValue={21}>
12
+ <NumberFieldGroup>
13
+ <NumberFieldDecrement data-align="start" />
14
+ <NumberFieldInput />
15
+ <NumberFieldIncrement data-align="end" />
16
+ </NumberFieldGroup>
17
+ </NumberField>
18
+ );
3
19
  }
@@ -0,0 +1,38 @@
1
+ import { ChevronsLeftRightEllipsis } from "lucide-react";
2
+ import * as React from "react";
3
+
4
+ import {
5
+ NumberField,
6
+ NumberFieldGroup,
7
+ NumberFieldInput,
8
+ NumberFieldIncrement,
9
+ NumberFieldDecrement,
10
+ NumberFieldScrubArea,
11
+ NumberFieldScrubAreaCursor,
12
+ } from "@/components/ui/number-field";
13
+
14
+ export default function NumberFieldScrubExample() {
15
+ const id = React.useId();
16
+ const [value, setValue] = React.useState<number | null>(120);
17
+
18
+ return (
19
+ <div className="flex flex-col gap-2">
20
+ <NumberField id={id} value={value} onValueChange={(v) => setValue(v)}>
21
+ <NumberFieldScrubArea>
22
+ <label htmlFor={id} className="text-sm font-medium">
23
+ Amount
24
+ </label>
25
+ <NumberFieldScrubAreaCursor>
26
+ <ChevronsLeftRightEllipsis className="size-4" />
27
+ </NumberFieldScrubAreaCursor>
28
+
29
+ <NumberFieldGroup>
30
+ <NumberFieldDecrement data-align="start" />
31
+ <NumberFieldInput />
32
+ <NumberFieldIncrement data-align="end" />
33
+ </NumberFieldGroup>
34
+ </NumberFieldScrubArea>
35
+ </NumberField>
36
+ </div>
37
+ );
38
+ }
@@ -1,3 +1,20 @@
1
+ import { Button } from "@/components/ui/button";
2
+ import {
3
+ Popover,
4
+ PopoverDescription,
5
+ PopoverPopup,
6
+ PopoverTitle,
7
+ PopoverTrigger,
8
+ } from "@/components/ui/popover";
9
+
1
10
  export default function PopoverDemo() {
2
- return <div></div>;
11
+ return (
12
+ <Popover>
13
+ <PopoverTrigger render={<Button variant={"secondary"}>Open popover</Button>} />
14
+ <PopoverPopup>
15
+ <PopoverTitle>Popover component</PopoverTitle>
16
+ <PopoverDescription>This is the popover description content.</PopoverDescription>
17
+ </PopoverPopup>
18
+ </Popover>
19
+ );
3
20
  }
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Field, FieldLabel, FieldControl } from "@/components/ui/field";
5
+ import {
6
+ Popover,
7
+ PopoverTrigger,
8
+ PopoverPopup,
9
+ PopoverTitle,
10
+ PopoverClose,
11
+ } from "@/components/ui/popover";
12
+
13
+ export default function PopoverFormExample() {
14
+ return (
15
+ <Popover>
16
+ <PopoverTrigger render={<Button>Open Form</Button>} />
17
+ <PopoverPopup>
18
+ <PopoverTitle>User Information</PopoverTitle>
19
+ <div className="space-y-3">
20
+ <Field name="firstName" className="w-full">
21
+ <FieldLabel>First Name</FieldLabel>
22
+ <FieldControl type="text" placeholder="John" />
23
+ </Field>
24
+ <Field name="lastName" className="w-full">
25
+ <FieldLabel>Last Name</FieldLabel>
26
+ <FieldControl type="text" placeholder="Doe" />
27
+ </Field>
28
+ <Field name="email" className="w-full">
29
+ <FieldLabel>Email</FieldLabel>
30
+ <FieldControl type="email" placeholder="john@example.com" />
31
+ </Field>
32
+ <div className="flex justify-end gap-2 pt-2">
33
+ <Button size="sm">Submit</Button>
34
+ <PopoverClose
35
+ render={
36
+ <Button variant="outline" size="sm">
37
+ Cancel
38
+ </Button>
39
+ }
40
+ />
41
+ </div>
42
+ </div>
43
+ </PopoverPopup>
44
+ </Popover>
45
+ );
46
+ }