@spree/dashboard-ui 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/LICENSE +21 -0
- package/README.md +26 -0
- package/package.json +86 -0
- package/src/hooks/use-copy-to-clipboard.ts +44 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/hooks/use-scrolled.ts +30 -0
- package/src/index.ts +99 -0
- package/src/lib/date-locale.ts +29 -0
- package/src/lib/utils.ts +6 -0
- package/src/lib/validation-messages.ts +19 -0
- package/src/spree/address-block.tsx +74 -0
- package/src/spree/back-button.tsx +48 -0
- package/src/spree/bulk-dialog.tsx +71 -0
- package/src/spree/bulk-price-table.tsx +254 -0
- package/src/spree/calculator-summary.tsx +120 -0
- package/src/spree/color-picker.tsx +202 -0
- package/src/spree/confirm-dialog.tsx +82 -0
- package/src/spree/copy-to-clipboard-button.tsx +90 -0
- package/src/spree/country-flag.tsx +30 -0
- package/src/spree/data-grid/cells.tsx +415 -0
- package/src/spree/data-grid/context.ts +59 -0
- package/src/spree/data-grid/data-grid.tsx +214 -0
- package/src/spree/data-grid/fill-handle.tsx +153 -0
- package/src/spree/data-grid/helpers.ts +18 -0
- package/src/spree/data-grid/index.ts +5 -0
- package/src/spree/data-grid/types.ts +36 -0
- package/src/spree/data-grid/use-data-grid-keyboard.ts +254 -0
- package/src/spree/data-grid/use-stable-cell-registration.ts +45 -0
- package/src/spree/drag-handle.tsx +51 -0
- package/src/spree/form-actions.tsx +140 -0
- package/src/spree/json-preview-drawer.tsx +254 -0
- package/src/spree/json-value-view.tsx +149 -0
- package/src/spree/language-menu-items.tsx +54 -0
- package/src/spree/metadata/metadata-card.tsx +62 -0
- package/src/spree/relative-time.tsx +49 -0
- package/src/spree/resource-combobox.tsx +108 -0
- package/src/spree/resource-layout.tsx +31 -0
- package/src/spree/resource-multi-autocomplete.tsx +180 -0
- package/src/spree/resource-name-cell.tsx +44 -0
- package/src/spree/route-error-boundary.tsx +102 -0
- package/src/spree/row-actions.tsx +85 -0
- package/src/spree/row-click-bridge.tsx +17 -0
- package/src/spree/secret-input.tsx +137 -0
- package/src/spree/storefront-visible-switch.tsx +58 -0
- package/src/spree/tag-list.tsx +26 -0
- package/src/spree/theme-provider.tsx +83 -0
- package/src/spree/theme-toggle.tsx +35 -0
- package/src/styles.css +338 -0
- package/src/ui/attachment.tsx +187 -0
- package/src/ui/avatar.tsx +94 -0
- package/src/ui/badge.tsx +161 -0
- package/src/ui/breadcrumb.tsx +109 -0
- package/src/ui/button.tsx +60 -0
- package/src/ui/calendar.tsx +66 -0
- package/src/ui/card.tsx +72 -0
- package/src/ui/chart.tsx +94 -0
- package/src/ui/checkbox.tsx +50 -0
- package/src/ui/collapsible.tsx +18 -0
- package/src/ui/combobox.tsx +270 -0
- package/src/ui/command.tsx +172 -0
- package/src/ui/data-table.tsx +60 -0
- package/src/ui/date-picker.tsx +253 -0
- package/src/ui/date-range-picker.tsx +150 -0
- package/src/ui/dialog.tsx +214 -0
- package/src/ui/dropdown-menu.tsx +345 -0
- package/src/ui/empty.tsx +94 -0
- package/src/ui/field.tsx +221 -0
- package/src/ui/input-group.tsx +141 -0
- package/src/ui/input.tsx +19 -0
- package/src/ui/label.tsx +29 -0
- package/src/ui/pagination.tsx +123 -0
- package/src/ui/popover.tsx +76 -0
- package/src/ui/progress.tsx +73 -0
- package/src/ui/radio-group.tsx +42 -0
- package/src/ui/rich-text-editor.tsx +263 -0
- package/src/ui/select.tsx +213 -0
- package/src/ui/separator.tsx +31 -0
- package/src/ui/sheet.tsx +208 -0
- package/src/ui/sidebar.tsx +679 -0
- package/src/ui/skeleton.tsx +13 -0
- package/src/ui/slot.tsx +35 -0
- package/src/ui/sonner.tsx +47 -0
- package/src/ui/switch.tsx +39 -0
- package/src/ui/textarea.tsx +18 -0
- package/src/ui/tooltip.tsx +100 -0
package/src/ui/sheet.tsx
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { Dialog as SheetPrimitive } from '@base-ui/react/dialog'
|
|
4
|
+
import i18n from 'i18next'
|
|
5
|
+
import { XIcon } from 'lucide-react'
|
|
6
|
+
import * as React from 'react'
|
|
7
|
+
import { cn } from '../lib/utils'
|
|
8
|
+
import { Button } from './button'
|
|
9
|
+
|
|
10
|
+
function Sheet({
|
|
11
|
+
children,
|
|
12
|
+
open,
|
|
13
|
+
defaultOpen,
|
|
14
|
+
onOpenChange,
|
|
15
|
+
modal,
|
|
16
|
+
...props
|
|
17
|
+
}: {
|
|
18
|
+
children?: React.ReactNode
|
|
19
|
+
open?: boolean
|
|
20
|
+
defaultOpen?: boolean
|
|
21
|
+
onOpenChange?: (open: boolean, eventDetails: SheetPrimitive.Root.ChangeEventDetails) => void
|
|
22
|
+
/**
|
|
23
|
+
* `true` (default) — full modal: focus trap + scroll lock + outside pointer interactions disabled.
|
|
24
|
+
* `'trap-focus'` — focus trap only; outside pointer interactions remain enabled.
|
|
25
|
+
* `false` — no modal behavior.
|
|
26
|
+
*
|
|
27
|
+
* Use `'trap-focus'` when the sheet contains a contenteditable (e.g. tiptap)
|
|
28
|
+
* — the full-modal pointer-down listeners on `document` with `capture: true`
|
|
29
|
+
* race with ProseMirror's own pointer handlers and break click-to-focus.
|
|
30
|
+
*/
|
|
31
|
+
modal?: boolean | 'trap-focus'
|
|
32
|
+
}) {
|
|
33
|
+
return (
|
|
34
|
+
<SheetPrimitive.Root
|
|
35
|
+
data-slot="sheet"
|
|
36
|
+
open={open}
|
|
37
|
+
defaultOpen={defaultOpen}
|
|
38
|
+
onOpenChange={onOpenChange}
|
|
39
|
+
modal={modal}
|
|
40
|
+
{...props}
|
|
41
|
+
>
|
|
42
|
+
{children}
|
|
43
|
+
</SheetPrimitive.Root>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function SheetTrigger({
|
|
48
|
+
asChild,
|
|
49
|
+
children,
|
|
50
|
+
...props
|
|
51
|
+
}: React.ComponentProps<typeof SheetPrimitive.Trigger> & {
|
|
52
|
+
asChild?: boolean
|
|
53
|
+
}) {
|
|
54
|
+
if (asChild && React.isValidElement(children)) {
|
|
55
|
+
return <SheetPrimitive.Trigger data-slot="sheet-trigger" render={children} {...props} />
|
|
56
|
+
}
|
|
57
|
+
return (
|
|
58
|
+
<SheetPrimitive.Trigger data-slot="sheet-trigger" {...props}>
|
|
59
|
+
{children}
|
|
60
|
+
</SheetPrimitive.Trigger>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function SheetClose({
|
|
65
|
+
asChild,
|
|
66
|
+
children,
|
|
67
|
+
...props
|
|
68
|
+
}: React.ComponentProps<typeof SheetPrimitive.Close> & {
|
|
69
|
+
asChild?: boolean
|
|
70
|
+
}) {
|
|
71
|
+
if (asChild && React.isValidElement(children)) {
|
|
72
|
+
return <SheetPrimitive.Close data-slot="sheet-close" render={children} {...props} />
|
|
73
|
+
}
|
|
74
|
+
return (
|
|
75
|
+
<SheetPrimitive.Close data-slot="sheet-close" {...props}>
|
|
76
|
+
{children}
|
|
77
|
+
</SheetPrimitive.Close>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function SheetPortal({ children, ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
|
|
82
|
+
return (
|
|
83
|
+
<SheetPrimitive.Portal data-slot="sheet-portal" {...props}>
|
|
84
|
+
{children}
|
|
85
|
+
</SheetPrimitive.Portal>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function SheetOverlay({
|
|
90
|
+
className,
|
|
91
|
+
...props
|
|
92
|
+
}: React.ComponentProps<typeof SheetPrimitive.Backdrop>) {
|
|
93
|
+
return (
|
|
94
|
+
<SheetPrimitive.Backdrop
|
|
95
|
+
data-slot="sheet-overlay"
|
|
96
|
+
className={cn(
|
|
97
|
+
'fixed inset-0 z-50 bg-gray-100/75 dark:bg-black/60 duration-200 data-[starting-style]:opacity-0 data-[ending-style]:opacity-0 transition-opacity',
|
|
98
|
+
className,
|
|
99
|
+
)}
|
|
100
|
+
{...props}
|
|
101
|
+
/>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function SheetContent({
|
|
106
|
+
className,
|
|
107
|
+
children,
|
|
108
|
+
side = 'right',
|
|
109
|
+
showCloseButton = true,
|
|
110
|
+
dir,
|
|
111
|
+
...props
|
|
112
|
+
}: React.ComponentProps<typeof SheetPrimitive.Popup> & {
|
|
113
|
+
side?: 'top' | 'right' | 'bottom' | 'left'
|
|
114
|
+
showCloseButton?: boolean
|
|
115
|
+
dir?: string
|
|
116
|
+
}) {
|
|
117
|
+
return (
|
|
118
|
+
<SheetPortal>
|
|
119
|
+
<SheetOverlay />
|
|
120
|
+
<SheetPrimitive.Popup
|
|
121
|
+
data-slot="sheet-content"
|
|
122
|
+
data-side={side}
|
|
123
|
+
dir={dir}
|
|
124
|
+
className={cn(
|
|
125
|
+
'fixed z-50 flex flex-col border border-border bg-card text-foreground text-sm shadow-lg transition duration-250 ease-out',
|
|
126
|
+
'data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-[calc(100dvh-1rem)] data-[side=right]:max-h-[calc(100dvh-1rem)] data-[side=right]:w-[calc(100vw-1rem)] data-[side=right]:max-w-[600px] data-[side=right]:min-w-[320px] data-[side=right]:m-2 data-[side=right]:rounded-xl',
|
|
127
|
+
'data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:sm:max-w-sm',
|
|
128
|
+
'data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t',
|
|
129
|
+
'data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b',
|
|
130
|
+
'data-[starting-style]:opacity-0 data-[side=right]:data-[starting-style]:translate-x-10 data-[side=left]:data-[starting-style]:-translate-x-10 data-[side=bottom]:data-[starting-style]:translate-y-10 data-[side=top]:data-[starting-style]:-translate-y-10',
|
|
131
|
+
'data-[ending-style]:opacity-0 data-[side=right]:data-[ending-style]:translate-x-10 data-[side=left]:data-[ending-style]:-translate-x-10 data-[side=bottom]:data-[ending-style]:translate-y-10 data-[side=top]:data-[ending-style]:-translate-y-10',
|
|
132
|
+
className,
|
|
133
|
+
)}
|
|
134
|
+
{...props}
|
|
135
|
+
>
|
|
136
|
+
{children}
|
|
137
|
+
{showCloseButton && (
|
|
138
|
+
<SheetPrimitive.Close
|
|
139
|
+
data-slot="sheet-close"
|
|
140
|
+
render={
|
|
141
|
+
<Button variant="ghost" className="absolute top-3 right-3" size="icon-sm">
|
|
142
|
+
<XIcon />
|
|
143
|
+
<span className="sr-only">{i18n.t('admin.actions.close')}</span>
|
|
144
|
+
</Button>
|
|
145
|
+
}
|
|
146
|
+
/>
|
|
147
|
+
)}
|
|
148
|
+
</SheetPrimitive.Popup>
|
|
149
|
+
</SheetPortal>
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {
|
|
154
|
+
return (
|
|
155
|
+
<div
|
|
156
|
+
data-slot="sheet-header"
|
|
157
|
+
className={cn('relative flex flex-col gap-1.5 border-b p-4 pr-12', className)}
|
|
158
|
+
{...props}
|
|
159
|
+
/>
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {
|
|
164
|
+
return (
|
|
165
|
+
<div
|
|
166
|
+
data-slot="sheet-footer"
|
|
167
|
+
className={cn(
|
|
168
|
+
'flex flex-col-reverse gap-2 border-t bg-muted/50 p-4 sm:flex-row sm:justify-end rounded-b-xl',
|
|
169
|
+
className,
|
|
170
|
+
)}
|
|
171
|
+
{...props}
|
|
172
|
+
/>
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {
|
|
177
|
+
return (
|
|
178
|
+
<SheetPrimitive.Title
|
|
179
|
+
data-slot="sheet-title"
|
|
180
|
+
className={cn('text-base leading-none font-medium', className)}
|
|
181
|
+
{...props}
|
|
182
|
+
/>
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function SheetDescription({
|
|
187
|
+
className,
|
|
188
|
+
...props
|
|
189
|
+
}: React.ComponentProps<typeof SheetPrimitive.Description>) {
|
|
190
|
+
return (
|
|
191
|
+
<SheetPrimitive.Description
|
|
192
|
+
data-slot="sheet-description"
|
|
193
|
+
className={cn('text-sm text-muted-foreground', className)}
|
|
194
|
+
{...props}
|
|
195
|
+
/>
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export {
|
|
200
|
+
Sheet,
|
|
201
|
+
SheetClose,
|
|
202
|
+
SheetContent,
|
|
203
|
+
SheetDescription,
|
|
204
|
+
SheetFooter,
|
|
205
|
+
SheetHeader,
|
|
206
|
+
SheetTitle,
|
|
207
|
+
SheetTrigger,
|
|
208
|
+
}
|