@snow-labs/brutal-ui 0.3.0 → 0.3.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 (68) hide show
  1. package/dist/components/brutal/cta-section.js +5 -2
  2. package/dist/components/brutal/cta-section.js.map +1 -1
  3. package/dist/components/brutal/faq.d.ts +1 -1
  4. package/dist/components/brutal/faq.js +3 -0
  5. package/dist/components/brutal/faq.js.map +1 -1
  6. package/dist/components/brutal/feature-grid.d.ts +1 -1
  7. package/dist/components/brutal/feature-grid.js +3 -0
  8. package/dist/components/brutal/feature-grid.js.map +1 -1
  9. package/dist/components/brutal/footer.js +1 -1
  10. package/dist/components/brutal/footer.js.map +1 -1
  11. package/dist/components/brutal/hero.d.ts +1 -1
  12. package/dist/components/brutal/hero.js +4 -1
  13. package/dist/components/brutal/hero.js.map +1 -1
  14. package/dist/components/brutal/index.js +8 -5
  15. package/dist/components/brutal/index.js.map +1 -1
  16. package/dist/components/brutal/integration-grid.d.ts +1 -1
  17. package/dist/components/brutal/integration-grid.js +3 -0
  18. package/dist/components/brutal/integration-grid.js.map +1 -1
  19. package/dist/components/brutal/logo-cloud.d.ts +1 -1
  20. package/dist/components/brutal/logo-cloud.js +3 -0
  21. package/dist/components/brutal/logo-cloud.js.map +1 -1
  22. package/dist/components/brutal/newsletter.d.ts +1 -1
  23. package/dist/components/brutal/newsletter.js +4 -1
  24. package/dist/components/brutal/newsletter.js.map +1 -1
  25. package/dist/components/brutal/pricing-table.d.ts +1 -1
  26. package/dist/components/brutal/pricing-table.js +3 -0
  27. package/dist/components/brutal/pricing-table.js.map +1 -1
  28. package/dist/components/brutal/section.d.ts +1 -1
  29. package/dist/components/brutal/section.js +3 -0
  30. package/dist/components/brutal/section.js.map +1 -1
  31. package/dist/components/brutal/stats-bar.d.ts +1 -1
  32. package/dist/components/brutal/stats-bar.js +3 -0
  33. package/dist/components/brutal/stats-bar.js.map +1 -1
  34. package/dist/components/brutal/testimonials.js +4 -1
  35. package/dist/components/brutal/testimonials.js.map +1 -1
  36. package/dist/components/dashboard/index.js +1 -1
  37. package/dist/components/dashboard/index.js.map +1 -1
  38. package/dist/components/dashboard/search-bar.js +1 -1
  39. package/dist/components/dashboard/search-bar.js.map +1 -1
  40. package/dist/components/ui/input-group.js +2 -2
  41. package/dist/components/ui/input-group.js.map +1 -1
  42. package/dist/components/ui/input.js +1 -1
  43. package/dist/components/ui/input.js.map +1 -1
  44. package/dist/components/ui/label.js +1 -1
  45. package/dist/components/ui/label.js.map +1 -1
  46. package/dist/components/ui/select.js +1 -1
  47. package/dist/components/ui/select.js.map +1 -1
  48. package/dist/components/ui/textarea.js +1 -1
  49. package/dist/components/ui/textarea.js.map +1 -1
  50. package/dist/components/views/data-table.js +1 -1
  51. package/dist/components/views/data-table.js.map +1 -1
  52. package/dist/components/views/index.js +1 -1
  53. package/dist/components/views/index.js.map +1 -1
  54. package/dist/components/views/kanban-board.js +1 -1
  55. package/dist/components/views/kanban-board.js.map +1 -1
  56. package/dist/index.js +18 -15
  57. package/dist/index.js.map +1 -1
  58. package/dist/templates/dashboard.js +1 -1
  59. package/dist/templates/dashboard.js.map +1 -1
  60. package/dist/templates/index.js +15 -12
  61. package/dist/templates/index.js.map +1 -1
  62. package/dist/templates/saas-launch.js +12 -9
  63. package/dist/templates/saas-launch.js.map +1 -1
  64. package/dist/templates/studio.js +11 -8
  65. package/dist/templates/studio.js.map +1 -1
  66. package/dist/theme.css +15 -0
  67. package/package.json +2 -3
  68. package/AGENTS.md +0 -1244
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/textarea.tsx"],"names":[],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,8jBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"textarea.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border-brutal border-foreground bg-background px-2.5 py-2 text-base shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:-translate-x-0.5 focus-visible:-translate-y-0.5 focus-visible:shadow-brutal disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/textarea.tsx"],"names":[],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqC;AAC3E,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wXAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"textarea.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border-brutal border-foreground bg-background px-2.5 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"]}
@@ -74,7 +74,7 @@ function Input({ className, type, ...props }) {
74
74
  type,
75
75
  "data-slot": "input",
76
76
  className: cn(
77
- "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
77
+ "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
78
78
  className
79
79
  ),
80
80
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/views/data-table.tsx"],"names":["ButtonPrimitive","jsx","InputPrimitive"],"mappings":"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","file":"data-table.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg whitespace-nowrap font-bold transition-all duration-150 select-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"border-brutal border-foreground bg-primary text-primary-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // CTA: Mint green bg — the Bannerbear signature\n cta: \"border-brutal border-foreground bg-cta text-cta-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Brand: Dynamic brand color bg\n brand:\n \"border-brutal border-foreground bg-brand text-brand-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"border-brutal border-foreground bg-background text-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"border-brutal border-foreground bg-secondary text-secondary-foreground shadow-brutal-sm hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal active:translate-x-px active:translate-y-px active:shadow-none\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"border-brutal border-destructive bg-destructive text-destructive-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\n\ninterface DataTableProps<TData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n searchColumn?: string;\n searchPlaceholder?: string;\n pageSize?: number;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataTable<TData>({\n columns,\n data,\n searchColumn,\n searchPlaceholder = \"Search...\",\n pageSize = 10,\n emptyMessage = \"No data\",\n className,\n}: DataTableProps<TData>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = useState(\"\");\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n });\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {searchColumn !== undefined && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n\n <div className=\"overflow-auto border-brutal border-foreground shadow-brutal\">\n <table className=\"w-full text-sm\">\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className=\"border-b-brutal border-foreground bg-secondary\"\n >\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n className={cn(\n \"brutal-label px-4 py-3 text-left\",\n header.column.getCanSort() &&\n \"cursor-pointer select-none\"\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {{\n asc: \" ↑\",\n desc: \" ↓\",\n }[header.column.getIsSorted() as string] ?? \"\"}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, i) => (\n <tr\n key={row.id}\n className={cn(\n \"border-b border-foreground/10 transition-colors hover:bg-brand-muted\",\n i % 2 === 1 && \"bg-secondary/30\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/views/data-table.tsx"],"names":["ButtonPrimitive","jsx","InputPrimitive"],"mappings":"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","file":"data-table.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg whitespace-nowrap font-bold transition-all duration-150 select-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"border-brutal border-foreground bg-primary text-primary-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // CTA: Mint green bg — the Bannerbear signature\n cta: \"border-brutal border-foreground bg-cta text-cta-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Brand: Dynamic brand color bg\n brand:\n \"border-brutal border-foreground bg-brand text-brand-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"border-brutal border-foreground bg-background text-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"border-brutal border-foreground bg-secondary text-secondary-foreground shadow-brutal-sm hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal active:translate-x-px active:translate-y-px active:shadow-none\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"border-brutal border-destructive bg-destructive text-destructive-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\n\ninterface DataTableProps<TData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n searchColumn?: string;\n searchPlaceholder?: string;\n pageSize?: number;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataTable<TData>({\n columns,\n data,\n searchColumn,\n searchPlaceholder = \"Search...\",\n pageSize = 10,\n emptyMessage = \"No data\",\n className,\n}: DataTableProps<TData>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = useState(\"\");\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n });\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {searchColumn !== undefined && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n\n <div className=\"overflow-auto border-brutal border-foreground shadow-brutal\">\n <table className=\"w-full text-sm\">\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className=\"border-b-brutal border-foreground bg-secondary\"\n >\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n className={cn(\n \"brutal-label px-4 py-3 text-left\",\n header.column.getCanSort() &&\n \"cursor-pointer select-none\"\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {{\n asc: \" ↑\",\n desc: \" ↓\",\n }[header.column.getIsSorted() as string] ?? \"\"}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, i) => (\n <tr\n key={row.id}\n className={cn(\n \"border-b border-foreground/10 transition-colors hover:bg-brand-muted\",\n i % 2 === 1 && \"bg-secondary/30\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -77,7 +77,7 @@ function Input({ className, type, ...props }) {
77
77
  type,
78
78
  "data-slot": "input",
79
79
  className: cn(
80
- "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
80
+ "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
81
81
  className
82
82
  ),
83
83
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/views/data-table.tsx","../../../src/components/views/kanban-board.tsx","../../../src/components/views/grid-view.tsx","../../../src/components/views/calendar-view.tsx","../../../src/components/ui/avatar.tsx","../../../src/components/views/list-view.tsx"],"names":["ButtonPrimitive","jsx","InputPrimitive","useState","jsxs","AvatarPrimitive"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg whitespace-nowrap font-bold transition-all duration-150 select-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"border-brutal border-foreground bg-primary text-primary-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // CTA: Mint green bg — the Bannerbear signature\n cta: \"border-brutal border-foreground bg-cta text-cta-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Brand: Dynamic brand color bg\n brand:\n \"border-brutal border-foreground bg-brand text-brand-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"border-brutal border-foreground bg-background text-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"border-brutal border-foreground bg-secondary text-secondary-foreground shadow-brutal-sm hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal active:translate-x-px active:translate-y-px active:shadow-none\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"border-brutal border-destructive bg-destructive text-destructive-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\n\ninterface DataTableProps<TData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n searchColumn?: string;\n searchPlaceholder?: string;\n pageSize?: number;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataTable<TData>({\n columns,\n data,\n searchColumn,\n searchPlaceholder = \"Search...\",\n pageSize = 10,\n emptyMessage = \"No data\",\n className,\n}: DataTableProps<TData>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = useState(\"\");\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n });\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {searchColumn !== undefined && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n\n <div className=\"overflow-auto border-brutal border-foreground shadow-brutal\">\n <table className=\"w-full text-sm\">\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className=\"border-b-brutal border-foreground bg-secondary\"\n >\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n className={cn(\n \"brutal-label px-4 py-3 text-left\",\n header.column.getCanSort() &&\n \"cursor-pointer select-none\"\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {{\n asc: \" ↑\",\n desc: \" ↓\",\n }[header.column.getIsSorted() as string] ?? \"\"}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, i) => (\n <tr\n key={row.id}\n className={cn(\n \"border-b border-foreground/10 transition-colors hover:bg-brand-muted\",\n i % 2 === 1 && \"bg-secondary/30\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useEffect, useRef, useState, useCallback } from \"react\";\nimport {\n draggable,\n dropTargetForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\nimport { Input } from \"../ui/input\";\n\ninterface KanbanColumn<TCard> {\n id: string;\n title: string;\n cards: TCard[];\n}\n\ninterface KanbanBoardProps<TCard extends { id: string }> {\n columns: KanbanColumn<TCard>[];\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n className?: string;\n}\n\nexport function KanbanBoard<TCard extends { id: string }>({\n columns,\n renderCard,\n onCardMove,\n onCardAdd,\n className,\n}: KanbanBoardProps<TCard>) {\n return (\n <div className={cn(\"flex gap-4 overflow-x-auto pb-4\", className)}>\n {columns.map((column) => (\n <KanbanColumnComponent\n key={column.id}\n column={column}\n renderCard={renderCard}\n onCardMove={onCardMove}\n onCardAdd={onCardAdd}\n />\n ))}\n </div>\n );\n}\n\nfunction KanbanColumnComponent<TCard extends { id: string }>({\n column,\n renderCard,\n onCardMove,\n onCardAdd,\n}: {\n column: KanbanColumn<TCard>;\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [addText, setAddText] = useState(\"\");\n\n useEffect(() => {\n if (!ref.current) return;\n return dropTargetForElements({\n element: ref.current,\n getData: () => ({ columnId: column.id }),\n onDragEnter: () => setIsDragOver(true),\n onDragLeave: () => setIsDragOver(false),\n onDrop: ({ source }) => {\n setIsDragOver(false);\n const data = source.data as { cardId: string; columnId: string };\n if (data.columnId !== column.id) {\n onCardMove?.(\n data.cardId as string,\n data.columnId as string,\n column.id,\n column.cards.length\n );\n }\n },\n });\n }, [column.id, column.cards.length, onCardMove]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-w-[280px] flex-col border-brutal border-foreground bg-secondary/30 p-3\",\n isDragOver && \"ring-2 ring-brand\"\n )}\n >\n <div className=\"brutal-label mb-3 flex items-center justify-between\">\n <span>{column.title}</span>\n <span className=\"bg-foreground px-1.5 font-mono text-xs text-background\">\n {column.cards.length}\n </span>\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n {column.cards.map((card) => (\n <KanbanCard\n key={card.id}\n card={card}\n columnId={column.id}\n renderCard={renderCard}\n />\n ))}\n </div>\n {onCardAdd && (\n <form\n className=\"mt-3\"\n onSubmit={(e) => {\n e.preventDefault();\n if (addText.trim()) {\n onCardAdd(column.id, addText.trim());\n setAddText(\"\");\n }\n }}\n >\n <Input\n value={addText}\n onChange={(e) => setAddText(e.target.value)}\n placeholder=\"+ Add card...\"\n className=\"text-sm\"\n />\n </form>\n )}\n </div>\n );\n}\n\nfunction KanbanCard<TCard extends { id: string }>({\n card,\n columnId,\n renderCard,\n}: {\n card: TCard;\n columnId: string;\n renderCard: (card: TCard) => React.ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n if (!ref.current) return;\n return draggable({\n element: ref.current,\n getInitialData: () => ({ cardId: card.id, columnId }),\n onDragStart: () => setIsDragging(true),\n onDrop: () => setIsDragging(false),\n });\n }, [card.id, columnId]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"cursor-grab border-brutal border-foreground bg-background p-3 shadow-brutal-sm transition-opacity active:cursor-grabbing\",\n isDragging && \"opacity-50\"\n )}\n >\n {renderCard(card)}\n </div>\n );\n}\n","import { cn } from \"../../lib/utils\";\n\ninterface GridViewProps {\n children: React.ReactNode;\n columns?: number;\n gap?: number;\n className?: string;\n}\n\nexport function GridView({\n children,\n columns = 3,\n gap = 6,\n className,\n}: GridViewProps) {\n return (\n <div\n className={cn(\"grid\", className)}\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(${Math.floor(100 / columns) - 2}%, 1fr))`,\n gap: `${gap * 4}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport { Button } from \"../ui/button\";\n\ninterface CalendarEvent {\n id: string;\n title: string;\n date: Date | string;\n color?: string;\n}\n\ninterface CalendarViewProps {\n events?: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n className?: string;\n}\n\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(year: number, month: number) {\n return new Date(year, month, 1).getDay();\n}\n\nexport function CalendarView({\n events = [],\n onEventClick,\n onDateClick,\n className,\n}: CalendarViewProps) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfMonth(year, month);\n const monthName = currentDate.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n });\n\n const cells: (number | null)[] = [];\n for (let i = 0; i < firstDay; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const getEventsForDay = (day: number) =>\n events.filter((e) => {\n const d = typeof e.date === \"string\" ? new Date(e.date) : e.date;\n return (\n d.getFullYear() === year &&\n d.getMonth() === month &&\n d.getDate() === day\n );\n });\n\n const today = new Date();\n const isToday = (day: number) =>\n day === today.getDate() &&\n month === today.getMonth() &&\n year === today.getFullYear();\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentDate(new Date(year, month - 1))}\n >\n ←\n </Button>\n <h3 className=\"brutal-h4\">{monthName}</h3>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentDate(new Date(year, month + 1))}\n >\n →\n </Button>\n </div>\n <div className=\"grid grid-cols-7 border-brutal border-foreground\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"brutal-label border-b-brutal border-foreground bg-secondary px-2 py-2 text-center text-xs\"\n >\n {day}\n </div>\n ))}\n {cells.map((day, i) => {\n const dayEvents = day ? getEventsForDay(day) : [];\n return (\n <div\n key={i}\n className={cn(\n \"min-h-[80px] border-b border-r border-foreground/10 p-1\",\n day && onDateClick && \"cursor-pointer hover:bg-secondary/50\",\n isToday(day ?? 0) && \"bg-brand-muted\"\n )}\n onClick={() => day && onDateClick?.(new Date(year, month, day))}\n >\n {day && (\n <>\n <span\n className={cn(\n \"text-xs font-bold\",\n isToday(day) && \"text-brand\"\n )}\n >\n {day}\n </span>\n <div className=\"mt-1 flex flex-col gap-0.5\">\n {dayEvents.slice(0, 3).map((event) => (\n <div\n key={event.id}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n className=\"cursor-pointer truncate border border-foreground/20 bg-brand-muted px-1 text-[10px] font-medium hover:bg-brand\"\n style={\n event.color\n ? { borderLeftColor: event.color, borderLeftWidth: 2 }\n : undefined\n }\n >\n {event.title}\n </div>\n ))}\n {dayEvents.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{dayEvents.length - 3}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import { cn } from \"../../lib/utils\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../ui/avatar\";\n\ninterface ListItem {\n id: string;\n title: string;\n subtitle?: string;\n avatar?: string;\n metadata?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\ninterface ListViewProps {\n items: ListItem[];\n onItemClick?: (item: ListItem) => void;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function ListView({\n items,\n onItemClick,\n emptyMessage = \"No items\",\n className,\n}: ListViewProps) {\n if (items.length === 0) {\n return (\n <p className=\"py-8 text-center text-muted-foreground\">{emptyMessage}</p>\n );\n }\n\n return (\n <div className={cn(\"border-brutal border-foreground shadow-brutal\", className)}>\n {items.map((item, i) => (\n <div\n key={item.id}\n onClick={() => onItemClick?.(item)}\n className={cn(\n \"flex items-center gap-4 px-4 py-3 transition-colors\",\n onItemClick && \"cursor-pointer\",\n \"hover:bg-secondary/50\",\n i < items.length - 1 && \"border-b border-foreground/10\"\n )}\n >\n {item.avatar && (\n <Avatar className=\"size-8\">\n <AvatarImage src={item.avatar} alt={item.title} />\n <AvatarFallback>{item.title[0]}</AvatarFallback>\n </Avatar>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-bold\">{item.title}</p>\n {item.subtitle && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {item.subtitle}\n </p>\n )}\n </div>\n {item.metadata && (\n <div className=\"text-sm text-muted-foreground\">{item.metadata}</div>\n )}\n {item.actions && <div>{item.actions}</div>}\n </div>\n ))}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/input.tsx","../../../src/components/views/data-table.tsx","../../../src/components/views/kanban-board.tsx","../../../src/components/views/grid-view.tsx","../../../src/components/views/calendar-view.tsx","../../../src/components/ui/avatar.tsx","../../../src/components/views/list-view.tsx"],"names":["ButtonPrimitive","jsx","InputPrimitive","useState","jsxs","AvatarPrimitive"],"mappings":";;;;;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,8RAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA;AAAA,QAEP,OAAA,EACE,2NAAA;AAAA;AAAA,QAEF,GAAA,EAAK,mNAAA;AAAA;AAAA,QAEL,KAAA,EACE,uNAAA;AAAA;AAAA,QAEF,OAAA,EACE,sNAAA;AAAA;AAAA,QAEF,SAAA,EACE,0NAAA;AAAA;AAAA,QAEF,KAAA,EAAO,0CAAA;AAAA;AAAA,QAEP,IAAA,EAAM,oDAAA;AAAA;AAAA,QAEN,WAAA,EACE,oOAAA;AAAA;AAAA,QAEF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,0BAAA;AAAA,QACJ,EAAA,EAAI,0BAAA;AAAA,QACJ,OAAA,EAAS,yBAAA;AAAA,QACT,EAAA,EAAI,2BAAA;AAAA,QACJ,EAAA,EAAI,2BAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAW,QAAA;AAAA,QACX,SAAA,EAAW;AAAA;AACb,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAAgE;AAC9D,EAAA,uBACE,GAAA;AAAA,IAACA,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACN;AAEJ;AC9DA,SAAS,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACEC,GAAAA;AAAA,IAACC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4SAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACUO,SAAS,SAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA,GAAoB,WAAA;AAAA,EACpB,QAAA,GAAW,EAAA;AAAA,EACX,YAAA,GAAe,SAAA;AAAA,EACf;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA;AAEnD,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,EAAE,OAAA,EAAS,YAAA,EAAa;AAAA,IAC/B,eAAA,EAAiB,UAAA;AAAA,IACjB,oBAAA,EAAsB,eAAA;AAAA,IACtB,iBAAiB,eAAA,EAAgB;AAAA,IACjC,mBAAmB,iBAAA,EAAkB;AAAA,IACrC,qBAAqB,mBAAA,EAAoB;AAAA,IACzC,uBAAuB,qBAAA,EAAsB;AAAA,IAC7C,YAAA,EAAc,EAAE,UAAA,EAAY,EAAE,UAAS;AAAE,GAC1C,CAAA;AAED,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAChD,QAAA,EAAA;AAAA,IAAA,YAAA,KAAiB,0BAChBD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,iBAAA;AAAA,QACb,KAAA,EAAO,YAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC/C,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAGFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACb,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,gBAAA,EACf,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,WACE,QAAA,EAAA,KAAA,CAAM,eAAA,GAAkB,GAAA,CAAI,CAAC,gCAC5BA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,gDAAA;AAAA,UAET,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACxB,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,EAAA;AAAA,gBACT,kCAAA;AAAA,gBACA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAW,IACvB;AAAA,eACJ;AAAA,cACA,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,uBAAA,EAAwB;AAAA,cAE9C,QAAA,EAAA;AAAA,gBAAA,UAAA;AAAA,kBACC,MAAA,CAAO,OAAO,SAAA,CAAU,MAAA;AAAA,kBACxB,OAAO,UAAA;AAAW,iBACpB;AAAA,gBACC;AAAA,kBACC,GAAA,EAAK,SAAA;AAAA,kBACL,IAAA,EAAM;AAAA,iBACR,CAAE,MAAA,CAAO,MAAA,CAAO,WAAA,EAAuB,CAAA,IAAK;AAAA;AAAA,aAAA;AAAA,YAfvC,MAAA,CAAO;AAAA,WAiBf;AAAA,SAAA;AAAA,QAtBI,WAAA,CAAY;AAAA,OAwBpB,CAAA,EACH,CAAA;AAAA,sBACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,CAAK,MAAA,KAAW,CAAA,mBACnCA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,SAAS,OAAA,CAAQ,MAAA;AAAA,UACjB,SAAA,EAAU,6CAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH,EACF,CAAA,GAEA,KAAA,CAAM,WAAA,EAAY,CAAE,KAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBACjCA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,sEAAA;AAAA,YACA,CAAA,GAAI,MAAM,CAAA,IAAK;AAAA,WACjB;AAAA,UAEC,QAAA,EAAA,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,yBAC1BA,GAAAA,CAAC,IAAA,EAAA,EAAiB,SAAA,EAAU,WAAA,EACzB,QAAA,EAAA,UAAA;AAAA,YACC,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA;AAAA,YACtB,KAAK,UAAA;AAAW,WAClB,EAAA,EAJO,IAAA,CAAK,EAKd,CACD;AAAA,SAAA;AAAA,QAbI,GAAA,CAAI;AAAA,OAeZ,CAAA,EAEL;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACrC,KAAA,CAAM,QAAA,EAAS,CAAE,UAAA,CAAW,SAAA,GAAY,CAAA;AAAA,QAAE,KAAA;AAAA,QAAI,GAAA;AAAA,QACnD,MAAM,YAAA;AAAa,OAAA,EACtB,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AAAA,YAClC,QAAA,EAAU,CAAC,KAAA,CAAM,kBAAA,EAAmB;AAAA,YACrC,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,KAAA,CAAM,QAAA,EAAS;AAAA,YAC9B,QAAA,EAAU,CAAC,KAAA,CAAM,cAAA,EAAe;AAAA,YACjC,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC5HO,SAAS,WAAA,CAA0C;AAAA,EACxD,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA,EAC5D,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MAEC,MAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KAAA;AAAA,IAJK,MAAA,CAAO;AAAA,GAMf,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,qBAAA,CAAoD;AAAA,EAC3D,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,OAAO,qBAAA,CAAsB;AAAA,MAC3B,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,OAAO,EAAE,QAAA,EAAU,OAAO,EAAA,EAAG,CAAA;AAAA,MACtC,WAAA,EAAa,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MACrC,WAAA,EAAa,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,MACtC,MAAA,EAAQ,CAAC,EAAE,MAAA,EAAO,KAAM;AACtB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,CAAO,EAAA,EAAI;AAC/B,UAAA,UAAA;AAAA,YACE,IAAA,CAAK,MAAA;AAAA,YACL,IAAA,CAAK,QAAA;AAAA,YACL,MAAA,CAAO,EAAA;AAAA,YACP,OAAO,KAAA,CAAM;AAAA,WACf;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,KAAA,CAAM,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE/C,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iFAAA;AAAA,QACA,UAAA,IAAc;AAAA,OAChB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA;AAAA,0BACpBA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EACb,QAAA,EAAA,MAAA,CAAO,MAAM,MAAA,EAChB;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,iBAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACjBA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,UAAU,MAAA,CAAO,EAAA;AAAA,YACjB;AAAA,WAAA;AAAA,UAHK,IAAA,CAAK;AAAA,SAKb,CAAA,EACH,CAAA;AAAA,QACC,6BACCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,gBAAA,SAAA,CAAU,MAAA,CAAO,EAAA,EAAI,OAAA,CAAQ,IAAA,EAAM,CAAA;AACnC,gBAAA,UAAA,CAAW,EAAE,CAAA;AAAA,cACf;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,OAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC1C,WAAA,EAAY,eAAA;AAAA,gBACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,UAAA,CAAyC;AAAA,EAChD,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,SAAS,KAAK,CAAA;AAElD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAClB,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,gBAAgB,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,QAAA,EAAS,CAAA;AAAA,MACnD,WAAA,EAAa,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MACrC,MAAA,EAAQ,MAAM,aAAA,CAAc,KAAK;AAAA,KAClC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAC,CAAA;AAEtB,EAAA,uBACEF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,0HAAA;AAAA,QACA,UAAA,IAAc;AAAA,OAChB;AAAA,MAEC,qBAAW,IAAI;AAAA;AAAA,GAClB;AAEJ;ACrKO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,GAAA,GAAM,CAAA;AAAA,EACN;AACF,CAAA,EAAkB;AAChB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC/B,KAAA,EAAO;AAAA,QACL,qBAAqB,CAAA,yBAAA,EAA4B,IAAA,CAAK,MAAM,GAAA,GAAM,OAAO,IAAI,CAAC,CAAA,QAAA,CAAA;AAAA,QAC9E,GAAA,EAAK,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,EAAA;AAAA,OACjB;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACNA,IAAM,IAAA,GAAO,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAE7D,SAAS,cAAA,CAAe,MAAc,KAAA,EAAe;AACnD,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAC,EAAE,OAAA,EAAQ;AAC9C;AAEA,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAAe;AACvD,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,CAAC,EAAE,MAAA,EAAO;AACzC;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,SAAS,EAAC;AAAA,EACV,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIE,QAAAA,iBAAS,IAAI,MAAM,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,YAAY,WAAA,EAAY;AACrC,EAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,EAAS;AACnC,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,kBAAA,CAAmB,OAAA,EAAS;AAAA,IACxD,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAU,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAClD,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,aAAa,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAEnD,EAAA,MAAM,kBAAkB,CAAC,GAAA,KACvB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM;AACnB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA,CAAE,IAAA;AAC5D,IAAA,OACE,CAAA,CAAE,WAAA,EAAY,KAAM,IAAA,IACpB,CAAA,CAAE,UAAS,KAAM,KAAA,IACjB,CAAA,CAAE,OAAA,EAAQ,KAAM,GAAA;AAAA,EAEpB,CAAC,CAAA;AAEH,EAAA,MAAM,KAAA,uBAAY,IAAA,EAAK;AACvB,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KACf,GAAA,KAAQ,KAAA,CAAM,OAAA,EAAQ,IACtB,KAAA,KAAU,KAAA,CAAM,QAAA,EAAS,IACzB,IAAA,KAAS,MAAM,WAAA,EAAY;AAE7B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EACjD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,KAAK,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,UACxD,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAa,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACrCA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,KAAK,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,UACxD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACZ,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTH,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,2FAAA;AAAA,UAET,QAAA,EAAA;AAAA,SAAA;AAAA,QAHI;AAAA,OAKR,CAAA;AAAA,MACA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACrB,QAAA,MAAM,SAAA,GAAY,GAAA,GAAM,eAAA,CAAgB,GAAG,IAAI,EAAC;AAChD,QAAA,uBACEA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,EAAA;AAAA,cACT,yDAAA;AAAA,cACA,OAAO,WAAA,IAAe,sCAAA;AAAA,cACtB,OAAA,CAAQ,GAAA,IAAO,CAAC,CAAA,IAAK;AAAA,aACvB;AAAA,YACA,OAAA,EAAS,MAAM,GAAA,IAAO,WAAA,GAAc,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,YAE7D,QAAA,EAAA,GAAA,oBACCG,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAH,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,mBAAA;AAAA,oBACA,OAAA,CAAQ,GAAG,CAAA,IAAK;AAAA,mBAClB;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,SAAA,CAAU,MAAM,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,0BAC1BH,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,sBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,sBAAA,YAAA,GAAe,KAAK,CAAA;AAAA,oBACtB,CAAA;AAAA,oBACA,SAAA,EAAU,gHAAA;AAAA,oBACV,KAAA,EACE,MAAM,KAAA,GACF,EAAE,iBAAiB,KAAA,CAAM,KAAA,EAAO,eAAA,EAAiB,CAAA,EAAE,GACnD,MAAA;AAAA,oBAGL,QAAA,EAAA,KAAA,CAAM;AAAA,mBAAA;AAAA,kBAZF,KAAA,CAAM;AAAA,iBAcd,CAAA;AAAA,gBACA,UAAU,MAAA,GAAS,CAAA,oBAClBG,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBAChD,UAAU,MAAA,GAAS;AAAA,iBAAA,EACvB;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF;AAAA,WAAA;AAAA,UA1CG;AAAA,SA4CP;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC7IA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,GAAG;AACL,CAAA,EAEG;AACD,EAAA,uBACEH,GAAAA;AAAA,IAACI,QAAA,CAAgB,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,uPAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACEJ,GAAAA;AAAA,IAACI,QAAA,CAAgB,KAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,mDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmC;AACjC,EAAA,uBACEJ,GAAAA;AAAA,IAACI,QAAA,CAAgB,QAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oIAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACnCO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,UAAA;AAAA,EACf;AACF,CAAA,EAAkB;AAChB,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,uBACEJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAA0C,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,EAExE;AAEA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA,EAC1E,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,sBAChBG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,MAAM,WAAA,GAAc,IAAI,CAAA;AAAA,MACjC,SAAA,EAAW,EAAA;AAAA,QACT,qDAAA;AAAA,QACA,WAAA,IAAe,gBAAA;AAAA,QACf,uBAAA;AAAA,QACA,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK;AAAA,OAC1B;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,MAAA,oBACJA,IAAAA,CAAC,MAAA,EAAA,EAAO,WAAU,QAAA,EAChB,QAAA,EAAA;AAAA,0BAAAH,IAAC,WAAA,EAAA,EAAY,GAAA,EAAK,KAAK,MAAA,EAAQ,GAAA,EAAK,KAAK,KAAA,EAAO,CAAA;AAAA,0BAChDA,GAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAE;AAAA,SAAA,EACjC,CAAA;AAAA,wBAEFG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAqB,eAAK,KAAA,EAAM,CAAA;AAAA,UAC5C,IAAA,CAAK,4BACJA,GAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EACV,eAAK,QAAA,EACR;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,IAAA,CAAK,4BACJA,GAAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EAAiC,eAAK,QAAA,EAAS,CAAA;AAAA,QAE/D,KAAK,OAAA,oBAAWA,GAAAA,CAAC,KAAA,EAAA,EAAK,eAAK,OAAA,EAAQ;AAAA;AAAA,KAAA;AAAA,IA1B/B,IAAA,CAAK;AAAA,GA4Bb,CAAA,EACH,CAAA;AAEJ","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\";\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg whitespace-nowrap font-bold transition-all duration-150 select-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n // Primary: Black bg, white text, offset shadow\n default:\n \"border-brutal border-foreground bg-primary text-primary-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // CTA: Mint green bg — the Bannerbear signature\n cta: \"border-brutal border-foreground bg-cta text-cta-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Brand: Dynamic brand color bg\n brand:\n \"border-brutal border-foreground bg-brand text-brand-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Outline: White bg, black border, offset shadow\n outline:\n \"border-brutal border-foreground bg-background text-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Secondary: Light bg, border, smaller shadow\n secondary:\n \"border-brutal border-foreground bg-secondary text-secondary-foreground shadow-brutal-sm hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal active:translate-x-px active:translate-y-px active:shadow-none\",\n // Ghost: No border/shadow, subtle hover\n ghost: \"hover:bg-secondary hover:text-foreground\",\n // Link: Text only\n link: \"text-foreground underline-offset-4 hover:underline\",\n // Destructive\n destructive:\n \"border-brutal border-destructive bg-destructive text-destructive-foreground shadow-brutal hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal-lg active:translate-x-px active:translate-y-px active:shadow-brutal-sm\",\n // Nav: Thin border, no shadow (for nav Sign In buttons)\n nav: \"border border-foreground bg-background text-foreground hover:bg-foreground hover:text-background\",\n },\n size: {\n xs: \"h-7 gap-1 px-2.5 text-xs\",\n sm: \"h-8 gap-1.5 px-3 text-sm\",\n default: \"h-10 gap-2 px-5 text-sm\",\n lg: \"h-12 gap-2 px-7 text-base\",\n xl: \"h-14 gap-2.5 px-9 text-lg\",\n icon: \"size-10\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-12\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\n\ninterface DataTableProps<TData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n searchColumn?: string;\n searchPlaceholder?: string;\n pageSize?: number;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataTable<TData>({\n columns,\n data,\n searchColumn,\n searchPlaceholder = \"Search...\",\n pageSize = 10,\n emptyMessage = \"No data\",\n className,\n}: DataTableProps<TData>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = useState(\"\");\n\n const table = useReactTable({\n data,\n columns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize } },\n });\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {searchColumn !== undefined && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n\n <div className=\"overflow-auto border-brutal border-foreground shadow-brutal\">\n <table className=\"w-full text-sm\">\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className=\"border-b-brutal border-foreground bg-secondary\"\n >\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n className={cn(\n \"brutal-label px-4 py-3 text-left\",\n header.column.getCanSort() &&\n \"cursor-pointer select-none\"\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {{\n asc: \" ↑\",\n desc: \" ↓\",\n }[header.column.getIsSorted() as string] ?? \"\"}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-4 py-8 text-center text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, i) => (\n <tr\n key={row.id}\n className={cn(\n \"border-b border-foreground/10 transition-colors hover:bg-brand-muted\",\n i % 2 === 1 && \"bg-secondary/30\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className=\"px-4 py-3\">\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Previous\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useEffect, useRef, useState, useCallback } from \"react\";\nimport {\n draggable,\n dropTargetForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\nimport { Input } from \"../ui/input\";\n\ninterface KanbanColumn<TCard> {\n id: string;\n title: string;\n cards: TCard[];\n}\n\ninterface KanbanBoardProps<TCard extends { id: string }> {\n columns: KanbanColumn<TCard>[];\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n className?: string;\n}\n\nexport function KanbanBoard<TCard extends { id: string }>({\n columns,\n renderCard,\n onCardMove,\n onCardAdd,\n className,\n}: KanbanBoardProps<TCard>) {\n return (\n <div className={cn(\"flex gap-4 overflow-x-auto pb-4\", className)}>\n {columns.map((column) => (\n <KanbanColumnComponent\n key={column.id}\n column={column}\n renderCard={renderCard}\n onCardMove={onCardMove}\n onCardAdd={onCardAdd}\n />\n ))}\n </div>\n );\n}\n\nfunction KanbanColumnComponent<TCard extends { id: string }>({\n column,\n renderCard,\n onCardMove,\n onCardAdd,\n}: {\n column: KanbanColumn<TCard>;\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [addText, setAddText] = useState(\"\");\n\n useEffect(() => {\n if (!ref.current) return;\n return dropTargetForElements({\n element: ref.current,\n getData: () => ({ columnId: column.id }),\n onDragEnter: () => setIsDragOver(true),\n onDragLeave: () => setIsDragOver(false),\n onDrop: ({ source }) => {\n setIsDragOver(false);\n const data = source.data as { cardId: string; columnId: string };\n if (data.columnId !== column.id) {\n onCardMove?.(\n data.cardId as string,\n data.columnId as string,\n column.id,\n column.cards.length\n );\n }\n },\n });\n }, [column.id, column.cards.length, onCardMove]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-w-[280px] flex-col border-brutal border-foreground bg-secondary/30 p-3\",\n isDragOver && \"ring-2 ring-brand\"\n )}\n >\n <div className=\"brutal-label mb-3 flex items-center justify-between\">\n <span>{column.title}</span>\n <span className=\"bg-foreground px-1.5 font-mono text-xs text-background\">\n {column.cards.length}\n </span>\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n {column.cards.map((card) => (\n <KanbanCard\n key={card.id}\n card={card}\n columnId={column.id}\n renderCard={renderCard}\n />\n ))}\n </div>\n {onCardAdd && (\n <form\n className=\"mt-3\"\n onSubmit={(e) => {\n e.preventDefault();\n if (addText.trim()) {\n onCardAdd(column.id, addText.trim());\n setAddText(\"\");\n }\n }}\n >\n <Input\n value={addText}\n onChange={(e) => setAddText(e.target.value)}\n placeholder=\"+ Add card...\"\n className=\"text-sm\"\n />\n </form>\n )}\n </div>\n );\n}\n\nfunction KanbanCard<TCard extends { id: string }>({\n card,\n columnId,\n renderCard,\n}: {\n card: TCard;\n columnId: string;\n renderCard: (card: TCard) => React.ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n if (!ref.current) return;\n return draggable({\n element: ref.current,\n getInitialData: () => ({ cardId: card.id, columnId }),\n onDragStart: () => setIsDragging(true),\n onDrop: () => setIsDragging(false),\n });\n }, [card.id, columnId]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"cursor-grab border-brutal border-foreground bg-background p-3 shadow-brutal-sm transition-opacity active:cursor-grabbing\",\n isDragging && \"opacity-50\"\n )}\n >\n {renderCard(card)}\n </div>\n );\n}\n","import { cn } from \"../../lib/utils\";\n\ninterface GridViewProps {\n children: React.ReactNode;\n columns?: number;\n gap?: number;\n className?: string;\n}\n\nexport function GridView({\n children,\n columns = 3,\n gap = 6,\n className,\n}: GridViewProps) {\n return (\n <div\n className={cn(\"grid\", className)}\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(${Math.floor(100 / columns) - 2}%, 1fr))`,\n gap: `${gap * 4}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useState } from \"react\";\nimport { Button } from \"../ui/button\";\n\ninterface CalendarEvent {\n id: string;\n title: string;\n date: Date | string;\n color?: string;\n}\n\ninterface CalendarViewProps {\n events?: CalendarEvent[];\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n className?: string;\n}\n\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(year: number, month: number) {\n return new Date(year, month, 1).getDay();\n}\n\nexport function CalendarView({\n events = [],\n onEventClick,\n onDateClick,\n className,\n}: CalendarViewProps) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const daysInMonth = getDaysInMonth(year, month);\n const firstDay = getFirstDayOfMonth(year, month);\n const monthName = currentDate.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n });\n\n const cells: (number | null)[] = [];\n for (let i = 0; i < firstDay; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const getEventsForDay = (day: number) =>\n events.filter((e) => {\n const d = typeof e.date === \"string\" ? new Date(e.date) : e.date;\n return (\n d.getFullYear() === year &&\n d.getMonth() === month &&\n d.getDate() === day\n );\n });\n\n const today = new Date();\n const isToday = (day: number) =>\n day === today.getDate() &&\n month === today.getMonth() &&\n year === today.getFullYear();\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentDate(new Date(year, month - 1))}\n >\n ←\n </Button>\n <h3 className=\"brutal-h4\">{monthName}</h3>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentDate(new Date(year, month + 1))}\n >\n →\n </Button>\n </div>\n <div className=\"grid grid-cols-7 border-brutal border-foreground\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"brutal-label border-b-brutal border-foreground bg-secondary px-2 py-2 text-center text-xs\"\n >\n {day}\n </div>\n ))}\n {cells.map((day, i) => {\n const dayEvents = day ? getEventsForDay(day) : [];\n return (\n <div\n key={i}\n className={cn(\n \"min-h-[80px] border-b border-r border-foreground/10 p-1\",\n day && onDateClick && \"cursor-pointer hover:bg-secondary/50\",\n isToday(day ?? 0) && \"bg-brand-muted\"\n )}\n onClick={() => day && onDateClick?.(new Date(year, month, day))}\n >\n {day && (\n <>\n <span\n className={cn(\n \"text-xs font-bold\",\n isToday(day) && \"text-brand\"\n )}\n >\n {day}\n </span>\n <div className=\"mt-1 flex flex-col gap-0.5\">\n {dayEvents.slice(0, 3).map((event) => (\n <div\n key={event.id}\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n className=\"cursor-pointer truncate border border-foreground/20 bg-brand-muted px-1 text-[10px] font-medium hover:bg-brand\"\n style={\n event.color\n ? { borderLeftColor: event.color, borderLeftWidth: 2 }\n : undefined\n }\n >\n {event.title}\n </div>\n ))}\n {dayEvents.length > 3 && (\n <span className=\"text-[10px] text-muted-foreground\">\n +{dayEvents.length - 3}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import { cn } from \"../../lib/utils\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../ui/avatar\";\n\ninterface ListItem {\n id: string;\n title: string;\n subtitle?: string;\n avatar?: string;\n metadata?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\ninterface ListViewProps {\n items: ListItem[];\n onItemClick?: (item: ListItem) => void;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function ListView({\n items,\n onItemClick,\n emptyMessage = \"No items\",\n className,\n}: ListViewProps) {\n if (items.length === 0) {\n return (\n <p className=\"py-8 text-center text-muted-foreground\">{emptyMessage}</p>\n );\n }\n\n return (\n <div className={cn(\"border-brutal border-foreground shadow-brutal\", className)}>\n {items.map((item, i) => (\n <div\n key={item.id}\n onClick={() => onItemClick?.(item)}\n className={cn(\n \"flex items-center gap-4 px-4 py-3 transition-colors\",\n onItemClick && \"cursor-pointer\",\n \"hover:bg-secondary/50\",\n i < items.length - 1 && \"border-b border-foreground/10\"\n )}\n >\n {item.avatar && (\n <Avatar className=\"size-8\">\n <AvatarImage src={item.avatar} alt={item.title} />\n <AvatarFallback>{item.title[0]}</AvatarFallback>\n </Avatar>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-bold\">{item.title}</p>\n {item.subtitle && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {item.subtitle}\n </p>\n )}\n </div>\n {item.metadata && (\n <div className=\"text-sm text-muted-foreground\">{item.metadata}</div>\n )}\n {item.actions && <div>{item.actions}</div>}\n </div>\n ))}\n </div>\n );\n}\n"]}
@@ -16,7 +16,7 @@ function Input({ className, type, ...props }) {
16
16
  type,
17
17
  "data-slot": "input",
18
18
  className: cn(
19
- "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
19
+ "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
20
20
  className
21
21
  ),
22
22
  ...props
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/input.tsx","../../../src/components/views/kanban-board.tsx"],"names":["InputPrimitive","jsx"],"mappings":"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","file":"kanban-board.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useEffect, useRef, useState, useCallback } from \"react\";\nimport {\n draggable,\n dropTargetForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\nimport { Input } from \"../ui/input\";\n\ninterface KanbanColumn<TCard> {\n id: string;\n title: string;\n cards: TCard[];\n}\n\ninterface KanbanBoardProps<TCard extends { id: string }> {\n columns: KanbanColumn<TCard>[];\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n className?: string;\n}\n\nexport function KanbanBoard<TCard extends { id: string }>({\n columns,\n renderCard,\n onCardMove,\n onCardAdd,\n className,\n}: KanbanBoardProps<TCard>) {\n return (\n <div className={cn(\"flex gap-4 overflow-x-auto pb-4\", className)}>\n {columns.map((column) => (\n <KanbanColumnComponent\n key={column.id}\n column={column}\n renderCard={renderCard}\n onCardMove={onCardMove}\n onCardAdd={onCardAdd}\n />\n ))}\n </div>\n );\n}\n\nfunction KanbanColumnComponent<TCard extends { id: string }>({\n column,\n renderCard,\n onCardMove,\n onCardAdd,\n}: {\n column: KanbanColumn<TCard>;\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [addText, setAddText] = useState(\"\");\n\n useEffect(() => {\n if (!ref.current) return;\n return dropTargetForElements({\n element: ref.current,\n getData: () => ({ columnId: column.id }),\n onDragEnter: () => setIsDragOver(true),\n onDragLeave: () => setIsDragOver(false),\n onDrop: ({ source }) => {\n setIsDragOver(false);\n const data = source.data as { cardId: string; columnId: string };\n if (data.columnId !== column.id) {\n onCardMove?.(\n data.cardId as string,\n data.columnId as string,\n column.id,\n column.cards.length\n );\n }\n },\n });\n }, [column.id, column.cards.length, onCardMove]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-w-[280px] flex-col border-brutal border-foreground bg-secondary/30 p-3\",\n isDragOver && \"ring-2 ring-brand\"\n )}\n >\n <div className=\"brutal-label mb-3 flex items-center justify-between\">\n <span>{column.title}</span>\n <span className=\"bg-foreground px-1.5 font-mono text-xs text-background\">\n {column.cards.length}\n </span>\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n {column.cards.map((card) => (\n <KanbanCard\n key={card.id}\n card={card}\n columnId={column.id}\n renderCard={renderCard}\n />\n ))}\n </div>\n {onCardAdd && (\n <form\n className=\"mt-3\"\n onSubmit={(e) => {\n e.preventDefault();\n if (addText.trim()) {\n onCardAdd(column.id, addText.trim());\n setAddText(\"\");\n }\n }}\n >\n <Input\n value={addText}\n onChange={(e) => setAddText(e.target.value)}\n placeholder=\"+ Add card...\"\n className=\"text-sm\"\n />\n </form>\n )}\n </div>\n );\n}\n\nfunction KanbanCard<TCard extends { id: string }>({\n card,\n columnId,\n renderCard,\n}: {\n card: TCard;\n columnId: string;\n renderCard: (card: TCard) => React.ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n if (!ref.current) return;\n return draggable({\n element: ref.current,\n getInitialData: () => ({ cardId: card.id, columnId }),\n onDragStart: () => setIsDragging(true),\n onDrop: () => setIsDragging(false),\n });\n }, [card.id, columnId]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"cursor-grab border-brutal border-foreground bg-background p-3 shadow-brutal-sm transition-opacity active:cursor-grabbing\",\n isDragging && \"opacity-50\"\n )}\n >\n {renderCard(card)}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/input.tsx","../../../src/components/views/kanban-board.tsx"],"names":["InputPrimitive","jsx"],"mappings":"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","file":"kanban-board.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport { cn } from \"../../lib/utils\";\nimport { useEffect, useRef, useState, useCallback } from \"react\";\nimport {\n draggable,\n dropTargetForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\nimport { Input } from \"../ui/input\";\n\ninterface KanbanColumn<TCard> {\n id: string;\n title: string;\n cards: TCard[];\n}\n\ninterface KanbanBoardProps<TCard extends { id: string }> {\n columns: KanbanColumn<TCard>[];\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n className?: string;\n}\n\nexport function KanbanBoard<TCard extends { id: string }>({\n columns,\n renderCard,\n onCardMove,\n onCardAdd,\n className,\n}: KanbanBoardProps<TCard>) {\n return (\n <div className={cn(\"flex gap-4 overflow-x-auto pb-4\", className)}>\n {columns.map((column) => (\n <KanbanColumnComponent\n key={column.id}\n column={column}\n renderCard={renderCard}\n onCardMove={onCardMove}\n onCardAdd={onCardAdd}\n />\n ))}\n </div>\n );\n}\n\nfunction KanbanColumnComponent<TCard extends { id: string }>({\n column,\n renderCard,\n onCardMove,\n onCardAdd,\n}: {\n column: KanbanColumn<TCard>;\n renderCard: (card: TCard) => React.ReactNode;\n onCardMove?: (\n cardId: string,\n fromColumn: string,\n toColumn: string,\n index: number\n ) => void;\n onCardAdd?: (columnId: string, title: string) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [addText, setAddText] = useState(\"\");\n\n useEffect(() => {\n if (!ref.current) return;\n return dropTargetForElements({\n element: ref.current,\n getData: () => ({ columnId: column.id }),\n onDragEnter: () => setIsDragOver(true),\n onDragLeave: () => setIsDragOver(false),\n onDrop: ({ source }) => {\n setIsDragOver(false);\n const data = source.data as { cardId: string; columnId: string };\n if (data.columnId !== column.id) {\n onCardMove?.(\n data.cardId as string,\n data.columnId as string,\n column.id,\n column.cards.length\n );\n }\n },\n });\n }, [column.id, column.cards.length, onCardMove]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-w-[280px] flex-col border-brutal border-foreground bg-secondary/30 p-3\",\n isDragOver && \"ring-2 ring-brand\"\n )}\n >\n <div className=\"brutal-label mb-3 flex items-center justify-between\">\n <span>{column.title}</span>\n <span className=\"bg-foreground px-1.5 font-mono text-xs text-background\">\n {column.cards.length}\n </span>\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n {column.cards.map((card) => (\n <KanbanCard\n key={card.id}\n card={card}\n columnId={column.id}\n renderCard={renderCard}\n />\n ))}\n </div>\n {onCardAdd && (\n <form\n className=\"mt-3\"\n onSubmit={(e) => {\n e.preventDefault();\n if (addText.trim()) {\n onCardAdd(column.id, addText.trim());\n setAddText(\"\");\n }\n }}\n >\n <Input\n value={addText}\n onChange={(e) => setAddText(e.target.value)}\n placeholder=\"+ Add card...\"\n className=\"text-sm\"\n />\n </form>\n )}\n </div>\n );\n}\n\nfunction KanbanCard<TCard extends { id: string }>({\n card,\n columnId,\n renderCard,\n}: {\n card: TCard;\n columnId: string;\n renderCard: (card: TCard) => React.ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n\n useEffect(() => {\n if (!ref.current) return;\n return draggable({\n element: ref.current,\n getInitialData: () => ({ cardId: card.id, columnId }),\n onDragStart: () => setIsDragging(true),\n onDrop: () => setIsDragging(false),\n });\n }, [card.id, columnId]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"cursor-grab border-brutal border-foreground bg-background p-3 shadow-brutal-sm transition-opacity active:cursor-grabbing\",\n isDragging && \"opacity-50\"\n )}\n >\n {renderCard(card)}\n </div>\n );\n}\n"]}
package/dist/index.js CHANGED
@@ -667,7 +667,7 @@ function Input({ className, type, ...props }) {
667
667
  type,
668
668
  "data-slot": "input",
669
669
  className: cn(
670
- "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base font-medium shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground focus:shadow-brutal focus:-translate-x-0.5 focus:-translate-y-0.5 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
670
+ "h-10 w-full min-w-0 rounded-lg border-brutal border-foreground bg-background px-3 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive md:text-sm",
671
671
  className
672
672
  ),
673
673
  ...props
@@ -680,7 +680,7 @@ function Textarea({ className, ...props }) {
680
680
  {
681
681
  "data-slot": "textarea",
682
682
  className: cn(
683
- "flex field-sizing-content min-h-16 w-full rounded-lg border-brutal border-foreground bg-background px-2.5 py-2 text-base shadow-brutal-sm transition-all outline-none placeholder:text-muted-foreground hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:-translate-x-0.5 focus-visible:-translate-y-0.5 focus-visible:shadow-brutal disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm",
683
+ "flex field-sizing-content min-h-16 w-full rounded-lg border-brutal border-foreground bg-background px-2.5 py-2 text-base transition-all outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm",
684
684
  className
685
685
  ),
686
686
  ...props
@@ -1542,7 +1542,7 @@ function Label({ className, ...props }) {
1542
1542
  {
1543
1543
  "data-slot": "label",
1544
1544
  className: cn(
1545
- "flex items-center gap-2 text-sm leading-none font-bold select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1545
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1546
1546
  className
1547
1547
  ),
1548
1548
  ...props
@@ -2264,7 +2264,7 @@ function SelectTrigger({
2264
2264
  "data-slot": "select-trigger",
2265
2265
  "data-size": size,
2266
2266
  className: cn(
2267
- "flex w-fit items-center justify-between gap-1.5 rounded-lg border-brutal border-foreground bg-background py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-brutal-sm transition-all outline-none select-none hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-brutal focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
2267
+ "flex w-fit items-center justify-between gap-1.5 rounded-lg border-brutal border-foreground bg-background py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-all outline-none select-none hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
2268
2268
  className
2269
2269
  ),
2270
2270
  ...props,
@@ -2900,6 +2900,9 @@ var colorMap = {
2900
2900
  white: "bg-background text-foreground",
2901
2901
  brand: "bg-brand",
2902
2902
  "brand-muted": "bg-brand-muted text-foreground",
2903
+ blue: "bg-section-blue",
2904
+ gray: "bg-section-gray text-foreground",
2905
+ cream: "bg-section-cream text-foreground",
2903
2906
  black: "bg-foreground text-background",
2904
2907
  cta: "bg-cta"
2905
2908
  };
@@ -3050,7 +3053,7 @@ function BrutalHero({
3050
3053
  variant === "centered" && "mx-auto"
3051
3054
  ), children: description }),
3052
3055
  /* @__PURE__ */ jsxs("div", { className: cn(
3053
- "flex flex-col gap-4 sm:flex-row sm:flex-wrap",
3056
+ "flex flex-col gap-3 sm:flex-row sm:gap-4",
3054
3057
  variant === "centered" && "sm:justify-center"
3055
3058
  ), children: [
3056
3059
  /* @__PURE__ */ jsx(Button, { variant: ctaVariant, size: "xl", className: "w-full sm:w-auto", render: /* @__PURE__ */ jsx("a", { href: ctaHref }), children: ctaText }),
@@ -3272,7 +3275,7 @@ function BrutalTestimonials({
3272
3275
  headline,
3273
3276
  testimonials,
3274
3277
  variant = "masonry",
3275
- color = "brand-muted",
3278
+ color = "blue",
3276
3279
  pattern,
3277
3280
  className
3278
3281
  }) {
@@ -3332,7 +3335,7 @@ function CTAButtons({
3332
3335
  secondaryText,
3333
3336
  secondaryHref
3334
3337
  }) {
3335
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center", children: [
3338
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:justify-center sm:gap-4", children: [
3336
3339
  /* @__PURE__ */ jsx(
3337
3340
  Button,
3338
3341
  {
@@ -3378,7 +3381,7 @@ function SplitCTA(props) {
3378
3381
  /* @__PURE__ */ jsx("h2", { className: "brutal-h1 mb-6", children: props.headline }),
3379
3382
  props.description && /* @__PURE__ */ jsx("p", { className: "brutal-body mb-4 opacity-80", children: props.description }),
3380
3383
  props.stats && /* @__PURE__ */ jsx("p", { className: "brutal-label mb-8 opacity-60", children: props.stats }),
3381
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:flex-wrap", children: [
3384
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:gap-4", children: [
3382
3385
  /* @__PURE__ */ jsx(
3383
3386
  Button,
3384
3387
  {
@@ -4744,7 +4747,7 @@ function SaaSLaunchTemplate({
4744
4747
  }
4745
4748
  ),
4746
4749
  stats && stats.length > 0 && /* @__PURE__ */ jsx(StatsBar, { stats, color: "brand" }),
4747
- /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--brand-muted))", variant: "torn-paper" }),
4750
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand))", to: "hsl(var(--section-blue))", variant: "torn-paper" }),
4748
4751
  /* @__PURE__ */ jsx(
4749
4752
  BrutalTestimonials,
4750
4753
  {
@@ -4752,10 +4755,10 @@ function SaaSLaunchTemplate({
4752
4755
  badge: testimonials.badge,
4753
4756
  headline: testimonials.headline,
4754
4757
  testimonials: testimonials.items,
4755
- color: "brand-muted"
4758
+ color: "blue"
4756
4759
  }
4757
4760
  ),
4758
- /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand-muted))", to: "hsl(var(--background))", variant: "wave" }),
4761
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--section-blue))", to: "hsl(var(--background))", variant: "wave" }),
4759
4762
  pricing && /* @__PURE__ */ jsx(
4760
4763
  PricingTable,
4761
4764
  {
@@ -4767,7 +4770,7 @@ function SaaSLaunchTemplate({
4767
4770
  color: "white"
4768
4771
  }
4769
4772
  ),
4770
- faq && faq.length > 0 && /* @__PURE__ */ jsx(FAQ, { badge: "FAQ", headline: "Common Questions", items: faq, color: "white" }),
4773
+ faq && faq.length > 0 && /* @__PURE__ */ jsx(FAQ, { badge: "FAQ", headline: "Common Questions", items: faq, color: "gray" }),
4771
4774
  /* @__PURE__ */ jsx(
4772
4775
  BrutalCTA,
4773
4776
  {
@@ -4834,7 +4837,7 @@ function StudioTemplate({
4834
4837
  }
4835
4838
  ),
4836
4839
  testimonials && /* @__PURE__ */ jsxs(Fragment, { children: [
4837
- /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--background))", to: "hsl(var(--brand-muted))", variant: "diagonal" }),
4840
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--background))", to: "hsl(var(--section-gray))", variant: "diagonal" }),
4838
4841
  /* @__PURE__ */ jsx(
4839
4842
  BrutalTestimonials,
4840
4843
  {
@@ -4842,10 +4845,10 @@ function StudioTemplate({
4842
4845
  badge: testimonials.badge,
4843
4846
  headline: testimonials.headline,
4844
4847
  testimonials: testimonials.items,
4845
- color: "brand-muted"
4848
+ color: "gray"
4846
4849
  }
4847
4850
  ),
4848
- /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--brand-muted))", to: "hsl(var(--background))", variant: "diagonal", flip: true })
4851
+ /* @__PURE__ */ jsx(SectionDivider, { from: "hsl(var(--section-gray))", to: "hsl(var(--background))", variant: "diagonal", flip: true })
4849
4852
  ] }),
4850
4853
  newsletter && /* @__PURE__ */ jsx(
4851
4854
  Newsletter,