organify-ui 0.3.12 → 0.3.17

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.
@@ -5,6 +5,8 @@ import { jsxs, jsx } from 'react/jsx-runtime';
5
5
  import * as React3 from 'react';
6
6
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
7
7
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
8
+ import { motion } from 'framer-motion';
9
+ import { Drawer as Drawer$1 } from 'vaul';
8
10
  import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
9
11
 
10
12
  function cn(...inputs) {
@@ -15,7 +17,7 @@ var badgeVariants = cva(
15
17
  {
16
18
  variants: {
17
19
  variant: {
18
- default: "rounded-full border border-white/10 bg-white/[0.05] px-3 py-1.5 text-org-text-secondary",
20
+ default: "rounded-full border border-primary/15 bg-white/[0.05] px-3 py-1.5 text-org-text-secondary",
19
21
  primary: "rounded-full border border-indigo-400/30 bg-indigo-500/20 px-3 py-1.5 text-indigo-300",
20
22
  success: "rounded-full border border-success/30 bg-success/10 px-3 py-1.5 text-success-light",
21
23
  warning: "rounded-full border border-warning/30 bg-warning/10 px-3 py-1.5 text-warning-light",
@@ -51,7 +53,7 @@ function Badge({ className, variant, dot, dotColor, children, ...props }) {
51
53
  ] });
52
54
  }
53
55
  var avatarVariants = cva(
54
- "relative overflow-hidden border border-white/10 flex items-center justify-center",
56
+ "relative overflow-hidden border border-primary/15 flex items-center justify-center",
55
57
  {
56
58
  variants: {
57
59
  shape: {
@@ -136,7 +138,7 @@ var TooltipContent = React3.forwardRef(({ className, sideOffset = 6, ...props },
136
138
  ref,
137
139
  sideOffset,
138
140
  className: cn(
139
- "z-50 max-w-[12rem] bg-white/[0.05] backdrop-blur-[40px] border border-white/10 rounded-xl px-2.5 py-1.5 text-[11px] leading-snug text-white/90 shadow-[0_24px_80px_-15px_rgba(0,0,0,0.5)] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1",
141
+ "z-50 max-w-[12rem] bg-white/[0.05] backdrop-blur-[40px] border border-primary/15 rounded-xl px-2.5 py-1.5 text-[11px] leading-snug text-white/90 shadow-[0_24px_80px_-15px_rgba(0,0,0,0.5)] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1",
140
142
  className
141
143
  ),
142
144
  ...props
@@ -176,43 +178,109 @@ function SkeletonCard({ className, ...props }) {
176
178
  ] })
177
179
  ] });
178
180
  }
179
- function ScrollArea({
181
+ function Drawer({
182
+ shouldScaleBackground = true,
183
+ ...props
184
+ }) {
185
+ return /* @__PURE__ */ jsx(Drawer$1.Root, { shouldScaleBackground, ...props });
186
+ }
187
+ var DrawerTrigger = Drawer$1.Trigger;
188
+ var DrawerPortal = Drawer$1.Portal;
189
+ var DrawerClose = Drawer$1.Close;
190
+ function DrawerOverlay({
191
+ className,
192
+ ...props
193
+ }) {
194
+ return /* @__PURE__ */ jsx(
195
+ Drawer$1.Overlay,
196
+ {
197
+ "data-slot": "drawer-overlay",
198
+ className: cn("fixed inset-0 z-50 bg-theme-subtle-20", className),
199
+ ...props
200
+ }
201
+ );
202
+ }
203
+ function DrawerContent({
180
204
  className,
181
205
  children,
182
206
  ...props
183
207
  }) {
184
- return /* @__PURE__ */ jsxs(
185
- ScrollAreaPrimitive.Root,
208
+ return /* @__PURE__ */ jsxs(DrawerPortal, { children: [
209
+ /* @__PURE__ */ jsx(DrawerOverlay, {}),
210
+ /* @__PURE__ */ jsx(
211
+ Drawer$1.Content,
212
+ {
213
+ asChild: true,
214
+ "data-slot": "drawer-content",
215
+ ...props,
216
+ children: /* @__PURE__ */ jsxs(
217
+ motion.div,
218
+ {
219
+ initial: { y: "100%", opacity: 0 },
220
+ animate: { y: 0, opacity: 1 },
221
+ exit: { y: "100%", opacity: 0 },
222
+ transition: {
223
+ type: "spring",
224
+ stiffness: 400,
225
+ damping: 40
226
+ },
227
+ className: cn(
228
+ "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border-t border-x border-gray-200 dark:!border-gray-800 !bg-white dark:!bg-[#0D0A1A] !text-gray-900 dark:!text-gray-100 shadow-2xl dark:shadow-[0_-10px_40px_rgba(124,58,237,0.15)]",
229
+ className
230
+ ),
231
+ children: [
232
+ /* @__PURE__ */ jsx("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-theme-subtle" }),
233
+ children
234
+ ]
235
+ }
236
+ )
237
+ }
238
+ )
239
+ ] });
240
+ }
241
+ function DrawerHeader({ className, ...props }) {
242
+ return /* @__PURE__ */ jsx(
243
+ "div",
186
244
  {
187
- "data-slot": "scroll-area",
188
- className: cn("relative overflow-hidden", className),
189
- ...props,
190
- children: [
191
- /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, { className: "h-full w-full rounded-[inherit]", children }),
192
- /* @__PURE__ */ jsx(ScrollBar, {}),
193
- /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
194
- ]
245
+ "data-slot": "drawer-header",
246
+ className: cn("grid gap-1.5 p-4 text-center sm:text-left", className),
247
+ ...props
195
248
  }
196
249
  );
197
250
  }
198
- function ScrollBar({
251
+ function DrawerFooter({ className, ...props }) {
252
+ return /* @__PURE__ */ jsx(
253
+ "div",
254
+ {
255
+ "data-slot": "drawer-footer",
256
+ className: cn("mt-auto flex flex-col gap-2 p-4", className),
257
+ ...props
258
+ }
259
+ );
260
+ }
261
+ function DrawerTitle({
199
262
  className,
200
- orientation = "vertical",
201
263
  ...props
202
264
  }) {
203
265
  return /* @__PURE__ */ jsx(
204
- ScrollAreaPrimitive.ScrollAreaScrollbar,
266
+ Drawer$1.Title,
205
267
  {
206
- "data-slot": "scroll-bar",
207
- orientation,
208
- className: cn(
209
- "flex touch-none select-none transition-colors",
210
- orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
211
- orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
212
- className
213
- ),
214
- ...props,
215
- children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
268
+ "data-slot": "drawer-title",
269
+ className: cn("text-lg font-semibold leading-none tracking-tight", className),
270
+ ...props
271
+ }
272
+ );
273
+ }
274
+ function DrawerDescription({
275
+ className,
276
+ ...props
277
+ }) {
278
+ return /* @__PURE__ */ jsx(
279
+ Drawer$1.Description,
280
+ {
281
+ "data-slot": "drawer-description",
282
+ className: cn("text-sm text-theme-secondary", className),
283
+ ...props
216
284
  }
217
285
  );
218
286
  }
@@ -453,7 +521,47 @@ function OrganifyProvider({ children, value }) {
453
521
  return /* @__PURE__ */ jsx(OrganifyContext.Provider, { value: merged, children });
454
522
  }
455
523
  OrganifyProvider.displayName = "OrganifyProvider";
524
+ function ScrollArea({
525
+ className,
526
+ children,
527
+ ...props
528
+ }) {
529
+ return /* @__PURE__ */ jsxs(
530
+ ScrollAreaPrimitive.Root,
531
+ {
532
+ "data-slot": "scroll-area",
533
+ className: cn("relative overflow-hidden", className),
534
+ ...props,
535
+ children: [
536
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, { className: "h-full w-full rounded-[inherit]", children }),
537
+ /* @__PURE__ */ jsx(ScrollBar, {}),
538
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
539
+ ]
540
+ }
541
+ );
542
+ }
543
+ function ScrollBar({
544
+ className,
545
+ orientation = "vertical",
546
+ ...props
547
+ }) {
548
+ return /* @__PURE__ */ jsx(
549
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
550
+ {
551
+ "data-slot": "scroll-bar",
552
+ orientation,
553
+ className: cn(
554
+ "flex touch-none select-none transition-colors",
555
+ orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
556
+ orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
557
+ className
558
+ ),
559
+ ...props,
560
+ children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
561
+ }
562
+ );
563
+ }
456
564
 
457
- export { Avatar, AvatarFallback, AvatarImage, Badge, OrganifyContext, OrganifyProvider, ScrollArea, ScrollBar, Skeleton, SkeletonCard, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, avatarVariants, badgeVariants, cn, useOrganify, useOrganifyApi, useOrganifyGql, useOrganifyNavigation, useOrganifyProject, useOrganifyRest, useOrganifyUser, useOrganifyWorkspace };
458
- //# sourceMappingURL=chunk-VHQZS77G.js.map
459
- //# sourceMappingURL=chunk-VHQZS77G.js.map
565
+ export { Avatar, AvatarFallback, AvatarImage, Badge, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, OrganifyContext, OrganifyProvider, ScrollArea, ScrollBar, Skeleton, SkeletonCard, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, avatarVariants, badgeVariants, cn, useOrganify, useOrganifyApi, useOrganifyGql, useOrganifyNavigation, useOrganifyProject, useOrganifyRest, useOrganifyUser, useOrganifyWorkspace };
566
+ //# sourceMappingURL=chunk-JZEXSBCK.js.map
567
+ //# sourceMappingURL=chunk-JZEXSBCK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/primitives/badge.tsx","../src/components/primitives/avatar.tsx","../src/components/primitives/tooltip.tsx","../src/components/primitives/skeleton.tsx","../src/components/primitives/drawer.tsx","../src/providers/organify-provider.tsx","../src/components/primitives/scroll-area.tsx"],"names":["cva","React","jsxs","jsx","React2","DrawerPrimitive","json"],"mappings":"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","file":"chunk-JZEXSBCK.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merge Tailwind CSS classes with clsx — the standard shadcn pattern.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../lib/utils';\n\n/**\n * Badge — Status badges & context indicators\n *\n * Organic Design System — smooth pill shapes.\n * Theme-aware: uses CSS variables for theme switching.\n */\nconst badgeVariants = cva(\n 'inline-flex items-center gap-2 text-caption font-bold uppercase tracking-wider transition-all duration-[400ms] ease-[cubic-bezier(0.25,1,0.5,1)]',\n {\n variants: {\n variant: {\n default:\n 'rounded-full border border-primary/15 bg-white/[0.05] px-3 py-1.5 text-org-text-secondary',\n primary:\n 'rounded-full border border-indigo-400/30 bg-indigo-500/20 px-3 py-1.5 text-indigo-300',\n success:\n 'rounded-full border border-success/30 bg-success/10 px-3 py-1.5 text-success-light',\n warning:\n 'rounded-full border border-warning/30 bg-warning/10 px-3 py-1.5 text-warning-light',\n error:\n 'rounded-full border border-error/30 bg-error/10 px-3 py-1.5 text-error-light',\n info:\n 'rounded-full border border-info/30 bg-info/10 px-3 py-1.5 text-info-light',\n\n // ─── Flow status (from Brand Assets HTML) ──\n 'in-flow':\n 'rounded-full border border-indigo-500/30 bg-indigo-500/20 px-3 py-1.5 text-indigo-200 shadow-[0_0_15px_rgba(99,102,241,0.15)]',\n 'deep-work':\n 'rounded-full border border-fuchsia-500/20 bg-fuchsia-500/10 px-3 py-1.5 text-fuchsia-200',\n 'high-energy':\n 'rounded-full border border-emerald-500/20 bg-emerald-500/10 px-3 py-1.5 text-emerald-200',\n\n // ─── Cream Light theme ─────────────────────\n 'cream-default':\n 'rounded-full border border-neutral-200 bg-white/50 px-3 py-1 text-neutral-600 backdrop-blur-sm',\n 'cream-primary':\n 'rounded-full border border-primary/20 bg-primary/5 px-3 py-1 text-primary',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {\n /** Animated pulse dot */\n dot?: boolean;\n /** Dot color class (e.g. 'bg-indigo-400') */\n dotColor?: string;\n}\n\nfunction Badge({ className, variant, dot, dotColor, children, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props}>\n {dot && (\n <span\n className={cn(\n 'h-1.5 w-1.5 rounded-full animate-pulse',\n dotColor || 'bg-current',\n variant === 'in-flow' && 'shadow-[0_0_8px_rgba(129,140,248,0.8)]',\n )}\n />\n )}\n {children}\n </div>\n );\n}\n\nexport { Badge, badgeVariants };\n","'use client';\n\nimport * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../lib/utils';\n\n/**\n * Avatar — Geometric asymmetric avatars\n *\n * From the Brand Assets HTML: asymmetric shapes with gradient backgrounds,\n * geometric corner accents, status dot indicators.\n * Theme-aware: uses CSS variables for theme switching.\n */\nconst avatarVariants = cva(\n 'relative overflow-hidden border border-primary/15 flex items-center justify-center',\n {\n variants: {\n shape: {\n circle: 'rounded-full',\n 'asym-1': 'rounded-asym-1',\n 'asym-2': 'rounded-asym-2',\n geo: 'rounded-geo',\n 'geo-inv': 'rounded-geo-inv',\n square: 'rounded-xl',\n },\n size: {\n sm: 'h-8 w-8',\n default: 'h-10 w-10',\n lg: 'h-16 w-16',\n xl: 'h-20 w-20',\n },\n },\n defaultVariants: {\n shape: 'circle',\n size: 'default',\n },\n },\n);\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n VariantProps<typeof avatarVariants> {\n /** Online status indicator */\n status?: 'online' | 'offline' | 'away' | 'busy';\n /** Status dot color class override */\n statusColor?: string;\n /** Gradient background for fallback */\n gradient?: string;\n}\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(({ className, shape, size, status, statusColor, gradient, ...props }, ref) => (\n <div className=\"relative inline-flex\">\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n avatarVariants({ shape, size }),\n gradient && `bg-gradient-to-br ${gradient}`,\n className,\n )}\n {...props}\n />\n {status && (\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 rounded-full border-2 border-surface',\n size === 'sm' && 'h-2.5 w-2.5',\n size === 'default' && 'h-3 w-3',\n (size === 'lg' || size === 'xl') && 'h-3.5 w-3.5',\n statusColor ||\n (status === 'online' && 'bg-green-500'),\n status === 'offline' && 'bg-neutral-500',\n status === 'away' && 'bg-amber-500',\n status === 'busy' && 'bg-red-500',\n )}\n />\n )}\n {/* Geometric corner accent for lg/xl */}\n {(size === 'lg' || size === 'xl') && shape !== 'circle' && (\n <div className=\"absolute bottom-0 right-0 h-3 w-3 rotate-45 translate-x-1/2 translate-y-1/2 bg-primary-light\" />\n )}\n </div>\n));\nAvatar.displayName = 'Avatar';\n\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n));\nAvatarImage.displayName = 'AvatarImage';\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center text-sm font-medium text-white/90',\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = 'AvatarFallback';\n\nexport { Avatar, AvatarImage, AvatarFallback, avatarVariants };\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '../../lib/utils';\n\n/**\n * Tooltip — Organic glass tooltip\n *\n * Theme-aware: uses CSS variables for theme switching.\n * Squircle shape with glass backdrop.\n */\n\nconst TooltipProvider = TooltipPrimitive.Provider;\nconst Tooltip = TooltipPrimitive.Root;\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 6, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-w-[12rem] bg-white/[0.05] backdrop-blur-[40px] border border-primary/15 rounded-xl px-2.5 py-1.5 text-[11px] leading-snug text-white/90 shadow-[0_24px_80px_-15px_rgba(0,0,0,0.5)] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from 'react';\nimport { cn } from '../../lib/utils';\n\n/**\n * Skeleton — Shimmer loading placeholder\n *\n * From the design system: bg-white/10 with a sliding gradient shimmer animation.\n */\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Shape variant */\n variant?: 'rectangular' | 'circular' | 'rounded';\n}\n\nfunction Skeleton({ className, variant = 'rounded', ...props }: SkeletonProps) {\n return (\n <div\n className={cn(\n 'skeleton-shimmer',\n variant === 'circular' && 'rounded-full',\n variant === 'rounded' && 'rounded-xl',\n variant === 'rectangular' && 'rounded-none',\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * SkeletonCard — Pre-built skeleton card from the design system\n */\nfunction SkeletonCard({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('glass-panel space-y-6 p-6', className)} {...props}>\n <div className=\"flex items-center gap-5\">\n <Skeleton className=\"h-14 w-14 shrink-0\" variant=\"rounded\" />\n <div className=\"flex-1 space-y-2.5\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-3 w-1/2 opacity-60\" />\n </div>\n </div>\n <div className=\"space-y-3 pt-2\">\n <Skeleton className=\"h-24 w-full rounded-xl\" />\n <div className=\"flex justify-between pt-1\">\n <Skeleton className=\"h-3 w-20 opacity-40\" />\n <Skeleton className=\"h-3 w-20 opacity-40\" />\n </div>\n </div>\n </div>\n );\n}\n\nexport { Skeleton, SkeletonCard };\n","'use client';\n\nimport * as React from 'react';\nimport { motion } from 'framer-motion';\nimport { Drawer as DrawerPrimitive } from 'vaul';\nimport { cn } from '../../lib/utils';\n\nfunction Drawer({\n shouldScaleBackground = true,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root shouldScaleBackground={shouldScaleBackground} {...props} />;\n}\n\nconst DrawerTrigger = DrawerPrimitive.Trigger;\nconst DrawerPortal = DrawerPrimitive.Portal;\nconst DrawerClose = DrawerPrimitive.Close;\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn('fixed inset-0 z-50 bg-theme-subtle-20', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n asChild\n data-slot=\"drawer-content\"\n {...props}\n >\n <motion.div\n initial={{ y: '100%', opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: '100%', opacity: 0 }}\n transition={{\n type: 'spring',\n stiffness: 400,\n damping: 40,\n }}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border-t border-x border-gray-200 dark:!border-gray-800 !bg-white dark:!bg-[#0D0A1A] !text-gray-900 dark:!text-gray-100 shadow-2xl dark:shadow-[0_-10px_40px_rgba(124,58,237,0.15)]',\n className,\n )}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-theme-subtle\" />\n {children}\n </motion.div>\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn('grid gap-1.5 p-4 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn('mt-auto flex flex-col gap-2 p-4', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n );\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn('text-sm text-theme-secondary', className)}\n {...props}\n />\n );\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n};\n","// ─────────────────────────────────────────────\n// OrganifyProvider — Shared data context\n// ─────────────────────────────────────────────\n// Holds workspace, user, project data + API config\n// so that organify-ui components (WorkspaceSwitcher,\n// OrganifyNotifications, OrganifyChat, TaskDetailDialog,\n// CommentThread, etc.) can do internal API fetches\n// instead of receiving data via props.\n//\n// ALL API requests must go through:\n// useOrganifyGql(endpoint, query, vars) — for GraphQL\n// useOrganifyRest(endpoint, options) — for REST\n//\n// Never use raw fetch() directly.\n// ─────────────────────────────────────────────\n\n'use client';\n\nimport * as React from 'react';\n\n// ─── Types ──────────────────────────────────\n\nexport interface OrganifyWorkspace {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n avatarUrl?: string | null;\n plan?: { name: string } | null;\n _count?: {\n members?: number;\n teams?: number;\n invites?: number;\n };\n}\n\nexport interface OrganifyUser {\n id: string;\n name: string;\n email: string;\n avatarUrl?: string | null;\n role?: string;\n}\n\nexport interface OrganifyProject {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n type?: string;\n status?: string;\n}\n\nexport interface OrganifyApiConfig {\n /** Gateway base URL (e.g. http://localhost:4000) */\n gatewayUrl: string;\n /** JWT auth token (from cookie or auth state) */\n authToken?: string;\n /** Direct service URLs for WebSocket/subscription connections (bypass gateway) */\n services?: {\n /** Chat service (e.g. https://organify-chat-service.onrender.com) */\n chat?: string;\n /** Notifications service (e.g. https://organify-notifications-service.onrender.com) */\n notifications?: string;\n /** Projects service (e.g. https://organify-projects-service.onrender.com) */\n projects?: string;\n /** Workspaces service (e.g. https://modern-nikki-organify-studio-787ea453.koyeb.app) */\n workspaces?: string;\n };\n}\n\n// ─── Endpoint Types ─────────────────────────\n// Pre-configured endpoint keys for useOrganifyGql\n\nexport type GqlEndpoint = 'projects' | 'chat' | 'notifications' | 'workspaces';\nexport type RestEndpoint = 'auth' | 'users' | 'onboarding' | 'workspaces' | 'projects';\n\nexport interface OrganifyContextValue {\n // ─── API Configuration ────────────────\n api: OrganifyApiConfig;\n\n // Current workspace\n workspace: OrganifyWorkspace | null;\n workspaceLoading: boolean;\n\n // All available workspaces (for switcher)\n workspaces: OrganifyWorkspace[];\n workspacesLoading: boolean;\n\n // Current user\n user: OrganifyUser | null;\n\n // Current project (optional, set inside project routes)\n project: OrganifyProject | null;\n projectLoading: boolean;\n\n // Navigation\n navigate?: (path: string) => void;\n\n // Render helpers\n renderLink?: (props: {\n href: string;\n children: React.ReactNode;\n className?: string;\n onClick?: () => void;\n }) => React.ReactNode;\n\n // ─── Workspace Mutation Callbacks ─────\n // Called by internal components (WorkspaceSwitcher) to update parent state.\n // The host app provides these to keep its workspace state in sync.\n\n /** Called when workspaces list changes (create, update, delete) */\n onWorkspacesChange?: (workspaces: OrganifyWorkspace[]) => void;\n\n /** Called when active workspace should change (e.g. after create, switch) */\n onWorkspaceChange?: (workspace: OrganifyWorkspace | null) => void;\n}\n\n// ─── Context ────────────────────────────────\n\nconst OrganifyContext = React.createContext<OrganifyContextValue>({\n api: { gatewayUrl: '' },\n workspace: null,\n workspaceLoading: false,\n workspaces: [],\n workspacesLoading: false,\n user: null,\n project: null,\n projectLoading: false,\n});\n\n// ─── Hooks ──────────────────────────────────\n\nexport function useOrganify(): OrganifyContextValue {\n return React.useContext(OrganifyContext);\n}\n\n/** Access the API config (gatewayUrl, authToken, services) for internal fetches */\nexport function useOrganifyApi(): OrganifyApiConfig {\n const ctx = React.useContext(OrganifyContext);\n return ctx.api ?? { gatewayUrl: '' };\n}\n\n// ─── URL Resolution ─────────────────────────\n\n/**\n * Resolves the full URL for a GraphQL endpoint.\n *\n * Routing logic:\n * - 'projects' → gatewayUrl/api/graphql (via gateway proxy)\n * - 'chat' → gatewayUrl/api/graphql (via gateway proxy)\n * - 'notifications' → gatewayUrl/api/graphql (via gateway proxy)\n * - 'workspaces' → gatewayUrl/api/graphql (via gateway proxy)\n *\n * The gateway at port 4000 has a global `/api` prefix and proxies all\n * GraphQL endpoints through `/api/graphql/[subgraph]`:\n * - POST /api/graphql/workspaces → workspaces subgraph\n * - POST /api/graphql/projects → projects subgraph\n * - POST /api/graphql/chat → chat subgraph\n * - POST /api/graphql/notifications → notifications subgraph\n *\n * Also accepts legacy full paths like '/graphql/projects' or '/api/graphql'.\n */\nfunction resolveGqlUrl(\n endpoint: string,\n gatewayUrl: string,\n services?: OrganifyApiConfig['services'],\n): string {\n // Normalise: strip leading slash if present\n const ep = endpoint.replace(/^\\//, '');\n\n // Named endpoint keys → gateway proxy with /api prefix\n switch (ep) {\n case 'projects':\n return `${gatewayUrl}/api/graphql/projects`;\n case 'chat':\n return `${gatewayUrl}/api/graphql/chat`;\n case 'notifications':\n return `${gatewayUrl}/api/graphql/notifications`;\n case 'workspaces': {\n // Gateway proxy (primary) or direct service fallback\n return `${gatewayUrl}/api/graphql/workspaces`;\n }\n default:\n break;\n }\n\n // Legacy full paths — support both /graphql/* and /api/graphql/*\n if (ep.startsWith('graphql/')) {\n return `${gatewayUrl}/api/${ep}`;\n }\n if (ep.startsWith('api/graphql')) {\n return `${gatewayUrl}/${ep}`;\n }\n\n // Absolute URL passthrough (for services that need direct connection)\n if (ep.startsWith('http://') || ep.startsWith('https://')) {\n return ep;\n }\n\n // Fallback: attach to gateway with /api prefix\n return `${gatewayUrl}/api/${ep}`;\n}\n\n/**\n * Resolves the full URL for a REST endpoint.\n *\n * Routing logic:\n * - 'auth' → gatewayUrl/api/auth\n * - 'users' → gatewayUrl/api/users\n * - 'onboarding' → gatewayUrl/api/onboarding\n * - 'workspaces' → gatewayUrl/api/internal/workspaces\n * - 'projects' → gatewayUrl/api/internal/projects\n *\n * Also accepts full paths like '/api/auth/me'.\n */\nfunction resolveRestUrl(\n endpoint: string,\n path: string,\n gatewayUrl: string,\n): string {\n const p = path.replace(/^\\//, '');\n\n switch (endpoint) {\n case 'auth':\n return `${gatewayUrl}/api/auth/${p}`;\n case 'users':\n return `${gatewayUrl}/api/users/${p}`;\n case 'onboarding':\n return `${gatewayUrl}/api/onboarding/${p}`;\n case 'workspaces':\n return `${gatewayUrl}/api/internal/workspaces/${p}`;\n case 'projects':\n return `${gatewayUrl}/api/internal/projects/${p}`;\n default:\n break;\n }\n\n // Full path passthrough (e.g. '/api/auth/me')\n if (endpoint.startsWith('/')) {\n return `${gatewayUrl}${endpoint}`;\n }\n\n return `${gatewayUrl}/${endpoint}`;\n}\n\n// ─── Client-side Query Rate Limiter ─────────\n// Prevents runaway re-fetches from overwhelming the backend.\n// Deduplicates identical queries within a sliding window.\n\nconst GQL_RATE_LIMIT_WINDOW = 2000; // 2 seconds\nconst GQL_RATE_LIMIT_MAX = 5; // max 5 identical queries per window\n\n/** Global map: \"endpoint|queryHash|varsHash\" → timestamp[] */\nconst _gqlQueryLog = new Map<string, number[]>();\n\nfunction _gqlRateLimitKey(endpoint: string, query: string, variables?: Record<string, any>): string {\n // Fast hash: first 80 chars of the query + stringified vars (or empty)\n const qKey = query.replace(/\\s+/g, ' ').slice(0, 80);\n const vKey = variables ? JSON.stringify(variables) : '';\n return `${endpoint}|${qKey}|${vKey}`;\n}\n\nfunction _gqlCheckRateLimit(key: string): boolean {\n const now = Date.now();\n const times = _gqlQueryLog.get(key) ?? [];\n // Evict old entries\n const recent = times.filter((t) => now - t < GQL_RATE_LIMIT_WINDOW);\n if (recent.length >= GQL_RATE_LIMIT_MAX) {\n _gqlQueryLog.set(key, recent);\n return false; // blocked\n }\n recent.push(now);\n _gqlQueryLog.set(key, recent);\n return true; // allowed\n}\n\nfunction readAuthTokenCookie(cookieName = 'auth_token'): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie\n .split(';')\n .map((s) => s.trim())\n .find((s) => s.startsWith(`${cookieName}=`));\n if (!match) return null;\n return decodeURIComponent(match.split('=')[1]);\n}\n\n// ─── Centralized GraphQL Client ─────────────\n\n/**\n * Universal GraphQL fetch helper — ALL GraphQL requests go through this.\n *\n * Includes client-side rate limiting: identical queries are capped at\n * 5 per 2-second window. If exceeded, the call throws to prevent\n * runaway loops from overwhelming the backend.\n *\n * Usage:\n * const gql = useOrganifyGql();\n * const data = await gql('projects', CREATE_TASK_MUTATION, { input });\n * const data = await gql('chat', GET_ROOMS_QUERY, { workspaceId });\n * const data = await gql('workspaces', GET_WORKSPACES_QUERY);\n * const data = await gql('notifications', GET_NOTIFICATIONS_QUERY, { filter });\n */\nexport function useOrganifyGql() {\n const api = useOrganifyApi();\n const gatewayUrl = api?.gatewayUrl ?? '';\n const authToken = api?.authToken;\n const services = api?.services;\n\n return React.useCallback(\n async <T = any>(\n endpoint: GqlEndpoint | string,\n query: string,\n variables?: Record<string, any>,\n ): Promise<T> => {\n // ─── Rate limit check ──\n const rlKey = _gqlRateLimitKey(endpoint, query, variables);\n if (!_gqlCheckRateLimit(rlKey)) {\n console.warn(\n `[useOrganifyGql] Rate limited — ${GQL_RATE_LIMIT_MAX} identical requests in ${GQL_RATE_LIMIT_WINDOW}ms window`,\n { endpoint, variables },\n );\n throw new Error('Rate limited: too many identical requests');\n }\n\n const url = resolveGqlUrl(endpoint, gatewayUrl, services);\n const token = authToken || readAuthTokenCookie();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n console.log(\n `[useOrganifyGql] ${endpoint} ${token ? '✓ token' : '⚠ no token'}`,\n Object.keys(variables || {}).length > 0 ? `vars: ${JSON.stringify(variables)}` : '',\n );\n\n const res = await fetch(url, {\n method: 'POST',\n headers,\n credentials: 'include',\n body: JSON.stringify({ query, variables }),\n });\n\n if (!res.ok) {\n const json = await res.json();\n const errorMsg = json.errors?.[0]?.message || json.error || `HTTP ${res.status}`;\n const originalError = json.errors?.[0]?.extensions?.originalError?.message;\n console.error(`[useOrganifyGql] ${res.status} error on ${endpoint}:`, {\n message: errorMsg,\n originalError,\n errors: json.errors,\n });\n throw new Error(`HTTP ${res.status}: ${errorMsg}${originalError ? ` (${originalError})` : ''}`);\n }\n const json = await res.json();\n if (json.errors?.length) {\n const errorMsg = json.errors[0].message;\n const originalError = json.errors[0]?.extensions?.originalError?.message;\n console.error(`[useOrganifyGql] GraphQL error on ${endpoint}:`, {\n message: errorMsg,\n originalError,\n errors: json.errors,\n });\n throw new Error(`${errorMsg}${originalError ? ` (${originalError})` : ''}`);\n }\n return json.data;\n },\n [gatewayUrl, authToken, services],\n );\n}\n\n// ─── Centralized REST Client ────────────────\n\n/**\n * Universal REST fetch helper — ALL REST requests go through this.\n *\n * Usage:\n * const rest = useOrganifyRest();\n * const user = await rest('auth', 'me');\n * const data = await rest('auth', 'login', { method: 'POST', body: { email, password } });\n * const ws = await rest('workspaces', '');\n */\nexport function useOrganifyRest() {\n const api = useOrganifyApi();\n const gatewayUrl = api?.gatewayUrl ?? '';\n const authToken = api?.authToken;\n\n return React.useCallback(\n async <T = any>(\n endpoint: RestEndpoint | string,\n path: string = '',\n options?: {\n method?: string;\n body?: any;\n headers?: Record<string, string>;\n },\n ): Promise<T> => {\n const url = resolveRestUrl(endpoint, path, gatewayUrl);\n const method = options?.method ?? 'GET';\n const token = authToken || readAuthTokenCookie();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options?.headers ?? {}),\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n const fetchOpts: RequestInit = {\n method,\n headers,\n credentials: 'include',\n };\n if (options?.body && method !== 'GET') {\n fetchOpts.body = JSON.stringify(options.body);\n }\n\n const res = await fetch(url, fetchOpts);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = await res.json();\n return json.data ?? json;\n },\n [gatewayUrl, authToken],\n );\n}\n\n// ─── Data Hooks ─────────────────────────────\n\nexport function useOrganifyWorkspace() {\n const ctx = React.useContext(OrganifyContext);\n return {\n workspace: ctx.workspace,\n loading: ctx.workspaceLoading,\n workspaces: ctx.workspaces,\n workspacesLoading: ctx.workspacesLoading,\n onWorkspacesChange: ctx.onWorkspacesChange,\n onWorkspaceChange: ctx.onWorkspaceChange,\n };\n}\n\nexport function useOrganifyUser() {\n const ctx = React.useContext(OrganifyContext);\n return ctx.user;\n}\n\nexport function useOrganifyProject() {\n const ctx = React.useContext(OrganifyContext);\n return {\n project: ctx.project,\n loading: ctx.projectLoading,\n };\n}\n\nexport function useOrganifyNavigation() {\n const ctx = React.useContext(OrganifyContext);\n return {\n navigate: ctx.navigate,\n renderLink: ctx.renderLink,\n };\n}\n\n// ─── Provider ───────────────────────────────\n\nexport interface OrganifyProviderProps {\n children: React.ReactNode;\n value: Partial<OrganifyContextValue> & { api: OrganifyApiConfig };\n}\n\nfunction OrganifyProvider({ children, value }: OrganifyProviderProps) {\n const merged = React.useMemo<OrganifyContextValue>(\n () => ({\n api: value.api,\n workspace: value.workspace ?? null,\n workspaceLoading: value.workspaceLoading ?? false,\n workspaces: value.workspaces ?? [],\n workspacesLoading: value.workspacesLoading ?? false,\n user: value.user ?? null,\n project: value.project ?? null,\n projectLoading: value.projectLoading ?? false,\n navigate: value.navigate,\n renderLink: value.renderLink,\n onWorkspacesChange: value.onWorkspacesChange,\n onWorkspaceChange: value.onWorkspaceChange,\n }),\n [\n value.api,\n value.workspace,\n value.workspaceLoading,\n value.workspaces,\n value.workspacesLoading,\n value.user,\n value.project,\n value.projectLoading,\n value.navigate,\n value.renderLink,\n value.onWorkspacesChange,\n value.onWorkspaceChange,\n ],\n );\n\n return (\n <OrganifyContext.Provider value={merged}>\n {children}\n </OrganifyContext.Provider>\n );\n}\n\nOrganifyProvider.displayName = 'OrganifyProvider';\n\nexport { OrganifyProvider, OrganifyContext };\n","'use client';\n\nimport * as React from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cn } from '../../lib/utils';\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-bar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-[1px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n"]}
@@ -1,4 +1,4 @@
1
- import { cn, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea, Skeleton, Avatar, AvatarFallback, Badge, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from './chunk-VHQZS77G.js';
1
+ import { cn, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ScrollArea, Skeleton, Avatar, AvatarFallback, Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerFooter, Badge, useOrganifyApi, useOrganifyUser, useOrganifyWorkspace, useOrganifyGql } from './chunk-JZEXSBCK.js';
2
2
  import { OrgPlus, OrgSearch, OrgComment, OrgClose, OrgEdit, OrgTeam, OrgGlobe, OrgLock, OrgCheckCircle, OrgError, OrgWarning, OrgInfo, OrgChevronDown, OrgChevronRight, OrgDoor, OrgTrash, OrgCheck, OrgFolder, OrgChevronLeft } from './chunk-MZKEDV5W.js';
3
3
  import * as React6 from 'react';
4
4
  import React6__default, { useState, useCallback, useEffect } from 'react';
@@ -8,7 +8,6 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
  import { motion, AnimatePresence } from 'framer-motion';
9
9
  import * as DialogPrimitive from '@radix-ui/react-dialog';
10
10
  import { ChevronDown, ChevronUp, Check, XIcon } from 'lucide-react';
11
- import { Drawer as Drawer$1 } from 'vaul';
12
11
  import * as TabsPrimitive from '@radix-ui/react-tabs';
13
12
  import * as SeparatorPrimitive from '@radix-ui/react-separator';
14
13
  import * as SelectPrimitive from '@radix-ui/react-select';
@@ -1596,7 +1595,7 @@ function Label({ className, ...props }) {
1596
1595
  );
1597
1596
  }
1598
1597
  var textareaVariants = cva(
1599
- "flex w-full min-h-[100px] bg-white/[0.03] backdrop-blur-md border border-white/10 rounded-xl px-4 py-3 text-sm font-light text-org-text transition-all duration-[400ms] ease-[cubic-bezier(0.25,1,0.5,1)] placeholder:text-org-text-muted focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 resize-none",
1598
+ "flex w-full min-h-[100px] bg-white/[0.03] backdrop-blur-md border border-primary/15 rounded-xl px-4 py-3 text-sm font-light text-org-text transition-all duration-[400ms] ease-[cubic-bezier(0.25,1,0.5,1)] placeholder:text-org-text-muted focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 resize-none",
1600
1599
  {
1601
1600
  variants: {
1602
1601
  variant: {
@@ -1755,112 +1754,6 @@ function DialogDescription({
1755
1754
  }
1756
1755
  );
1757
1756
  }
1758
- function Drawer({
1759
- shouldScaleBackground = true,
1760
- ...props
1761
- }) {
1762
- return /* @__PURE__ */ jsx(Drawer$1.Root, { shouldScaleBackground, ...props });
1763
- }
1764
- var DrawerTrigger = Drawer$1.Trigger;
1765
- var DrawerPortal = Drawer$1.Portal;
1766
- var DrawerClose = Drawer$1.Close;
1767
- function DrawerOverlay({
1768
- className,
1769
- ...props
1770
- }) {
1771
- return /* @__PURE__ */ jsx(
1772
- Drawer$1.Overlay,
1773
- {
1774
- "data-slot": "drawer-overlay",
1775
- className: cn("fixed inset-0 z-50 bg-theme-subtle-20", className),
1776
- ...props
1777
- }
1778
- );
1779
- }
1780
- function DrawerContent({
1781
- className,
1782
- children,
1783
- ...props
1784
- }) {
1785
- return /* @__PURE__ */ jsxs(DrawerPortal, { children: [
1786
- /* @__PURE__ */ jsx(DrawerOverlay, {}),
1787
- /* @__PURE__ */ jsx(
1788
- Drawer$1.Content,
1789
- {
1790
- asChild: true,
1791
- "data-slot": "drawer-content",
1792
- ...props,
1793
- children: /* @__PURE__ */ jsxs(
1794
- motion.div,
1795
- {
1796
- initial: { y: "100%", opacity: 0 },
1797
- animate: { y: 0, opacity: 1 },
1798
- exit: { y: "100%", opacity: 0 },
1799
- transition: {
1800
- type: "spring",
1801
- stiffness: 400,
1802
- damping: 40
1803
- },
1804
- className: cn(
1805
- "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border-t border-x border-gray-200 dark:!border-gray-800 !bg-white dark:!bg-[#0D0A1A] !text-gray-900 dark:!text-gray-100 shadow-2xl dark:shadow-[0_-10px_40px_rgba(124,58,237,0.15)]",
1806
- className
1807
- ),
1808
- children: [
1809
- /* @__PURE__ */ jsx("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-theme-subtle" }),
1810
- children
1811
- ]
1812
- }
1813
- )
1814
- }
1815
- )
1816
- ] });
1817
- }
1818
- function DrawerHeader({ className, ...props }) {
1819
- return /* @__PURE__ */ jsx(
1820
- "div",
1821
- {
1822
- "data-slot": "drawer-header",
1823
- className: cn("grid gap-1.5 p-4 text-center sm:text-left", className),
1824
- ...props
1825
- }
1826
- );
1827
- }
1828
- function DrawerFooter({ className, ...props }) {
1829
- return /* @__PURE__ */ jsx(
1830
- "div",
1831
- {
1832
- "data-slot": "drawer-footer",
1833
- className: cn("mt-auto flex flex-col gap-2 p-4", className),
1834
- ...props
1835
- }
1836
- );
1837
- }
1838
- function DrawerTitle({
1839
- className,
1840
- ...props
1841
- }) {
1842
- return /* @__PURE__ */ jsx(
1843
- Drawer$1.Title,
1844
- {
1845
- "data-slot": "drawer-title",
1846
- className: cn("text-lg font-semibold leading-none tracking-tight", className),
1847
- ...props
1848
- }
1849
- );
1850
- }
1851
- function DrawerDescription({
1852
- className,
1853
- ...props
1854
- }) {
1855
- return /* @__PURE__ */ jsx(
1856
- Drawer$1.Description,
1857
- {
1858
- "data-slot": "drawer-description",
1859
- className: cn("text-sm text-theme-secondary", className),
1860
- ...props
1861
- }
1862
- );
1863
- }
1864
1757
  function useMediaQuery(query) {
1865
1758
  const [matches, setMatches] = React6.useState(false);
1866
1759
  React6.useEffect(() => {
@@ -1920,7 +1813,7 @@ function TabsList({
1920
1813
  {
1921
1814
  "data-slot": "tabs-list",
1922
1815
  className: cn(
1923
- "inline-flex h-10 items-center justify-center rounded-xl bg-white/[0.03] backdrop-blur-md border border-white/10 p-1 text-theme-muted",
1816
+ "inline-flex h-10 items-center justify-center rounded-xl bg-white/[0.03] backdrop-blur-md border border-primary/15 p-1 text-theme-muted",
1924
1817
  className
1925
1818
  ),
1926
1819
  ...props
@@ -2405,7 +2298,7 @@ function getInitials4(name) {
2405
2298
  var roleBadgeColors = {
2406
2299
  OWNER: "bg-amber-500/15 text-amber-300 border-amber-500/30",
2407
2300
  ADMIN: "bg-blue-500/15 text-blue-300 border-blue-500/30",
2408
- MEMBER: "bg-white/5 text-white/40 border-white/10"
2301
+ MEMBER: "bg-white/5 text-white/40 border-primary/15"
2409
2302
  };
2410
2303
  var roleLabels = {
2411
2304
  OWNER: "Dono",
@@ -3861,7 +3754,7 @@ function OrganifyChat({
3861
3754
  onClick: handleCloseManagement
3862
3755
  }
3863
3756
  ),
3864
- /* @__PURE__ */ jsx("div", { className: "w-[85%] max-w-sm h-full bg-white/[0.03] backdrop-blur-[40px] border-l border-white/10 animate-in slide-in-from-right-5 duration-[400ms]", children: /* @__PURE__ */ jsx(
3757
+ /* @__PURE__ */ jsx("div", { className: "w-[85%] max-w-sm h-full bg-white/[0.03] backdrop-blur-[40px] border-l border-primary/15 animate-in slide-in-from-right-5 duration-[400ms]", children: /* @__PURE__ */ jsx(
3865
3758
  RoomManagementPanel,
3866
3759
  {
3867
3760
  room: activeRoom,
@@ -4578,6 +4471,6 @@ function useAiInline({ gatewayUrl, workspaceId, projectId }) {
4578
4471
  return { loading, suggestion, requestSuggestion, dismiss };
4579
4472
  }
4580
4473
 
4581
- export { AiChatSidebar, Alert, Button, ChatMessages, ChatSidebar, CommandBar, CreateRoomDialog, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, InlineAiButton, Input, Label, MOCK_PROJECTS, MOCK_USERS, MentionPopover, MessageBubble, MessageInput, OrgLoader, OrgLoaderInline, OrganifyChat, ResponsiveDialog, RoomManagementPanel, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, TypingIndicatorMock, alertVariants, buttonVariants, generateAutoReplies, getMockMentionOptions, getRoomPermissions, inputVariants, orgLoaderVariants, typingIndicator, useAiInline, useChat };
4582
- //# sourceMappingURL=chunk-HFX2XZKZ.js.map
4583
- //# sourceMappingURL=chunk-HFX2XZKZ.js.map
4474
+ export { AiChatSidebar, Alert, Button, ChatMessages, ChatSidebar, CommandBar, CreateRoomDialog, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, InlineAiButton, Input, Label, MOCK_PROJECTS, MOCK_USERS, MentionPopover, MessageBubble, MessageInput, OrgLoader, OrgLoaderInline, OrganifyChat, ResponsiveDialog, RoomManagementPanel, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, TypingIndicatorMock, alertVariants, buttonVariants, generateAutoReplies, getMockMentionOptions, getRoomPermissions, inputVariants, orgLoaderVariants, typingIndicator, useAiInline, useChat };
4475
+ //# sourceMappingURL=chunk-NKUVER25.js.map
4476
+ //# sourceMappingURL=chunk-NKUVER25.js.map