@multicomma/arkcn 0.1.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.
- package/README.md +78 -0
- package/bin/arkcn.mjs +78 -0
- package/cli/commands.mjs +251 -0
- package/cli/project.mjs +168 -0
- package/cli/registry.mjs +50 -0
- package/cli/ui.mjs +46 -0
- package/mcp/server.mjs +149 -0
- package/package.json +201 -0
- package/registry/base.css +680 -0
- package/registry/index.json +1833 -0
- package/registry/items/accordion.json +18 -0
- package/registry/items/activity-feed.json +18 -0
- package/registry/items/alert-dialog.json +18 -0
- package/registry/items/alert.json +17 -0
- package/registry/items/angle-slider.json +17 -0
- package/registry/items/app-shell.json +28 -0
- package/registry/items/aspect-ratio.json +13 -0
- package/registry/items/attachment.json +19 -0
- package/registry/items/avatar.json +17 -0
- package/registry/items/badge.json +18 -0
- package/registry/items/breadcrumb.json +18 -0
- package/registry/items/bubble.json +18 -0
- package/registry/items/button-group.json +19 -0
- package/registry/items/button.json +18 -0
- package/registry/items/calendar.json +19 -0
- package/registry/items/canvas.json +24 -0
- package/registry/items/card.json +15 -0
- package/registry/items/carousel.json +19 -0
- package/registry/items/cascader.json +23 -0
- package/registry/items/chart.json +17 -0
- package/registry/items/chat.json +23 -0
- package/registry/items/checkbox.json +18 -0
- package/registry/items/clipboard.json +19 -0
- package/registry/items/collapsible.json +15 -0
- package/registry/items/color-picker.json +19 -0
- package/registry/items/combobox.json +20 -0
- package/registry/items/command.json +21 -0
- package/registry/items/comment-thread.json +25 -0
- package/registry/items/context-menu.json +18 -0
- package/registry/items/controllable.json +14 -0
- package/registry/items/data-grid.json +24 -0
- package/registry/items/data-table-adapter.json +14 -0
- package/registry/items/data-table.json +32 -0
- package/registry/items/date-input.json +17 -0
- package/registry/items/dialog.json +19 -0
- package/registry/items/direction.json +13 -0
- package/registry/items/drag-preview.json +16 -0
- package/registry/items/drawer.json +18 -0
- package/registry/items/dropdown-menu.json +18 -0
- package/registry/items/editable.json +17 -0
- package/registry/items/empty.json +17 -0
- package/registry/items/field.json +19 -0
- package/registry/items/file-upload.json +19 -0
- package/registry/items/floating-panel.json +19 -0
- package/registry/items/floating-toolbar.json +16 -0
- package/registry/items/form.json +14 -0
- package/registry/items/format.json +15 -0
- package/registry/items/gantt.json +22 -0
- package/registry/items/history.json +14 -0
- package/registry/items/hotkeys.json +18 -0
- package/registry/items/hover-card.json +17 -0
- package/registry/items/image-cropper.json +17 -0
- package/registry/items/input-group.json +20 -0
- package/registry/items/input-otp.json +18 -0
- package/registry/items/input.json +15 -0
- package/registry/items/item.json +19 -0
- package/registry/items/json-tree-view.json +17 -0
- package/registry/items/kanban.json +26 -0
- package/registry/items/kbd.json +15 -0
- package/registry/items/label.json +15 -0
- package/registry/items/live-region.json +16 -0
- package/registry/items/marker.json +18 -0
- package/registry/items/marquee.json +17 -0
- package/registry/items/menubar.json +19 -0
- package/registry/items/message.json +15 -0
- package/registry/items/navigation-menu.json +19 -0
- package/registry/items/node-graph.json +22 -0
- package/registry/items/number-input.json +18 -0
- package/registry/items/pagination.json +18 -0
- package/registry/items/password-input.json +18 -0
- package/registry/items/popconfirm.json +20 -0
- package/registry/items/popover.json +18 -0
- package/registry/items/progress.json +17 -0
- package/registry/items/qr-code.json +17 -0
- package/registry/items/query-builder.json +23 -0
- package/registry/items/radio-group.json +17 -0
- package/registry/items/rating-group.json +18 -0
- package/registry/items/resizable.json +17 -0
- package/registry/items/rich-text-editor.json +37 -0
- package/registry/items/row-layout.json +15 -0
- package/registry/items/scheduler.json +23 -0
- package/registry/items/scroll-area.json +17 -0
- package/registry/items/segment-group.json +17 -0
- package/registry/items/select.json +19 -0
- package/registry/items/separator.json +15 -0
- package/registry/items/sheet.json +19 -0
- package/registry/items/sidebar.json +27 -0
- package/registry/items/signature-pad.json +19 -0
- package/registry/items/skeleton.json +15 -0
- package/registry/items/slider.json +17 -0
- package/registry/items/sonner.json +17 -0
- package/registry/items/spinner.json +17 -0
- package/registry/items/steps.json +19 -0
- package/registry/items/swap.json +17 -0
- package/registry/items/switch.json +17 -0
- package/registry/items/table.json +16 -0
- package/registry/items/tabs.json +18 -0
- package/registry/items/tags-input.json +18 -0
- package/registry/items/textarea.json +15 -0
- package/registry/items/time.json +14 -0
- package/registry/items/timer.json +18 -0
- package/registry/items/toc.json +17 -0
- package/registry/items/toggle-group.json +19 -0
- package/registry/items/toggle.json +18 -0
- package/registry/items/tooltip.json +17 -0
- package/registry/items/tour.json +19 -0
- package/registry/items/transfer-list.json +24 -0
- package/registry/items/tree-select.json +24 -0
- package/registry/items/tree-view.json +18 -0
- package/registry/items/use-mobile.json +13 -0
- package/registry/items/utils.json +17 -0
- package/registry/items/virtual-list.json +16 -0
- package/src/components/ui/accordion.tsx +111 -0
- package/src/components/ui/activity-feed.tsx +228 -0
- package/src/components/ui/alert-dialog.tsx +204 -0
- package/src/components/ui/alert.tsx +55 -0
- package/src/components/ui/angle-slider.tsx +117 -0
- package/src/components/ui/app-shell.tsx +985 -0
- package/src/components/ui/aspect-ratio.tsx +35 -0
- package/src/components/ui/attachment.tsx +193 -0
- package/src/components/ui/avatar.tsx +94 -0
- package/src/components/ui/badge.tsx +45 -0
- package/src/components/ui/breadcrumb.tsx +93 -0
- package/src/components/ui/bubble.tsx +119 -0
- package/src/components/ui/button-group.tsx +79 -0
- package/src/components/ui/button.tsx +65 -0
- package/src/components/ui/calendar.tsx +172 -0
- package/src/components/ui/canvas.tsx +723 -0
- package/src/components/ui/card.tsx +69 -0
- package/src/components/ui/carousel.tsx +228 -0
- package/src/components/ui/cascader.tsx +754 -0
- package/src/components/ui/chart.tsx +303 -0
- package/src/components/ui/chat.tsx +544 -0
- package/src/components/ui/checkbox.tsx +94 -0
- package/src/components/ui/clipboard.tsx +94 -0
- package/src/components/ui/collapsible.tsx +32 -0
- package/src/components/ui/color-picker.tsx +441 -0
- package/src/components/ui/combobox.tsx +400 -0
- package/src/components/ui/command.tsx +292 -0
- package/src/components/ui/comment-thread.tsx +923 -0
- package/src/components/ui/context-menu.tsx +331 -0
- package/src/components/ui/data-grid.tsx +1227 -0
- package/src/components/ui/data-table.tsx +993 -0
- package/src/components/ui/date-input.tsx +103 -0
- package/src/components/ui/dialog.tsx +159 -0
- package/src/components/ui/direction.tsx +32 -0
- package/src/components/ui/drawer.tsx +200 -0
- package/src/components/ui/dropdown-menu.tsx +329 -0
- package/src/components/ui/editable.tsx +90 -0
- package/src/components/ui/empty.tsx +86 -0
- package/src/components/ui/field.tsx +218 -0
- package/src/components/ui/file-upload.tsx +204 -0
- package/src/components/ui/floating-panel.tsx +199 -0
- package/src/components/ui/floating-toolbar.tsx +79 -0
- package/src/components/ui/format.tsx +22 -0
- package/src/components/ui/gantt.tsx +950 -0
- package/src/components/ui/hotkeys.tsx +340 -0
- package/src/components/ui/hover-card.tsx +83 -0
- package/src/components/ui/image-cropper.tsx +100 -0
- package/src/components/ui/input-group.tsx +133 -0
- package/src/components/ui/input-otp.tsx +82 -0
- package/src/components/ui/input.tsx +18 -0
- package/src/components/ui/item.tsx +174 -0
- package/src/components/ui/json-tree-view.tsx +37 -0
- package/src/components/ui/kanban.tsx +884 -0
- package/src/components/ui/kbd.tsx +20 -0
- package/src/components/ui/label.tsx +30 -0
- package/src/components/ui/live-region.tsx +54 -0
- package/src/components/ui/marker.tsx +66 -0
- package/src/components/ui/marquee.tsx +61 -0
- package/src/components/ui/menubar.tsx +456 -0
- package/src/components/ui/message.tsx +74 -0
- package/src/components/ui/navigation-menu.tsx +202 -0
- package/src/components/ui/node-graph.tsx +1723 -0
- package/src/components/ui/number-input.tsx +148 -0
- package/src/components/ui/pagination.tsx +88 -0
- package/src/components/ui/password-input.tsx +104 -0
- package/src/components/ui/popconfirm.tsx +149 -0
- package/src/components/ui/popover.tsx +126 -0
- package/src/components/ui/progress.tsx +114 -0
- package/src/components/ui/qr-code.tsx +51 -0
- package/src/components/ui/query-builder.tsx +938 -0
- package/src/components/ui/radio-group.tsx +108 -0
- package/src/components/ui/rating-group.tsx +91 -0
- package/src/components/ui/resizable.tsx +41 -0
- package/src/components/ui/rich-text-editor.tsx +845 -0
- package/src/components/ui/scheduler.tsx +1164 -0
- package/src/components/ui/scroll-area.tsx +82 -0
- package/src/components/ui/segment-group.tsx +95 -0
- package/src/components/ui/select.tsx +354 -0
- package/src/components/ui/separator.tsx +32 -0
- package/src/components/ui/sheet.tsx +130 -0
- package/src/components/ui/sidebar.tsx +665 -0
- package/src/components/ui/signature-pad.tsx +112 -0
- package/src/components/ui/skeleton.tsx +7 -0
- package/src/components/ui/slider.tsx +183 -0
- package/src/components/ui/sonner.tsx +37 -0
- package/src/components/ui/spinner.tsx +16 -0
- package/src/components/ui/steps.tsx +152 -0
- package/src/components/ui/swap.tsx +33 -0
- package/src/components/ui/switch.tsx +83 -0
- package/src/components/ui/table.tsx +72 -0
- package/src/components/ui/tabs.tsx +100 -0
- package/src/components/ui/tags-input.tsx +153 -0
- package/src/components/ui/textarea.tsx +17 -0
- package/src/components/ui/timer.tsx +67 -0
- package/src/components/ui/toc.tsx +64 -0
- package/src/components/ui/toggle-group.tsx +89 -0
- package/src/components/ui/toggle.tsx +46 -0
- package/src/components/ui/tooltip.tsx +113 -0
- package/src/components/ui/tour.tsx +168 -0
- package/src/components/ui/transfer-list.tsx +700 -0
- package/src/components/ui/tree-select.tsx +638 -0
- package/src/components/ui/tree-view.tsx +217 -0
- package/src/components/ui/virtual-list.tsx +343 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/lib/controllable.ts +31 -0
- package/src/lib/data-table-adapter.ts +67 -0
- package/src/lib/drag-preview.ts +39 -0
- package/src/lib/form.ts +39 -0
- package/src/lib/history.ts +55 -0
- package/src/lib/row-layout.ts +81 -0
- package/src/lib/table.ts +483 -0
- package/src/lib/time.ts +37 -0
- package/src/lib/utils.ts +6 -0
- package/src/styles/arkcn.css +764 -0
- package/src/styles/index.css +3 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
import { SignaturePad as SignaturePadPrimitive } from "@ark-ui/react"
|
|
6
|
+
import { XIcon } from "lucide-react"
|
|
7
|
+
|
|
8
|
+
import { Button } from "@/components/ui/button"
|
|
9
|
+
|
|
10
|
+
function SignaturePad({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Root>) {
|
|
11
|
+
return (
|
|
12
|
+
<SignaturePadPrimitive.Root
|
|
13
|
+
data-slot="signature-pad"
|
|
14
|
+
className={cn("flex w-full flex-col gap-1.5", className)}
|
|
15
|
+
{...props}
|
|
16
|
+
/>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function SignaturePadContext({ ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Context>) {
|
|
21
|
+
return <SignaturePadPrimitive.Context {...props} />
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function SignaturePadLabel({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Label>) {
|
|
25
|
+
return (
|
|
26
|
+
<SignaturePadPrimitive.Label
|
|
27
|
+
data-slot="signature-pad-label"
|
|
28
|
+
className={cn("text-sm font-medium select-none", className)}
|
|
29
|
+
{...props}
|
|
30
|
+
/>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function SignaturePadControl({
|
|
35
|
+
className,
|
|
36
|
+
children,
|
|
37
|
+
...props
|
|
38
|
+
}: React.ComponentProps<typeof SignaturePadPrimitive.Control>) {
|
|
39
|
+
return (
|
|
40
|
+
<SignaturePadPrimitive.Control
|
|
41
|
+
data-slot="signature-pad-control"
|
|
42
|
+
className={cn(
|
|
43
|
+
"relative h-40 w-full touch-none overflow-hidden rounded-xl border border-input bg-transparent transition-colors has-focus-visible:border-ring has-focus-visible:ring-3 has-focus-visible:ring-ring/50 dark:bg-input/30 data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
44
|
+
className
|
|
45
|
+
)}
|
|
46
|
+
{...props}
|
|
47
|
+
>
|
|
48
|
+
{children ?? (
|
|
49
|
+
<>
|
|
50
|
+
<SignaturePadSegment />
|
|
51
|
+
<SignaturePadGuide />
|
|
52
|
+
<SignaturePadClearTrigger />
|
|
53
|
+
</>
|
|
54
|
+
)}
|
|
55
|
+
</SignaturePadPrimitive.Control>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function SignaturePadSegment({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Segment>) {
|
|
60
|
+
return (
|
|
61
|
+
<SignaturePadPrimitive.Segment
|
|
62
|
+
data-slot="signature-pad-segment"
|
|
63
|
+
className={cn("fill-foreground", className)}
|
|
64
|
+
{...props}
|
|
65
|
+
/>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function SignaturePadGuide({ className, ...props }: React.ComponentProps<typeof SignaturePadPrimitive.Guide>) {
|
|
70
|
+
return (
|
|
71
|
+
<SignaturePadPrimitive.Guide
|
|
72
|
+
data-slot="signature-pad-guide"
|
|
73
|
+
className={cn("pointer-events-none absolute inset-x-4 bottom-8 border-b border-dashed border-border", className)}
|
|
74
|
+
{...props}
|
|
75
|
+
/>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function SignaturePadClearTrigger({
|
|
80
|
+
className,
|
|
81
|
+
children,
|
|
82
|
+
...props
|
|
83
|
+
}: React.ComponentProps<typeof SignaturePadPrimitive.ClearTrigger>) {
|
|
84
|
+
return (
|
|
85
|
+
<SignaturePadPrimitive.ClearTrigger
|
|
86
|
+
data-slot="signature-pad-clear-trigger"
|
|
87
|
+
className={cn("absolute top-2 right-2", className)}
|
|
88
|
+
asChild
|
|
89
|
+
{...props}
|
|
90
|
+
>
|
|
91
|
+
<Button variant="ghost" size="icon-sm">
|
|
92
|
+
{children ?? <XIcon />}
|
|
93
|
+
<span className="sr-only">Clear</span>
|
|
94
|
+
</Button>
|
|
95
|
+
</SignaturePadPrimitive.ClearTrigger>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function SignaturePadHiddenInput({ ...props }: React.ComponentProps<typeof SignaturePadPrimitive.HiddenInput>) {
|
|
100
|
+
return <SignaturePadPrimitive.HiddenInput {...props} />
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
SignaturePad,
|
|
105
|
+
SignaturePadClearTrigger,
|
|
106
|
+
SignaturePadContext,
|
|
107
|
+
SignaturePadControl,
|
|
108
|
+
SignaturePadGuide,
|
|
109
|
+
SignaturePadHiddenInput,
|
|
110
|
+
SignaturePadLabel,
|
|
111
|
+
SignaturePadSegment,
|
|
112
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
import { Slider as SliderPrimitive } from "@ark-ui/react"
|
|
6
|
+
|
|
7
|
+
function Slider({
|
|
8
|
+
className,
|
|
9
|
+
children,
|
|
10
|
+
defaultValue,
|
|
11
|
+
value,
|
|
12
|
+
min = 0,
|
|
13
|
+
max = 100,
|
|
14
|
+
...props
|
|
15
|
+
}: React.ComponentProps<typeof SliderPrimitive.Root>) {
|
|
16
|
+
const _values = React.useMemo(
|
|
17
|
+
() => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]),
|
|
18
|
+
[value, defaultValue, min, max]
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<SliderPrimitive.Root
|
|
23
|
+
data-slot="slider"
|
|
24
|
+
defaultValue={defaultValue}
|
|
25
|
+
value={value}
|
|
26
|
+
min={min}
|
|
27
|
+
max={max}
|
|
28
|
+
className={cn(
|
|
29
|
+
"relative flex w-full touch-none flex-col gap-2 select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto",
|
|
30
|
+
className
|
|
31
|
+
)}
|
|
32
|
+
{...props}
|
|
33
|
+
>
|
|
34
|
+
{children}
|
|
35
|
+
<SliderControl>
|
|
36
|
+
<SliderTrack>
|
|
37
|
+
<SliderRange />
|
|
38
|
+
</SliderTrack>
|
|
39
|
+
{Array.from({ length: _values.length }, (_, index) => (
|
|
40
|
+
<SliderThumb key={index} index={index}>
|
|
41
|
+
<SliderHiddenInput />
|
|
42
|
+
</SliderThumb>
|
|
43
|
+
))}
|
|
44
|
+
</SliderControl>
|
|
45
|
+
</SliderPrimitive.Root>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function SliderRoot({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Root>) {
|
|
50
|
+
return (
|
|
51
|
+
<SliderPrimitive.Root
|
|
52
|
+
data-slot="slider"
|
|
53
|
+
className={cn(
|
|
54
|
+
"relative flex w-full touch-none flex-col gap-2 select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto",
|
|
55
|
+
className
|
|
56
|
+
)}
|
|
57
|
+
{...props}
|
|
58
|
+
/>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function SliderContext({ ...props }: React.ComponentProps<typeof SliderPrimitive.Context>) {
|
|
63
|
+
return <SliderPrimitive.Context {...props} />
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function SliderLabel({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Label>) {
|
|
67
|
+
return <SliderPrimitive.Label data-slot="slider-label" className={cn("text-sm font-medium", className)} {...props} />
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function SliderValueText({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.ValueText>) {
|
|
71
|
+
return (
|
|
72
|
+
<SliderPrimitive.ValueText
|
|
73
|
+
data-slot="slider-value-text"
|
|
74
|
+
className={cn("text-sm text-muted-foreground", className)}
|
|
75
|
+
{...props}
|
|
76
|
+
/>
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function SliderControl({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Control>) {
|
|
81
|
+
return (
|
|
82
|
+
<SliderPrimitive.Control
|
|
83
|
+
data-slot="slider-control"
|
|
84
|
+
className={cn("relative flex items-center data-vertical:h-full data-vertical:flex-col", className)}
|
|
85
|
+
{...props}
|
|
86
|
+
/>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function SliderTrack({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Track>) {
|
|
91
|
+
return (
|
|
92
|
+
<SliderPrimitive.Track
|
|
93
|
+
data-slot="slider-track"
|
|
94
|
+
className={cn(
|
|
95
|
+
"relative grow overflow-hidden rounded-full bg-muted data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1",
|
|
96
|
+
className
|
|
97
|
+
)}
|
|
98
|
+
{...props}
|
|
99
|
+
/>
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function SliderRange({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Range>) {
|
|
104
|
+
return (
|
|
105
|
+
<SliderPrimitive.Range
|
|
106
|
+
data-slot="slider-range"
|
|
107
|
+
className={cn("absolute bg-primary select-none data-horizontal:h-full data-vertical:w-full", className)}
|
|
108
|
+
{...props}
|
|
109
|
+
/>
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
114
|
+
function SliderThumb({ className, ...props }: Omit<React.ComponentProps<typeof SliderPrimitive.Thumb>, "id">) {
|
|
115
|
+
return (
|
|
116
|
+
<SliderPrimitive.Thumb
|
|
117
|
+
data-slot="slider-thumb"
|
|
118
|
+
className={cn(
|
|
119
|
+
"relative block size-3 shrink-0 rounded-full border border-ring bg-white ring-ring/50 transition-[color,box-shadow] select-none after:absolute after:-inset-2 hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden data-dragging:ring-3 data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
120
|
+
className
|
|
121
|
+
)}
|
|
122
|
+
{...props}
|
|
123
|
+
/>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
128
|
+
function SliderHiddenInput({ ...props }: Omit<React.ComponentProps<typeof SliderPrimitive.HiddenInput>, "id">) {
|
|
129
|
+
return <SliderPrimitive.HiddenInput {...props} />
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function SliderMarkerGroup({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.MarkerGroup>) {
|
|
133
|
+
return (
|
|
134
|
+
<SliderPrimitive.MarkerGroup
|
|
135
|
+
data-slot="slider-marker-group"
|
|
136
|
+
className={cn("relative h-4 text-xs text-muted-foreground", className)}
|
|
137
|
+
{...props}
|
|
138
|
+
/>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function SliderMarker({ className, ...props }: React.ComponentProps<typeof SliderPrimitive.Marker>) {
|
|
143
|
+
return (
|
|
144
|
+
<SliderPrimitive.Marker
|
|
145
|
+
data-slot="slider-marker"
|
|
146
|
+
className={cn("absolute -translate-x-1/2", className)}
|
|
147
|
+
{...props}
|
|
148
|
+
/>
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Value bubble shown above a thumb while it is dragged. Place it inside `SliderThumb`. */
|
|
153
|
+
function SliderDraggingIndicator({
|
|
154
|
+
className,
|
|
155
|
+
...props
|
|
156
|
+
}: React.ComponentProps<typeof SliderPrimitive.DraggingIndicator>) {
|
|
157
|
+
return (
|
|
158
|
+
<SliderPrimitive.DraggingIndicator
|
|
159
|
+
data-slot="slider-dragging-indicator"
|
|
160
|
+
className={cn(
|
|
161
|
+
"pointer-events-none absolute bottom-full left-1/2 mb-2 -translate-x-1/2 rounded-md bg-primary px-1.5 py-0.5 text-xs font-medium text-primary-foreground tabular-nums",
|
|
162
|
+
className
|
|
163
|
+
)}
|
|
164
|
+
{...props}
|
|
165
|
+
/>
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export {
|
|
170
|
+
Slider,
|
|
171
|
+
SliderContext,
|
|
172
|
+
SliderControl,
|
|
173
|
+
SliderHiddenInput,
|
|
174
|
+
SliderLabel,
|
|
175
|
+
SliderMarker,
|
|
176
|
+
SliderMarkerGroup,
|
|
177
|
+
SliderRange,
|
|
178
|
+
SliderRoot,
|
|
179
|
+
SliderThumb,
|
|
180
|
+
SliderTrack,
|
|
181
|
+
SliderValueText,
|
|
182
|
+
SliderDraggingIndicator,
|
|
183
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useTheme } from "next-themes"
|
|
2
|
+
import { Toaster as Sonner, type ToasterProps } from "sonner"
|
|
3
|
+
import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
|
|
4
|
+
|
|
5
|
+
const Toaster = ({ ...props }: ToasterProps) => {
|
|
6
|
+
const { theme = "system" } = useTheme()
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<Sonner
|
|
10
|
+
theme={theme as ToasterProps["theme"]}
|
|
11
|
+
className="group"
|
|
12
|
+
icons={{
|
|
13
|
+
success: <CircleCheckIcon className="size-4" />,
|
|
14
|
+
info: <InfoIcon className="size-4" />,
|
|
15
|
+
warning: <TriangleAlertIcon className="size-4" />,
|
|
16
|
+
error: <OctagonXIcon className="size-4" />,
|
|
17
|
+
loading: <Loader2Icon className="size-4 animate-spin" />,
|
|
18
|
+
}}
|
|
19
|
+
style={
|
|
20
|
+
{
|
|
21
|
+
"--normal-bg": "var(--popover)",
|
|
22
|
+
"--normal-text": "var(--popover-foreground)",
|
|
23
|
+
"--normal-border": "var(--border)",
|
|
24
|
+
"--border-radius": "var(--radius)",
|
|
25
|
+
} as React.CSSProperties
|
|
26
|
+
}
|
|
27
|
+
toastOptions={{
|
|
28
|
+
classNames: {
|
|
29
|
+
toast: "cn-toast",
|
|
30
|
+
},
|
|
31
|
+
}}
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { Toaster }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils"
|
|
2
|
+
import { Loader2Icon } from "lucide-react"
|
|
3
|
+
|
|
4
|
+
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
|
|
5
|
+
return (
|
|
6
|
+
<Loader2Icon
|
|
7
|
+
data-slot="spinner"
|
|
8
|
+
role="status"
|
|
9
|
+
aria-label="Loading"
|
|
10
|
+
className={cn("size-4 animate-spin", className)}
|
|
11
|
+
{...props}
|
|
12
|
+
/>
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { Spinner }
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
import { Steps as StepsPrimitive } from "@ark-ui/react"
|
|
6
|
+
import { CheckIcon } from "lucide-react"
|
|
7
|
+
|
|
8
|
+
import { Button } from "@/components/ui/button"
|
|
9
|
+
|
|
10
|
+
function Steps({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Root>) {
|
|
11
|
+
return (
|
|
12
|
+
<StepsPrimitive.Root
|
|
13
|
+
data-slot="steps"
|
|
14
|
+
className={cn("flex w-full flex-col gap-4 data-vertical:flex-row", className)}
|
|
15
|
+
{...props}
|
|
16
|
+
/>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function StepsContext({ ...props }: React.ComponentProps<typeof StepsPrimitive.Context>) {
|
|
21
|
+
return <StepsPrimitive.Context {...props} />
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function StepsList({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.List>) {
|
|
25
|
+
return (
|
|
26
|
+
<StepsPrimitive.List
|
|
27
|
+
data-slot="steps-list"
|
|
28
|
+
className={cn("flex items-center gap-2 data-vertical:flex-col data-vertical:items-stretch", className)}
|
|
29
|
+
{...props}
|
|
30
|
+
/>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function StepsItem({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Item>) {
|
|
35
|
+
return (
|
|
36
|
+
<StepsPrimitive.Item
|
|
37
|
+
data-slot="steps-item"
|
|
38
|
+
className={cn(
|
|
39
|
+
"group/steps-item flex flex-1 items-center gap-2 last:flex-none data-vertical:flex-col data-vertical:items-start",
|
|
40
|
+
className
|
|
41
|
+
)}
|
|
42
|
+
{...props}
|
|
43
|
+
/>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function StepsItemContext({ ...props }: React.ComponentProps<typeof StepsPrimitive.ItemContext>) {
|
|
48
|
+
return <StepsPrimitive.ItemContext {...props} />
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function StepsTrigger({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Trigger>) {
|
|
52
|
+
return (
|
|
53
|
+
<StepsPrimitive.Trigger
|
|
54
|
+
data-slot="steps-trigger"
|
|
55
|
+
className={cn(
|
|
56
|
+
"flex items-center gap-2 rounded-md text-left text-sm font-medium outline-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-incomplete:text-muted-foreground",
|
|
57
|
+
className
|
|
58
|
+
)}
|
|
59
|
+
{...props}
|
|
60
|
+
/>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function StepsIndicator({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.Indicator>) {
|
|
65
|
+
return (
|
|
66
|
+
<StepsPrimitive.Indicator
|
|
67
|
+
data-slot="steps-indicator"
|
|
68
|
+
className={cn(
|
|
69
|
+
"flex size-7 shrink-0 items-center justify-center rounded-full border border-input text-xs font-medium tabular-nums transition-colors data-complete:border-primary data-complete:bg-primary data-complete:text-primary-foreground data-current:border-primary data-current:bg-primary data-current:text-primary-foreground [&_svg]:size-3.5",
|
|
70
|
+
className
|
|
71
|
+
)}
|
|
72
|
+
{...props}
|
|
73
|
+
>
|
|
74
|
+
{children ?? (
|
|
75
|
+
<StepsPrimitive.ItemContext>
|
|
76
|
+
{({ completed, index }) => (completed ? <CheckIcon /> : index + 1)}
|
|
77
|
+
</StepsPrimitive.ItemContext>
|
|
78
|
+
)}
|
|
79
|
+
</StepsPrimitive.Indicator>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function StepsSeparator({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Separator>) {
|
|
84
|
+
return (
|
|
85
|
+
<StepsPrimitive.Separator
|
|
86
|
+
data-slot="steps-separator"
|
|
87
|
+
className={cn(
|
|
88
|
+
"h-px flex-1 bg-border transition-colors data-complete:bg-primary data-vertical:ml-3.5 data-vertical:h-6 data-vertical:w-px data-vertical:flex-none",
|
|
89
|
+
className
|
|
90
|
+
)}
|
|
91
|
+
{...props}
|
|
92
|
+
/>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function StepsContent({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Content>) {
|
|
97
|
+
return <StepsPrimitive.Content data-slot="steps-content" className={cn("text-sm", className)} {...props} />
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function StepsCompletedContent({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.CompletedContent>) {
|
|
101
|
+
return (
|
|
102
|
+
<StepsPrimitive.CompletedContent
|
|
103
|
+
data-slot="steps-completed-content"
|
|
104
|
+
className={cn("text-sm", className)}
|
|
105
|
+
{...props}
|
|
106
|
+
/>
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function StepsProgress({ className, ...props }: React.ComponentProps<typeof StepsPrimitive.Progress>) {
|
|
111
|
+
return (
|
|
112
|
+
<StepsPrimitive.Progress
|
|
113
|
+
data-slot="steps-progress"
|
|
114
|
+
className={cn("h-1 w-full rounded-full bg-muted", className)}
|
|
115
|
+
{...props}
|
|
116
|
+
/>
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function StepsPrevTrigger({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.PrevTrigger>) {
|
|
121
|
+
return (
|
|
122
|
+
<StepsPrimitive.PrevTrigger data-slot="steps-prev-trigger" className={cn(className)} asChild {...props}>
|
|
123
|
+
<Button variant="outline" size="sm">
|
|
124
|
+
{children}
|
|
125
|
+
</Button>
|
|
126
|
+
</StepsPrimitive.PrevTrigger>
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function StepsNextTrigger({ className, children, ...props }: React.ComponentProps<typeof StepsPrimitive.NextTrigger>) {
|
|
131
|
+
return (
|
|
132
|
+
<StepsPrimitive.NextTrigger data-slot="steps-next-trigger" className={cn(className)} asChild {...props}>
|
|
133
|
+
<Button size="sm">{children}</Button>
|
|
134
|
+
</StepsPrimitive.NextTrigger>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export {
|
|
139
|
+
Steps,
|
|
140
|
+
StepsCompletedContent,
|
|
141
|
+
StepsContent,
|
|
142
|
+
StepsContext,
|
|
143
|
+
StepsIndicator,
|
|
144
|
+
StepsItem,
|
|
145
|
+
StepsItemContext,
|
|
146
|
+
StepsList,
|
|
147
|
+
StepsNextTrigger,
|
|
148
|
+
StepsPrevTrigger,
|
|
149
|
+
StepsProgress,
|
|
150
|
+
StepsSeparator,
|
|
151
|
+
StepsTrigger,
|
|
152
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
import { Swap as SwapPrimitive } from "@ark-ui/react"
|
|
6
|
+
|
|
7
|
+
function Swap({ className, ...props }: React.ComponentProps<typeof SwapPrimitive.Root>) {
|
|
8
|
+
return (
|
|
9
|
+
<SwapPrimitive.Root
|
|
10
|
+
data-slot="swap"
|
|
11
|
+
className={cn(
|
|
12
|
+
"relative inline-grid cursor-pointer place-items-center select-none *:col-start-1 *:row-start-1",
|
|
13
|
+
className
|
|
14
|
+
)}
|
|
15
|
+
{...props}
|
|
16
|
+
/>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function SwapIndicator({ className, ...props }: React.ComponentProps<typeof SwapPrimitive.Indicator>) {
|
|
21
|
+
return (
|
|
22
|
+
<SwapPrimitive.Indicator
|
|
23
|
+
data-slot="swap-indicator"
|
|
24
|
+
className={cn(
|
|
25
|
+
"transition-[opacity,transform] duration-200 data-[state=closed]:scale-75 data-[state=closed]:opacity-0 data-[state=open]:scale-100 data-[state=open]:opacity-100",
|
|
26
|
+
className
|
|
27
|
+
)}
|
|
28
|
+
{...props}
|
|
29
|
+
/>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { Swap, SwapIndicator }
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
import { Switch as SwitchPrimitive } from "@ark-ui/react"
|
|
6
|
+
|
|
7
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
8
|
+
function Switch({
|
|
9
|
+
className,
|
|
10
|
+
size = "default",
|
|
11
|
+
children,
|
|
12
|
+
...props
|
|
13
|
+
}: Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, "id"> & {
|
|
14
|
+
size?: "sm" | "default"
|
|
15
|
+
}) {
|
|
16
|
+
return (
|
|
17
|
+
<SwitchPrimitive.Root
|
|
18
|
+
data-slot="switch"
|
|
19
|
+
data-size={size}
|
|
20
|
+
className="group/switch peer inline-flex items-center gap-2"
|
|
21
|
+
{...props}
|
|
22
|
+
>
|
|
23
|
+
<SwitchControl className={className}>
|
|
24
|
+
<SwitchThumb />
|
|
25
|
+
</SwitchControl>
|
|
26
|
+
{children && <SwitchLabel>{children}</SwitchLabel>}
|
|
27
|
+
<SwitchHiddenInput />
|
|
28
|
+
</SwitchPrimitive.Root>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
33
|
+
function SwitchRoot({ ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, "id">) {
|
|
34
|
+
return <SwitchPrimitive.Root data-slot="switch" {...props} />
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function SwitchContext({ ...props }: React.ComponentProps<typeof SwitchPrimitive.Context>) {
|
|
38
|
+
return <SwitchPrimitive.Context {...props} />
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
42
|
+
function SwitchControl({ className, ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.Control>, "id">) {
|
|
43
|
+
return (
|
|
44
|
+
<SwitchPrimitive.Control
|
|
45
|
+
data-slot="switch-control"
|
|
46
|
+
className={cn(
|
|
47
|
+
"relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none group-has-focus-visible/field-label:border-transparent group-has-focus-visible/field-label:ring-0 group-data-[size=default]/switch:h-[18.4px] group-data-[size=default]/switch:w-8 group-data-[size=sm]/switch:h-3.5 group-data-[size=sm]/switch:w-6 after:absolute after:-inset-x-3 after:-inset-y-2 data-focus-visible:border-ring data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-invalid:border-destructive data-invalid:ring-3 data-invalid:ring-destructive/20 dark:data-invalid:border-destructive/50 dark:data-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
|
|
48
|
+
className
|
|
49
|
+
)}
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function SwitchThumb({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Thumb>) {
|
|
56
|
+
return (
|
|
57
|
+
<SwitchPrimitive.Thumb
|
|
58
|
+
data-slot="switch-thumb"
|
|
59
|
+
className={cn(
|
|
60
|
+
"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground",
|
|
61
|
+
className
|
|
62
|
+
)}
|
|
63
|
+
{...props}
|
|
64
|
+
/>
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function SwitchLabel({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Label>) {
|
|
69
|
+
return (
|
|
70
|
+
<SwitchPrimitive.Label
|
|
71
|
+
data-slot="switch-label"
|
|
72
|
+
className={cn("text-sm leading-none select-none data-disabled:opacity-50", className)}
|
|
73
|
+
{...props}
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** `id` is omitted: set part ids through the root `ids` prop so Ark's internal lookups keep working. */
|
|
79
|
+
function SwitchHiddenInput({ ...props }: Omit<React.ComponentProps<typeof SwitchPrimitive.HiddenInput>, "id">) {
|
|
80
|
+
return <SwitchPrimitive.HiddenInput {...props} />
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { Switch, SwitchContext, SwitchControl, SwitchHiddenInput, SwitchLabel, SwitchRoot, SwitchThumb }
|