create-auto-app 0.1.0 → 0.1.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 (187) hide show
  1. package/dist/index.js +189 -85
  2. package/dist/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/templates/shopping-app/.context/auto-ia-scheme.json +175 -0
  5. package/templates/shopping-app/.context/design-system.md +118 -0
  6. package/templates/shopping-app/.context/figma-variables.json +14448 -0
  7. package/templates/shopping-app/.context/schema.graphql +46 -0
  8. package/templates/shopping-app/.context/schema.json +583 -0
  9. package/templates/shopping-app/.context/shadcn-filter.ts +31 -0
  10. package/templates/shopping-app/.env +8 -0
  11. package/templates/shopping-app/auto.config.ts +21 -0
  12. package/templates/shopping-app/client/auto-configure.ts +107 -0
  13. package/templates/shopping-app/client/codegen.ts +16 -0
  14. package/templates/shopping-app/client/components.json +20 -0
  15. package/templates/shopping-app/client/design-system-principles.md +19 -0
  16. package/templates/shopping-app/client/eslint.config.ts +57 -0
  17. package/templates/shopping-app/client/index.html +26 -0
  18. package/templates/shopping-app/client/package.json +100 -0
  19. package/templates/shopping-app/client/postcss.config.js +6 -0
  20. package/templates/shopping-app/client/public/favicon.ico +0 -0
  21. package/templates/shopping-app/client/schema.graphql +46 -0
  22. package/templates/shopping-app/client/src/App.css +42 -0
  23. package/templates/shopping-app/client/src/App.tsx +20 -0
  24. package/templates/shopping-app/client/src/apolloClient.ts +8 -0
  25. package/templates/shopping-app/client/src/components/atoms/accordion.tsx +51 -0
  26. package/templates/shopping-app/client/src/components/atoms/alert-dialog.tsx +111 -0
  27. package/templates/shopping-app/client/src/components/atoms/alert.tsx +49 -0
  28. package/templates/shopping-app/client/src/components/atoms/aspect-ratio.tsx +7 -0
  29. package/templates/shopping-app/client/src/components/atoms/avatar.tsx +32 -0
  30. package/templates/shopping-app/client/src/components/atoms/badge.tsx +36 -0
  31. package/templates/shopping-app/client/src/components/atoms/breadcrumb.tsx +92 -0
  32. package/templates/shopping-app/client/src/components/atoms/button.tsx +50 -0
  33. package/templates/shopping-app/client/src/components/atoms/calendar.tsx +156 -0
  34. package/templates/shopping-app/client/src/components/atoms/card.tsx +56 -0
  35. package/templates/shopping-app/client/src/components/atoms/carousel.tsx +214 -0
  36. package/templates/shopping-app/client/src/components/atoms/chart.tsx +290 -0
  37. package/templates/shopping-app/client/src/components/atoms/checkbox.tsx +27 -0
  38. package/templates/shopping-app/client/src/components/atoms/collapsible.tsx +15 -0
  39. package/templates/shopping-app/client/src/components/atoms/command.tsx +135 -0
  40. package/templates/shopping-app/client/src/components/atoms/context-menu.tsx +209 -0
  41. package/templates/shopping-app/client/src/components/atoms/dialog.tsx +123 -0
  42. package/templates/shopping-app/client/src/components/atoms/drawer.tsx +106 -0
  43. package/templates/shopping-app/client/src/components/atoms/dropdown-menu.tsx +217 -0
  44. package/templates/shopping-app/client/src/components/atoms/hover-card.tsx +36 -0
  45. package/templates/shopping-app/client/src/components/atoms/input-otp.tsx +66 -0
  46. package/templates/shopping-app/client/src/components/atoms/input.tsx +21 -0
  47. package/templates/shopping-app/client/src/components/atoms/label.tsx +19 -0
  48. package/templates/shopping-app/client/src/components/atoms/logo.tsx +33 -0
  49. package/templates/shopping-app/client/src/components/atoms/menubar.tsx +234 -0
  50. package/templates/shopping-app/client/src/components/atoms/navigation-menu.tsx +142 -0
  51. package/templates/shopping-app/client/src/components/atoms/pagination.tsx +100 -0
  52. package/templates/shopping-app/client/src/components/atoms/popover.tsx +40 -0
  53. package/templates/shopping-app/client/src/components/atoms/progress.tsx +22 -0
  54. package/templates/shopping-app/client/src/components/atoms/radio-group.tsx +31 -0
  55. package/templates/shopping-app/client/src/components/atoms/resizable.tsx +46 -0
  56. package/templates/shopping-app/client/src/components/atoms/scroll-area.tsx +46 -0
  57. package/templates/shopping-app/client/src/components/atoms/select.tsx +158 -0
  58. package/templates/shopping-app/client/src/components/atoms/separator.tsx +26 -0
  59. package/templates/shopping-app/client/src/components/atoms/sheet.tsx +101 -0
  60. package/templates/shopping-app/client/src/components/atoms/sidebar.tsx +675 -0
  61. package/templates/shopping-app/client/src/components/atoms/skeleton.tsx +7 -0
  62. package/templates/shopping-app/client/src/components/atoms/slider.tsx +54 -0
  63. package/templates/shopping-app/client/src/components/atoms/sonner.tsx +23 -0
  64. package/templates/shopping-app/client/src/components/atoms/switch.tsx +26 -0
  65. package/templates/shopping-app/client/src/components/atoms/table.tsx +73 -0
  66. package/templates/shopping-app/client/src/components/atoms/tabs.tsx +40 -0
  67. package/templates/shopping-app/client/src/components/atoms/textarea.tsx +18 -0
  68. package/templates/shopping-app/client/src/components/atoms/toggle-group.tsx +65 -0
  69. package/templates/shopping-app/client/src/components/atoms/toggle.tsx +39 -0
  70. package/templates/shopping-app/client/src/components/atoms/tooltip.tsx +48 -0
  71. package/templates/shopping-app/client/src/components/molecules/QuantitySelector.tsx +8 -0
  72. package/templates/shopping-app/client/src/components/molecules/ShoppingCriteriaForm.tsx +8 -0
  73. package/templates/shopping-app/client/src/components/molecules/SuggestedItemCard.tsx +10 -0
  74. package/templates/shopping-app/client/src/components/organisms/AssistantChatInterface.tsx +14 -0
  75. package/templates/shopping-app/client/src/components/organisms/PageHeader.tsx +6 -0
  76. package/templates/shopping-app/client/src/components/organisms/SuggestedItemsList.tsx +15 -0
  77. package/templates/shopping-app/client/src/gql/fragment-masking.ts +48 -0
  78. package/templates/shopping-app/client/src/gql/gql.ts +47 -0
  79. package/templates/shopping-app/client/src/gql/graphql.ts +106 -0
  80. package/templates/shopping-app/client/src/gql/index.ts +2 -0
  81. package/templates/shopping-app/client/src/graphql/mutations.ts +13 -0
  82. package/templates/shopping-app/client/src/graphql/queries.ts +14 -0
  83. package/templates/shopping-app/client/src/hooks/use-mobile.tsx +19 -0
  84. package/templates/shopping-app/client/src/hooks/use-toast.ts +186 -0
  85. package/templates/shopping-app/client/src/index.css +153 -0
  86. package/templates/shopping-app/client/src/lib/utils.ts +6 -0
  87. package/templates/shopping-app/client/src/main.tsx +5 -0
  88. package/templates/shopping-app/client/src/mockApolloClient.ts +93 -0
  89. package/templates/shopping-app/client/src/pages/AssistantChatPage.tsx +8 -0
  90. package/templates/shopping-app/client/src/pages/Index.tsx +10 -0
  91. package/templates/shopping-app/client/src/pages/NotFound.tsx +22 -0
  92. package/templates/shopping-app/client/src/pages/SuggestedItemsPage.tsx +8 -0
  93. package/templates/shopping-app/client/tailwind.config.ts +92 -0
  94. package/templates/shopping-app/client/tsconfig.json +49 -0
  95. package/templates/shopping-app/client/vite.config.ts +17 -0
  96. package/templates/shopping-app/flows/shopping-assistant.flow.ts +369 -0
  97. package/templates/shopping-app/package.json +25 -0
  98. package/templates/shopping-app/pnpm-workspace.yaml +2 -0
  99. package/templates/shopping-app/server/package.json +25 -0
  100. package/templates/shopping-app/server/scripts/generate-schema.ts +31 -0
  101. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/commands.ts +8 -0
  102. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/decide.specs.ts +46 -0
  103. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/decide.ts +36 -0
  104. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/events.ts +10 -0
  105. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/evolve.ts +28 -0
  106. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/handle.ts +31 -0
  107. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/mutation.resolver.ts +29 -0
  108. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/register.ts +10 -0
  109. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/state.ts +47 -0
  110. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/react.specs.ts +63 -0
  111. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/react.ts +49 -0
  112. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/register.ts +31 -0
  113. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/commands.ts +8 -0
  114. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/decide.specs.ts +38 -0
  115. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/decide.ts +36 -0
  116. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/events.ts +10 -0
  117. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/evolve.ts +28 -0
  118. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/handle.ts +31 -0
  119. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/mutation.resolver.ts +30 -0
  120. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/register.ts +10 -0
  121. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/state.ts +47 -0
  122. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/commands.ts +8 -0
  123. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/decide.specs.ts +61 -0
  124. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/decide.ts +45 -0
  125. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/events.ts +14 -0
  126. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/evolve.ts +28 -0
  127. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/handle.ts +59 -0
  128. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/mutation.resolver.ts +30 -0
  129. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/register.ts +10 -0
  130. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/state.ts +47 -0
  131. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/projection.specs.ts +94 -0
  132. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/projection.ts +40 -0
  133. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/query.resolver.ts +59 -0
  134. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/state.ts +9 -0
  135. package/templates/shopping-app/server/src/domain/shared/ReadModel.d.ts +10 -0
  136. package/templates/shopping-app/server/src/domain/shared/ReadModel.d.ts.map +1 -0
  137. package/templates/shopping-app/server/src/domain/shared/ReadModel.js +19 -0
  138. package/templates/shopping-app/server/src/domain/shared/ReadModel.js.map +1 -0
  139. package/templates/shopping-app/server/src/domain/shared/ReadModel.ts +26 -0
  140. package/templates/shopping-app/server/src/domain/shared/index.d.ts +5 -0
  141. package/templates/shopping-app/server/src/domain/shared/index.d.ts.map +1 -0
  142. package/templates/shopping-app/server/src/domain/shared/index.js +5 -0
  143. package/templates/shopping-app/server/src/domain/shared/index.js.map +1 -0
  144. package/templates/shopping-app/server/src/domain/shared/index.ts +4 -0
  145. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.d.ts +35 -0
  146. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.d.ts.map +1 -0
  147. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.js +155 -0
  148. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.js.map +1 -0
  149. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.ts +257 -0
  150. package/templates/shopping-app/server/src/domain/shared/sendCommand.d.ts +4 -0
  151. package/templates/shopping-app/server/src/domain/shared/sendCommand.d.ts.map +1 -0
  152. package/templates/shopping-app/server/src/domain/shared/sendCommand.js +17 -0
  153. package/templates/shopping-app/server/src/domain/shared/sendCommand.js.map +1 -0
  154. package/templates/shopping-app/server/src/domain/shared/sendCommand.ts +21 -0
  155. package/templates/shopping-app/server/src/domain/shared/types.d.ts +19 -0
  156. package/templates/shopping-app/server/src/domain/shared/types.d.ts.map +1 -0
  157. package/templates/shopping-app/server/src/domain/shared/types.js +39 -0
  158. package/templates/shopping-app/server/src/domain/shared/types.js.map +1 -0
  159. package/templates/shopping-app/server/src/domain/shared/types.ts +31 -0
  160. package/templates/shopping-app/server/src/integrations/ai-integration.ts +76 -0
  161. package/templates/shopping-app/server/src/integrations/cart-integration.ts +178 -0
  162. package/templates/shopping-app/server/src/integrations/index.ts +3 -0
  163. package/templates/shopping-app/server/src/integrations/product-catalogue-integration.ts +363 -0
  164. package/templates/shopping-app/server/src/server.ts +43 -0
  165. package/templates/shopping-app/server/src/utils/index.d.ts +4 -0
  166. package/templates/shopping-app/server/src/utils/index.d.ts.map +1 -0
  167. package/templates/shopping-app/server/src/utils/index.js +4 -0
  168. package/templates/shopping-app/server/src/utils/index.js.map +1 -0
  169. package/templates/shopping-app/server/src/utils/index.ts +3 -0
  170. package/templates/shopping-app/server/src/utils/loadProjections.d.ts +3 -0
  171. package/templates/shopping-app/server/src/utils/loadProjections.d.ts.map +1 -0
  172. package/templates/shopping-app/server/src/utils/loadProjections.js +23 -0
  173. package/templates/shopping-app/server/src/utils/loadProjections.js.map +1 -0
  174. package/templates/shopping-app/server/src/utils/loadProjections.ts +30 -0
  175. package/templates/shopping-app/server/src/utils/loadRegisterFiles.d.ts +6 -0
  176. package/templates/shopping-app/server/src/utils/loadRegisterFiles.d.ts.map +1 -0
  177. package/templates/shopping-app/server/src/utils/loadRegisterFiles.js +28 -0
  178. package/templates/shopping-app/server/src/utils/loadRegisterFiles.js.map +1 -0
  179. package/templates/shopping-app/server/src/utils/loadRegisterFiles.ts +41 -0
  180. package/templates/shopping-app/server/src/utils/loadResolvers.d.ts +5 -0
  181. package/templates/shopping-app/server/src/utils/loadResolvers.d.ts.map +1 -0
  182. package/templates/shopping-app/server/src/utils/loadResolvers.js +27 -0
  183. package/templates/shopping-app/server/src/utils/loadResolvers.js.map +1 -0
  184. package/templates/shopping-app/server/src/utils/loadResolvers.ts +36 -0
  185. package/templates/shopping-app/server/tsconfig.json +19 -0
  186. package/templates/shopping-app/server/vitest.config.ts +7 -0
  187. package/templates/shopping-app/tsconfig.json +21 -0
@@ -0,0 +1,49 @@
1
+ import * as React from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+
4
+ import { cn } from '../../lib/utils';
5
+
6
+ const alertVariants = cva(
7
+ 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'bg-card text-card-foreground',
12
+ destructive:
13
+ 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ variant: 'default',
18
+ },
19
+ },
20
+ );
21
+
22
+ function Alert({ className, variant, ...props }: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {
23
+ return <div data-slot="alert" role="alert" className={cn(alertVariants({ variant }), className)} {...props} />;
24
+ }
25
+
26
+ function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {
27
+ return (
28
+ <div
29
+ data-slot="alert-title"
30
+ className={cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', className)}
31
+ {...props}
32
+ />
33
+ );
34
+ }
35
+
36
+ function AlertDescription({ className, ...props }: React.ComponentProps<'div'>) {
37
+ return (
38
+ <div
39
+ data-slot="alert-description"
40
+ className={cn(
41
+ 'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',
42
+ className,
43
+ )}
44
+ {...props}
45
+ />
46
+ );
47
+ }
48
+
49
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,7 @@
1
+ import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
2
+
3
+ function AspectRatio({ ...props }: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {
4
+ return <AspectRatioPrimitive.Root data-slot="aspect-ratio" {...props} />;
5
+ }
6
+
7
+ export { AspectRatio };
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
3
+
4
+ import { cn } from '../../lib/utils';
5
+
6
+ function Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {
7
+ return (
8
+ <AvatarPrimitive.Root
9
+ data-slot="avatar"
10
+ className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}
11
+ {...props}
12
+ />
13
+ );
14
+ }
15
+
16
+ function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {
17
+ return (
18
+ <AvatarPrimitive.Image data-slot="avatar-image" className={cn('aspect-square size-full', className)} {...props} />
19
+ );
20
+ }
21
+
22
+ function AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
23
+ return (
24
+ <AvatarPrimitive.Fallback
25
+ data-slot="avatar-fallback"
26
+ className={cn('bg-muted flex size-full items-center justify-center rounded-full', className)}
27
+ {...props}
28
+ />
29
+ );
30
+ }
31
+
32
+ export { Avatar, AvatarImage, AvatarFallback };
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva, type VariantProps } from 'class-variance-authority';
4
+
5
+ import { cn } from '../../lib/utils';
6
+
7
+ const badgeVariants = cva(
8
+ 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',
13
+ secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',
14
+ destructive:
15
+ 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
16
+ outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: 'default',
21
+ },
22
+ },
23
+ );
24
+
25
+ function Badge({
26
+ className,
27
+ variant,
28
+ asChild = false,
29
+ ...props
30
+ }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
31
+ const Comp = asChild ? Slot : 'span';
32
+
33
+ return <Comp data-slot="badge" className={cn(badgeVariants({ variant }), className)} {...props} />;
34
+ }
35
+
36
+ export { Badge, badgeVariants };
@@ -0,0 +1,92 @@
1
+ import * as React from 'react';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { ChevronRight, MoreHorizontal } from 'lucide-react';
4
+
5
+ import { cn } from '../../lib/utils';
6
+
7
+ function Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {
8
+ return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />;
9
+ }
10
+
11
+ function BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {
12
+ return (
13
+ <ol
14
+ data-slot="breadcrumb-list"
15
+ className={cn(
16
+ 'text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5',
17
+ className,
18
+ )}
19
+ {...props}
20
+ />
21
+ );
22
+ }
23
+
24
+ function BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {
25
+ return <li data-slot="breadcrumb-item" className={cn('inline-flex items-center gap-1.5', className)} {...props} />;
26
+ }
27
+
28
+ function BreadcrumbLink({
29
+ asChild,
30
+ className,
31
+ ...props
32
+ }: React.ComponentProps<'a'> & {
33
+ asChild?: boolean;
34
+ }) {
35
+ const Comp = asChild ? Slot : 'a';
36
+
37
+ return (
38
+ <Comp data-slot="breadcrumb-link" className={cn('hover:text-foreground transition-colors', className)} {...props} />
39
+ );
40
+ }
41
+
42
+ function BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {
43
+ return (
44
+ <span
45
+ data-slot="breadcrumb-page"
46
+ role="link"
47
+ aria-disabled="true"
48
+ aria-current="page"
49
+ className={cn('text-foreground font-normal', className)}
50
+ {...props}
51
+ />
52
+ );
53
+ }
54
+
55
+ function BreadcrumbSeparator({ children, className, ...props }: React.ComponentProps<'li'>) {
56
+ return (
57
+ <li
58
+ data-slot="breadcrumb-separator"
59
+ role="presentation"
60
+ aria-hidden="true"
61
+ className={cn('[&>svg]:size-3.5', className)}
62
+ {...props}
63
+ >
64
+ {children ?? <ChevronRight />}
65
+ </li>
66
+ );
67
+ }
68
+
69
+ function BreadcrumbEllipsis({ className, ...props }: React.ComponentProps<'span'>) {
70
+ return (
71
+ <span
72
+ data-slot="breadcrumb-ellipsis"
73
+ role="presentation"
74
+ aria-hidden="true"
75
+ className={cn('flex size-9 items-center justify-center', className)}
76
+ {...props}
77
+ >
78
+ <MoreHorizontal className="size-4" />
79
+ <span className="sr-only">More</span>
80
+ </span>
81
+ );
82
+ }
83
+
84
+ export {
85
+ Breadcrumb,
86
+ BreadcrumbList,
87
+ BreadcrumbItem,
88
+ BreadcrumbLink,
89
+ BreadcrumbPage,
90
+ BreadcrumbSeparator,
91
+ BreadcrumbEllipsis,
92
+ };
@@ -0,0 +1,50 @@
1
+ import * as React from 'react';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva, type VariantProps } from 'class-variance-authority';
4
+
5
+ import { cn } from '../../lib/utils';
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',
13
+ destructive:
14
+ 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
15
+ outline:
16
+ 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
17
+ secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',
18
+ ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
19
+ link: 'text-primary underline-offset-4 hover:underline',
20
+ },
21
+ size: {
22
+ default: 'h-9 px-4 py-2 has-[>svg]:px-3',
23
+ sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',
24
+ lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
25
+ icon: 'size-9',
26
+ },
27
+ },
28
+ defaultVariants: {
29
+ variant: 'default',
30
+ size: 'default',
31
+ },
32
+ },
33
+ );
34
+
35
+ function Button({
36
+ className,
37
+ variant,
38
+ size,
39
+ asChild = false,
40
+ ...props
41
+ }: React.ComponentProps<'button'> &
42
+ VariantProps<typeof buttonVariants> & {
43
+ asChild?: boolean;
44
+ }) {
45
+ const Comp = asChild ? Slot : 'button';
46
+
47
+ return <Comp data-slot="button" className={cn(buttonVariants({ variant, size, className }))} {...props} />;
48
+ }
49
+
50
+ export { Button, buttonVariants };
@@ -0,0 +1,156 @@
1
+ import * as React from 'react';
2
+ import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
3
+ import { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker';
4
+
5
+ import { cn } from '../../lib/utils';
6
+ import { Button, buttonVariants } from './button';
7
+
8
+ function Calendar({
9
+ className,
10
+ classNames,
11
+ showOutsideDays = true,
12
+ captionLayout = 'label',
13
+ buttonVariant = 'ghost',
14
+ formatters,
15
+ components,
16
+ ...props
17
+ }: React.ComponentProps<typeof DayPicker> & {
18
+ buttonVariant?: React.ComponentProps<typeof Button>['variant'];
19
+ }) {
20
+ const defaultClassNames = getDefaultClassNames();
21
+
22
+ return (
23
+ <DayPicker
24
+ showOutsideDays={showOutsideDays}
25
+ className={cn(
26
+ 'bg-background group/calendar p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent',
27
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
28
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
29
+ className,
30
+ )}
31
+ captionLayout={captionLayout}
32
+ formatters={{
33
+ formatMonthDropdown: (date) => date.toLocaleString('default', { month: 'short' }),
34
+ ...formatters,
35
+ }}
36
+ classNames={{
37
+ root: cn('w-fit', defaultClassNames.root),
38
+ months: cn('flex gap-4 flex-col md:flex-row relative', defaultClassNames.months),
39
+ month: cn('flex flex-col w-full gap-4', defaultClassNames.month),
40
+ nav: cn('flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between', defaultClassNames.nav),
41
+ button_previous: cn(
42
+ buttonVariants({ variant: buttonVariant }),
43
+ 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',
44
+ defaultClassNames.button_previous,
45
+ ),
46
+ button_next: cn(
47
+ buttonVariants({ variant: buttonVariant }),
48
+ 'size-(--cell-size) aria-disabled:opacity-50 p-0 select-none',
49
+ defaultClassNames.button_next,
50
+ ),
51
+ month_caption: cn(
52
+ 'flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)',
53
+ defaultClassNames.month_caption,
54
+ ),
55
+ dropdowns: cn(
56
+ 'w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5',
57
+ defaultClassNames.dropdowns,
58
+ ),
59
+ dropdown_root: cn(
60
+ 'relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md',
61
+ defaultClassNames.dropdown_root,
62
+ ),
63
+ dropdown: cn('absolute bg-popover inset-0 opacity-0', defaultClassNames.dropdown),
64
+ caption_label: cn(
65
+ 'select-none font-medium',
66
+ captionLayout === 'label'
67
+ ? 'text-sm'
68
+ : 'rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5',
69
+ defaultClassNames.caption_label,
70
+ ),
71
+ table: 'w-full border-collapse',
72
+ weekdays: cn('flex', defaultClassNames.weekdays),
73
+ weekday: cn(
74
+ 'text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none',
75
+ defaultClassNames.weekday,
76
+ ),
77
+ week: cn('flex w-full mt-2', defaultClassNames.week),
78
+ week_number_header: cn('select-none w-(--cell-size)', defaultClassNames.week_number_header),
79
+ week_number: cn('text-[0.8rem] select-none text-muted-foreground', defaultClassNames.week_number),
80
+ day: cn(
81
+ 'relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none',
82
+ defaultClassNames.day,
83
+ ),
84
+ range_start: cn('rounded-l-md bg-accent', defaultClassNames.range_start),
85
+ range_middle: cn('rounded-none', defaultClassNames.range_middle),
86
+ range_end: cn('rounded-r-md bg-accent', defaultClassNames.range_end),
87
+ today: cn(
88
+ 'bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none',
89
+ defaultClassNames.today,
90
+ ),
91
+ outside: cn('text-muted-foreground aria-selected:text-muted-foreground', defaultClassNames.outside),
92
+ disabled: cn('text-muted-foreground opacity-50', defaultClassNames.disabled),
93
+ hidden: cn('invisible', defaultClassNames.hidden),
94
+ ...classNames,
95
+ }}
96
+ components={{
97
+ Root: ({ className, rootRef, ...props }) => {
98
+ return <div data-slot="calendar" ref={rootRef} className={cn(className)} {...props} />;
99
+ },
100
+ Chevron: ({ className, orientation, ...props }) => {
101
+ if (orientation === 'left') {
102
+ return <ChevronLeftIcon className={cn('size-4', className)} {...props} />;
103
+ }
104
+
105
+ if (orientation === 'right') {
106
+ return <ChevronRightIcon className={cn('size-4', className)} {...props} />;
107
+ }
108
+
109
+ return <ChevronDownIcon className={cn('size-4', className)} {...props} />;
110
+ },
111
+ DayButton: CalendarDayButton,
112
+ WeekNumber: ({ children, ...props }) => {
113
+ return (
114
+ <td {...props}>
115
+ <div className="flex size-(--cell-size) items-center justify-center text-center">{children}</div>
116
+ </td>
117
+ );
118
+ },
119
+ ...components,
120
+ }}
121
+ {...props}
122
+ />
123
+ );
124
+ }
125
+
126
+ function CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>) {
127
+ const defaultClassNames = getDefaultClassNames();
128
+
129
+ const ref = React.useRef<HTMLButtonElement>(null);
130
+ React.useEffect(() => {
131
+ if (modifiers.focused) ref.current?.focus();
132
+ }, [modifiers.focused]);
133
+
134
+ return (
135
+ <Button
136
+ ref={ref}
137
+ variant="ghost"
138
+ size="icon"
139
+ data-day={day.date.toLocaleDateString()}
140
+ data-selected-single={
141
+ modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle
142
+ }
143
+ data-range-start={modifiers.range_start}
144
+ data-range-end={modifiers.range_end}
145
+ data-range-middle={modifiers.range_middle}
146
+ className={cn(
147
+ 'data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70',
148
+ defaultClassNames.day,
149
+ className,
150
+ )}
151
+ {...props}
152
+ />
153
+ );
154
+ }
155
+
156
+ export { Calendar, CalendarDayButton };
@@ -0,0 +1,56 @@
1
+ import * as React from 'react';
2
+
3
+ import { cn } from '../../lib/utils';
4
+
5
+ function Card({ className, ...props }: React.ComponentProps<'div'>) {
6
+ return (
7
+ <div
8
+ data-slot="card"
9
+ className={cn('bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm', className)}
10
+ {...props}
11
+ />
12
+ );
13
+ }
14
+
15
+ function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
16
+ return (
17
+ <div
18
+ data-slot="card-header"
19
+ className={cn(
20
+ '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6',
21
+ className,
22
+ )}
23
+ {...props}
24
+ />
25
+ );
26
+ }
27
+
28
+ function CardTitle({ className, ...props }: React.ComponentProps<'div'>) {
29
+ return <div data-slot="card-title" className={cn('leading-none font-semibold', className)} {...props} />;
30
+ }
31
+
32
+ function CardDescription({ className, ...props }: React.ComponentProps<'div'>) {
33
+ return <div data-slot="card-description" className={cn('text-muted-foreground text-sm', className)} {...props} />;
34
+ }
35
+
36
+ function CardAction({ className, ...props }: React.ComponentProps<'div'>) {
37
+ return (
38
+ <div
39
+ data-slot="card-action"
40
+ className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}
41
+ {...props}
42
+ />
43
+ );
44
+ }
45
+
46
+ function CardContent({ className, ...props }: React.ComponentProps<'div'>) {
47
+ return <div data-slot="card-content" className={cn('px-6', className)} {...props} />;
48
+ }
49
+
50
+ function CardFooter({ className, ...props }: React.ComponentProps<'div'>) {
51
+ return (
52
+ <div data-slot="card-footer" className={cn('flex items-center px-6 [.border-t]:pt-6', className)} {...props} />
53
+ );
54
+ }
55
+
56
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };