parthenon-ui 1.0.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.
Files changed (36) hide show
  1. package/package.json +74 -0
  2. package/src/components/.gitkeep +0 -0
  3. package/src/components/avatar.tsx +109 -0
  4. package/src/components/badge.tsx +52 -0
  5. package/src/components/button.tsx +122 -0
  6. package/src/components/card.tsx +108 -0
  7. package/src/components/checkbox.tsx +37 -0
  8. package/src/components/collapsible.tsx +21 -0
  9. package/src/components/color-picker.tsx +270 -0
  10. package/src/components/command.tsx +195 -0
  11. package/src/components/context-menu.tsx +270 -0
  12. package/src/components/dialog.tsx +169 -0
  13. package/src/components/dropdown-menu.tsx +279 -0
  14. package/src/components/empty.tsx +104 -0
  15. package/src/components/index.ts +27 -0
  16. package/src/components/input-group.tsx +155 -0
  17. package/src/components/input.tsx +27 -0
  18. package/src/components/label.tsx +18 -0
  19. package/src/components/popover.tsx +88 -0
  20. package/src/components/scroll-area.tsx +55 -0
  21. package/src/components/select.tsx +201 -0
  22. package/src/components/separator.tsx +23 -0
  23. package/src/components/sheet.tsx +138 -0
  24. package/src/components/sidebar.tsx +729 -0
  25. package/src/components/skeleton.tsx +13 -0
  26. package/src/components/sonner.tsx +59 -0
  27. package/src/components/switch.tsx +51 -0
  28. package/src/components/table.tsx +375 -0
  29. package/src/components/tabs.tsx +80 -0
  30. package/src/components/textarea.tsx +18 -0
  31. package/src/components/tooltip.tsx +64 -0
  32. package/src/hooks/.gitkeep +0 -0
  33. package/src/hooks/use-mobile.ts +19 -0
  34. package/src/lib/.gitkeep +0 -0
  35. package/src/lib/utils.ts +6 -0
  36. package/src/styles/globals.css +654 -0
@@ -0,0 +1,270 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu"
5
+
6
+ import { cn } from "@workspace/ui/lib/utils"
7
+ import { HugeiconsIcon } from "@hugeicons/react"
8
+ import { ArrowRight01Icon, Tick02Icon } from "@hugeicons/core-free-icons"
9
+
10
+ function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {
11
+ return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />
12
+ }
13
+
14
+ function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) {
15
+ return (
16
+ <ContextMenuPrimitive.Portal data-slot="context-menu-portal" {...props} />
17
+ )
18
+ }
19
+
20
+ function ContextMenuTrigger({
21
+ className,
22
+ ...props
23
+ }: ContextMenuPrimitive.Trigger.Props) {
24
+ return (
25
+ <ContextMenuPrimitive.Trigger
26
+ data-slot="context-menu-trigger"
27
+ className={cn("select-none", className)}
28
+ {...props}
29
+ />
30
+ )
31
+ }
32
+
33
+ function ContextMenuContent({
34
+ className,
35
+ align = "start",
36
+ alignOffset = 4,
37
+ side = "inline-end",
38
+ sideOffset = 0,
39
+ ...props
40
+ }: ContextMenuPrimitive.Popup.Props &
41
+ Pick<
42
+ ContextMenuPrimitive.Positioner.Props,
43
+ "align" | "alignOffset" | "side" | "sideOffset"
44
+ >) {
45
+ return (
46
+ <ContextMenuPrimitive.Portal>
47
+ <ContextMenuPrimitive.Positioner
48
+ className="isolate z-50 outline-none"
49
+ align={align}
50
+ alignOffset={alignOffset}
51
+ side={side}
52
+ sideOffset={sideOffset}
53
+ >
54
+ <ContextMenuPrimitive.Popup
55
+ data-slot="context-menu-content"
56
+ className={cn("z-50 max-h-(--available-height) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-2xl bg-popover p-1 text-popover-foreground shadow-2xl ring-1 ring-foreground/5 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-start-2 data-[side=inline-start]:slide-in-from-end-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )}
57
+ {...props}
58
+ />
59
+ </ContextMenuPrimitive.Positioner>
60
+ </ContextMenuPrimitive.Portal>
61
+ )
62
+ }
63
+
64
+ function ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {
65
+ return (
66
+ <ContextMenuPrimitive.Group data-slot="context-menu-group" {...props} />
67
+ )
68
+ }
69
+
70
+ function ContextMenuLabel({
71
+ className,
72
+ inset,
73
+ ...props
74
+ }: ContextMenuPrimitive.GroupLabel.Props & {
75
+ inset?: boolean
76
+ }) {
77
+ return (
78
+ <ContextMenuPrimitive.GroupLabel
79
+ data-slot="context-menu-label"
80
+ data-inset={inset}
81
+ className={cn(
82
+ "px-3 py-2.5 text-xs text-muted-foreground data-inset:ps-9.5",
83
+ className
84
+ )}
85
+ {...props}
86
+ />
87
+ )
88
+ }
89
+
90
+ function ContextMenuItem({
91
+ className,
92
+ inset,
93
+ variant = "default",
94
+ ...props
95
+ }: ContextMenuPrimitive.Item.Props & {
96
+ inset?: boolean
97
+ variant?: "default" | "destructive"
98
+ }) {
99
+ return (
100
+ <ContextMenuPrimitive.Item
101
+ data-slot="context-menu-item"
102
+ data-inset={inset}
103
+ data-variant={variant}
104
+ className={cn(
105
+ "group/context-menu-item relative flex cursor-default items-center gap-2.5 rounded-xl px-3 py-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-9.5 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
106
+ className
107
+ )}
108
+ {...props}
109
+ />
110
+ )
111
+ }
112
+
113
+ function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) {
114
+ return (
115
+ <ContextMenuPrimitive.SubmenuRoot data-slot="context-menu-sub" {...props} />
116
+ )
117
+ }
118
+
119
+ function ContextMenuSubTrigger({
120
+ className,
121
+ inset,
122
+ children,
123
+ ...props
124
+ }: ContextMenuPrimitive.SubmenuTrigger.Props & {
125
+ inset?: boolean
126
+ }) {
127
+ return (
128
+ <ContextMenuPrimitive.SubmenuTrigger
129
+ data-slot="context-menu-sub-trigger"
130
+ data-inset={inset}
131
+ className={cn(
132
+ "flex cursor-default items-center rounded-xl px-3 py-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-9.5 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
133
+ className
134
+ )}
135
+ {...props}
136
+ >
137
+ {children}
138
+ <HugeiconsIcon icon={ArrowRight01Icon} strokeWidth={2} className="rtl:rotate-180 ms-auto" />
139
+ </ContextMenuPrimitive.SubmenuTrigger>
140
+ )
141
+ }
142
+
143
+ function ContextMenuSubContent({
144
+ ...props
145
+ }: React.ComponentProps<typeof ContextMenuContent>) {
146
+ return (
147
+ <ContextMenuContent
148
+ data-slot="context-menu-sub-content"
149
+ className="shadow-lg"
150
+ side="inline-end"
151
+ {...props}
152
+ />
153
+ )
154
+ }
155
+
156
+ function ContextMenuCheckboxItem({
157
+ className,
158
+ children,
159
+ checked,
160
+ inset,
161
+ ...props
162
+ }: ContextMenuPrimitive.CheckboxItem.Props & {
163
+ inset?: boolean
164
+ }) {
165
+ return (
166
+ <ContextMenuPrimitive.CheckboxItem
167
+ data-slot="context-menu-checkbox-item"
168
+ data-inset={inset}
169
+ className={cn(
170
+ "relative flex cursor-default items-center gap-2 rounded-xl py-2 pe-8 ps-3 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
171
+ className
172
+ )}
173
+ checked={checked}
174
+ {...props}
175
+ >
176
+ <span className="pointer-events-none absolute end-2">
177
+ <ContextMenuPrimitive.CheckboxItemIndicator>
178
+ <HugeiconsIcon icon={Tick02Icon} strokeWidth={2} />
179
+ </ContextMenuPrimitive.CheckboxItemIndicator>
180
+ </span>
181
+ {children}
182
+ </ContextMenuPrimitive.CheckboxItem>
183
+ )
184
+ }
185
+
186
+ function ContextMenuRadioGroup({
187
+ ...props
188
+ }: ContextMenuPrimitive.RadioGroup.Props) {
189
+ return (
190
+ <ContextMenuPrimitive.RadioGroup
191
+ data-slot="context-menu-radio-group"
192
+ {...props}
193
+ />
194
+ )
195
+ }
196
+
197
+ function ContextMenuRadioItem({
198
+ className,
199
+ children,
200
+ inset,
201
+ ...props
202
+ }: ContextMenuPrimitive.RadioItem.Props & {
203
+ inset?: boolean
204
+ }) {
205
+ return (
206
+ <ContextMenuPrimitive.RadioItem
207
+ data-slot="context-menu-radio-item"
208
+ data-inset={inset}
209
+ className={cn(
210
+ "relative flex cursor-default items-center gap-2 rounded-xl py-2 pe-8 ps-3 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:ps-9.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
211
+ className
212
+ )}
213
+ {...props}
214
+ >
215
+ <span className="pointer-events-none absolute end-2">
216
+ <ContextMenuPrimitive.RadioItemIndicator>
217
+ <HugeiconsIcon icon={Tick02Icon} strokeWidth={2} />
218
+ </ContextMenuPrimitive.RadioItemIndicator>
219
+ </span>
220
+ {children}
221
+ </ContextMenuPrimitive.RadioItem>
222
+ )
223
+ }
224
+
225
+ function ContextMenuSeparator({
226
+ className,
227
+ ...props
228
+ }: ContextMenuPrimitive.Separator.Props) {
229
+ return (
230
+ <ContextMenuPrimitive.Separator
231
+ data-slot="context-menu-separator"
232
+ className={cn("-mx-1 my-1 h-px bg-border/50", className)}
233
+ {...props}
234
+ />
235
+ )
236
+ }
237
+
238
+ function ContextMenuShortcut({
239
+ className,
240
+ ...props
241
+ }: React.ComponentProps<"span">) {
242
+ return (
243
+ <span
244
+ data-slot="context-menu-shortcut"
245
+ className={cn(
246
+ "ms-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground",
247
+ className
248
+ )}
249
+ {...props}
250
+ />
251
+ )
252
+ }
253
+
254
+ export {
255
+ ContextMenu,
256
+ ContextMenuTrigger,
257
+ ContextMenuContent,
258
+ ContextMenuItem,
259
+ ContextMenuCheckboxItem,
260
+ ContextMenuRadioItem,
261
+ ContextMenuLabel,
262
+ ContextMenuSeparator,
263
+ ContextMenuShortcut,
264
+ ContextMenuGroup,
265
+ ContextMenuPortal,
266
+ ContextMenuSub,
267
+ ContextMenuSubContent,
268
+ ContextMenuSubTrigger,
269
+ ContextMenuRadioGroup,
270
+ }
@@ -0,0 +1,169 @@
1
+ import * as React from "react"
2
+ import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
3
+
4
+ import { cn } from "@workspace/ui/lib/utils"
5
+ import { Button } from "@workspace/ui/components/button"
6
+ import { HugeiconsIcon } from "@hugeicons/react"
7
+ import { Cancel01Icon } from "@hugeicons/core-free-icons"
8
+
9
+ function Dialog({ ...props }: DialogPrimitive.Root.Props) {
10
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
11
+ }
12
+
13
+ function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
14
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
15
+ }
16
+
17
+ function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
18
+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
19
+ }
20
+
21
+ function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
22
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
23
+ }
24
+
25
+ function DialogOverlay({
26
+ className,
27
+ ...props
28
+ }: DialogPrimitive.Backdrop.Props) {
29
+ const patternId = React.useId()
30
+
31
+ return (
32
+ <DialogPrimitive.Backdrop
33
+ data-slot="dialog-overlay"
34
+ className={cn(
35
+ "fixed inset-0 isolate z-50 bg-black/80 duration-200 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
36
+ className
37
+ )}
38
+ {...props}
39
+ >
40
+ <svg className="absolute inset-0 size-full opacity-[0.04] pointer-events-none" fill="none">
41
+ <defs>
42
+ <pattern id={patternId} x="0" y="0" width="10" height="10" patternUnits="userSpaceOnUse">
43
+ <path d="M-3 13 15-5M-5 5l18-18M-1 21 17 3" />
44
+ </pattern>
45
+ </defs>
46
+ <rect stroke="none" fill={`url(#${patternId})`} width="100%" height="100%" />
47
+ </svg>
48
+ </DialogPrimitive.Backdrop>
49
+ )
50
+ }
51
+
52
+ function DialogContent({
53
+ className,
54
+ children,
55
+ showCloseButton = true,
56
+ ...props
57
+ }: DialogPrimitive.Popup.Props & {
58
+ showCloseButton?: boolean
59
+ }) {
60
+ return (
61
+ <DialogPortal>
62
+ <DialogOverlay />
63
+ <DialogPrimitive.Popup
64
+ data-slot="dialog-content"
65
+ className={cn(
66
+ "fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/5 duration-200 outline-none sm:max-w-md data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
67
+ className
68
+ )}
69
+ {...props}
70
+ >
71
+ {children}
72
+ {showCloseButton && (
73
+ <DialogPrimitive.Close
74
+ data-slot="dialog-close"
75
+ render={
76
+ <Button
77
+ variant="ghost"
78
+ className="absolute top-4 end-4"
79
+ size="icon-sm"
80
+ />
81
+ }
82
+ >
83
+ <HugeiconsIcon icon={Cancel01Icon} strokeWidth={2} />
84
+ <span className="sr-only">Close</span>
85
+ </DialogPrimitive.Close>
86
+ )}
87
+ </DialogPrimitive.Popup>
88
+ </DialogPortal>
89
+ )
90
+ }
91
+
92
+ function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
93
+ return (
94
+ <div
95
+ data-slot="dialog-header"
96
+ className={cn("flex flex-col gap-2", className)}
97
+ {...props}
98
+ />
99
+ )
100
+ }
101
+
102
+ function DialogFooter({
103
+ className,
104
+ showCloseButton = false,
105
+ children,
106
+ ...props
107
+ }: React.ComponentProps<"div"> & {
108
+ showCloseButton?: boolean
109
+ }) {
110
+ return (
111
+ <div
112
+ data-slot="dialog-footer"
113
+ className={cn(
114
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
115
+ className
116
+ )}
117
+ {...props}
118
+ >
119
+ {children}
120
+ {showCloseButton && (
121
+ <DialogPrimitive.Close render={<Button variant="outline" />}>
122
+ Close
123
+ </DialogPrimitive.Close>
124
+ )}
125
+ </div>
126
+ )
127
+ }
128
+
129
+ function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
130
+ return (
131
+ <DialogPrimitive.Title
132
+ data-slot="dialog-title"
133
+ className={cn(
134
+ "font-heading text-base leading-none font-medium",
135
+ className
136
+ )}
137
+ {...props}
138
+ />
139
+ )
140
+ }
141
+
142
+ function DialogDescription({
143
+ className,
144
+ ...props
145
+ }: DialogPrimitive.Description.Props) {
146
+ return (
147
+ <DialogPrimitive.Description
148
+ data-slot="dialog-description"
149
+ className={cn(
150
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
151
+ className
152
+ )}
153
+ {...props}
154
+ />
155
+ )
156
+ }
157
+
158
+ export {
159
+ Dialog,
160
+ DialogClose,
161
+ DialogContent,
162
+ DialogDescription,
163
+ DialogFooter,
164
+ DialogHeader,
165
+ DialogOverlay,
166
+ DialogPortal,
167
+ DialogTitle,
168
+ DialogTrigger,
169
+ }