@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.
Files changed (93) hide show
  1. package/package.json +73 -0
  2. package/src/blocks/ContactPanel.tsx +99 -0
  3. package/src/blocks/FeatureGrid.tsx +38 -0
  4. package/src/blocks/OpticalCTA.tsx +33 -0
  5. package/src/blocks/OpticalHero.tsx +51 -0
  6. package/src/blocks/styles.ts +175 -0
  7. package/src/components/accordion/optical-accordion.tsx +199 -0
  8. package/src/components/alert/optical-alert.tsx +59 -0
  9. package/src/components/alert-dialog/optical-alert-dialog.tsx +143 -0
  10. package/src/components/ambient-light.tsx +27 -0
  11. package/src/components/aspect-ratio/optical-aspect-ratio.tsx +7 -0
  12. package/src/components/attachment/optical-attachment.tsx +25 -0
  13. package/src/components/avatar/optical-avatar.tsx +50 -0
  14. package/src/components/badge/optical-badge.tsx +36 -0
  15. package/src/components/breadcrumb/optical-breadcrumb.tsx +115 -0
  16. package/src/components/bubble/optical-bubble.tsx +25 -0
  17. package/src/components/button/optical-button.tsx +67 -0
  18. package/src/components/button-group/optical-button-group.tsx +83 -0
  19. package/src/components/calendar/optical-calendar.tsx +214 -0
  20. package/src/components/card/optical-card.tsx +44 -0
  21. package/src/components/carousel/optical-carousel.tsx +262 -0
  22. package/src/components/chart/optical-chart.tsx +369 -0
  23. package/src/components/checkbox/optical-checkbox.tsx +42 -0
  24. package/src/components/collapsible/optical-collapsible.tsx +11 -0
  25. package/src/components/combobox/optical-combobox.tsx +25 -0
  26. package/src/components/command/optical-command.tsx +153 -0
  27. package/src/components/context-menu/optical-context-menu.tsx +201 -0
  28. package/src/components/cursor/optical-cursor.tsx +10 -0
  29. package/src/components/data-table/optical-data-table.tsx +25 -0
  30. package/src/components/date-picker/optical-date-picker.tsx +25 -0
  31. package/src/components/dialog/optical-dialog.tsx +110 -0
  32. package/src/components/direction/optical-direction.tsx +25 -0
  33. package/src/components/drawer/optical-drawer.tsx +120 -0
  34. package/src/components/dropdown-menu/optical-dropdown-menu.tsx +194 -0
  35. package/src/components/empty/optical-empty.tsx +104 -0
  36. package/src/components/field/optical-field.tsx +244 -0
  37. package/src/components/glass-card.tsx +13 -0
  38. package/src/components/hover-card/optical-hover-card.tsx +30 -0
  39. package/src/components/icon-button/optical-icon-button.tsx +22 -0
  40. package/src/components/input/optical-input.tsx +29 -0
  41. package/src/components/input-group/optical-input-group.tsx +170 -0
  42. package/src/components/input-otp/optical-input-otp.tsx +71 -0
  43. package/src/components/item/optical-item.tsx +193 -0
  44. package/src/components/kbd/optical-kbd.tsx +28 -0
  45. package/src/components/label/optical-label.tsx +25 -0
  46. package/src/components/marker/optical-marker.tsx +25 -0
  47. package/src/components/menubar/optical-menubar.tsx +257 -0
  48. package/src/components/message/optical-message.tsx +25 -0
  49. package/src/components/message-scroller/optical-message-scroller.tsx +25 -0
  50. package/src/components/native-select/optical-native-select.tsx +25 -0
  51. package/src/components/navigation-menu/optical-navigation-menu.tsx +68 -0
  52. package/src/components/pagination/optical-pagination.tsx +118 -0
  53. package/src/components/panel/optical-panel.tsx +26 -0
  54. package/src/components/popover/optical-popover.tsx +32 -0
  55. package/src/components/prism-button.tsx +17 -0
  56. package/src/components/progress/optical-progress.tsx +28 -0
  57. package/src/components/questionnaire/optical-questionnaire.tsx +25 -0
  58. package/src/components/radio-group/optical-radio-group.tsx +25 -0
  59. package/src/components/resizable/optical-resizable.tsx +45 -0
  60. package/src/components/scroll-area/optical-scroll-area.tsx +48 -0
  61. package/src/components/select/optical-select.tsx +110 -0
  62. package/src/components/separator/optical-separator.tsx +31 -0
  63. package/src/components/sheet/optical-sheet.tsx +143 -0
  64. package/src/components/sidebar/optical-sidebar.tsx +762 -0
  65. package/src/components/skeleton/optical-skeleton.tsx +15 -0
  66. package/src/components/slider/optical-slider.tsx +34 -0
  67. package/src/components/sonner/optical-toast.tsx +45 -0
  68. package/src/components/spinner/optical-spinner.tsx +16 -0
  69. package/src/components/stained-glass-card.tsx +93 -0
  70. package/src/components/switch/optical-switch.tsx +31 -0
  71. package/src/components/table/optical-table.tsx +83 -0
  72. package/src/components/tabs/optical-tabs.tsx +56 -0
  73. package/src/components/text/liquid-tension-text.tsx +65 -0
  74. package/src/components/text/optical-tension-text.tsx +65 -0
  75. package/src/components/text/optical-text.tsx +20 -0
  76. package/src/components/text/prismatic-selection.tsx +5 -0
  77. package/src/components/textarea/optical-textarea.tsx +22 -0
  78. package/src/components/theme-toggle/optical-theme-toggle.tsx +45 -0
  79. package/src/components/toast/optical-toast.tsx +25 -0
  80. package/src/components/toggle/optical-toggle.tsx +45 -0
  81. package/src/components/toggle-group/optical-toggle-group.tsx +61 -0
  82. package/src/components/tooltip/optical-tooltip.tsx +33 -0
  83. package/src/components/typography/optical-typography.tsx +49 -0
  84. package/src/hooks/use-mobile.ts +19 -0
  85. package/src/index.ts +88 -0
  86. package/src/templates/ContactPageTemplate.tsx +42 -0
  87. package/src/templates/LandingPageTemplate.tsx +29 -0
  88. package/src/templates/ProductPageTemplate.tsx +46 -0
  89. package/src/templates/styles.ts +23 -0
  90. package/src/utils/button-variants.ts +26 -0
  91. package/src/utils/cn.ts +6 -0
  92. package/tsconfig.json +27 -0
  93. package/vite.config.ts +42 -0
@@ -0,0 +1,59 @@
1
+ import * as React from "react"
2
+ import { cva, type VariantProps } from "class-variance-authority"
3
+
4
+ import { cn } from '../../utils/cn';
5
+
6
+ const alertVariants = cva(
7
+ "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-white",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-transparent text-white",
12
+ destructive:
13
+ "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ variant: "default",
18
+ },
19
+ }
20
+ )
21
+
22
+ const Alert = React.forwardRef<
23
+ HTMLDivElement,
24
+ React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
25
+ >(({ className, variant, ...props }, ref) => (
26
+ <div
27
+ ref={ref}
28
+ role="alert"
29
+ className={cn(alertVariants({ variant }), className)}
30
+ {...props}
31
+ />
32
+ ))
33
+ Alert.displayName = "Alert"
34
+
35
+ const AlertTitle = React.forwardRef<
36
+ HTMLParagraphElement,
37
+ React.HTMLAttributes<HTMLHeadingElement>
38
+ >(({ className, ...props }, ref) => (
39
+ <h5
40
+ ref={ref}
41
+ className={cn("mb-1 font-medium leading-none tracking-tight", className)}
42
+ {...props}
43
+ />
44
+ ))
45
+ AlertTitle.displayName = "AlertTitle"
46
+
47
+ const AlertDescription = React.forwardRef<
48
+ HTMLParagraphElement,
49
+ React.HTMLAttributes<HTMLParagraphElement>
50
+ >(({ className, ...props }, ref) => (
51
+ <div
52
+ ref={ref}
53
+ className={cn("text-sm [&_p]:leading-relaxed", className)}
54
+ {...props}
55
+ />
56
+ ))
57
+ AlertDescription.displayName = "AlertDescription"
58
+
59
+ export { Alert, AlertTitle, AlertDescription }
@@ -0,0 +1,143 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
5
+
6
+ import { cn } from '../../utils/cn';
7
+ import { GlassSurface } from '@mrigx/fx';
8
+ import { buttonVariants } from '../../utils/button-variants';
9
+
10
+ const AlertDialog = AlertDialogPrimitive.Root
11
+
12
+ const AlertDialogTrigger = AlertDialogPrimitive.Trigger
13
+
14
+ const AlertDialogPortal = AlertDialogPrimitive.Portal
15
+
16
+ const AlertDialogOverlay = React.forwardRef<
17
+ React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
18
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
19
+ >(({ className, ...props }, ref) => (
20
+ <AlertDialogPrimitive.Overlay
21
+ className={cn(
22
+ "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",
23
+ className
24
+ )}
25
+ {...props}
26
+ ref={ref}
27
+ />
28
+ ))
29
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
30
+
31
+ const AlertDialogContent = React.forwardRef<
32
+ React.ElementRef<typeof AlertDialogPrimitive.Content>,
33
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
34
+ >(({ className, ...props }, ref) => (
35
+ <AlertDialogPortal>
36
+ <AlertDialogOverlay />
37
+ <AlertDialogPrimitive.Content
38
+ ref={ref}
39
+ className={cn(
40
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-transparent p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
41
+ className
42
+ )}
43
+ {...props}
44
+ />
45
+ <GlassSurface material="crystal" materialStrength={1.5} borderRadius={12} className="absolute inset-0 -z-10" />
46
+ </AlertDialogPortal>
47
+ ))
48
+ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
49
+
50
+ const AlertDialogHeader = ({
51
+ className,
52
+ ...props
53
+ }: React.HTMLAttributes<HTMLDivElement>) => (
54
+ <div
55
+ className={cn(
56
+ "flex flex-col space-y-2 text-center sm:text-left",
57
+ className
58
+ )}
59
+ {...props}
60
+ />
61
+ )
62
+ AlertDialogHeader.displayName = "AlertDialogHeader"
63
+
64
+ const AlertDialogFooter = ({
65
+ className,
66
+ ...props
67
+ }: React.HTMLAttributes<HTMLDivElement>) => (
68
+ <div
69
+ className={cn(
70
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
71
+ className
72
+ )}
73
+ {...props}
74
+ />
75
+ )
76
+ AlertDialogFooter.displayName = "AlertDialogFooter"
77
+
78
+ const AlertDialogTitle = React.forwardRef<
79
+ React.ElementRef<typeof AlertDialogPrimitive.Title>,
80
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
81
+ >(({ className, ...props }, ref) => (
82
+ <AlertDialogPrimitive.Title
83
+ ref={ref}
84
+ className={cn("text-lg font-semibold", className)}
85
+ {...props}
86
+ />
87
+ ))
88
+ AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
89
+
90
+ const AlertDialogDescription = React.forwardRef<
91
+ React.ElementRef<typeof AlertDialogPrimitive.Description>,
92
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
93
+ >(({ className, ...props }, ref) => (
94
+ <AlertDialogPrimitive.Description
95
+ ref={ref}
96
+ className={cn("text-sm text-white/50", className)}
97
+ {...props}
98
+ />
99
+ ))
100
+ AlertDialogDescription.displayName =
101
+ AlertDialogPrimitive.Description.displayName
102
+
103
+ const AlertDialogAction = React.forwardRef<
104
+ React.ElementRef<typeof AlertDialogPrimitive.Action>,
105
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
106
+ >(({ className, ...props }, ref) => (
107
+ <AlertDialogPrimitive.Action
108
+ ref={ref}
109
+ className={cn(buttonVariants(), className)}
110
+ {...props}
111
+ />
112
+ ))
113
+ AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
114
+
115
+ const AlertDialogCancel = React.forwardRef<
116
+ React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
117
+ React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
118
+ >(({ className, ...props }, ref) => (
119
+ <AlertDialogPrimitive.Cancel
120
+ ref={ref}
121
+ className={cn(
122
+ buttonVariants({ variant: "outline" }),
123
+ "mt-2 sm:mt-0",
124
+ className
125
+ )}
126
+ {...props}
127
+ />
128
+ ))
129
+ AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
130
+
131
+ export {
132
+ AlertDialog,
133
+ AlertDialogPortal,
134
+ AlertDialogOverlay,
135
+ AlertDialogTrigger,
136
+ AlertDialogContent,
137
+ AlertDialogHeader,
138
+ AlertDialogFooter,
139
+ AlertDialogTitle,
140
+ AlertDialogDescription,
141
+ AlertDialogAction,
142
+ AlertDialogCancel,
143
+ }
@@ -0,0 +1,27 @@
1
+ import { forwardRef } from 'react';
2
+
3
+ export interface AmbientLightProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ color?: string;
5
+ size?: string;
6
+ blur?: string;
7
+ opacity?: number;
8
+ }
9
+
10
+ export const AmbientLight = forwardRef<HTMLDivElement, AmbientLightProps>(({
11
+ className = "",
12
+ color = "bg-blue-500",
13
+ size = "w-48 h-48",
14
+ blur = "blur-[60px]",
15
+ opacity = 0.2,
16
+ ...props
17
+ }, ref) => {
18
+ return (
19
+ <div
20
+ ref={ref}
21
+ className={`absolute rounded-full pointer-events-none -z-10 ${size} ${blur} ${color} ${className}`}
22
+ style={{ opacity, ...props.style }}
23
+ {...props}
24
+ />
25
+ );
26
+ });
27
+ AmbientLight.displayName = "AmbientLight";
@@ -0,0 +1,7 @@
1
+ "use client"
2
+
3
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
4
+
5
+ const AspectRatio = AspectRatioPrimitive.Root
6
+
7
+ export { AspectRatio }
@@ -0,0 +1,25 @@
1
+ import React, { useRef } from 'react';
2
+ import { useMrigSurface } from "@mrigx/react";
3
+
4
+ export interface OpticalAttachmentProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ material?: 'glass' | 'crystal' | 'abyss';
6
+ materialStrength?: number;
7
+ }
8
+
9
+ export function OpticalAttachment({ children, className = "", material = 'glass', materialStrength = 1.0, ...props }: OpticalAttachmentProps) {
10
+ const localRef = useRef<HTMLDivElement>(null);
11
+ const ref = useMrigSurface<HTMLDivElement>({ material, materialStrength, borderRadius: 8 }, localRef);
12
+
13
+ return (
14
+ <div
15
+ ref={ref as any}
16
+ className={`p-6 border border-white/10 bg-white/5 rounded-xl shadow-lg backdrop-blur-md flex items-center justify-center text-white/80 font-light ${className}`}
17
+ {...props}
18
+ >
19
+ {children || 'Attachment Interface'}
20
+ </div>
21
+ );
22
+ }
23
+
24
+
25
+
@@ -0,0 +1,50 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as AvatarPrimitive from "@radix-ui/react-avatar"
5
+
6
+ import { cn } from '../../utils/cn';
7
+
8
+ const Avatar = React.forwardRef<
9
+ React.ElementRef<typeof AvatarPrimitive.Root>,
10
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
11
+ >(({ className, ...props }, ref) => (
12
+ <AvatarPrimitive.Root
13
+ ref={ref}
14
+ className={cn(
15
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
16
+ className
17
+ )}
18
+ {...props}
19
+ />
20
+ ))
21
+ Avatar.displayName = AvatarPrimitive.Root.displayName
22
+
23
+ const AvatarImage = React.forwardRef<
24
+ React.ElementRef<typeof AvatarPrimitive.Image>,
25
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
26
+ >(({ className, ...props }, ref) => (
27
+ <AvatarPrimitive.Image
28
+ ref={ref}
29
+ className={cn("aspect-square h-full w-full", className)}
30
+ {...props}
31
+ />
32
+ ))
33
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName
34
+
35
+ const AvatarFallback = React.forwardRef<
36
+ React.ElementRef<typeof AvatarPrimitive.Fallback>,
37
+ React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
38
+ >(({ className, ...props }, ref) => (
39
+ <AvatarPrimitive.Fallback
40
+ ref={ref}
41
+ className={cn(
42
+ "flex h-full w-full items-center justify-center rounded-full bg-white/10",
43
+ className
44
+ )}
45
+ {...props}
46
+ />
47
+ ))
48
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
49
+
50
+ export { Avatar, AvatarImage, AvatarFallback }
@@ -0,0 +1,36 @@
1
+ import * as React from "react"
2
+ import { cva, type VariantProps } from "class-variance-authority"
3
+
4
+ import { cn } from '../../utils/cn';
5
+
6
+ const badgeVariants = cva(
7
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default:
12
+ "border-transparent bg-white/20 text-white hover:bg-white/20/80",
13
+ secondary:
14
+ "border-transparent bg-white/5 text-white hover:bg-white/5/80",
15
+ destructive:
16
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
17
+ outline: "text-white",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ variant: "default",
22
+ },
23
+ }
24
+ )
25
+
26
+ export interface BadgeProps
27
+ extends React.HTMLAttributes<HTMLDivElement>,
28
+ VariantProps<typeof badgeVariants> {}
29
+
30
+ function Badge({ className, variant, ...props }: BadgeProps) {
31
+ return (
32
+ <div className={cn(badgeVariants({ variant }), className)} {...props} />
33
+ )
34
+ }
35
+
36
+ export { Badge, badgeVariants }
@@ -0,0 +1,115 @@
1
+ import * as React from "react"
2
+ import { Slot } from "@radix-ui/react-slot"
3
+ import { ChevronRight, MoreHorizontal } from "lucide-react"
4
+
5
+ import { cn } from '../../utils/cn';
6
+
7
+ const Breadcrumb = React.forwardRef<
8
+ HTMLElement,
9
+ React.ComponentPropsWithoutRef<"nav"> & {
10
+ separator?: React.ReactNode
11
+ }
12
+ >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />)
13
+ Breadcrumb.displayName = "Breadcrumb"
14
+
15
+ const BreadcrumbList = React.forwardRef<
16
+ HTMLOListElement,
17
+ React.ComponentPropsWithoutRef<"ol">
18
+ >(({ className, ...props }, ref) => (
19
+ <ol
20
+ ref={ref}
21
+ className={cn(
22
+ "flex flex-wrap items-center gap-1.5 break-words text-sm text-white/50 sm:gap-2.5",
23
+ className
24
+ )}
25
+ {...props}
26
+ />
27
+ ))
28
+ BreadcrumbList.displayName = "BreadcrumbList"
29
+
30
+ const BreadcrumbItem = React.forwardRef<
31
+ HTMLLIElement,
32
+ React.ComponentPropsWithoutRef<"li">
33
+ >(({ className, ...props }, ref) => (
34
+ <li
35
+ ref={ref}
36
+ className={cn("inline-flex items-center gap-1.5", className)}
37
+ {...props}
38
+ />
39
+ ))
40
+ BreadcrumbItem.displayName = "BreadcrumbItem"
41
+
42
+ const BreadcrumbLink = React.forwardRef<
43
+ HTMLAnchorElement,
44
+ React.ComponentPropsWithoutRef<"a"> & {
45
+ asChild?: boolean
46
+ }
47
+ >(({ asChild, className, ...props }, ref) => {
48
+ const Comp = asChild ? Slot : "a"
49
+
50
+ return (
51
+ <Comp
52
+ ref={ref}
53
+ className={cn("transition-colors hover:text-white", className)}
54
+ {...props}
55
+ />
56
+ )
57
+ })
58
+ BreadcrumbLink.displayName = "BreadcrumbLink"
59
+
60
+ const BreadcrumbPage = React.forwardRef<
61
+ HTMLSpanElement,
62
+ React.ComponentPropsWithoutRef<"span">
63
+ >(({ className, ...props }, ref) => (
64
+ <span
65
+ ref={ref}
66
+ role="link"
67
+ aria-disabled="true"
68
+ aria-current="page"
69
+ className={cn("font-normal text-white", className)}
70
+ {...props}
71
+ />
72
+ ))
73
+ BreadcrumbPage.displayName = "BreadcrumbPage"
74
+
75
+ const BreadcrumbSeparator = ({
76
+ children,
77
+ className,
78
+ ...props
79
+ }: React.ComponentProps<"li">) => (
80
+ <li
81
+ role="presentation"
82
+ aria-hidden="true"
83
+ className={cn("[&>svg]:w-3.5 [&>svg]:h-3.5", className)}
84
+ {...props}
85
+ >
86
+ {children ?? <ChevronRight />}
87
+ </li>
88
+ )
89
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
90
+
91
+ const BreadcrumbEllipsis = ({
92
+ className,
93
+ ...props
94
+ }: React.ComponentProps<"span">) => (
95
+ <span
96
+ role="presentation"
97
+ aria-hidden="true"
98
+ className={cn("flex h-9 w-9 items-center justify-center", className)}
99
+ {...props}
100
+ >
101
+ <MoreHorizontal className="h-4 w-4" />
102
+ <span className="sr-only">More</span>
103
+ </span>
104
+ )
105
+ BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
106
+
107
+ export {
108
+ Breadcrumb,
109
+ BreadcrumbList,
110
+ BreadcrumbItem,
111
+ BreadcrumbLink,
112
+ BreadcrumbPage,
113
+ BreadcrumbSeparator,
114
+ BreadcrumbEllipsis,
115
+ }
@@ -0,0 +1,25 @@
1
+ import React, { useRef } from 'react';
2
+ import { useMrigSurface } from "@mrigx/react";
3
+
4
+ export interface OpticalBubbleProps extends React.HTMLAttributes<HTMLDivElement> {
5
+ material?: 'glass' | 'crystal' | 'abyss';
6
+ materialStrength?: number;
7
+ }
8
+
9
+ export function OpticalBubble({ children, className = "", material = 'glass', materialStrength = 1.0, ...props }: OpticalBubbleProps) {
10
+ const localRef = useRef<HTMLDivElement>(null);
11
+ const ref = useMrigSurface<HTMLDivElement>({ material, materialStrength, borderRadius: 8 }, localRef);
12
+
13
+ return (
14
+ <div
15
+ ref={ref as any}
16
+ className={`p-6 border border-white/10 bg-white/5 rounded-xl shadow-lg backdrop-blur-md flex items-center justify-center text-white/80 font-light ${className}`}
17
+ {...props}
18
+ >
19
+ {children || 'Bubble Interface'}
20
+ </div>
21
+ );
22
+ }
23
+
24
+
25
+
@@ -0,0 +1,67 @@
1
+ import * as React from 'react';
2
+ import { RippleSurface } from '@mrigx/fx';
3
+
4
+ export interface OpticalButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ as?: React.ElementType;
6
+ variant?: 'default' | 'ghost' | 'outline' | 'glass';
7
+ size?: 'default' | 'sm' | 'lg' | 'icon';
8
+ material?: string;
9
+ materialStrength?: number;
10
+ borderRadius?: number;
11
+ [key: string]: any; // Allow 'to' for Link, etc.
12
+ }
13
+
14
+ export const OpticalButton = React.forwardRef<HTMLButtonElement, OpticalButtonProps>(({
15
+ className = "",
16
+ variant = 'default',
17
+ size = 'default',
18
+ material = 'crystal',
19
+ materialStrength = 1.0,
20
+ borderRadius = 12,
21
+ as: Component,
22
+ ...props
23
+ }, ref) => {
24
+
25
+ const baseStyles = "inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer select-none rounded-xl";
26
+
27
+ const variants = {
28
+ default: "bg-white text-black hover:bg-white/90 shadow-md",
29
+ outline: "border border-white/20 bg-black/20 text-white hover:bg-white/10 hover:border-white/30",
30
+ ghost: "text-white/70 hover:text-white hover:bg-white/10",
31
+ glass: "bg-white/[0.05] border border-white/10 text-white hover:bg-white/[0.1] hover:border-white/20 shadow-[inset_0_1px_1px_rgba(255,255,255,0.1),0_4px_24px_rgba(0,0,0,0.5)]"
32
+ };
33
+
34
+ const sizes = {
35
+ default: "h-10 px-4 py-2",
36
+ sm: "h-9 rounded-lg px-3",
37
+ lg: "h-11 rounded-xl px-8 text-base",
38
+ icon: "h-10 w-10"
39
+ };
40
+
41
+ if (Component) {
42
+ return (
43
+ <RippleSurface
44
+ ref={ref as any}
45
+ material={material}
46
+ materialStrength={materialStrength}
47
+ borderRadius={size === 'sm' ? 8 : borderRadius}
48
+ className={`${baseStyles} ${variants[variant as keyof typeof variants]} ${sizes[size as keyof typeof sizes]} ${className}`}
49
+ >
50
+ <Component {...props} className="w-full h-full flex items-center justify-center gap-2" />
51
+ </RippleSurface>
52
+ );
53
+ }
54
+
55
+ return (
56
+ <RippleSurface
57
+ ref={ref as any}
58
+ material={material}
59
+ materialStrength={materialStrength}
60
+ borderRadius={size === 'sm' ? 8 : borderRadius}
61
+ className={`${baseStyles} ${variants[variant as keyof typeof variants]} ${sizes[size as keyof typeof sizes]} ${className}`}
62
+ {...props}
63
+ />
64
+ );
65
+ });
66
+ OpticalButton.displayName = "OpticalButton";
67
+
@@ -0,0 +1,83 @@
1
+ import { Slot } from "@radix-ui/react-slot"
2
+ import { cva, type VariantProps } from "class-variance-authority"
3
+
4
+ import { cn } from '../../utils/cn';
5
+ import { Separator } from '../separator/optical-separator';
6
+
7
+ const buttonGroupVariants = cva(
8
+ "flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
9
+ {
10
+ variants: {
11
+ orientation: {
12
+ horizontal:
13
+ "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
14
+ vertical:
15
+ "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none",
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ orientation: "horizontal",
20
+ },
21
+ }
22
+ )
23
+
24
+ function ButtonGroup({
25
+ className,
26
+ orientation,
27
+ ...props
28
+ }: React.ComponentProps<"div"> & VariantProps<typeof buttonGroupVariants>) {
29
+ return (
30
+ <div
31
+ role="group"
32
+ data-slot="button-group"
33
+ data-orientation={orientation}
34
+ className={cn(buttonGroupVariants({ orientation }), className)}
35
+ {...props}
36
+ />
37
+ )
38
+ }
39
+
40
+ function ButtonGroupText({
41
+ className,
42
+ asChild = false,
43
+ ...props
44
+ }: React.ComponentProps<"div"> & {
45
+ asChild?: boolean
46
+ }) {
47
+ const Comp = asChild ? Slot : "div"
48
+
49
+ return (
50
+ <Comp
51
+ className={cn(
52
+ "bg-white/10 shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none",
53
+ className
54
+ )}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ function ButtonGroupSeparator({
61
+ className,
62
+ orientation = "vertical",
63
+ ...props
64
+ }: React.ComponentProps<typeof Separator>) {
65
+ return (
66
+ <Separator
67
+ data-slot="button-group-separator"
68
+ orientation={orientation}
69
+ className={cn(
70
+ "bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto",
71
+ className
72
+ )}
73
+ {...props}
74
+ />
75
+ )
76
+ }
77
+
78
+ export {
79
+ ButtonGroup,
80
+ ButtonGroupSeparator,
81
+ ButtonGroupText,
82
+ buttonGroupVariants,
83
+ }