@mesob/ui 0.2.0 → 0.2.2

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 (78) hide show
  1. package/dist/components/alert-dialog.js +10 -10
  2. package/dist/components/alert-dialog.js.map +1 -1
  3. package/dist/components/alert.js +1 -1
  4. package/dist/components/alert.js.map +1 -1
  5. package/dist/components/animated-tabs.js +1 -1
  6. package/dist/components/animated-tabs.js.map +1 -1
  7. package/dist/components/app-header-actions.js +68 -53
  8. package/dist/components/app-header-actions.js.map +1 -1
  9. package/dist/components/app-sidebar.js +33 -28
  10. package/dist/components/app-sidebar.js.map +1 -1
  11. package/dist/components/button-group.js +1 -1
  12. package/dist/components/button-group.js.map +1 -1
  13. package/dist/components/button.d.ts +6 -3
  14. package/dist/components/button.js +15 -7
  15. package/dist/components/button.js.map +1 -1
  16. package/dist/components/calendar.js +15 -7
  17. package/dist/components/calendar.js.map +1 -1
  18. package/dist/components/card.js +1 -1
  19. package/dist/components/card.js.map +1 -1
  20. package/dist/components/carousel.js +18 -10
  21. package/dist/components/carousel.js.map +1 -1
  22. package/dist/components/command.js +5 -5
  23. package/dist/components/command.js.map +1 -1
  24. package/dist/components/context-menu.js +2 -2
  25. package/dist/components/context-menu.js.map +1 -1
  26. package/dist/components/data-table/index.js +129 -120
  27. package/dist/components/data-table/index.js.map +1 -1
  28. package/dist/components/dialog.js +2 -2
  29. package/dist/components/dialog.js.map +1 -1
  30. package/dist/components/drawer.js +2 -2
  31. package/dist/components/drawer.js.map +1 -1
  32. package/dist/components/dropdown-menu.js +2 -2
  33. package/dist/components/dropdown-menu.js.map +1 -1
  34. package/dist/components/entity/index.js +138 -133
  35. package/dist/components/entity/index.js.map +1 -1
  36. package/dist/components/hover-card.js +1 -1
  37. package/dist/components/hover-card.js.map +1 -1
  38. package/dist/components/input-group.js +15 -7
  39. package/dist/components/input-group.js.map +1 -1
  40. package/dist/components/item.d.ts +1 -1
  41. package/dist/components/menubar.js +3 -3
  42. package/dist/components/menubar.js.map +1 -1
  43. package/dist/components/navigation-menu.js +1 -1
  44. package/dist/components/navigation-menu.js.map +1 -1
  45. package/dist/components/page/index.js +24 -16
  46. package/dist/components/page/index.js.map +1 -1
  47. package/dist/components/pagination.js +10 -10
  48. package/dist/components/pagination.js.map +1 -1
  49. package/dist/components/popover.js +1 -1
  50. package/dist/components/popover.js.map +1 -1
  51. package/dist/components/section/index.js +19 -11
  52. package/dist/components/section/index.js.map +1 -1
  53. package/dist/components/select.js +1 -1
  54. package/dist/components/select.js.map +1 -1
  55. package/dist/components/sheet.js +2 -2
  56. package/dist/components/sheet.js.map +1 -1
  57. package/dist/components/shell.js +44 -31
  58. package/dist/components/shell.js.map +1 -1
  59. package/dist/components/sidebar-context.d.ts +19 -0
  60. package/dist/components/sidebar-context.js +17 -0
  61. package/dist/components/sidebar-context.js.map +1 -0
  62. package/dist/components/sidebar.d.ts +2 -15
  63. package/dist/components/sidebar.js +51 -38
  64. package/dist/components/sidebar.js.map +1 -1
  65. package/dist/components/spotlight-search.js +38 -30
  66. package/dist/components/spotlight-search.js.map +1 -1
  67. package/dist/components/theme-toggle.js +17 -9
  68. package/dist/components/theme-toggle.js.map +1 -1
  69. package/dist/hooks/use-translation.js +3 -2
  70. package/dist/hooks/use-translation.js.map +1 -1
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.js +94 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/lib/theme-schema.d.ts +21 -0
  75. package/dist/lib/theme-schema.js +95 -0
  76. package/dist/lib/theme-schema.js.map +1 -0
  77. package/package.json +2 -5
  78. package/src/styles/globals.css +0 -130
@@ -10,18 +10,18 @@ function cn(...inputs) {
10
10
  // src/components/button.tsx
11
11
  import { Slot } from "@radix-ui/react-slot";
12
12
  import { cva } from "class-variance-authority";
13
- import { jsx } from "react/jsx-runtime";
13
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
14
  var buttonVariants = cva(
15
15
  "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
16
16
  {
17
17
  variants: {
18
18
  variant: {
19
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
20
- destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
21
- outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
22
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19
+ default: "bg-primary text-primary-foreground hover:bg-primary-600 dark:hover:bg-primary-400",
20
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
21
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
22
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary-600 dark:hover:bg-secondary-400",
23
23
  ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
24
- link: "text-primary underline-offset-4 hover:underline"
24
+ link: "text-primary underline-offset-4 hover:text-primary-600 dark:hover:text-primary-400 hover:underline"
25
25
  },
26
26
  size: {
27
27
  default: "h-9 px-4 py-2 has-[>svg]:px-3",
@@ -41,7 +41,7 @@ var buttonVariants = cva(
41
41
 
42
42
  // src/components/alert-dialog.tsx
43
43
  import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
44
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
44
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
45
45
  function AlertDialog({
46
46
  ...props
47
47
  }) {
@@ -66,7 +66,7 @@ function AlertDialogOverlay({
66
66
  {
67
67
  "data-slot": "alert-dialog-overlay",
68
68
  className: cn(
69
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
69
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:opacity-100 fixed inset-0 z-50 bg-[var(--overlay,oklch(0_0_0/0.5))]",
70
70
  className
71
71
  ),
72
72
  ...props
@@ -77,14 +77,14 @@ function AlertDialogContent({
77
77
  className,
78
78
  ...props
79
79
  }) {
80
- return /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
80
+ return /* @__PURE__ */ jsxs2(AlertDialogPortal, { children: [
81
81
  /* @__PURE__ */ jsx2(AlertDialogOverlay, {}),
82
82
  /* @__PURE__ */ jsx2(
83
83
  AlertDialogPrimitive.Content,
84
84
  {
85
85
  "data-slot": "alert-dialog-content",
86
86
  className: cn(
87
- "bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
87
+ "bg-background text-foreground border-border 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 fixed top-[50%] left-[50%] z-[51] grid w-full min-w-[280px] max-w-[calc(100vw-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:min-w-[320px] sm:max-w-[32rem]",
88
88
  className
89
89
  ),
90
90
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/button.tsx","../../src/components/alert-dialog.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","'use client';\n\nimport { buttonVariants } from '@mesob/ui/components/button';\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';\nimport type * as React from 'react';\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n );\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n 'flex flex-col-reverse gap-2 sm:flex-row sm:justify-end',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn('text-lg font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: 'outline' }), className)}\n {...props}\n />\n );\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n"],"mappings":";;;AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACJA,SAAS,YAAY;AACrB,SAAS,WAA8B;AAgDnC;AA7CJ,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC/BA,YAAY,0BAA0B;AAM7B,gBAAAA,MAwCL,YAxCK;AAHT,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAA2D;AACzD,SAAO,gBAAAA,KAAsB,2BAArB,EAA0B,aAAU,gBAAgB,GAAG,OAAO;AACxE;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAA8D;AAC5D,SACE,gBAAAA,KAAsB,8BAArB,EAA6B,aAAU,wBAAwB,GAAG,OAAO;AAE9E;AAEA,SAAS,kBAAkB;AAAA,EACzB,GAAG;AACL,GAA6D;AAC3D,SACE,gBAAAA,KAAsB,6BAArB,EAA4B,aAAU,uBAAuB,GAAG,OAAO;AAE5E;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,SACE,gBAAAA;AAAA,IAAsB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,SACE,qBAAC,qBACC;AAAA,oBAAAA,KAAC,sBAAmB;AAAA,IACpB,gBAAAA;AAAA,MAAsB;AAAA,MAArB;AAAA,QACC,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,KACF;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,gDAAgD,SAAS;AAAA,MACtE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE,gBAAAA;AAAA,IAAsB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAC/C,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAAkE;AAChE,SACE,gBAAAA;AAAA,IAAsB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,SACE,gBAAAA;AAAA,IAAsB;AAAA,IAArB;AAAA,MACC,WAAW,GAAG,eAAe,GAAG,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,SACE,gBAAAA;AAAA,IAAsB;AAAA,IAArB;AAAA,MACC,WAAW,GAAG,eAAe,EAAE,SAAS,UAAU,CAAC,GAAG,SAAS;AAAA,MAC9D,GAAG;AAAA;AAAA,EACN;AAEJ;","names":["jsx"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/button.tsx","../../src/components/alert-dialog.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground hover:bg-primary-600 dark:hover:bg-primary-400',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n outline:\n 'border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary-600 dark:hover:bg-secondary-400',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:text-primary-600 dark:hover:text-primary-400 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\ntype ButtonProps = React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n };\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n leftIcon,\n rightIcon,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {leftIcon}\n {children}\n {rightIcon}\n </>\n )}\n </Comp>\n );\n}\n\nexport { Button, buttonVariants };\n","'use client';\n\nimport { buttonVariants } from '@mesob/ui/components/button';\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';\nimport type * as React from 'react';\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />;\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n );\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n );\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:opacity-100 fixed inset-0 z-50 bg-[var(--overlay,oklch(0_0_0/0.5))]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogContent({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'bg-background text-foreground border-border 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 fixed top-[50%] left-[50%] z-[51] grid w-full min-w-[280px] max-w-[calc(100vw-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:min-w-[320px] sm:max-w-[32rem]',\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n 'flex flex-col-reverse gap-2 sm:flex-row sm:justify-end',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn('text-lg font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogAction({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {\n return (\n <AlertDialogPrimitive.Action\n className={cn(buttonVariants(), className)}\n {...props}\n />\n );\n}\n\nfunction AlertDialogCancel({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {\n return (\n <AlertDialogPrimitive.Cancel\n className={cn(buttonVariants({ variant: 'outline' }), className)}\n {...props}\n />\n );\n}\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -9,7 +9,7 @@ function cn(...inputs) {
9
9
  import { cva } from "class-variance-authority";
10
10
  import { jsx } from "react/jsx-runtime";
11
11
  var alertVariants = cva(
12
- "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
12
+ "border-border relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
13
13
  {
14
14
  variants: {
15
15
  variant: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/alert.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',\n {\n variants: {\n variant: {\n default: 'bg-card text-card-foreground',\n destructive:\n 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n 'col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n 'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription };\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACJA,SAAS,WAA8B;AAyBnC;AAtBJ,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqE;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/alert.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from '@mesob/ui/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\n\nconst alertVariants = cva(\n 'border-border relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',\n {\n variants: {\n variant: {\n default: 'bg-card text-card-foreground',\n destructive:\n 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n 'col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n 'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription };\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACJA,SAAS,WAA8B;AAyBnC;AAtBJ,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqE;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -43,7 +43,7 @@ function DropdownMenuContent({
43
43
  "data-slot": "dropdown-menu-content",
44
44
  sideOffset,
45
45
  className: cn(
46
- "bg-popover text-popover-foreground 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
46
+ "bg-popover text-popover-foreground border-border 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
47
47
  className
48
48
  ),
49
49
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/animated-tabs.tsx","../../src/components/dropdown-menu.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { motion } from 'motion/react';\nimport type { ComponentType, ReactNode } from 'react';\nimport { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from './dropdown-menu';\n\nexport type AnimatedTabItem = {\n name: string;\n value: string;\n href?: string;\n content?: ReactNode;\n};\n\ntype LinkComponentProps = {\n href: string;\n className?: string;\n children: ReactNode;\n ref?: React.Ref<HTMLAnchorElement>;\n};\n\ntype AnimatedTabsProps = {\n tabs: AnimatedTabItem[];\n activeTab?: string;\n defaultTab?: string;\n onTabChange?: (value: string) => void;\n className?: string;\n linkComponent?: ComponentType<LinkComponentProps>;\n};\n\nexport function AnimatedTabs({\n tabs,\n activeTab: controlledActiveTab,\n defaultTab,\n onTabChange,\n className,\n linkComponent: LinkComponent,\n}: AnimatedTabsProps) {\n const [internalActiveTab, setInternalActiveTab] = useState(\n defaultTab ?? tabs[0]?.value ?? '',\n );\n const activeTab = controlledActiveTab ?? internalActiveTab;\n\n const [visibleTabs, setVisibleTabs] = useState<AnimatedTabItem[]>(tabs);\n const [overflowTabs, setOverflowTabs] = useState<AnimatedTabItem[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n const tabsListRef = useRef<HTMLDivElement>(null);\n const dropdownTriggerRef = useRef<HTMLButtonElement>(null);\n const tabRefs = useRef<(HTMLElement | null)[]>([]);\n const [underlineStyle, setUnderlineStyle] = useState({ left: 0, width: 0 });\n\n const handleTabChange = (newValue: string) => {\n if (!controlledActiveTab) {\n setInternalActiveTab(newValue);\n }\n onTabChange?.(newValue);\n };\n\n useLayoutEffect(() => {\n const updateTabs = () => {\n if (!containerRef.current) {\n return;\n }\n if (!tabsListRef.current) {\n return;\n }\n\n const containerWidth = containerRef.current.offsetWidth;\n const dropdownWidth = 80;\n const padding = 16;\n const availableWidth = containerWidth - padding;\n\n let totalWidth = 0;\n const visible: AnimatedTabItem[] = [];\n const overflow: AnimatedTabItem[] = [];\n let hasOverflow = false;\n\n for (const [i, tab] of tabs.entries()) {\n const tabEl = tabRefs.current[i];\n\n if (!tabEl || tabEl.offsetWidth === 0) {\n if (hasOverflow) {\n overflow.push(tab);\n } else {\n visible.push(tab);\n }\n continue;\n }\n\n const tabWidth = tabEl.scrollWidth || tabEl.offsetWidth;\n const wouldFitWithoutDropdown = totalWidth + tabWidth <= availableWidth;\n const wouldFitWithDropdown =\n totalWidth + tabWidth + dropdownWidth <= availableWidth;\n\n if (!hasOverflow && wouldFitWithoutDropdown) {\n visible.push(tab);\n totalWidth += tabWidth;\n } else if (!hasOverflow && wouldFitWithDropdown) {\n visible.push(tab);\n totalWidth += tabWidth;\n hasOverflow = true;\n } else {\n hasOverflow = true;\n overflow.push(tab);\n }\n }\n\n setVisibleTabs(visible);\n setOverflowTabs(overflow);\n };\n\n const timeoutId = setTimeout(updateTabs, 100);\n\n const resizeObserver = new ResizeObserver(() => {\n setTimeout(updateTabs, 0);\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n if (tabsListRef.current) {\n resizeObserver.observe(tabsListRef.current);\n }\n\n window.addEventListener('resize', updateTabs);\n\n return () => {\n clearTimeout(timeoutId);\n resizeObserver.disconnect();\n window.removeEventListener('resize', updateTabs);\n };\n }, [tabs]);\n\n useLayoutEffect(() => {\n const updateUnderline = () => {\n const isInOverflow = overflowTabs.some((tab) => tab.value === activeTab);\n\n if (isInOverflow && dropdownTriggerRef.current) {\n const { offsetLeft, offsetWidth } = dropdownTriggerRef.current;\n setUnderlineStyle({\n left: offsetLeft,\n width: offsetWidth,\n });\n return;\n }\n\n const activeTabIndex = tabs.findIndex((tab) => tab.value === activeTab);\n const activeTabElement = tabRefs.current[activeTabIndex];\n\n if (\n activeTabElement &&\n visibleTabs.some((tab) => tab.value === activeTab)\n ) {\n const { offsetLeft, offsetWidth } = activeTabElement;\n setUnderlineStyle({\n left: offsetLeft,\n width: offsetWidth,\n });\n }\n };\n\n updateUnderline();\n }, [activeTab, visibleTabs, overflowTabs, tabs]);\n\n const activeTabData = useMemo(\n () => tabs.find((tab) => tab.value === activeTab),\n [tabs, activeTab],\n );\n\n const renderTab = (tab: AnimatedTabItem, originalIndex: number) => {\n const isActive = activeTab === tab.value;\n\n const tabClassName = cn(\n 'relative z-10 px-4 py-3 text-sm font-medium transition-all duration-200',\n 'hover:bg-muted/60 rounded-t-md',\n isActive ? 'text-primary' : 'text-muted-foreground hover:text-foreground',\n );\n\n const setRef = (el: HTMLElement | null) => {\n if (originalIndex >= 0) {\n tabRefs.current[originalIndex] = el;\n }\n };\n\n if (tab.href && LinkComponent) {\n return (\n <LinkComponent\n key={tab.value}\n href={tab.href}\n className={tabClassName}\n ref={setRef as React.Ref<HTMLAnchorElement>}\n >\n {tab.name}\n </LinkComponent>\n );\n }\n\n return (\n <button\n key={tab.value}\n type=\"button\"\n ref={setRef}\n onClick={() => handleTabChange(tab.value)}\n className={tabClassName}\n >\n {tab.name}\n </button>\n );\n };\n\n const renderDropdownItem = (tab: AnimatedTabItem) => {\n const isActive = activeTab === tab.value;\n const itemClassName = cn(\n 'cursor-pointer',\n isActive && 'bg-accent font-medium',\n );\n\n if (tab.href && LinkComponent) {\n return (\n <DropdownMenuItem key={tab.value} asChild className={itemClassName}>\n <LinkComponent href={tab.href}>{tab.name}</LinkComponent>\n </DropdownMenuItem>\n );\n }\n\n return (\n <DropdownMenuItem\n key={tab.value}\n onClick={() => handleTabChange(tab.value)}\n className={itemClassName}\n >\n {tab.name}\n </DropdownMenuItem>\n );\n };\n\n return (\n <div className={cn('flex flex-col', className)}>\n <div ref={containerRef} className=\"w-full\">\n <div ref={tabsListRef} className=\"relative flex items-center\">\n {visibleTabs.map((tab) => {\n const originalIndex = tabs.findIndex((t) => t.value === tab.value);\n return renderTab(tab, originalIndex);\n })}\n\n {overflowTabs.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n ref={dropdownTriggerRef}\n className={cn(\n 'relative z-10 flex items-center gap-1 px-4 py-3 text-sm font-medium transition-all duration-200',\n 'hover:bg-muted/60 rounded-t-md',\n overflowTabs.some((tab) => tab.value === activeTab)\n ? 'text-primary'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n More\n <IconChevronDown className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-40\">\n {overflowTabs.map(renderDropdownItem)}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n <motion.div\n className=\"absolute bottom-0 left-0 z-20 h-0.5 bg-primary\"\n animate={{\n left: underlineStyle.left,\n width: underlineStyle.width,\n }}\n transition={{\n type: 'spring',\n stiffness: 400,\n damping: 40,\n }}\n />\n </div>\n </div>\n\n {activeTabData?.content && (\n <div className=\"flex-1\">{activeTabData.content}</div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { IconCheck, IconChevronRight, IconCircle } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCheck className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCircle className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n 'px-2 py-1.5 text-sm font-medium data-[inset]:pl-8',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <IconChevronRight className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/animated-tabs.tsx","../../src/components/dropdown-menu.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { motion } from 'motion/react';\nimport type { ComponentType, ReactNode } from 'react';\nimport { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from './dropdown-menu';\n\nexport type AnimatedTabItem = {\n name: string;\n value: string;\n href?: string;\n content?: ReactNode;\n};\n\ntype LinkComponentProps = {\n href: string;\n className?: string;\n children: ReactNode;\n ref?: React.Ref<HTMLAnchorElement>;\n};\n\ntype AnimatedTabsProps = {\n tabs: AnimatedTabItem[];\n activeTab?: string;\n defaultTab?: string;\n onTabChange?: (value: string) => void;\n className?: string;\n linkComponent?: ComponentType<LinkComponentProps>;\n};\n\nexport function AnimatedTabs({\n tabs,\n activeTab: controlledActiveTab,\n defaultTab,\n onTabChange,\n className,\n linkComponent: LinkComponent,\n}: AnimatedTabsProps) {\n const [internalActiveTab, setInternalActiveTab] = useState(\n defaultTab ?? tabs[0]?.value ?? '',\n );\n const activeTab = controlledActiveTab ?? internalActiveTab;\n\n const [visibleTabs, setVisibleTabs] = useState<AnimatedTabItem[]>(tabs);\n const [overflowTabs, setOverflowTabs] = useState<AnimatedTabItem[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n const tabsListRef = useRef<HTMLDivElement>(null);\n const dropdownTriggerRef = useRef<HTMLButtonElement>(null);\n const tabRefs = useRef<(HTMLElement | null)[]>([]);\n const [underlineStyle, setUnderlineStyle] = useState({ left: 0, width: 0 });\n\n const handleTabChange = (newValue: string) => {\n if (!controlledActiveTab) {\n setInternalActiveTab(newValue);\n }\n onTabChange?.(newValue);\n };\n\n useLayoutEffect(() => {\n const updateTabs = () => {\n if (!containerRef.current) {\n return;\n }\n if (!tabsListRef.current) {\n return;\n }\n\n const containerWidth = containerRef.current.offsetWidth;\n const dropdownWidth = 80;\n const padding = 16;\n const availableWidth = containerWidth - padding;\n\n let totalWidth = 0;\n const visible: AnimatedTabItem[] = [];\n const overflow: AnimatedTabItem[] = [];\n let hasOverflow = false;\n\n for (const [i, tab] of tabs.entries()) {\n const tabEl = tabRefs.current[i];\n\n if (!tabEl || tabEl.offsetWidth === 0) {\n if (hasOverflow) {\n overflow.push(tab);\n } else {\n visible.push(tab);\n }\n continue;\n }\n\n const tabWidth = tabEl.scrollWidth || tabEl.offsetWidth;\n const wouldFitWithoutDropdown = totalWidth + tabWidth <= availableWidth;\n const wouldFitWithDropdown =\n totalWidth + tabWidth + dropdownWidth <= availableWidth;\n\n if (!hasOverflow && wouldFitWithoutDropdown) {\n visible.push(tab);\n totalWidth += tabWidth;\n } else if (!hasOverflow && wouldFitWithDropdown) {\n visible.push(tab);\n totalWidth += tabWidth;\n hasOverflow = true;\n } else {\n hasOverflow = true;\n overflow.push(tab);\n }\n }\n\n setVisibleTabs(visible);\n setOverflowTabs(overflow);\n };\n\n const timeoutId = setTimeout(updateTabs, 100);\n\n const resizeObserver = new ResizeObserver(() => {\n setTimeout(updateTabs, 0);\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n if (tabsListRef.current) {\n resizeObserver.observe(tabsListRef.current);\n }\n\n window.addEventListener('resize', updateTabs);\n\n return () => {\n clearTimeout(timeoutId);\n resizeObserver.disconnect();\n window.removeEventListener('resize', updateTabs);\n };\n }, [tabs]);\n\n useLayoutEffect(() => {\n const updateUnderline = () => {\n const isInOverflow = overflowTabs.some((tab) => tab.value === activeTab);\n\n if (isInOverflow && dropdownTriggerRef.current) {\n const { offsetLeft, offsetWidth } = dropdownTriggerRef.current;\n setUnderlineStyle({\n left: offsetLeft,\n width: offsetWidth,\n });\n return;\n }\n\n const activeTabIndex = tabs.findIndex((tab) => tab.value === activeTab);\n const activeTabElement = tabRefs.current[activeTabIndex];\n\n if (\n activeTabElement &&\n visibleTabs.some((tab) => tab.value === activeTab)\n ) {\n const { offsetLeft, offsetWidth } = activeTabElement;\n setUnderlineStyle({\n left: offsetLeft,\n width: offsetWidth,\n });\n }\n };\n\n updateUnderline();\n }, [activeTab, visibleTabs, overflowTabs, tabs]);\n\n const activeTabData = useMemo(\n () => tabs.find((tab) => tab.value === activeTab),\n [tabs, activeTab],\n );\n\n const renderTab = (tab: AnimatedTabItem, originalIndex: number) => {\n const isActive = activeTab === tab.value;\n\n const tabClassName = cn(\n 'relative z-10 px-4 py-3 text-sm font-medium transition-all duration-200',\n 'hover:bg-muted/60 rounded-t-md',\n isActive ? 'text-primary' : 'text-muted-foreground hover:text-foreground',\n );\n\n const setRef = (el: HTMLElement | null) => {\n if (originalIndex >= 0) {\n tabRefs.current[originalIndex] = el;\n }\n };\n\n if (tab.href && LinkComponent) {\n return (\n <LinkComponent\n key={tab.value}\n href={tab.href}\n className={tabClassName}\n ref={setRef as React.Ref<HTMLAnchorElement>}\n >\n {tab.name}\n </LinkComponent>\n );\n }\n\n return (\n <button\n key={tab.value}\n type=\"button\"\n ref={setRef}\n onClick={() => handleTabChange(tab.value)}\n className={tabClassName}\n >\n {tab.name}\n </button>\n );\n };\n\n const renderDropdownItem = (tab: AnimatedTabItem) => {\n const isActive = activeTab === tab.value;\n const itemClassName = cn(\n 'cursor-pointer',\n isActive && 'bg-accent font-medium',\n );\n\n if (tab.href && LinkComponent) {\n return (\n <DropdownMenuItem key={tab.value} asChild className={itemClassName}>\n <LinkComponent href={tab.href}>{tab.name}</LinkComponent>\n </DropdownMenuItem>\n );\n }\n\n return (\n <DropdownMenuItem\n key={tab.value}\n onClick={() => handleTabChange(tab.value)}\n className={itemClassName}\n >\n {tab.name}\n </DropdownMenuItem>\n );\n };\n\n return (\n <div className={cn('flex flex-col', className)}>\n <div ref={containerRef} className=\"w-full\">\n <div ref={tabsListRef} className=\"relative flex items-center\">\n {visibleTabs.map((tab) => {\n const originalIndex = tabs.findIndex((t) => t.value === tab.value);\n return renderTab(tab, originalIndex);\n })}\n\n {overflowTabs.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger\n ref={dropdownTriggerRef}\n className={cn(\n 'relative z-10 flex items-center gap-1 px-4 py-3 text-sm font-medium transition-all duration-200',\n 'hover:bg-muted/60 rounded-t-md',\n overflowTabs.some((tab) => tab.value === activeTab)\n ? 'text-primary'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n More\n <IconChevronDown className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-40\">\n {overflowTabs.map(renderDropdownItem)}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n <motion.div\n className=\"absolute bottom-0 left-0 z-20 h-0.5 bg-primary\"\n animate={{\n left: underlineStyle.left,\n width: underlineStyle.width,\n }}\n transition={{\n type: 'spring',\n stiffness: 400,\n damping: 40,\n }}\n />\n </div>\n </div>\n\n {activeTabData?.content && (\n <div className=\"flex-1\">{activeTabData.content}</div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { cn } from '@mesob/ui/lib/utils';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { IconCheck, IconChevronRight, IconCircle } from '@tabler/icons-react';\nimport type * as React from 'react';\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n );\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground border-border 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCheck className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCircle className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n 'px-2 py-1.5 text-sm font-medium data-[inset]:pl-8',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <IconChevronRight className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground border-border 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -59,18 +59,18 @@ function AvatarFallback({
59
59
  // src/components/button.tsx
60
60
  import { Slot } from "@radix-ui/react-slot";
61
61
  import { cva } from "class-variance-authority";
62
- import { jsx as jsx2 } from "react/jsx-runtime";
62
+ import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
63
63
  var buttonVariants = cva(
64
64
  "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
65
65
  {
66
66
  variants: {
67
67
  variant: {
68
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
69
- destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
70
- outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
71
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
68
+ default: "bg-primary text-primary-foreground hover:bg-primary-600 dark:hover:bg-primary-400",
69
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
70
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
71
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary-600 dark:hover:bg-secondary-400",
72
72
  ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
73
- link: "text-primary underline-offset-4 hover:underline"
73
+ link: "text-primary underline-offset-4 hover:text-primary-600 dark:hover:text-primary-400 hover:underline"
74
74
  },
75
75
  size: {
76
76
  default: "h-9 px-4 py-2 has-[>svg]:px-3",
@@ -92,6 +92,9 @@ function Button({
92
92
  variant,
93
93
  size,
94
94
  asChild = false,
95
+ leftIcon,
96
+ rightIcon,
97
+ children,
95
98
  ...props
96
99
  }) {
97
100
  const Comp = asChild ? Slot : "button";
@@ -100,7 +103,12 @@ function Button({
100
103
  {
101
104
  "data-slot": "button",
102
105
  className: cn(buttonVariants({ variant, size, className })),
103
- ...props
106
+ ...props,
107
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
108
+ leftIcon,
109
+ children,
110
+ rightIcon
111
+ ] })
104
112
  }
105
113
  );
106
114
  }
@@ -108,7 +116,7 @@ function Button({
108
116
  // src/components/dropdown-menu.tsx
109
117
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
110
118
  import { IconCheck, IconChevronRight, IconCircle } from "@tabler/icons-react";
111
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
119
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
112
120
  function DropdownMenu({
113
121
  ...props
114
122
  }) {
@@ -136,7 +144,7 @@ function DropdownMenuContent({
136
144
  "data-slot": "dropdown-menu-content",
137
145
  sideOffset,
138
146
  className: cn(
139
- "bg-popover text-popover-foreground 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
147
+ "bg-popover text-popover-foreground border-border 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
140
148
  className
141
149
  ),
142
150
  ...props
@@ -179,7 +187,7 @@ function DropdownMenuSeparator({
179
187
 
180
188
  // src/components/tooltip.tsx
181
189
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
182
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
190
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
183
191
 
184
192
  // src/components/mesob-context.tsx
185
193
  import {
@@ -222,7 +230,7 @@ function Link({
222
230
  // src/components/dialog.tsx
223
231
  import * as DialogPrimitive from "@radix-ui/react-dialog";
224
232
  import { IconX } from "@tabler/icons-react";
225
- import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
233
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
226
234
  function Dialog({
227
235
  ...props
228
236
  }) {
@@ -242,7 +250,7 @@ function DialogOverlay({
242
250
  {
243
251
  "data-slot": "dialog-overlay",
244
252
  className: cn(
245
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
253
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:opacity-100 fixed inset-0 z-50 bg-[var(--overlay,oklch(0_0_0/0.5))]",
246
254
  className
247
255
  ),
248
256
  ...props
@@ -255,20 +263,20 @@ function DialogContent({
255
263
  showCloseButton = true,
256
264
  ...props
257
265
  }) {
258
- return /* @__PURE__ */ jsxs3(DialogPortal, { "data-slot": "dialog-portal", children: [
266
+ return /* @__PURE__ */ jsxs4(DialogPortal, { "data-slot": "dialog-portal", children: [
259
267
  /* @__PURE__ */ jsx7(DialogOverlay, {}),
260
- /* @__PURE__ */ jsxs3(
268
+ /* @__PURE__ */ jsxs4(
261
269
  DialogPrimitive.Content,
262
270
  {
263
271
  "data-slot": "dialog-content",
264
272
  className: cn(
265
- "bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
273
+ "bg-background text-foreground border-border 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 fixed top-[50%] left-[50%] z-[51] grid w-full min-w-[280px] max-w-[calc(100vw-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:min-w-[320px] sm:max-w-[32rem]",
266
274
  className
267
275
  ),
268
276
  ...props,
269
277
  children: [
270
278
  children,
271
- showCloseButton && /* @__PURE__ */ jsxs3(
279
+ showCloseButton && /* @__PURE__ */ jsxs4(
272
280
  DialogPrimitive.Close,
273
281
  {
274
282
  "data-slot": "dialog-close",
@@ -324,7 +332,7 @@ function DialogDescription({
324
332
  // src/components/command.tsx
325
333
  import { IconSearch } from "@tabler/icons-react";
326
334
  import { Command as CommandPrimitive } from "cmdk";
327
- import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
335
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
328
336
  function Command({
329
337
  className,
330
338
  ...props
@@ -334,7 +342,7 @@ function Command({
334
342
  {
335
343
  "data-slot": "command",
336
344
  className: cn(
337
- "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
345
+ "bg-popover text-popover-foreground flex h-full min-h-0 w-full flex-col overflow-hidden rounded-md",
338
346
  className
339
347
  ),
340
348
  ...props
@@ -349,8 +357,8 @@ function CommandDialog({
349
357
  showCloseButton = true,
350
358
  ...props
351
359
  }) {
352
- return /* @__PURE__ */ jsxs4(Dialog, { ...props, children: [
353
- /* @__PURE__ */ jsxs4(DialogHeader, { className: "sr-only", children: [
360
+ return /* @__PURE__ */ jsxs5(Dialog, { ...props, children: [
361
+ /* @__PURE__ */ jsxs5(DialogHeader, { className: "sr-only", children: [
354
362
  /* @__PURE__ */ jsx8(DialogTitle, { children: title }),
355
363
  /* @__PURE__ */ jsx8(DialogDescription, { children: description })
356
364
  ] }),
@@ -368,11 +376,11 @@ function CommandInput({
368
376
  className,
369
377
  ...props
370
378
  }) {
371
- return /* @__PURE__ */ jsxs4(
379
+ return /* @__PURE__ */ jsxs5(
372
380
  "div",
373
381
  {
374
382
  "data-slot": "command-input-wrapper",
375
- className: "flex h-9 items-center gap-2 border-b px-3",
383
+ className: "border-border flex h-9 items-center gap-2 border-b px-3",
376
384
  children: [
377
385
  /* @__PURE__ */ jsx8(IconSearch, { className: "size-4 shrink-0 opacity-50" }),
378
386
  /* @__PURE__ */ jsx8(
@@ -413,7 +421,7 @@ function CommandEmpty({
413
421
  CommandPrimitive.Empty,
414
422
  {
415
423
  "data-slot": "command-empty",
416
- className: "py-6 text-center text-sm",
424
+ className: "text-muted-foreground py-6 text-center text-sm",
417
425
  ...props
418
426
  }
419
427
  );
@@ -467,7 +475,7 @@ function CommandItem({
467
475
  // src/components/spotlight-search.tsx
468
476
  import { IconSearch as IconSearch2 } from "@tabler/icons-react";
469
477
  import * as React from "react";
470
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
478
+ import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
471
479
  function SpotlightSearch({
472
480
  groups = [],
473
481
  placeholder = "Search...",
@@ -487,27 +495,27 @@ function SpotlightSearch({
487
495
  document.addEventListener("keydown", down);
488
496
  return () => document.removeEventListener("keydown", down);
489
497
  }, []);
490
- return /* @__PURE__ */ jsxs5(Fragment2, { children: [
491
- /* @__PURE__ */ jsxs5(
498
+ return /* @__PURE__ */ jsxs6(Fragment3, { children: [
499
+ /* @__PURE__ */ jsxs6(
492
500
  Button,
493
501
  {
494
502
  variant: "outline",
495
503
  className: cn(
496
- "relative h-9 w-9 p-0 xl:h-9 xl:w-60 xl:justify-start xl:px-3 xl:py-2",
504
+ "relative h-9 min-w-9 p-0 xl:h-9 xl:min-w-[12rem] xl:w-60 xl:justify-start xl:px-3 xl:py-2",
497
505
  triggerClassName
498
506
  ),
499
507
  onClick: () => setOpen(true),
500
508
  children: [
501
509
  /* @__PURE__ */ jsx9(IconSearch2, { className: "h-4 w-4 xl:mr-2" }),
502
510
  /* @__PURE__ */ jsx9("span", { className: "hidden xl:inline-flex", children: "Search..." }),
503
- /* @__PURE__ */ jsxs5("kbd", { className: "pointer-events-none absolute right-1.5 top-1/2 hidden h-5 -translate-y-1/2 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 xl:flex", children: [
511
+ /* @__PURE__ */ jsxs6("kbd", { className: "border-border pointer-events-none absolute right-1.5 top-1/2 hidden h-5 -translate-y-1/2 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 xl:flex", children: [
504
512
  /* @__PURE__ */ jsx9("span", { className: "text-xs", children: "\u2318" }),
505
513
  "K"
506
514
  ] })
507
515
  ]
508
516
  }
509
517
  ),
510
- /* @__PURE__ */ jsxs5(
518
+ /* @__PURE__ */ jsxs6(
511
519
  CommandDialog,
512
520
  {
513
521
  open,
@@ -518,11 +526,11 @@ function SpotlightSearch({
518
526
  className,
519
527
  children: [
520
528
  /* @__PURE__ */ jsx9(CommandInput, { placeholder, onValueChange: onSearch }),
521
- /* @__PURE__ */ jsxs5(CommandList, { children: [
529
+ /* @__PURE__ */ jsxs6(CommandList, { children: [
522
530
  /* @__PURE__ */ jsx9(CommandEmpty, { children: emptyMessage }),
523
- groups.map((group, index) => /* @__PURE__ */ jsxs5(React.Fragment, { children: [
531
+ groups.map((group, index) => /* @__PURE__ */ jsxs6(React.Fragment, { children: [
524
532
  index > 0 && /* @__PURE__ */ jsx9(CommandSeparator, {}),
525
- /* @__PURE__ */ jsx9(CommandGroup, { heading: group.heading, children: group.items.map((item) => /* @__PURE__ */ jsxs5(
533
+ /* @__PURE__ */ jsx9(CommandGroup, { heading: group.heading, children: group.items.map((item) => /* @__PURE__ */ jsxs6(
526
534
  CommandItem,
527
535
  {
528
536
  onSelect: () => {
@@ -532,7 +540,7 @@ function SpotlightSearch({
532
540
  children: [
533
541
  item.icon,
534
542
  /* @__PURE__ */ jsx9("span", { children: item.title }),
535
- item.shortcut && /* @__PURE__ */ jsx9("kbd", { className: "pointer-events-none ml-auto hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 sm:flex", children: item.shortcut })
543
+ item.shortcut && /* @__PURE__ */ jsx9("kbd", { className: "border-border pointer-events-none ml-auto hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 sm:flex", children: item.shortcut })
536
544
  ]
537
545
  },
538
546
  item.id
@@ -547,7 +555,7 @@ function SpotlightSearch({
547
555
 
548
556
  // src/components/app-header-actions.tsx
549
557
  import { IconBell, IconLogout } from "@tabler/icons-react";
550
- import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
558
+ import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
551
559
  function AppHeaderActions({
552
560
  user,
553
561
  onLogout,
@@ -561,32 +569,39 @@ function AppHeaderActions({
561
569
  const initials = user?.fullName?.split(" ").map((n) => n[0]).join("").toUpperCase().slice(0, 2) || "U";
562
570
  const displayName = user?.fullName ?? "Account";
563
571
  const displaySubtext = user?.email ?? user?.phone ?? user?.handle ?? "";
564
- return /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2", children: [
572
+ return /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2", children: [
565
573
  /* @__PURE__ */ jsx10(SpotlightSearch, { groups: searchGroups }),
566
574
  actions,
567
575
  /* @__PURE__ */ jsx10(Button, { variant: "ghost", size: "icon", className: "relative", children: /* @__PURE__ */ jsx10(IconBell, { className: "size-5" }) }),
568
- /* @__PURE__ */ jsxs6(DropdownMenu, { children: [
569
- /* @__PURE__ */ jsx10(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs6(Button, { variant: "ghost", className: "flex items-center gap-2 px-2", children: [
570
- /* @__PURE__ */ jsxs6(Avatar, { className: "size-8", children: [
571
- /* @__PURE__ */ jsx10(AvatarImage, { src: user?.image ?? void 0 }),
572
- /* @__PURE__ */ jsx10(AvatarFallback, { className: "text-xs", children: initials })
573
- ] }),
574
- /* @__PURE__ */ jsxs6("div", { className: "hidden flex-col items-start text-left md:flex", children: [
575
- /* @__PURE__ */ jsx10("span", { className: "text-sm font-medium", children: displayName }),
576
- /* @__PURE__ */ jsx10("span", { className: "text-xs text-muted-foreground", children: displaySubtext })
577
- ] })
578
- ] }) }),
579
- /* @__PURE__ */ jsxs6(DropdownMenuContent, { align: "end", className: "w-56", children: [
576
+ /* @__PURE__ */ jsxs7(DropdownMenu, { children: [
577
+ /* @__PURE__ */ jsx10(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs7(
578
+ Button,
579
+ {
580
+ variant: "ghost",
581
+ className: "flex items-center gap-3 px-3 py-2 h-auto rounded-md min-h-9 hover:bg-accent/70 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
582
+ children: [
583
+ /* @__PURE__ */ jsxs7(Avatar, { className: "size-8 shrink-0", children: [
584
+ /* @__PURE__ */ jsx10(AvatarImage, { src: user?.image ?? void 0 }),
585
+ /* @__PURE__ */ jsx10(AvatarFallback, { className: "text-xs", children: initials })
586
+ ] }),
587
+ /* @__PURE__ */ jsxs7("div", { className: "hidden flex-col items-start text-left md:flex min-w-0", children: [
588
+ /* @__PURE__ */ jsx10("span", { className: "text-sm font-medium", children: displayName }),
589
+ /* @__PURE__ */ jsx10("span", { className: "text-xs text-muted-foreground", children: displaySubtext })
590
+ ] })
591
+ ]
592
+ }
593
+ ) }),
594
+ /* @__PURE__ */ jsxs7(DropdownMenuContent, { align: "end", className: "w-56", children: [
580
595
  topMenuItems.map((item) => /* @__PURE__ */ jsx10(
581
596
  DropdownMenuItem,
582
597
  {
583
598
  onClick: item.onClick,
584
599
  variant: item.variant,
585
600
  asChild: item.href ? true : void 0,
586
- children: item.href ? /* @__PURE__ */ jsxs6(Link, { href: item.href, onClick: item.onClick, children: [
601
+ children: item.href ? /* @__PURE__ */ jsxs7(Link, { href: item.href, onClick: item.onClick, children: [
587
602
  item.icon && /* @__PURE__ */ jsx10("span", { className: "mr-2", children: item.icon }),
588
603
  item.label
589
- ] }) : /* @__PURE__ */ jsxs6(Fragment3, { children: [
604
+ ] }) : /* @__PURE__ */ jsxs7(Fragment4, { children: [
590
605
  item.icon && /* @__PURE__ */ jsx10("span", { className: "mr-2", children: item.icon }),
591
606
  item.label
592
607
  ] })
@@ -600,10 +615,10 @@ function AppHeaderActions({
600
615
  onClick: item.onClick,
601
616
  variant: item.variant,
602
617
  asChild: item.href ? true : void 0,
603
- children: item.href ? /* @__PURE__ */ jsxs6(Link, { href: item.href, onClick: item.onClick, children: [
618
+ children: item.href ? /* @__PURE__ */ jsxs7(Link, { href: item.href, onClick: item.onClick, children: [
604
619
  item.icon && /* @__PURE__ */ jsx10("span", { className: "mr-2", children: item.icon }),
605
620
  item.label
606
- ] }) : /* @__PURE__ */ jsxs6(Fragment3, { children: [
621
+ ] }) : /* @__PURE__ */ jsxs7(Fragment4, { children: [
607
622
  item.icon && /* @__PURE__ */ jsx10("span", { className: "mr-2", children: item.icon }),
608
623
  item.label
609
624
  ] })
@@ -612,9 +627,9 @@ function AppHeaderActions({
612
627
  )),
613
628
  accountMenuFooter && (topMenuItems.length > 0 || menuItems.length > 0) && /* @__PURE__ */ jsx10(DropdownMenuSeparator, {}),
614
629
  accountMenuFooter,
615
- onLogout && /* @__PURE__ */ jsxs6(Fragment3, { children: [
630
+ onLogout && /* @__PURE__ */ jsxs7(Fragment4, { children: [
616
631
  (topMenuItems.length > 0 || menuItems.length > 0 || accountMenuFooter) && /* @__PURE__ */ jsx10(DropdownMenuSeparator, {}),
617
- /* @__PURE__ */ jsxs6(DropdownMenuItem, { onClick: onLogout, variant: "destructive", children: [
632
+ /* @__PURE__ */ jsxs7(DropdownMenuItem, { onClick: onLogout, variant: "destructive", children: [
618
633
  isLoggingOut ? /* @__PURE__ */ jsx10("span", { className: "mr-2", children: "..." }) : /* @__PURE__ */ jsx10(IconLogout, { className: "mr-2 size-4" }),
619
634
  "Log out"
620
635
  ] })