@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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/package.json +86 -0
  4. package/src/hooks/use-copy-to-clipboard.ts +44 -0
  5. package/src/hooks/use-mobile.ts +19 -0
  6. package/src/hooks/use-scrolled.ts +30 -0
  7. package/src/index.ts +99 -0
  8. package/src/lib/date-locale.ts +29 -0
  9. package/src/lib/utils.ts +6 -0
  10. package/src/lib/validation-messages.ts +19 -0
  11. package/src/spree/address-block.tsx +74 -0
  12. package/src/spree/back-button.tsx +48 -0
  13. package/src/spree/bulk-dialog.tsx +71 -0
  14. package/src/spree/bulk-price-table.tsx +254 -0
  15. package/src/spree/calculator-summary.tsx +120 -0
  16. package/src/spree/color-picker.tsx +202 -0
  17. package/src/spree/confirm-dialog.tsx +82 -0
  18. package/src/spree/copy-to-clipboard-button.tsx +90 -0
  19. package/src/spree/country-flag.tsx +30 -0
  20. package/src/spree/data-grid/cells.tsx +415 -0
  21. package/src/spree/data-grid/context.ts +59 -0
  22. package/src/spree/data-grid/data-grid.tsx +214 -0
  23. package/src/spree/data-grid/fill-handle.tsx +153 -0
  24. package/src/spree/data-grid/helpers.ts +18 -0
  25. package/src/spree/data-grid/index.ts +5 -0
  26. package/src/spree/data-grid/types.ts +36 -0
  27. package/src/spree/data-grid/use-data-grid-keyboard.ts +254 -0
  28. package/src/spree/data-grid/use-stable-cell-registration.ts +45 -0
  29. package/src/spree/drag-handle.tsx +51 -0
  30. package/src/spree/form-actions.tsx +140 -0
  31. package/src/spree/json-preview-drawer.tsx +254 -0
  32. package/src/spree/json-value-view.tsx +149 -0
  33. package/src/spree/language-menu-items.tsx +54 -0
  34. package/src/spree/metadata/metadata-card.tsx +62 -0
  35. package/src/spree/relative-time.tsx +49 -0
  36. package/src/spree/resource-combobox.tsx +108 -0
  37. package/src/spree/resource-layout.tsx +31 -0
  38. package/src/spree/resource-multi-autocomplete.tsx +180 -0
  39. package/src/spree/resource-name-cell.tsx +44 -0
  40. package/src/spree/route-error-boundary.tsx +102 -0
  41. package/src/spree/row-actions.tsx +85 -0
  42. package/src/spree/row-click-bridge.tsx +17 -0
  43. package/src/spree/secret-input.tsx +137 -0
  44. package/src/spree/storefront-visible-switch.tsx +58 -0
  45. package/src/spree/tag-list.tsx +26 -0
  46. package/src/spree/theme-provider.tsx +83 -0
  47. package/src/spree/theme-toggle.tsx +35 -0
  48. package/src/styles.css +338 -0
  49. package/src/ui/attachment.tsx +187 -0
  50. package/src/ui/avatar.tsx +94 -0
  51. package/src/ui/badge.tsx +161 -0
  52. package/src/ui/breadcrumb.tsx +109 -0
  53. package/src/ui/button.tsx +60 -0
  54. package/src/ui/calendar.tsx +66 -0
  55. package/src/ui/card.tsx +72 -0
  56. package/src/ui/chart.tsx +94 -0
  57. package/src/ui/checkbox.tsx +50 -0
  58. package/src/ui/collapsible.tsx +18 -0
  59. package/src/ui/combobox.tsx +270 -0
  60. package/src/ui/command.tsx +172 -0
  61. package/src/ui/data-table.tsx +60 -0
  62. package/src/ui/date-picker.tsx +253 -0
  63. package/src/ui/date-range-picker.tsx +150 -0
  64. package/src/ui/dialog.tsx +214 -0
  65. package/src/ui/dropdown-menu.tsx +345 -0
  66. package/src/ui/empty.tsx +94 -0
  67. package/src/ui/field.tsx +221 -0
  68. package/src/ui/input-group.tsx +141 -0
  69. package/src/ui/input.tsx +19 -0
  70. package/src/ui/label.tsx +29 -0
  71. package/src/ui/pagination.tsx +123 -0
  72. package/src/ui/popover.tsx +76 -0
  73. package/src/ui/progress.tsx +73 -0
  74. package/src/ui/radio-group.tsx +42 -0
  75. package/src/ui/rich-text-editor.tsx +263 -0
  76. package/src/ui/select.tsx +213 -0
  77. package/src/ui/separator.tsx +31 -0
  78. package/src/ui/sheet.tsx +208 -0
  79. package/src/ui/sidebar.tsx +679 -0
  80. package/src/ui/skeleton.tsx +13 -0
  81. package/src/ui/slot.tsx +35 -0
  82. package/src/ui/sonner.tsx +47 -0
  83. package/src/ui/switch.tsx +39 -0
  84. package/src/ui/textarea.tsx +18 -0
  85. package/src/ui/tooltip.tsx +100 -0
@@ -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
+ }