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.
- package/.idea/compiler.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/vcs.xml +6 -0
- package/CHANGELOG.md +12 -0
- package/content/components/menubar.mdx +4 -2
- package/content/components/meter.mdx +13 -1
- package/content/components/navigation-menu.mdx +6 -0
- package/content/components/number-field.mdx +24 -0
- package/content/components/popover.mdx +20 -0
- package/content/components/preview-card.mdx +11 -0
- package/content/components/progress.mdx +2 -0
- package/examples/__index.tsx +45 -0
- package/examples/menubar-advanced.tsx +91 -0
- package/examples/meter-demo.tsx +1 -22
- package/examples/meter-flip.tsx +13 -0
- package/examples/meter-no-label.tsx +5 -0
- package/examples/meter-no-value.tsx +13 -0
- package/examples/navigation-menu-demo.tsx +113 -1
- package/examples/number-field-buttons-end.tsx +20 -0
- package/examples/number-field-demo.tsx +17 -1
- package/examples/number-field-scrub.tsx +38 -0
- package/examples/popover-demo.tsx +18 -1
- package/examples/popover-form.tsx +46 -0
- package/examples/popover-positions.tsx +54 -0
- package/examples/preview-card-demo.tsx +26 -1
- package/examples/preview-card-links.tsx +38 -0
- package/examples/progress-demo.tsx +33 -1
- package/package.json +1 -1
- package/public/r/menubar.json +1 -1
- package/public/r/meter.json +1 -1
- package/public/r/navigation-menu.json +1 -1
- package/public/r/number-field.json +4 -2
- package/public/r/popover.json +1 -1
- package/public/r/preview-card.json +1 -1
- package/src/components/ui/menubar.tsx +52 -18
- package/src/components/ui/meter.tsx +7 -5
- package/src/components/ui/navigation-menu.tsx +121 -38
- package/src/components/ui/number-field.tsx +42 -46
- package/src/components/ui/popover.tsx +7 -2
- package/src/components/ui/preview-card.tsx +4 -2
- package/src/components/ui/progress.tsx +7 -18
package/.idea/vcs.xml
ADDED
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
|
-
###
|
|
17
|
+
### Submenus
|
|
16
18
|
|
|
17
|
-
<RenderPreview name="menubar-
|
|
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
|
-
###
|
|
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" />
|
package/examples/__index.tsx
CHANGED
|
@@ -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
|
+
}
|
package/examples/meter-demo.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
+
}
|