shapes-ui 0.4.1 → 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 (41) 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 +12 -0
  5. package/content/components/menubar.mdx +4 -2
  6. package/content/components/meter.mdx +13 -1
  7. package/content/components/navigation-menu.mdx +6 -0
  8. package/content/components/number-field.mdx +24 -0
  9. package/content/components/popover.mdx +20 -0
  10. package/content/components/preview-card.mdx +11 -0
  11. package/content/components/progress.mdx +2 -0
  12. package/examples/__index.tsx +45 -0
  13. package/examples/menubar-advanced.tsx +91 -0
  14. package/examples/meter-demo.tsx +1 -22
  15. package/examples/meter-flip.tsx +13 -0
  16. package/examples/meter-no-label.tsx +5 -0
  17. package/examples/meter-no-value.tsx +13 -0
  18. package/examples/navigation-menu-demo.tsx +113 -1
  19. package/examples/number-field-buttons-end.tsx +20 -0
  20. package/examples/number-field-demo.tsx +17 -1
  21. package/examples/number-field-scrub.tsx +38 -0
  22. package/examples/popover-demo.tsx +18 -1
  23. package/examples/popover-form.tsx +46 -0
  24. package/examples/popover-positions.tsx +54 -0
  25. package/examples/preview-card-demo.tsx +26 -1
  26. package/examples/preview-card-links.tsx +38 -0
  27. package/examples/progress-demo.tsx +33 -1
  28. package/package.json +1 -1
  29. package/public/r/menubar.json +1 -1
  30. package/public/r/meter.json +1 -1
  31. package/public/r/navigation-menu.json +1 -1
  32. package/public/r/number-field.json +4 -2
  33. package/public/r/popover.json +1 -1
  34. package/public/r/preview-card.json +1 -1
  35. package/src/components/ui/menubar.tsx +52 -18
  36. package/src/components/ui/meter.tsx +7 -5
  37. package/src/components/ui/navigation-menu.tsx +121 -38
  38. package/src/components/ui/number-field.tsx +42 -46
  39. package/src/components/ui/popover.tsx +7 -2
  40. package/src/components/ui/preview-card.tsx +4 -2
  41. package/src/components/ui/progress.tsx +7 -18
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="TypeScriptCompiler">
4
+ <option name="useServicePoweredTypesWasEnabledByExperiment" value="true" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Ask2AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # shapes-ui
2
2
 
3
+ ## 0.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 476148c: Updated menubar docs and stylings.
8
+ - 60ac79e: Updated meter examples and stylings
9
+ - a591c64: Added examples for preview card
10
+ - 7f642b5: Updated number field component and examples
11
+ - 30ebfe7: UPdated progress styles and example
12
+ - c2be2cd: Updated popover component and examples
13
+ - 2d38dfc: Updated navihation menu styles and demo
14
+
3
15
  ## 0.4.1
4
16
 
5
17
  ### Patch Changes
@@ -10,8 +10,10 @@ description: Menu bar providing commands and options for your application with d
10
10
 
11
11
  <InstallationBlock name="menubar" />
12
12
 
13
+ Menubar relies on `Menu` component, but for the ease of use, it also provides a set of components that are built on top of `Menu` component with same styling and APIs.
14
+
13
15
  ## Examples
14
16
 
15
- ### Demo
17
+ ### Submenus
16
18
 
17
- <RenderPreview name="menubar-demo" />
19
+ <RenderPreview name="menubar-advanced" />
@@ -12,6 +12,18 @@ description: Meter component that provides a graphical display of a numeric valu
12
12
 
13
13
  ## Examples
14
14
 
15
- ### Demo
15
+ ### Default
16
16
 
17
17
  <RenderPreview name="meter-demo" />
18
+
19
+ ### Value only
20
+
21
+ <RenderPreview name="meter-no-label" />
22
+
23
+ ### Label only
24
+
25
+ <RenderPreview name="meter-no-value" />
26
+
27
+ ### Flip
28
+
29
+ <RenderPreview name="meter-flip" />
@@ -3,3 +3,9 @@ title: Navigation Menu
3
3
  slug: navigation-menu
4
4
  description: Navigation menu component for displaying a collection of links and dropdown menus.
5
5
  ---
6
+
7
+ <RenderPreview name="navigation-menu-demo" />
8
+
9
+ ## Installation
10
+
11
+ <InstallationBlock name="navigation-menu" />
@@ -3,3 +3,27 @@ title: Number Field
3
3
  slug: number-field
4
4
  description: An input field component specifically designed for numeric input, with built-in validation and formatting options
5
5
  ---
6
+
7
+ <RenderPreview name="number-field-demo" />
8
+
9
+ ## Installation
10
+
11
+ <InstallationBlock name="number-field" />
12
+
13
+ ## Examples
14
+
15
+ ### Basic
16
+
17
+ Use data-align `start` and `end` to position increment and decrement controls at the start or end of the input.
18
+
19
+ <RenderPreview name="number-field-demo" />
20
+
21
+ ### Scrub area
22
+
23
+ A number field with a scrub area (drag over input to change value).
24
+
25
+ <RenderPreview name="number-field-scrub" />
26
+
27
+ ### Buttons at end
28
+
29
+ <RenderPreview name="number-field-buttons-end" />
@@ -3,3 +3,23 @@ title: Popover
3
3
  slug: popover
4
4
  description: Popover component that displays content anchored to a trigger element.
5
5
  ---
6
+
7
+ <RenderPreview name="popover-demo" />
8
+
9
+ ## Installation
10
+
11
+ <InstallationBlock name="popover" />
12
+
13
+ ## Examples
14
+
15
+ ### Basic
16
+
17
+ <RenderPreview name="popover-demo" />
18
+
19
+ ### Sides
20
+
21
+ <RenderPreview name="popover-positions" />
22
+
23
+ ### Form
24
+
25
+ <RenderPreview name="popover-form" />
@@ -3,3 +3,14 @@ title: Preview Card
3
3
  slug: preview-card
4
4
  description: Component that displays a preview of linked content when hovered.
5
5
  ---
6
+
7
+ <RenderPreview name={'preview-card-demo'} />
8
+
9
+
10
+ ## Installation
11
+ <InstallationBlock name="preview-card" />
12
+
13
+ ## Examples
14
+
15
+ ### Composed as CTA
16
+ <RenderPreview name="preview-card-links" />
@@ -3,3 +3,5 @@ title: Progress
3
3
  slug: progress
4
4
  description: Progress bar component for displaying the status of a task.
5
5
  ---
6
+
7
+ <RenderPreview name={'progress-demo'} />
@@ -574,12 +574,32 @@ export const examples: ExampleRegistry = {
574
574
  title: "Demo",
575
575
  code: lazy(() => import("./menubar-demo")),
576
576
  },
577
+ {
578
+ name: "menubar-advanced",
579
+ title: "Advanced",
580
+ code: lazy(() => import("./menubar-advanced")),
581
+ },
577
582
  ],
578
583
  },
579
584
  "meter": {
580
585
  title: "Meter",
581
586
  code: lazy(() => import("../src/components/ui/meter").then(m => ({ default: m.Meter }))),
582
587
  examples: [
588
+ {
589
+ name: "meter-no-value",
590
+ title: "No Value",
591
+ code: lazy(() => import("./meter-no-value")),
592
+ },
593
+ {
594
+ name: "meter-no-label",
595
+ title: "No Label",
596
+ code: lazy(() => import("./meter-no-label")),
597
+ },
598
+ {
599
+ name: "meter-flip",
600
+ title: "Flip",
601
+ code: lazy(() => import("./meter-flip")),
602
+ },
583
603
  {
584
604
  name: "meter-demo",
585
605
  title: "Demo",
@@ -602,17 +622,37 @@ export const examples: ExampleRegistry = {
602
622
  title: "Number Field",
603
623
  code: lazy(() => import("../src/components/ui/number-field").then(m => ({ default: m.NumberField }))),
604
624
  examples: [
625
+ {
626
+ name: "number-field-scrub",
627
+ title: "Scrub",
628
+ code: lazy(() => import("./number-field-scrub")),
629
+ },
605
630
  {
606
631
  name: "number-field-demo",
607
632
  title: "Demo",
608
633
  code: lazy(() => import("./number-field-demo")),
609
634
  },
635
+ {
636
+ name: "number-field-buttons-end",
637
+ title: "Buttons End",
638
+ code: lazy(() => import("./number-field-buttons-end")),
639
+ },
610
640
  ],
611
641
  },
612
642
  "popover": {
613
643
  title: "Popover",
614
644
  code: lazy(() => import("../src/components/ui/popover").then(m => ({ default: m.Popover }))),
615
645
  examples: [
646
+ {
647
+ name: "popover-positions",
648
+ title: "Positions",
649
+ code: lazy(() => import("./popover-positions")),
650
+ },
651
+ {
652
+ name: "popover-form",
653
+ title: "Form",
654
+ code: lazy(() => import("./popover-form")),
655
+ },
616
656
  {
617
657
  name: "popover-demo",
618
658
  title: "Demo",
@@ -624,6 +664,11 @@ export const examples: ExampleRegistry = {
624
664
  title: "Preview Card",
625
665
  code: lazy(() => import("../src/components/ui/preview-card").then(m => ({ default: m.PreviewCard }))),
626
666
  examples: [
667
+ {
668
+ name: "preview-card-links",
669
+ title: "Links",
670
+ code: lazy(() => import("./preview-card-links")),
671
+ },
627
672
  {
628
673
  name: "preview-card-demo",
629
674
  title: "Demo",
@@ -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
+ }