@mrigx/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/package.json +73 -0
- package/src/blocks/ContactPanel.tsx +99 -0
- package/src/blocks/FeatureGrid.tsx +38 -0
- package/src/blocks/OpticalCTA.tsx +33 -0
- package/src/blocks/OpticalHero.tsx +51 -0
- package/src/blocks/styles.ts +175 -0
- package/src/components/accordion/optical-accordion.tsx +199 -0
- package/src/components/alert/optical-alert.tsx +59 -0
- package/src/components/alert-dialog/optical-alert-dialog.tsx +143 -0
- package/src/components/ambient-light.tsx +27 -0
- package/src/components/aspect-ratio/optical-aspect-ratio.tsx +7 -0
- package/src/components/attachment/optical-attachment.tsx +25 -0
- package/src/components/avatar/optical-avatar.tsx +50 -0
- package/src/components/badge/optical-badge.tsx +36 -0
- package/src/components/breadcrumb/optical-breadcrumb.tsx +115 -0
- package/src/components/bubble/optical-bubble.tsx +25 -0
- package/src/components/button/optical-button.tsx +67 -0
- package/src/components/button-group/optical-button-group.tsx +83 -0
- package/src/components/calendar/optical-calendar.tsx +214 -0
- package/src/components/card/optical-card.tsx +44 -0
- package/src/components/carousel/optical-carousel.tsx +262 -0
- package/src/components/chart/optical-chart.tsx +369 -0
- package/src/components/checkbox/optical-checkbox.tsx +42 -0
- package/src/components/collapsible/optical-collapsible.tsx +11 -0
- package/src/components/combobox/optical-combobox.tsx +25 -0
- package/src/components/command/optical-command.tsx +153 -0
- package/src/components/context-menu/optical-context-menu.tsx +201 -0
- package/src/components/cursor/optical-cursor.tsx +10 -0
- package/src/components/data-table/optical-data-table.tsx +25 -0
- package/src/components/date-picker/optical-date-picker.tsx +25 -0
- package/src/components/dialog/optical-dialog.tsx +110 -0
- package/src/components/direction/optical-direction.tsx +25 -0
- package/src/components/drawer/optical-drawer.tsx +120 -0
- package/src/components/dropdown-menu/optical-dropdown-menu.tsx +194 -0
- package/src/components/empty/optical-empty.tsx +104 -0
- package/src/components/field/optical-field.tsx +244 -0
- package/src/components/glass-card.tsx +13 -0
- package/src/components/hover-card/optical-hover-card.tsx +30 -0
- package/src/components/icon-button/optical-icon-button.tsx +22 -0
- package/src/components/input/optical-input.tsx +29 -0
- package/src/components/input-group/optical-input-group.tsx +170 -0
- package/src/components/input-otp/optical-input-otp.tsx +71 -0
- package/src/components/item/optical-item.tsx +193 -0
- package/src/components/kbd/optical-kbd.tsx +28 -0
- package/src/components/label/optical-label.tsx +25 -0
- package/src/components/marker/optical-marker.tsx +25 -0
- package/src/components/menubar/optical-menubar.tsx +257 -0
- package/src/components/message/optical-message.tsx +25 -0
- package/src/components/message-scroller/optical-message-scroller.tsx +25 -0
- package/src/components/native-select/optical-native-select.tsx +25 -0
- package/src/components/navigation-menu/optical-navigation-menu.tsx +68 -0
- package/src/components/pagination/optical-pagination.tsx +118 -0
- package/src/components/panel/optical-panel.tsx +26 -0
- package/src/components/popover/optical-popover.tsx +32 -0
- package/src/components/prism-button.tsx +17 -0
- package/src/components/progress/optical-progress.tsx +28 -0
- package/src/components/questionnaire/optical-questionnaire.tsx +25 -0
- package/src/components/radio-group/optical-radio-group.tsx +25 -0
- package/src/components/resizable/optical-resizable.tsx +45 -0
- package/src/components/scroll-area/optical-scroll-area.tsx +48 -0
- package/src/components/select/optical-select.tsx +110 -0
- package/src/components/separator/optical-separator.tsx +31 -0
- package/src/components/sheet/optical-sheet.tsx +143 -0
- package/src/components/sidebar/optical-sidebar.tsx +762 -0
- package/src/components/skeleton/optical-skeleton.tsx +15 -0
- package/src/components/slider/optical-slider.tsx +34 -0
- package/src/components/sonner/optical-toast.tsx +45 -0
- package/src/components/spinner/optical-spinner.tsx +16 -0
- package/src/components/stained-glass-card.tsx +93 -0
- package/src/components/switch/optical-switch.tsx +31 -0
- package/src/components/table/optical-table.tsx +83 -0
- package/src/components/tabs/optical-tabs.tsx +56 -0
- package/src/components/text/liquid-tension-text.tsx +65 -0
- package/src/components/text/optical-tension-text.tsx +65 -0
- package/src/components/text/optical-text.tsx +20 -0
- package/src/components/text/prismatic-selection.tsx +5 -0
- package/src/components/textarea/optical-textarea.tsx +22 -0
- package/src/components/theme-toggle/optical-theme-toggle.tsx +45 -0
- package/src/components/toast/optical-toast.tsx +25 -0
- package/src/components/toggle/optical-toggle.tsx +45 -0
- package/src/components/toggle-group/optical-toggle-group.tsx +61 -0
- package/src/components/tooltip/optical-tooltip.tsx +33 -0
- package/src/components/typography/optical-typography.tsx +49 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/index.ts +88 -0
- package/src/templates/ContactPageTemplate.tsx +42 -0
- package/src/templates/LandingPageTemplate.tsx +29 -0
- package/src/templates/ProductPageTemplate.tsx +46 -0
- package/src/templates/styles.ts +23 -0
- package/src/utils/button-variants.ts +26 -0
- package/src/utils/cn.ts +6 -0
- package/tsconfig.json +27 -0
- package/vite.config.ts +42 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { GripVertical } from "lucide-react"
|
|
4
|
+
import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"
|
|
5
|
+
|
|
6
|
+
import { cn } from '../../utils/cn';
|
|
7
|
+
|
|
8
|
+
const ResizablePanelGroup = ({
|
|
9
|
+
className,
|
|
10
|
+
...props
|
|
11
|
+
}: React.ComponentProps<typeof PanelGroup>) => (
|
|
12
|
+
<PanelGroup
|
|
13
|
+
className={cn(
|
|
14
|
+
"flex h-full w-full data-[panel-group-direction=vertical]:flex-col",
|
|
15
|
+
className
|
|
16
|
+
)}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const ResizablePanel = Panel
|
|
22
|
+
|
|
23
|
+
const ResizableHandle = ({
|
|
24
|
+
withHandle,
|
|
25
|
+
className,
|
|
26
|
+
...props
|
|
27
|
+
}: React.ComponentProps<typeof PanelResizeHandle> & {
|
|
28
|
+
withHandle?: boolean
|
|
29
|
+
}) => (
|
|
30
|
+
<PanelResizeHandle
|
|
31
|
+
className={cn(
|
|
32
|
+
"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
|
|
33
|
+
className
|
|
34
|
+
)}
|
|
35
|
+
{...props}
|
|
36
|
+
>
|
|
37
|
+
{withHandle && (
|
|
38
|
+
<div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
|
|
39
|
+
<GripVertical className="h-2.5 w-2.5" />
|
|
40
|
+
</div>
|
|
41
|
+
)}
|
|
42
|
+
</PanelResizeHandle>
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
|
|
5
|
+
|
|
6
|
+
import { cn } from '../../utils/cn';
|
|
7
|
+
|
|
8
|
+
const OpticalScrollArea = React.forwardRef<
|
|
9
|
+
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
|
|
10
|
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
|
|
11
|
+
>(({ className, children, ...props }, ref) => (
|
|
12
|
+
<ScrollAreaPrimitive.Root
|
|
13
|
+
ref={ref}
|
|
14
|
+
className={cn("relative overflow-hidden", className)}
|
|
15
|
+
{...props}
|
|
16
|
+
>
|
|
17
|
+
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
|
|
18
|
+
{children}
|
|
19
|
+
</ScrollAreaPrimitive.Viewport>
|
|
20
|
+
<ScrollBar />
|
|
21
|
+
<ScrollAreaPrimitive.Corner />
|
|
22
|
+
</ScrollAreaPrimitive.Root>
|
|
23
|
+
))
|
|
24
|
+
OpticalScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
|
|
25
|
+
|
|
26
|
+
const ScrollBar = React.forwardRef<
|
|
27
|
+
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
|
|
28
|
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
29
|
+
>(({ className, orientation = "vertical", ...props }, ref) => (
|
|
30
|
+
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
|
31
|
+
ref={ref}
|
|
32
|
+
orientation={orientation}
|
|
33
|
+
className={cn(
|
|
34
|
+
"flex touch-none select-none transition-colors",
|
|
35
|
+
orientation === "vertical" &&
|
|
36
|
+
"h-full w-2.5 border-l border-l-transparent p-[1px]",
|
|
37
|
+
orientation === "horizontal" &&
|
|
38
|
+
"h-2.5 flex-col border-t border-t-transparent p-[1px]",
|
|
39
|
+
className
|
|
40
|
+
)}
|
|
41
|
+
{...props}
|
|
42
|
+
>
|
|
43
|
+
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-white/20 hover:bg-white/40 active:bg-white/60 transition-colors" />
|
|
44
|
+
</ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
45
|
+
))
|
|
46
|
+
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
|
|
47
|
+
|
|
48
|
+
export { OpticalScrollArea, ScrollBar }
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import * as SelectPrimitive from "@radix-ui/react-select"
|
|
3
|
+
import { GlassSurface } from '@mrigx/fx';
|
|
4
|
+
|
|
5
|
+
const OpticalSelect = SelectPrimitive.Root
|
|
6
|
+
const OpticalSelectGroup = SelectPrimitive.Group
|
|
7
|
+
const OpticalSelectValue = SelectPrimitive.Value
|
|
8
|
+
|
|
9
|
+
const OpticalSelectTrigger = React.forwardRef<
|
|
10
|
+
React.ElementRef<typeof SelectPrimitive.Trigger>,
|
|
11
|
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> & { material?: string; materialStrength?: number; borderRadius?: number }
|
|
12
|
+
>(({ className, children, material = "glass", materialStrength = 0.5, borderRadius = 8, ...props }, ref) => (
|
|
13
|
+
<SelectPrimitive.Trigger
|
|
14
|
+
ref={ref}
|
|
15
|
+
className={`flex h-10 w-full items-center justify-between rounded-md border border-white/10 bg-white/[0.02] px-3 py-2 text-sm text-white/90 ring-offset-background placeholder:text-white/40 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 relative ${className}`}
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
<GlassSurface material={material} materialStrength={materialStrength} borderRadius={borderRadius} className="absolute inset-0 -z-10" />
|
|
19
|
+
{children}
|
|
20
|
+
<SelectPrimitive.Icon asChild>
|
|
21
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="opacity-50"><path d="m6 9 6 6 6-6"/></svg>
|
|
22
|
+
</SelectPrimitive.Icon>
|
|
23
|
+
</SelectPrimitive.Trigger>
|
|
24
|
+
))
|
|
25
|
+
OpticalSelectTrigger.displayName = SelectPrimitive.Trigger.displayName
|
|
26
|
+
|
|
27
|
+
const OpticalSelectContent = React.forwardRef<
|
|
28
|
+
React.ElementRef<typeof SelectPrimitive.Content>,
|
|
29
|
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & { material?: string; materialStrength?: number; borderRadius?: number }
|
|
30
|
+
>(({ className, children, position = "popper", material = "crystal", materialStrength = 1.0, borderRadius = 12, ...props }, ref) => (
|
|
31
|
+
<SelectPrimitive.Portal>
|
|
32
|
+
<SelectPrimitive.Content
|
|
33
|
+
ref={ref}
|
|
34
|
+
className={`relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-xl border border-white/10 text-white shadow-2xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-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 ${
|
|
35
|
+
position === "popper"
|
|
36
|
+
? "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1"
|
|
37
|
+
: ""
|
|
38
|
+
} ${className}`}
|
|
39
|
+
position={position}
|
|
40
|
+
{...props}
|
|
41
|
+
>
|
|
42
|
+
<GlassSurface material={material} materialStrength={materialStrength} borderRadius={borderRadius} className="absolute inset-0 -z-10" />
|
|
43
|
+
<SelectPrimitive.Viewport
|
|
44
|
+
className={`p-1 ${
|
|
45
|
+
position === "popper"
|
|
46
|
+
? "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
|
|
47
|
+
: ""
|
|
48
|
+
}`}
|
|
49
|
+
>
|
|
50
|
+
{children}
|
|
51
|
+
</SelectPrimitive.Viewport>
|
|
52
|
+
</SelectPrimitive.Content>
|
|
53
|
+
</SelectPrimitive.Portal>
|
|
54
|
+
))
|
|
55
|
+
OpticalSelectContent.displayName = SelectPrimitive.Content.displayName
|
|
56
|
+
|
|
57
|
+
const OpticalSelectLabel = React.forwardRef<
|
|
58
|
+
React.ElementRef<typeof SelectPrimitive.Label>,
|
|
59
|
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
|
|
60
|
+
>(({ className, ...props }, ref) => (
|
|
61
|
+
<SelectPrimitive.Label
|
|
62
|
+
ref={ref}
|
|
63
|
+
className={`py-1.5 pl-8 pr-2 text-xs font-semibold tracking-wider uppercase text-white/50 ${className}`}
|
|
64
|
+
{...props}
|
|
65
|
+
/>
|
|
66
|
+
))
|
|
67
|
+
OpticalSelectLabel.displayName = SelectPrimitive.Label.displayName
|
|
68
|
+
|
|
69
|
+
const OpticalSelectItem = React.forwardRef<
|
|
70
|
+
React.ElementRef<typeof SelectPrimitive.Item>,
|
|
71
|
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
|
|
72
|
+
>(({ className, children, ...props }, ref) => (
|
|
73
|
+
<SelectPrimitive.Item
|
|
74
|
+
ref={ref}
|
|
75
|
+
className={`relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-white/10 focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-50 ${className}`}
|
|
76
|
+
{...props}
|
|
77
|
+
>
|
|
78
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
79
|
+
<SelectPrimitive.ItemIndicator>
|
|
80
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
|
|
81
|
+
</SelectPrimitive.ItemIndicator>
|
|
82
|
+
</span>
|
|
83
|
+
|
|
84
|
+
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
|
85
|
+
</SelectPrimitive.Item>
|
|
86
|
+
))
|
|
87
|
+
OpticalSelectItem.displayName = SelectPrimitive.Item.displayName
|
|
88
|
+
|
|
89
|
+
const OpticalSelectSeparator = React.forwardRef<
|
|
90
|
+
React.ElementRef<typeof SelectPrimitive.Separator>,
|
|
91
|
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
|
|
92
|
+
>(({ className, ...props }, ref) => (
|
|
93
|
+
<SelectPrimitive.Separator
|
|
94
|
+
ref={ref}
|
|
95
|
+
className={`-mx-1 my-1 h-px bg-white/10 ${className}`}
|
|
96
|
+
{...props}
|
|
97
|
+
/>
|
|
98
|
+
))
|
|
99
|
+
OpticalSelectSeparator.displayName = SelectPrimitive.Separator.displayName
|
|
100
|
+
|
|
101
|
+
export {
|
|
102
|
+
OpticalSelect,
|
|
103
|
+
OpticalSelectGroup,
|
|
104
|
+
OpticalSelectValue,
|
|
105
|
+
OpticalSelectTrigger,
|
|
106
|
+
OpticalSelectContent,
|
|
107
|
+
OpticalSelectLabel,
|
|
108
|
+
OpticalSelectItem,
|
|
109
|
+
OpticalSelectSeparator,
|
|
110
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator"
|
|
5
|
+
|
|
6
|
+
import { cn } from '../../utils/cn';
|
|
7
|
+
|
|
8
|
+
const Separator = React.forwardRef<
|
|
9
|
+
React.ElementRef<typeof SeparatorPrimitive.Root>,
|
|
10
|
+
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
|
|
11
|
+
>(
|
|
12
|
+
(
|
|
13
|
+
{ className, orientation = "horizontal", decorative = true, ...props },
|
|
14
|
+
ref
|
|
15
|
+
) => (
|
|
16
|
+
<SeparatorPrimitive.Root
|
|
17
|
+
ref={ref}
|
|
18
|
+
decorative={decorative}
|
|
19
|
+
orientation={orientation}
|
|
20
|
+
className={cn(
|
|
21
|
+
"shrink-0 bg-border",
|
|
22
|
+
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
|
23
|
+
className
|
|
24
|
+
)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
Separator.displayName = SeparatorPrimitive.Root.displayName
|
|
30
|
+
|
|
31
|
+
export { Separator }
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import * as SheetPrimitive from "@radix-ui/react-dialog"
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
4
|
+
import { X } from "lucide-react"
|
|
5
|
+
|
|
6
|
+
import { cn } from '../../utils/cn';
|
|
7
|
+
import { GlassSurface } from '@mrigx/fx';
|
|
8
|
+
|
|
9
|
+
const OpticalSheet = SheetPrimitive.Root
|
|
10
|
+
|
|
11
|
+
const OpticalSheetTrigger = SheetPrimitive.Trigger
|
|
12
|
+
|
|
13
|
+
const OpticalSheetClose = SheetPrimitive.Close
|
|
14
|
+
|
|
15
|
+
const OpticalSheetPortal = SheetPrimitive.Portal
|
|
16
|
+
|
|
17
|
+
const OpticalSheetOverlay = React.forwardRef<
|
|
18
|
+
React.ElementRef<typeof SheetPrimitive.Overlay>,
|
|
19
|
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
|
|
20
|
+
>(({ className, ...props }, ref) => (
|
|
21
|
+
<SheetPrimitive.Overlay
|
|
22
|
+
className={cn(
|
|
23
|
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
24
|
+
className
|
|
25
|
+
)}
|
|
26
|
+
{...props}
|
|
27
|
+
ref={ref}
|
|
28
|
+
/>
|
|
29
|
+
))
|
|
30
|
+
OpticalSheetOverlay.displayName = SheetPrimitive.Overlay.displayName
|
|
31
|
+
|
|
32
|
+
const sheetVariants = cva(
|
|
33
|
+
"fixed z-50 gap-4 p-6 shadow-2xl transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
|
|
34
|
+
{
|
|
35
|
+
variants: {
|
|
36
|
+
side: {
|
|
37
|
+
top: "inset-x-0 top-0 border-b border-white/10 data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
38
|
+
bottom:
|
|
39
|
+
"inset-x-0 bottom-0 border-t border-white/10 data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
40
|
+
left: "inset-y-0 left-0 h-full w-3/4 border-r border-white/10 data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
41
|
+
right:
|
|
42
|
+
"inset-y-0 right-0 h-full w-3/4 border-l border-white/10 data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
defaultVariants: {
|
|
46
|
+
side: "right",
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
interface OpticalSheetContentProps
|
|
52
|
+
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
|
|
53
|
+
VariantProps<typeof sheetVariants> {
|
|
54
|
+
material?: string;
|
|
55
|
+
materialStrength?: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const OpticalSheetContent = React.forwardRef<
|
|
59
|
+
React.ElementRef<typeof SheetPrimitive.Content>,
|
|
60
|
+
OpticalSheetContentProps
|
|
61
|
+
>(({ side = "right", className, children, material = "crystal", materialStrength = 1.0, ...props }, ref) => (
|
|
62
|
+
<OpticalSheetPortal>
|
|
63
|
+
<OpticalSheetOverlay />
|
|
64
|
+
<SheetPrimitive.Content
|
|
65
|
+
ref={ref}
|
|
66
|
+
className={cn(sheetVariants({ side }), className)}
|
|
67
|
+
{...props}
|
|
68
|
+
>
|
|
69
|
+
<GlassSurface material={material} materialStrength={materialStrength} borderRadius={0} className="absolute inset-0 -z-10" />
|
|
70
|
+
{children}
|
|
71
|
+
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-white/10 text-white flex items-center justify-center p-1 cursor-pointer">
|
|
72
|
+
<X className="h-4 w-4" />
|
|
73
|
+
<span className="sr-only">Close</span>
|
|
74
|
+
</SheetPrimitive.Close>
|
|
75
|
+
</SheetPrimitive.Content>
|
|
76
|
+
</OpticalSheetPortal>
|
|
77
|
+
))
|
|
78
|
+
OpticalSheetContent.displayName = SheetPrimitive.Content.displayName
|
|
79
|
+
|
|
80
|
+
const OpticalSheetHeader = ({
|
|
81
|
+
className,
|
|
82
|
+
...props
|
|
83
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
84
|
+
<div
|
|
85
|
+
className={cn(
|
|
86
|
+
"flex flex-col space-y-2 text-center sm:text-left text-white",
|
|
87
|
+
className
|
|
88
|
+
)}
|
|
89
|
+
{...props}
|
|
90
|
+
/>
|
|
91
|
+
)
|
|
92
|
+
OpticalSheetHeader.displayName = "OpticalSheetHeader"
|
|
93
|
+
|
|
94
|
+
const OpticalSheetFooter = ({
|
|
95
|
+
className,
|
|
96
|
+
...props
|
|
97
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
98
|
+
<div
|
|
99
|
+
className={cn(
|
|
100
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 text-white",
|
|
101
|
+
className
|
|
102
|
+
)}
|
|
103
|
+
{...props}
|
|
104
|
+
/>
|
|
105
|
+
)
|
|
106
|
+
OpticalSheetFooter.displayName = "OpticalSheetFooter"
|
|
107
|
+
|
|
108
|
+
const OpticalSheetTitle = React.forwardRef<
|
|
109
|
+
React.ElementRef<typeof SheetPrimitive.Title>,
|
|
110
|
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
|
|
111
|
+
>(({ className, ...props }, ref) => (
|
|
112
|
+
<SheetPrimitive.Title
|
|
113
|
+
ref={ref}
|
|
114
|
+
className={cn("text-lg font-semibold text-white", className)}
|
|
115
|
+
{...props}
|
|
116
|
+
/>
|
|
117
|
+
))
|
|
118
|
+
OpticalSheetTitle.displayName = SheetPrimitive.Title.displayName
|
|
119
|
+
|
|
120
|
+
const OpticalSheetDescription = React.forwardRef<
|
|
121
|
+
React.ElementRef<typeof SheetPrimitive.Description>,
|
|
122
|
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
|
|
123
|
+
>(({ className, ...props }, ref) => (
|
|
124
|
+
<SheetPrimitive.Description
|
|
125
|
+
ref={ref}
|
|
126
|
+
className={cn("text-sm text-white/50", className)}
|
|
127
|
+
{...props}
|
|
128
|
+
/>
|
|
129
|
+
))
|
|
130
|
+
OpticalSheetDescription.displayName = SheetPrimitive.Description.displayName
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
OpticalSheet,
|
|
134
|
+
OpticalSheetPortal,
|
|
135
|
+
OpticalSheetOverlay,
|
|
136
|
+
OpticalSheetTrigger,
|
|
137
|
+
OpticalSheetClose,
|
|
138
|
+
OpticalSheetContent,
|
|
139
|
+
OpticalSheetHeader,
|
|
140
|
+
OpticalSheetFooter,
|
|
141
|
+
OpticalSheetTitle,
|
|
142
|
+
OpticalSheetDescription,
|
|
143
|
+
}
|