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.
- package/.idea/compiler.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/vcs.xml +6 -0
- package/CHANGELOG.md +18 -0
- package/content/components/menu.mdx +29 -2
- 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 +141 -96
- package/examples/menu-advanced.tsx +131 -0
- package/examples/menu-align.tsx +33 -0
- package/examples/menu-checkbox.tsx +28 -0
- package/examples/menu-demo.tsx +43 -12
- package/examples/menu-group.tsx +41 -0
- package/examples/menu-radio.tsx +23 -0
- package/examples/menu-submenu.tsx +43 -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/accordion.json +5 -2
- package/public/r/alert-dialog.json +7 -3
- package/public/r/alert.json +4 -2
- package/public/r/autocomplete.json +18 -0
- package/public/r/avatar.json +15 -0
- package/public/r/badge.json +4 -2
- package/public/r/button-group.json +7 -3
- package/public/r/button.json +5 -2
- package/public/r/card.json +1 -1
- package/public/r/checkbox.json +5 -2
- package/public/r/collapsible.json +4 -2
- package/public/r/combobox.json +9 -3
- package/public/r/context-menu.json +5 -2
- package/public/r/dialog.json +9 -4
- package/public/r/drawer.json +8 -3
- package/public/r/field.json +5 -2
- package/public/r/fieldset.json +4 -2
- package/public/r/form.json +15 -0
- package/public/r/index.json +21 -2
- package/public/r/input-group.json +9 -3
- package/public/r/input.json +4 -2
- package/public/r/menu.json +16 -0
- package/public/r/menubar.json +16 -0
- package/public/r/meter.json +15 -0
- package/public/r/navigation-menu.json +16 -0
- package/public/r/number-field.json +18 -0
- package/public/r/popover.json +15 -0
- package/public/r/preview-card.json +15 -0
- package/public/r/progress.json +15 -0
- package/public/r/radio.json +16 -0
- package/public/r/scroll-area.json +5 -3
- package/public/r/select.json +16 -0
- package/public/r/separator.json +4 -2
- package/public/r/slider.json +15 -0
- package/public/r/switch.json +15 -0
- package/public/r/tabs.json +16 -0
- package/public/r/textarea.json +1 -1
- package/public/r/toast.json +16 -0
- package/public/r/toggle.json +16 -0
- package/public/r/toolbar.json +15 -0
- package/src/components/ui/menu.tsx +42 -16
- 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/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
|
+
}
|
package/examples/menu-demo.tsx
CHANGED
|
@@ -1,32 +1,63 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
10
|
+
MenuGroup,
|
|
11
|
+
MenuLabel,
|
|
9
12
|
MenuSeparator,
|
|
10
|
-
|
|
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
|
|
19
|
+
<MenuTrigger>
|
|
19
20
|
<Button variant="outline">Open Menu</Button>
|
|
20
21
|
</MenuTrigger>
|
|
21
22
|
<MenuPopup>
|
|
22
|
-
<
|
|
23
|
-
|
|
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
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
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
|
+
}
|
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
|
+
}
|