create-aron-app 0.1.7 → 0.1.8

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 (160) hide show
  1. package/README.md +24 -31
  2. package/dist/index.js +38 -49
  3. package/package.json +3 -3
  4. package/templates/.cursor/rules/backend.mdc +112 -0
  5. package/templates/.cursor/rules/coding_standards.mdc +85 -4
  6. package/templates/.cursor/rules/frontend_architecture.mdc +334 -0
  7. package/templates/.github/workflows/ci.yml +17 -6
  8. package/templates/apps/{react-router → web}/.react-router/types/+routes.ts +11 -6
  9. package/templates/apps/{react-router/.react-router/types/src/routes/(dashboard)/todos → web/.react-router/types/src/routes/(dashboard)/(todos)}/+types/[id].ts +5 -2
  10. package/templates/apps/{react-router/.react-router/types/src/routes/(dashboard)/todos → web/.react-router/types/src/routes/(dashboard)/(todos)}/+types/index.ts +5 -2
  11. package/templates/apps/web/.react-router/types/src/routes/(dashboard)/(todos)/+types/layout.ts +65 -0
  12. package/templates/apps/{react-router → web}/project.json +11 -4
  13. package/templates/apps/{react-router → web}/react-router.config.ts +1 -1
  14. package/templates/apps/web/src/libs/convex_query_client.ts +11 -0
  15. package/templates/apps/web/src/libs/react_query_client.ts +17 -0
  16. package/templates/apps/web/src/libs/server/auth.ts +32 -0
  17. package/templates/apps/web/src/libs/server/protected.ts +17 -0
  18. package/templates/apps/web/src/providers/api_auth_provider.tsx +26 -0
  19. package/templates/apps/web/src/providers/global_provider.tsx +28 -0
  20. package/templates/apps/web/src/providers/navigation_loading_bar_provider.tsx +72 -0
  21. package/templates/apps/web/src/root.tsx +68 -0
  22. package/templates/apps/web/src/routes/(dashboard)/(todos)/[id].tsx +33 -0
  23. package/templates/apps/web/src/routes/(dashboard)/(todos)/index.tsx +26 -0
  24. package/templates/apps/web/src/routes/(dashboard)/(todos)/layout.tsx +9 -0
  25. package/templates/apps/{react-router → web}/src/routes/(dashboard)/index.tsx +3 -2
  26. package/templates/apps/web/src/routes/(dashboard)/layout.tsx +20 -0
  27. package/templates/apps/{react-router → web}/src/routes.ts +4 -2
  28. package/templates/apps/{nextjs → web}/src/surfaces/sidebar/install.tsx +1 -5
  29. package/templates/apps/{react-router → web}/src/surfaces/sidebar/layout.tsx +24 -15
  30. package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/all_todos.tsx +1 -1
  31. package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/all_todos_controller.ts +1 -1
  32. package/templates/apps/web/src/surfaces/todos/all_todos/bootstrap.ts +21 -0
  33. package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/bootstrap.ts +4 -5
  34. package/templates/apps/{nextjs → web}/src/surfaces/todos/single_todo/header/create.tsx +4 -6
  35. package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/single_todo_controller.ts +1 -1
  36. package/templates/biome.json +5 -0
  37. package/templates/bun.lock +11 -1281
  38. package/templates/nx.json +0 -11
  39. package/templates/package.json +2 -3
  40. package/templates/shared/assets/src/styles/global.css +14 -8
  41. package/templates/shared/ui/src/base/collapsible.tsx +31 -0
  42. package/templates/shared/ui/src/base/hover-card.tsx +42 -0
  43. package/templates/shared/ui/src/base/input-group.tsx +168 -0
  44. package/templates/shared/ui/src/base/panel.tsx +93 -0
  45. package/templates/shared/ui/src/hooks/use_mobile.tsx +1 -1
  46. package/templates/shared/ui/src/hooks/use_query_params.tsx +6 -7
  47. package/templates/shared/ui/tsconfig.json +1 -1
  48. package/templates/shared/utils/src/convex.ts +2 -1
  49. package/templates/tsconfig.base.json +2 -4
  50. package/templates/.cursor/commands/builder.md +0 -0
  51. package/templates/.cursor/rules/api_architecture.mdc +0 -262
  52. package/templates/.cursor/rules/convex_rules.mdc +0 -331
  53. package/templates/.cursor/rules/frontend_architecture_core.mdc +0 -495
  54. package/templates/.cursor/rules/frontend_architecture_nextjs.mdc +0 -458
  55. package/templates/.cursor/rules/frontend_architecture_reactrouter.mdc +0 -473
  56. package/templates/apps/nextjs/.env.example +0 -10
  57. package/templates/apps/nextjs/index.d.ts +0 -6
  58. package/templates/apps/nextjs/next-env.d.ts +0 -5
  59. package/templates/apps/nextjs/next.config.js +0 -22
  60. package/templates/apps/nextjs/postcss.config.js +0 -17
  61. package/templates/apps/nextjs/project.json +0 -22
  62. package/templates/apps/nextjs/src/app/(auth)/layout.tsx +0 -21
  63. package/templates/apps/nextjs/src/app/(auth)/not-allowed/page.tsx +0 -23
  64. package/templates/apps/nextjs/src/app/(auth)/sign-in/[[...sign-in]]/page.tsx +0 -15
  65. package/templates/apps/nextjs/src/app/(dashboard)/layout.tsx +0 -22
  66. package/templates/apps/nextjs/src/app/(dashboard)/page.tsx +0 -12
  67. package/templates/apps/nextjs/src/app/(dashboard)/todos/[id]/page.tsx +0 -26
  68. package/templates/apps/nextjs/src/app/(dashboard)/todos/page.tsx +0 -19
  69. package/templates/apps/nextjs/src/app/app.css +0 -3
  70. package/templates/apps/nextjs/src/app/layout.tsx +0 -26
  71. package/templates/apps/nextjs/src/middleware.ts +0 -18
  72. package/templates/apps/nextjs/src/providers/convex_provider.tsx +0 -44
  73. package/templates/apps/nextjs/src/surfaces/home/home.tsx +0 -27
  74. package/templates/apps/nextjs/src/surfaces/home/layout.tsx +0 -44
  75. package/templates/apps/nextjs/src/surfaces/home/main/create.tsx +0 -34
  76. package/templates/apps/nextjs/src/surfaces/sidebar/layout.tsx +0 -118
  77. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/create.tsx +0 -19
  78. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/nav_config.ts +0 -22
  79. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/nav_main.tsx +0 -25
  80. package/templates/apps/nextjs/src/surfaces/sidebar/nav_secondary/create.tsx +0 -21
  81. package/templates/apps/nextjs/src/surfaces/sidebar/nav_secondary/nav_secondary.tsx +0 -33
  82. package/templates/apps/nextjs/src/surfaces/sidebar/sidebar.tsx +0 -23
  83. package/templates/apps/nextjs/src/surfaces/sidebar/ui/sidebar_nav_link.tsx +0 -39
  84. package/templates/apps/nextjs/src/surfaces/sidebar/user_menu/create.tsx +0 -28
  85. package/templates/apps/nextjs/src/surfaces/sidebar/user_menu/user_menu.tsx +0 -42
  86. package/templates/apps/nextjs/src/surfaces/todos/all_todos/all_todos.tsx +0 -29
  87. package/templates/apps/nextjs/src/surfaces/todos/all_todos/all_todos_controller.ts +0 -61
  88. package/templates/apps/nextjs/src/surfaces/todos/all_todos/bootstrap.ts +0 -21
  89. package/templates/apps/nextjs/src/surfaces/todos/all_todos/header/create.tsx +0 -23
  90. package/templates/apps/nextjs/src/surfaces/todos/all_todos/install.tsx +0 -23
  91. package/templates/apps/nextjs/src/surfaces/todos/all_todos/layout.tsx +0 -44
  92. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/create.tsx +0 -49
  93. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/main.tsx +0 -70
  94. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/new_todo_sheet/create.tsx +0 -56
  95. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/new_todo_sheet/new_todo_sheet.tsx +0 -99
  96. package/templates/apps/nextjs/src/surfaces/todos/single_todo/bootstrap.ts +0 -32
  97. package/templates/apps/nextjs/src/surfaces/todos/single_todo/header/header.tsx +0 -22
  98. package/templates/apps/nextjs/src/surfaces/todos/single_todo/install.tsx +0 -27
  99. package/templates/apps/nextjs/src/surfaces/todos/single_todo/layout.tsx +0 -55
  100. package/templates/apps/nextjs/src/surfaces/todos/single_todo/main/create.tsx +0 -38
  101. package/templates/apps/nextjs/src/surfaces/todos/single_todo/main/main.tsx +0 -49
  102. package/templates/apps/nextjs/src/surfaces/todos/single_todo/single_todo.tsx +0 -29
  103. package/templates/apps/nextjs/src/surfaces/todos/single_todo/single_todo_controller.ts +0 -13
  104. package/templates/apps/nextjs/src/utils/auth.ts +0 -18
  105. package/templates/apps/nextjs/src/utils/convex.ts +0 -11
  106. package/templates/apps/nextjs/src/utils/font.ts +0 -9
  107. package/templates/apps/nextjs/tsconfig.json +0 -42
  108. package/templates/apps/react-router/src/providers/api_auth_provider.tsx +0 -40
  109. package/templates/apps/react-router/src/root.tsx +0 -37
  110. package/templates/apps/react-router/src/routes/(dashboard)/layout.tsx +0 -37
  111. package/templates/apps/react-router/src/routes/(dashboard)/todos/[id].tsx +0 -19
  112. package/templates/apps/react-router/src/routes/(dashboard)/todos/index.tsx +0 -19
  113. package/templates/apps/react-router/src/surfaces/home/bootstrap.ts +0 -9
  114. package/templates/apps/react-router/src/surfaces/home/install.tsx +0 -17
  115. package/templates/apps/react-router/src/surfaces/sidebar/install.tsx +0 -23
  116. package/templates/apps/react-router/src/surfaces/sidebar/nav_secondary/create.tsx +0 -21
  117. package/templates/apps/react-router/src/surfaces/sidebar/nav_secondary/nav_secondary.tsx +0 -31
  118. package/templates/apps/react-router/src/surfaces/todos/all_todos/bootstrap.ts +0 -18
  119. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/new_todo_sheet/schema.ts +0 -11
  120. package/templates/apps/react-router/src/surfaces/todos/single_todo/header/create.tsx +0 -32
  121. /package/templates/apps/{react-router → web}/.env.example +0 -0
  122. /package/templates/apps/{react-router → web}/.react-router/types/+future.ts +0 -0
  123. /package/templates/apps/{react-router → web}/.react-router/types/+server-build.d.ts +0 -0
  124. /package/templates/apps/{react-router → web}/.react-router/types/src/+types/root.ts +0 -0
  125. /package/templates/apps/{react-router → web}/.react-router/types/src/routes/(auth)/+types/layout.ts +0 -0
  126. /package/templates/apps/{react-router → web}/.react-router/types/src/routes/(auth)/sign-in/+types/index.ts +0 -0
  127. /package/templates/apps/{react-router → web}/.react-router/types/src/routes/(dashboard)/+types/index.ts +0 -0
  128. /package/templates/apps/{react-router → web}/.react-router/types/src/routes/(dashboard)/+types/layout.ts +0 -0
  129. /package/templates/apps/{react-router → web}/postcss.config.js +0 -0
  130. /package/templates/apps/{react-router → web}/public/favicon.ico +0 -0
  131. /package/templates/apps/{react-router → web}/src/app.css +0 -0
  132. /package/templates/apps/{react-router → web}/src/components/error_boundary.tsx +0 -0
  133. /package/templates/apps/{react-router → web}/src/routes/(auth)/layout.tsx +0 -0
  134. /package/templates/apps/{react-router → web}/src/routes/(auth)/sign-in/index.tsx +0 -0
  135. /package/templates/apps/{nextjs → web}/src/surfaces/home/bootstrap.ts +0 -0
  136. /package/templates/apps/{react-router → web}/src/surfaces/home/home.tsx +0 -0
  137. /package/templates/apps/{nextjs → web}/src/surfaces/home/install.tsx +0 -0
  138. /package/templates/apps/{react-router → web}/src/surfaces/home/layout.tsx +0 -0
  139. /package/templates/apps/{react-router → web}/src/surfaces/home/main/create.tsx +0 -0
  140. /package/templates/apps/{react-router → web}/src/surfaces/sidebar/nav_main/create.tsx +0 -0
  141. /package/templates/apps/{react-router → web}/src/surfaces/sidebar/nav_main/nav_main.tsx +0 -0
  142. /package/templates/apps/{react-router → web}/src/surfaces/sidebar/sidebar.tsx +0 -0
  143. /package/templates/apps/{react-router → web}/src/surfaces/sidebar/user_menu/create.tsx +0 -0
  144. /package/templates/apps/{react-router → web}/src/surfaces/sidebar/user_menu/user_menu.tsx +0 -0
  145. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/header/create.tsx +0 -0
  146. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/install.tsx +0 -0
  147. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/layout.tsx +0 -0
  148. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/main/create.tsx +0 -0
  149. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/main/main.tsx +0 -0
  150. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/main/new_todo_sheet/create.tsx +0 -0
  151. /package/templates/apps/{react-router → web}/src/surfaces/todos/all_todos/main/new_todo_sheet/new_todo_sheet.tsx +0 -0
  152. /package/templates/apps/{nextjs → web}/src/surfaces/todos/all_todos/main/new_todo_sheet/schema.ts +0 -0
  153. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/header/header.tsx +0 -0
  154. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/install.tsx +0 -0
  155. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/layout.tsx +0 -0
  156. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/main/create.tsx +0 -0
  157. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/main/main.tsx +0 -0
  158. /package/templates/apps/{react-router → web}/src/surfaces/todos/single_todo/single_todo.tsx +0 -0
  159. /package/templates/apps/{react-router → web}/tsconfig.json +0 -0
  160. /package/templates/apps/{react-router → web}/vite.config.ts +0 -0
package/templates/nx.json CHANGED
@@ -24,17 +24,6 @@
24
24
  "watchDepsName": "watch-deps"
25
25
  }
26
26
  }
27
- },
28
- {
29
- "plugin": "@nx/next/plugin",
30
- "options": {
31
- "startTargetName": "start",
32
- "buildTargetName": "build",
33
- "devTargetName": "dev",
34
- "serveStaticTargetName": "serve-static",
35
- "buildDepsTargetName": "build-deps",
36
- "watchDepsTargetName": "watch-deps"
37
- }
38
27
  }
39
28
  ]
40
29
  }
@@ -2,10 +2,10 @@
2
2
  "name": "@/source",
3
3
  "version": "0.0.0",
4
4
  "license": "MIT",
5
+ "type": "module",
5
6
  "private": true,
6
7
  "scripts": {},
7
8
  "dependencies": {
8
- "@clerk/nextjs": "^6.33.7",
9
9
  "@clerk/react-router": "^3.0.4",
10
10
  "@convex-dev/react-query": "^0.0.0-alpha.8",
11
11
  "@hookform/resolvers": "^3.9.1",
@@ -48,12 +48,12 @@
48
48
  "mobx-react": "^9.2.1",
49
49
  "mobx-react-lite": "^4.1.1",
50
50
  "nanoid": "^5.1.6",
51
- "next": "~15.1.4",
52
51
  "react": "19.0.0",
53
52
  "react-dom": "19.0.0",
54
53
  "react-hook-form": "^7.54.2",
55
54
  "react-resizable-panels": "^4.7.2",
56
55
  "react-router": "^7.5.0",
56
+ "react-top-loading-bar": "^3.0.0",
57
57
  "sharp": "^0.33.5",
58
58
  "sonner": "^2.0.1",
59
59
  "ts-essentials": "^10.1.1",
@@ -63,7 +63,6 @@
63
63
  "devDependencies": {
64
64
  "@biomejs/biome": "^2.2.3",
65
65
  "@nx/js": "20.6.2",
66
- "@nx/next": "20.6.2",
67
66
  "@nx/workspace": "20.6.2",
68
67
  "@react-router/dev": "^7.5.0",
69
68
  "@swc-node/register": "~1.9.1",
@@ -5,7 +5,6 @@
5
5
  :root {
6
6
  --spacing: 0.222222rem;
7
7
  --radius: 0.625rem;
8
-
9
8
  --background: oklch(1 0 0);
10
9
  --foreground: oklch(0.145 0 0);
11
10
  --card: oklch(1 0 0);
@@ -29,17 +28,22 @@
29
28
  --chart-3: oklch(0.398 0.07 227.392);
30
29
  --chart-4: oklch(0.828 0.189 84.429);
31
30
  --chart-5: oklch(0.769 0.188 70.08);
32
- --sidebar: oklch(0.985 0 0);
33
- --sidebar-foreground: oklch(0.145 0 0);
34
- --sidebar-primary: oklch(0.205 0 0);
35
- --sidebar-primary-foreground: oklch(0.985 0 0);
36
- --sidebar-accent: oklch(0.97 0 0);
37
- --sidebar-accent-foreground: oklch(0.205 0 0);
38
- --sidebar-border: oklch(0.922 0 0);
31
+ --sidebar: oklch(0.25 0 0);
32
+ --sidebar-foreground: oklch(0.95 0 0);
33
+ --sidebar-primary: oklch(0.5 0.15 250);
34
+ --sidebar-primary-foreground: oklch(1 0 0);
35
+ --sidebar-accent: oklch(0.3 0 0);
36
+ --sidebar-accent-foreground: oklch(0.95 0 0);
37
+ --sidebar-border: oklch(0.3 0 0);
39
38
  --sidebar-ring: oklch(0.708 0 0);
39
+ --sidebar-muted-foreground: oklch(0.6 0 0);
40
+ --sidebar-brand: oklch(0.5 0.15 250);
40
41
  }
41
42
 
42
43
  @theme inline {
44
+ --font-sans:
45
+ "Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
46
+ "Segoe UI Symbol", "Noto Color Emoji";
43
47
  --font-heading: var(--font-heading);
44
48
  --font-body: var(--font-body);
45
49
  --color-background: var(--background);
@@ -69,5 +73,7 @@
69
73
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
70
74
  --color-sidebar-border: var(--sidebar-border);
71
75
  --color-sidebar-ring: var(--sidebar-ring);
76
+ --color-sidebar-muted-foreground: var(--sidebar-muted-foreground);
77
+ --color-sidebar-brand: var(--sidebar-brand);
72
78
  }
73
79
 
@@ -0,0 +1,31 @@
1
+ import { Collapsible as CollapsiblePrimitive } from "radix-ui"
2
+
3
+ function Collapsible({
4
+ ...props
5
+ }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {
6
+ return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
7
+ }
8
+
9
+ function CollapsibleTrigger({
10
+ ...props
11
+ }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {
12
+ return (
13
+ <CollapsiblePrimitive.CollapsibleTrigger
14
+ data-slot="collapsible-trigger"
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ function CollapsibleContent({
21
+ ...props
22
+ }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {
23
+ return (
24
+ <CollapsiblePrimitive.CollapsibleContent
25
+ data-slot="collapsible-content"
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent }
@@ -0,0 +1,42 @@
1
+ import * as React from "react"
2
+ import { HoverCard as HoverCardPrimitive } from "radix-ui"
3
+
4
+ import { cn } from "@/ui/base/utils"
5
+
6
+ function HoverCard({
7
+ ...props
8
+ }: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
9
+ return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />
10
+ }
11
+
12
+ function HoverCardTrigger({
13
+ ...props
14
+ }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {
15
+ return (
16
+ <HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
17
+ )
18
+ }
19
+
20
+ function HoverCardContent({
21
+ className,
22
+ align = "center",
23
+ sideOffset = 4,
24
+ ...props
25
+ }: React.ComponentProps<typeof HoverCardPrimitive.Content>) {
26
+ return (
27
+ <HoverCardPrimitive.Portal data-slot="hover-card-portal">
28
+ <HoverCardPrimitive.Content
29
+ data-slot="hover-card-content"
30
+ align={align}
31
+ sideOffset={sideOffset}
32
+ className={cn(
33
+ "z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
34
+ className
35
+ )}
36
+ {...props}
37
+ />
38
+ </HoverCardPrimitive.Portal>
39
+ )
40
+ }
41
+
42
+ export { HoverCard, HoverCardTrigger, HoverCardContent }
@@ -0,0 +1,168 @@
1
+ import * as React from "react"
2
+ import { cva, type VariantProps } from "class-variance-authority"
3
+
4
+ import { cn } from "@/ui/base/utils"
5
+ import { Button } from "@/ui/base/button"
6
+ import { Input } from "@/ui/base/input"
7
+ import { Textarea } from "@/ui/base/textarea"
8
+
9
+ function InputGroup({ className, ...props }: React.ComponentProps<"div">) {
10
+ return (
11
+ <div
12
+ data-slot="input-group"
13
+ role="group"
14
+ className={cn(
15
+ "group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30",
16
+ "h-9 min-w-0 has-[>textarea]:h-auto",
17
+
18
+ // Variants based on alignment.
19
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2",
20
+ "has-[>[data-align=inline-end]]:[&>input]:pr-2",
21
+ "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3",
22
+ "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
23
+
24
+ // Focus state.
25
+ "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50",
26
+
27
+ // Error state.
28
+ "has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40",
29
+
30
+ className
31
+ )}
32
+ {...props}
33
+ />
34
+ )
35
+ }
36
+
37
+ const inputGroupAddonVariants = cva(
38
+ "flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",
39
+ {
40
+ variants: {
41
+ align: {
42
+ "inline-start":
43
+ "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
44
+ "inline-end":
45
+ "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
46
+ "block-start":
47
+ "order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3",
48
+ "block-end":
49
+ "order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3",
50
+ },
51
+ },
52
+ defaultVariants: {
53
+ align: "inline-start",
54
+ },
55
+ }
56
+ )
57
+
58
+ function InputGroupAddon({
59
+ className,
60
+ align = "inline-start",
61
+ ...props
62
+ }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>) {
63
+ return (
64
+ <div
65
+ role="group"
66
+ data-slot="input-group-addon"
67
+ data-align={align}
68
+ className={cn(inputGroupAddonVariants({ align }), className)}
69
+ onClick={(e) => {
70
+ if ((e.target as HTMLElement).closest("button")) {
71
+ return
72
+ }
73
+ e.currentTarget.parentElement?.querySelector("input")?.focus()
74
+ }}
75
+ {...props}
76
+ />
77
+ )
78
+ }
79
+
80
+ const inputGroupButtonVariants = cva(
81
+ "flex items-center gap-2 text-sm shadow-none",
82
+ {
83
+ variants: {
84
+ size: {
85
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5",
86
+ sm: "h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5",
87
+ "icon-xs":
88
+ "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
89
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
90
+ },
91
+ },
92
+ defaultVariants: {
93
+ size: "xs",
94
+ },
95
+ }
96
+ )
97
+
98
+ function InputGroupButton({
99
+ className,
100
+ type = "button",
101
+ variant = "ghost",
102
+ size = "xs",
103
+ ...props
104
+ }: Omit<React.ComponentProps<typeof Button>, "size"> &
105
+ VariantProps<typeof inputGroupButtonVariants>) {
106
+ return (
107
+ <Button
108
+ type={type}
109
+ data-size={size}
110
+ variant={variant}
111
+ className={cn(inputGroupButtonVariants({ size }), className)}
112
+ {...props}
113
+ />
114
+ )
115
+ }
116
+
117
+ function InputGroupText({ className, ...props }: React.ComponentProps<"span">) {
118
+ return (
119
+ <span
120
+ className={cn(
121
+ "flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
122
+ className
123
+ )}
124
+ {...props}
125
+ />
126
+ )
127
+ }
128
+
129
+ function InputGroupInput({
130
+ className,
131
+ ...props
132
+ }: React.ComponentProps<"input">) {
133
+ return (
134
+ <Input
135
+ data-slot="input-group-control"
136
+ className={cn(
137
+ "flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
138
+ className
139
+ )}
140
+ {...props}
141
+ />
142
+ )
143
+ }
144
+
145
+ function InputGroupTextarea({
146
+ className,
147
+ ...props
148
+ }: React.ComponentProps<"textarea">) {
149
+ return (
150
+ <Textarea
151
+ data-slot="input-group-control"
152
+ className={cn(
153
+ "flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent",
154
+ className
155
+ )}
156
+ {...props}
157
+ />
158
+ )
159
+ }
160
+
161
+ export {
162
+ InputGroup,
163
+ InputGroupAddon,
164
+ InputGroupButton,
165
+ InputGroupText,
166
+ InputGroupInput,
167
+ InputGroupTextarea,
168
+ }
@@ -0,0 +1,93 @@
1
+ /*
2
+ * Copyright (c) SalesStar Limited 2026.
3
+ */
4
+
5
+ import type * as React from "react";
6
+
7
+ import { cn } from "@/ui/base/utils";
8
+ import { useMobile } from "@/ui/hooks/use_mobile";
9
+
10
+ type PanelProps = {
11
+ open: boolean;
12
+ onOpenChange: (open: boolean) => void;
13
+ children: React.ReactNode;
14
+ side?: "left" | "right";
15
+ width?: string;
16
+ className?: string;
17
+ };
18
+
19
+ const Panel = ({
20
+ open,
21
+ onOpenChange,
22
+ children,
23
+ side = "right",
24
+ width = "20rem",
25
+ className,
26
+ }: PanelProps) => {
27
+ const isMobile = useMobile();
28
+
29
+ if (isMobile) {
30
+ return null;
31
+ // <Sheet open={open} onOpenChange={onOpenChange}>
32
+ // <SheetContent
33
+ // side={side}
34
+ // style={{ width } as React.CSSProperties}
35
+ // className={cn(
36
+ // "p-0 data-[state=open]:duration-700 data-[state=closed]:duration-500",
37
+ // className,
38
+ // )}
39
+ // >
40
+ // <div className="flex h-full flex-col overflow-auto">{children}</div>
41
+ // </SheetContent>
42
+ // </Sheet>
43
+ }
44
+
45
+ return (
46
+ <aside
47
+ style={open ? { width } : { width: 0 }}
48
+ className={cn(
49
+ "bg-background text-foreground flex h-full flex-col shrink-0 border-border transition-[width] duration-500 ease-in-out",
50
+ side === "right" ? "border-l" : "border-r",
51
+ open ? "overflow-auto" : "overflow-hidden invisible",
52
+ )}
53
+ >
54
+ {open && (
55
+ <div className={cn("flex h-full w-full flex-col overflow-auto", className)}>{children}</div>
56
+ )}
57
+ </aside>
58
+ );
59
+ };
60
+
61
+ type PanelHeaderProps = React.ComponentProps<"div">;
62
+ const PanelHeader = ({ className, ...props }: PanelHeaderProps) => {
63
+ return (
64
+ <div data-slot="panel-header" className={cn("flex flex-col gap-2 p-4", className)} {...props} />
65
+ );
66
+ };
67
+
68
+ type PanelContentProps = React.ComponentProps<"div">;
69
+ const PanelContent = ({ className, ...props }: PanelContentProps) => {
70
+ return (
71
+ <div
72
+ data-slot="panel-content"
73
+ className={cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto", className)}
74
+ {...props}
75
+ />
76
+ );
77
+ };
78
+
79
+ type PanelFooterProps = React.ComponentProps<"div">;
80
+ const PanelFooter = ({ className, ...props }: PanelFooterProps) => {
81
+ return (
82
+ <div data-slot="panel-footer" className={cn("flex flex-col gap-2 p-4", className)} {...props} />
83
+ );
84
+ };
85
+
86
+ type PanelGroupProps = React.ComponentProps<"div">;
87
+ const PanelGroup = ({ className, ...props }: PanelGroupProps) => {
88
+ return (
89
+ <div data-slot="panel-group" className={cn("flex flex-col gap-2", className)} {...props} />
90
+ );
91
+ };
92
+
93
+ export { Panel, PanelContent, PanelFooter, PanelGroup, PanelHeader };
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) Aron Weston 2025.
2
+ * Copyright (c) Sales Star Limited 2026.
3
3
  */
4
4
 
5
5
  "use client";
@@ -3,13 +3,12 @@
3
3
  */
4
4
 
5
5
  import { useCallback } from "react";
6
- import { usePathname, useSearchParams } from "next/navigation";
7
- import { useRouter } from "next/navigation";
6
+ import { useLocation, useNavigate, useSearchParams } from "react-router";
8
7
 
9
8
  export const useQueryParams = () => {
10
- const router = useRouter();
11
- const pathname = usePathname();
12
- const searchParams = useSearchParams();
9
+ const navigate = useNavigate();
10
+ const { pathname } = useLocation();
11
+ const [searchParams] = useSearchParams();
13
12
 
14
13
  return useCallback(
15
14
  (paths: Record<string, string | null>) => {
@@ -26,8 +25,8 @@ export const useQueryParams = () => {
26
25
 
27
26
  const path = pathname + "?" + params.toString();
28
27
 
29
- return router.push(path);
28
+ return navigate(path);
30
29
  },
31
- [searchParams],
30
+ [navigate, pathname, searchParams],
32
31
  );
33
32
  };
@@ -3,6 +3,6 @@
3
3
  "compilerOptions": {
4
4
  "moduleResolution": "Node"
5
5
  },
6
- "include": ["src/base/**/*"],
6
+ "include": ["src/base/**/*", "src/hooks/**/*"],
7
7
  "exclude": ["node_modules"]
8
8
  }
@@ -1,3 +1,4 @@
1
+ /// <reference types="vite/client" />
1
2
  import { ConvexClient } from "convex/browser";
2
3
 
3
- export const convex = new ConvexClient(process.env.NEXT_PUBLIC_CONVEX_URL!);
4
+ export const convex = new ConvexClient(import.meta.env.VITE_CONVEX_URL!);
@@ -21,16 +21,14 @@
21
21
  "@/ui/*": ["./shared/ui/src/*"],
22
22
  "@/utils/*": ["./shared/utils/src/*"],
23
23
  "@/emails/*": ["./emails/*"],
24
- "@/web/*": ["./apps/web/src/*", "./apps/nextjs/src/*", "./apps/react-router/src/*"],
25
- "@/router/*": ["./apps/react-router/.react-router/types/*"],
24
+ "@/web/*": ["./apps/web/src/*"],
25
+ "@/router/*": ["./apps/web/.react-router/types/*"],
26
26
  }
27
27
  },
28
28
  "exclude": ["node_modules", "dist", "build", "public"],
29
29
  "include": [
30
30
  "./apps/api/src/**/*",
31
31
  "./apps/web/src/**/*",
32
- "./apps/nextjs/src/**/*",
33
- "./apps/react-router/src/**/*",
34
32
  "./shared/**/*",
35
33
  "./tsconfig.json"
36
34
  ]
File without changes