create-lumen 1.1.4 → 1.2.0

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 (217) hide show
  1. package/README.md +41 -34
  2. package/package.json +5 -1
  3. package/src/configure.js +6 -2
  4. package/src/css.js +71 -24
  5. package/src/dependencies.js +15 -6
  6. package/src/injector.js +116 -24
  7. package/src/main.js +3 -1
  8. package/src/readme.js +64 -22
  9. package/templates/architectures/component-based/src/App.jsx +6 -3
  10. package/templates/architectures/component-based/src/App.tsx +6 -3
  11. package/templates/architectures/component-based/src/components/common/Button.jsx +5 -2
  12. package/templates/architectures/component-based/src/components/common/Button.tsx +5 -2
  13. package/templates/architectures/component-based/src/hooks/useApp.js +10 -0
  14. package/templates/architectures/component-based/src/hooks/useApp.ts +10 -0
  15. package/templates/architectures/component-based/src/layouts/MainLayout.jsx +12 -4
  16. package/templates/architectures/component-based/src/layouts/MainLayout.tsx +12 -4
  17. package/templates/architectures/component-based/src/pages/Home/Home.jsx +6 -1
  18. package/templates/architectures/component-based/src/pages/Home/Home.tsx +6 -1
  19. package/templates/architectures/component-based/src/providers/AppProvider.jsx +20 -0
  20. package/templates/architectures/component-based/src/providers/AppProvider.tsx +24 -0
  21. package/templates/architectures/component-based/src/providers/appcontext.js +3 -0
  22. package/templates/architectures/component-based/src/{context/app-context.ts → providers/appcontext.ts} +1 -3
  23. package/templates/architectures/{feature-based → component-based}/src/types/index.js +7 -0
  24. package/templates/architectures/{feature-based → component-based}/src/types/index.ts +5 -0
  25. package/templates/architectures/feature-based/main.jsx +1 -1
  26. package/templates/architectures/feature-based/main.tsx +1 -1
  27. package/templates/architectures/feature-based/scripts/create-feature.mjs +2 -2
  28. package/templates/architectures/feature-based/src/app/App.jsx +15 -4
  29. package/templates/architectures/feature-based/src/app/App.tsx +15 -4
  30. package/templates/architectures/feature-based/src/app/contexts/themecontext.js +3 -0
  31. package/templates/architectures/feature-based/src/app/contexts/themecontext.ts +8 -0
  32. package/templates/architectures/feature-based/src/app/hooks/useTheme.js +10 -0
  33. package/templates/architectures/feature-based/src/app/hooks/useTheme.ts +10 -0
  34. package/templates/architectures/feature-based/src/app/providers/ThemeProvider.jsx +18 -1
  35. package/templates/architectures/feature-based/src/app/providers/ThemeProvider.tsx +19 -2
  36. package/templates/architectures/feature-based/src/features/home/pages/HomePage.jsx +18 -4
  37. package/templates/architectures/feature-based/src/features/home/pages/HomePage.tsx +18 -4
  38. package/templates/architectures/feature-based/src/shared/components/ui/Button.jsx +31 -0
  39. package/templates/architectures/feature-based/src/shared/components/ui/Button.tsx +36 -0
  40. package/templates/architectures/feature-based/src/shared/layouts/.gitkeep +0 -0
  41. package/templates/architectures/feature-based/src/shared/stores/.gitkeep +0 -0
  42. package/templates/architectures/feature-based/src/shared/styles/.gitkeep +0 -0
  43. package/templates/architectures/feature-based/src/shared/types/index.js +20 -0
  44. package/templates/architectures/feature-based/src/shared/types/index.ts +16 -0
  45. package/templates/conditional/axios/component-based/src/config/axios.config.js +7 -0
  46. package/templates/conditional/axios/component-based/src/config/axios.config.ts +7 -0
  47. package/templates/conditional/axios/component-based/src/services/axios.client.js +24 -0
  48. package/templates/conditional/axios/component-based/src/services/axios.client.ts +24 -0
  49. package/templates/conditional/axios/component-based/src/services/user.service.js +33 -0
  50. package/templates/conditional/axios/component-based/src/services/user.service.ts +29 -0
  51. package/templates/conditional/axios/feature-based/src/features/home/services/user.service.js +33 -0
  52. package/templates/conditional/axios/feature-based/src/features/home/services/user.service.ts +29 -0
  53. package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.client.js +24 -0
  54. package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.client.ts +24 -0
  55. package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.config.js +7 -0
  56. package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.config.ts +7 -0
  57. package/templates/conditional/axios/feature-based/src/shared/lib/axios/index.js +1 -0
  58. package/templates/conditional/axios/feature-based/src/shared/lib/axios/index.ts +1 -0
  59. package/templates/conditional/fetch/component-based/src/config/api.config.js +7 -0
  60. package/templates/conditional/fetch/component-based/src/config/api.config.ts +7 -0
  61. package/templates/conditional/fetch/component-based/src/services/api.client.js +51 -0
  62. package/templates/conditional/fetch/component-based/src/services/api.client.ts +55 -0
  63. package/templates/conditional/fetch/component-based/src/services/user.service.js +33 -0
  64. package/templates/conditional/fetch/component-based/src/services/user.service.ts +29 -0
  65. package/templates/conditional/fetch/feature-based/src/features/home/services/user.service.js +33 -0
  66. package/templates/conditional/fetch/feature-based/src/features/home/services/user.service.ts +29 -0
  67. package/templates/conditional/fetch/feature-based/src/shared/api/api.client.js +51 -0
  68. package/templates/conditional/fetch/feature-based/src/shared/api/api.client.ts +55 -0
  69. package/templates/conditional/fetch/feature-based/src/shared/api/api.config.js +7 -0
  70. package/templates/conditional/fetch/feature-based/src/shared/api/api.config.ts +7 -0
  71. package/templates/conditional/fetch/feature-based/src/shared/api/index.js +1 -0
  72. package/templates/conditional/fetch/feature-based/src/shared/api/index.ts +1 -0
  73. package/templates/conditional/icons/huge/component-based/bootstrap/src/pages/Home/Home.jsx +20 -0
  74. package/templates/conditional/icons/huge/component-based/bootstrap/src/pages/Home/Home.tsx +20 -0
  75. package/templates/conditional/icons/huge/component-based/src/pages/Home/Home.jsx +24 -8
  76. package/templates/conditional/icons/huge/component-based/src/pages/Home/Home.tsx +24 -8
  77. package/templates/conditional/icons/huge/component-based/tailwind/src/pages/Home/Home.jsx +20 -0
  78. package/templates/conditional/icons/huge/component-based/tailwind/src/pages/Home/Home.tsx +20 -0
  79. package/templates/conditional/icons/huge/feature-based/bootstrap/src/features/home/pages/HomePage.jsx +20 -0
  80. package/templates/conditional/icons/huge/feature-based/bootstrap/src/features/home/pages/HomePage.tsx +20 -0
  81. package/templates/conditional/icons/huge/feature-based/src/features/home/pages/HomePage.jsx +25 -9
  82. package/templates/conditional/icons/huge/feature-based/src/features/home/pages/HomePage.tsx +25 -9
  83. package/templates/conditional/icons/huge/feature-based/tailwind/src/features/home/pages/HomePage.jsx +20 -0
  84. package/templates/conditional/icons/huge/feature-based/tailwind/src/features/home/pages/HomePage.tsx +20 -0
  85. package/templates/conditional/icons/lucide/component-based/bootstrap/src/pages/Home/Home.jsx +19 -0
  86. package/templates/conditional/icons/lucide/component-based/bootstrap/src/pages/Home/Home.tsx +19 -0
  87. package/templates/conditional/icons/lucide/component-based/src/pages/Home/Home.jsx +24 -8
  88. package/templates/conditional/icons/lucide/component-based/src/pages/Home/Home.tsx +24 -8
  89. package/templates/conditional/icons/lucide/component-based/tailwind/src/pages/Home/Home.jsx +19 -0
  90. package/templates/conditional/icons/lucide/component-based/tailwind/src/pages/Home/Home.tsx +19 -0
  91. package/templates/conditional/icons/lucide/feature-based/bootstrap/src/features/home/pages/HomePage.jsx +19 -0
  92. package/templates/conditional/icons/lucide/feature-based/bootstrap/src/features/home/pages/HomePage.tsx +19 -0
  93. package/templates/conditional/icons/lucide/feature-based/src/features/home/pages/HomePage.jsx +25 -9
  94. package/templates/conditional/icons/lucide/feature-based/src/features/home/pages/HomePage.tsx +25 -9
  95. package/templates/conditional/icons/lucide/feature-based/tailwind/src/features/home/pages/HomePage.jsx +19 -0
  96. package/templates/conditional/icons/lucide/feature-based/tailwind/src/features/home/pages/HomePage.tsx +19 -0
  97. package/templates/conditional/router/component-based/bootstrap/src/layouts/MainLayout.jsx +17 -0
  98. package/templates/conditional/router/component-based/bootstrap/src/layouts/MainLayout.tsx +17 -0
  99. package/templates/conditional/router/component-based/src/App.jsx +4 -4
  100. package/templates/conditional/router/component-based/src/App.tsx +4 -4
  101. package/templates/conditional/router/component-based/src/layouts/MainLayout.jsx +39 -0
  102. package/templates/conditional/router/component-based/src/layouts/MainLayout.tsx +39 -0
  103. package/templates/conditional/router/component-based/src/router/guards/AuthGuard.jsx +8 -0
  104. package/templates/conditional/router/component-based/src/router/guards/AuthGuard.tsx +14 -0
  105. package/templates/conditional/router/component-based/src/router/guards/GuestGuard.jsx +8 -0
  106. package/templates/conditional/router/component-based/src/router/guards/GuestGuard.tsx +14 -0
  107. package/templates/conditional/router/component-based/src/router/index.jsx +44 -0
  108. package/templates/conditional/router/component-based/src/router/index.tsx +44 -0
  109. package/templates/conditional/router/component-based/tailwind/src/layouts/MainLayout.jsx +17 -0
  110. package/templates/conditional/router/component-based/tailwind/src/layouts/MainLayout.tsx +17 -0
  111. package/templates/conditional/router/feature-based/bootstrap/src/shared/layouts/RootLayout.jsx +9 -0
  112. package/templates/conditional/router/feature-based/bootstrap/src/shared/layouts/RootLayout.tsx +9 -0
  113. package/templates/conditional/router/feature-based/src/app/App.jsx +6 -1
  114. package/templates/conditional/router/feature-based/src/app/App.tsx +6 -1
  115. package/templates/conditional/router/feature-based/src/app/router/guards/AuthGuard.jsx +8 -0
  116. package/templates/conditional/router/feature-based/src/app/router/guards/AuthGuard.tsx +14 -0
  117. package/templates/conditional/router/feature-based/src/app/router/guards/RoleGuard.jsx +8 -0
  118. package/templates/conditional/router/feature-based/src/app/router/guards/RoleGuard.tsx +15 -0
  119. package/templates/conditional/router/feature-based/src/app/router/index.jsx +16 -0
  120. package/templates/conditional/router/feature-based/src/app/router/index.tsx +16 -0
  121. package/templates/conditional/router/feature-based/src/app/router/routes/auth.routes.jsx +18 -0
  122. package/templates/conditional/router/feature-based/src/app/router/routes/auth.routes.tsx +18 -0
  123. package/templates/conditional/router/feature-based/src/app/router/routes/home.routes.jsx +8 -0
  124. package/templates/conditional/router/feature-based/src/app/router/routes/home.routes.tsx +8 -0
  125. package/templates/conditional/router/feature-based/src/shared/layouts/RootLayout.jsx +17 -0
  126. package/templates/conditional/router/feature-based/src/shared/layouts/RootLayout.tsx +17 -0
  127. package/templates/conditional/router/feature-based/tailwind/src/shared/layouts/RootLayout.jsx +9 -0
  128. package/templates/conditional/router/feature-based/tailwind/src/shared/layouts/RootLayout.tsx +9 -0
  129. package/templates/conditional/state/redux/feature-based/src/app/providers/StoreProvider.jsx +1 -1
  130. package/templates/conditional/state/redux/feature-based/src/app/providers/StoreProvider.tsx +1 -1
  131. package/templates/css/bootstrap/src/themes.css +14 -0
  132. package/templates/css/component-styles/bootstrap/component-based/src/components/common/Button.jsx +17 -0
  133. package/templates/css/component-styles/bootstrap/component-based/src/components/common/Button.tsx +22 -0
  134. package/templates/css/component-styles/bootstrap/component-based/src/layouts/MainLayout.jsx +15 -0
  135. package/templates/css/component-styles/bootstrap/component-based/src/layouts/MainLayout.tsx +19 -0
  136. package/templates/css/component-styles/bootstrap/component-based/src/pages/Home/Home.jsx +13 -0
  137. package/templates/css/component-styles/bootstrap/component-based/src/pages/Home/Home.tsx +13 -0
  138. package/templates/css/component-styles/bootstrap/feature-based/src/app/App.jsx +9 -0
  139. package/templates/css/component-styles/bootstrap/feature-based/src/app/App.tsx +9 -0
  140. package/templates/css/component-styles/bootstrap/feature-based/src/features/home/pages/HomePage.jsx +13 -0
  141. package/templates/css/component-styles/bootstrap/feature-based/src/features/home/pages/HomePage.tsx +13 -0
  142. package/templates/css/component-styles/bootstrap/feature-based/src/shared/components/ui/Button.jsx +17 -0
  143. package/templates/css/component-styles/bootstrap/feature-based/src/shared/components/ui/Button.tsx +22 -0
  144. package/templates/{architectures/feature-based/src/components/ui → css/component-styles/tailwind/component-based/src/components/common}/Button.jsx +1 -1
  145. package/templates/{architectures/feature-based/src/components/ui → css/component-styles/tailwind/component-based/src/components/common}/Button.tsx +1 -1
  146. package/templates/css/component-styles/tailwind/component-based/src/layouts/MainLayout.jsx +15 -0
  147. package/templates/css/component-styles/tailwind/component-based/src/layouts/MainLayout.tsx +19 -0
  148. package/templates/css/component-styles/tailwind/component-based/src/pages/Home/Home.jsx +13 -0
  149. package/templates/css/component-styles/tailwind/component-based/src/pages/Home/Home.tsx +13 -0
  150. package/templates/css/component-styles/tailwind/feature-based/src/app/App.jsx +9 -0
  151. package/templates/css/component-styles/tailwind/feature-based/src/app/App.tsx +9 -0
  152. package/templates/css/component-styles/tailwind/feature-based/src/features/home/pages/HomePage.jsx +13 -0
  153. package/templates/css/component-styles/tailwind/feature-based/src/features/home/pages/HomePage.tsx +13 -0
  154. package/templates/css/component-styles/tailwind/feature-based/src/shared/components/ui/Button.jsx +21 -0
  155. package/templates/css/component-styles/tailwind/feature-based/src/shared/components/ui/Button.tsx +26 -0
  156. package/templates/css/none/src/{index.css → main.css} +2 -0
  157. package/templates/css/none/src/themes.css +19 -0
  158. package/templates/css/tailwind/src/themes.css +9 -0
  159. package/templates/architectures/component-based/src/config/constants.js +0 -1
  160. package/templates/architectures/component-based/src/config/constants.ts +0 -1
  161. package/templates/architectures/component-based/src/config/routes.js +0 -7
  162. package/templates/architectures/component-based/src/config/routes.ts +0 -7
  163. package/templates/architectures/component-based/src/context/AppContext.jsx +0 -12
  164. package/templates/architectures/component-based/src/context/AppContext.tsx +0 -18
  165. package/templates/architectures/component-based/src/context/app-context.js +0 -5
  166. package/templates/architectures/component-based/src/hooks/index.js +0 -1
  167. package/templates/architectures/component-based/src/hooks/index.ts +0 -1
  168. package/templates/architectures/component-based/src/layouts/index.js +0 -1
  169. package/templates/architectures/component-based/src/layouts/index.ts +0 -1
  170. package/templates/architectures/component-based/src/styles/globals.css +0 -7
  171. package/templates/architectures/component-based/src/utils/index.js +0 -1
  172. package/templates/architectures/component-based/src/utils/index.ts +0 -1
  173. package/templates/architectures/feature-based/src/config/constants.js +0 -1
  174. package/templates/architectures/feature-based/src/config/constants.ts +0 -1
  175. package/templates/architectures/feature-based/src/hooks/index.js +0 -1
  176. package/templates/architectures/feature-based/src/hooks/index.ts +0 -1
  177. package/templates/architectures/feature-based/src/utils/index.js +0 -1
  178. package/templates/architectures/feature-based/src/utils/index.ts +0 -1
  179. package/templates/conditional/axios/component-based/src/services/axios.jsx +0 -19
  180. package/templates/conditional/axios/component-based/src/services/axios.ts +0 -19
  181. package/templates/conditional/axios/component-based/src/services/index.js +0 -1
  182. package/templates/conditional/axios/component-based/src/services/index.ts +0 -1
  183. package/templates/conditional/axios/feature-based/src/lib/axios.jsx +0 -19
  184. package/templates/conditional/axios/feature-based/src/lib/axios.ts +0 -19
  185. package/templates/conditional/axios/feature-based/src/lib/index.js +0 -1
  186. package/templates/conditional/axios/feature-based/src/lib/index.ts +0 -1
  187. package/templates/conditional/fetch/component-based/src/services/api.jsx +0 -27
  188. package/templates/conditional/fetch/component-based/src/services/api.ts +0 -27
  189. package/templates/conditional/fetch/component-based/src/services/index.js +0 -1
  190. package/templates/conditional/fetch/component-based/src/services/index.ts +0 -1
  191. package/templates/conditional/fetch/feature-based/src/lib/api.jsx +0 -27
  192. package/templates/conditional/fetch/feature-based/src/lib/api.ts +0 -27
  193. package/templates/conditional/fetch/feature-based/src/lib/index.js +0 -1
  194. package/templates/conditional/fetch/feature-based/src/lib/index.ts +0 -1
  195. package/templates/conditional/router/component-based/src/routes/index.jsx +0 -12
  196. package/templates/conditional/router/component-based/src/routes/index.tsx +0 -12
  197. package/templates/conditional/router/feature-based/src/app/router.jsx +0 -13
  198. package/templates/conditional/router/feature-based/src/app/router.tsx +0 -13
  199. package/templates/css/tailwind/src/index.css +0 -1
  200. /package/templates/architectures/component-based/src/{components/layout → config}/.gitkeep +0 -0
  201. /package/templates/architectures/{feature-based/src/features/home/interfaces → component-based/src/providers}/.gitkeep +0 -0
  202. /package/templates/architectures/{feature-based/src/lib → component-based/src/styles}/.gitkeep +0 -0
  203. /package/templates/architectures/feature-based/src/{stores → features/home/types}/.gitkeep +0 -0
  204. /package/templates/architectures/feature-based/src/{components → shared/components}/ui/index.js +0 -0
  205. /package/templates/architectures/feature-based/src/{components → shared/components}/ui/index.ts +0 -0
  206. /package/templates/architectures/feature-based/src/{hooks → shared/hooks}/useLocalStorage.jsx +0 -0
  207. /package/templates/architectures/feature-based/src/{hooks → shared/hooks}/useLocalStorage.ts +0 -0
  208. /package/templates/architectures/feature-based/src/{utils → shared/utils}/cn.jsx +0 -0
  209. /package/templates/architectures/feature-based/src/{utils → shared/utils}/cn.ts +0 -0
  210. /package/templates/conditional/state/redux/component-based/src/{context → providers}/StoreProvider.jsx +0 -0
  211. /package/templates/conditional/state/redux/component-based/src/{context → providers}/StoreProvider.tsx +0 -0
  212. /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/hooks.js +0 -0
  213. /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/hooks.ts +0 -0
  214. /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/index.js +0 -0
  215. /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/index.ts +0 -0
  216. /package/templates/css/bootstrap/src/{index.css → globals.css} +0 -0
  217. /package/templates/{architectures/feature-based/src/styles → css/tailwind/src}/globals.css +0 -0
@@ -0,0 +1,22 @@
1
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
2
+ variant?: "primary" | "secondary";
3
+ children: React.ReactNode;
4
+ }
5
+
6
+ export function Button({
7
+ variant = "primary",
8
+ children,
9
+ className,
10
+ ...props
11
+ }: ButtonProps) {
12
+ const variants = {
13
+ primary: "btn btn-primary",
14
+ secondary: "btn btn-secondary",
15
+ };
16
+
17
+ return (
18
+ <button className={`${variants[variant]} ${className ?? ""}`} {...props}>
19
+ {children}
20
+ </button>
21
+ );
22
+ }
@@ -0,0 +1,15 @@
1
+ export function MainLayout({ children }) {
2
+ return (
3
+ <div className="min-vh-100 d-flex flex-column">
4
+ <header className="px-4 py-3 border-bottom">
5
+ <h2 className="h5 fw-semibold mb-0">Lumen</h2>
6
+ </header>
7
+ <main className="flex-grow-1 p-4 d-flex align-items-center justify-content-center">
8
+ {children}
9
+ </main>
10
+ <footer className="px-4 py-3 border-top text-center text-muted">
11
+ <p className="mb-0">Built with Lumen</p>
12
+ </footer>
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,19 @@
1
+ interface MainLayoutProps {
2
+ children: React.ReactNode;
3
+ }
4
+
5
+ export function MainLayout({ children }: MainLayoutProps) {
6
+ return (
7
+ <div className="min-vh-100 d-flex flex-column">
8
+ <header className="px-4 py-3 border-bottom">
9
+ <h2 className="h5 fw-semibold mb-0">Lumen</h2>
10
+ </header>
11
+ <main className="flex-grow-1 p-4 d-flex align-items-center justify-content-center">
12
+ {children}
13
+ </main>
14
+ <footer className="px-4 py-3 border-top text-center text-muted">
15
+ <p className="mb-0">Built with Lumen</p>
16
+ </footer>
17
+ </div>
18
+ );
19
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/components/common";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="h1 fw-bold text-dark mb-4">Welcome to Lumen</h1>
7
+ <p className="text-muted mb-5">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/components/common";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="h1 fw-bold text-dark mb-4">Welcome to Lumen</h1>
7
+ <p className="text-muted mb-5">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,9 @@
1
+ import { HomePage } from "@/features/home";
2
+
3
+ export default function App() {
4
+ return (
5
+ <div className="min-vh-100 d-flex align-items-center justify-content-center bg-light">
6
+ <HomePage />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,9 @@
1
+ import { HomePage } from "@/features/home";
2
+
3
+ export default function App() {
4
+ return (
5
+ <div className="min-vh-100 d-flex align-items-center justify-content-center bg-light">
6
+ <HomePage />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/shared/components/ui";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="h1 fw-bold text-dark mb-4">Welcome to Lumen</h1>
7
+ <p className="text-muted mb-5">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/shared/components/ui";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="h1 fw-bold text-dark mb-4">Welcome to Lumen</h1>
7
+ <p className="text-muted mb-5">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,17 @@
1
+ export function Button({
2
+ variant = "primary",
3
+ children,
4
+ className,
5
+ ...props
6
+ }) {
7
+ const variants = {
8
+ primary: "btn btn-primary",
9
+ secondary: "btn btn-secondary",
10
+ };
11
+
12
+ return (
13
+ <button className={`${variants[variant]} ${className ?? ""}`} {...props}>
14
+ {children}
15
+ </button>
16
+ );
17
+ }
@@ -0,0 +1,22 @@
1
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
2
+ variant?: "primary" | "secondary";
3
+ children: React.ReactNode;
4
+ }
5
+
6
+ export function Button({
7
+ variant = "primary",
8
+ children,
9
+ className,
10
+ ...props
11
+ }: ButtonProps) {
12
+ const variants = {
13
+ primary: "btn btn-primary",
14
+ secondary: "btn btn-secondary",
15
+ };
16
+
17
+ return (
18
+ <button className={`${variants[variant]} ${className ?? ""}`} {...props}>
19
+ {children}
20
+ </button>
21
+ );
22
+ }
@@ -0,0 +1,15 @@
1
+ export function MainLayout({ children }) {
2
+ return (
3
+ <div className="min-h-screen flex flex-col">
4
+ <header className="px-6 py-4 border-b">
5
+ <h2 className="text-xl font-semibold">Lumen</h2>
6
+ </header>
7
+ <main className="flex-1 p-6 flex items-center justify-center">
8
+ {children}
9
+ </main>
10
+ <footer className="px-6 py-4 border-t text-center text-gray-500">
11
+ <p>Built with Lumen</p>
12
+ </footer>
13
+ </div>
14
+ );
15
+ }
@@ -0,0 +1,19 @@
1
+ interface MainLayoutProps {
2
+ children: React.ReactNode;
3
+ }
4
+
5
+ export function MainLayout({ children }: MainLayoutProps) {
6
+ return (
7
+ <div className="min-h-screen flex flex-col">
8
+ <header className="px-6 py-4 border-b">
9
+ <h2 className="text-xl font-semibold">Lumen</h2>
10
+ </header>
11
+ <main className="flex-1 p-6 flex items-center justify-center">
12
+ {children}
13
+ </main>
14
+ <footer className="px-6 py-4 border-t text-center text-gray-500">
15
+ <p>Built with Lumen</p>
16
+ </footer>
17
+ </div>
18
+ );
19
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/components/common";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">Welcome to Lumen</h1>
7
+ <p className="text-gray-600 mb-8">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/components/common";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">Welcome to Lumen</h1>
7
+ <p className="text-gray-600 mb-8">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,9 @@
1
+ import { HomePage } from "@/features/home";
2
+
3
+ export default function App() {
4
+ return (
5
+ <div className="min-h-screen flex items-center justify-center bg-gray-50">
6
+ <HomePage />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,9 @@
1
+ import { HomePage } from "@/features/home";
2
+
3
+ export default function App() {
4
+ return (
5
+ <div className="min-h-screen flex items-center justify-center bg-gray-50">
6
+ <HomePage />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/shared/components/ui";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">Welcome to Lumen</h1>
7
+ <p className="text-gray-600 mb-8">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Button } from "@/shared/components/ui";
2
+
3
+ export function HomePage() {
4
+ return (
5
+ <div className="text-center">
6
+ <h1 className="text-4xl font-bold text-gray-900 mb-4">Welcome to Lumen</h1>
7
+ <p className="text-gray-600 mb-8">
8
+ Your React + Vite project is ready. Start building!
9
+ </p>
10
+ <Button>Get Started</Button>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,21 @@
1
+ export function Button({
2
+ variant = "primary",
3
+ children,
4
+ className,
5
+ ...props
6
+ }) {
7
+ const base = "px-4 py-2 rounded-lg font-medium transition-colors";
8
+ const variants = {
9
+ primary: "bg-blue-600 text-white hover:bg-blue-700",
10
+ secondary: "bg-gray-200 text-gray-800 hover:bg-gray-300",
11
+ };
12
+
13
+ return (
14
+ <button
15
+ className={`${base} ${variants[variant]} ${className ?? ""}`}
16
+ {...props}
17
+ >
18
+ {children}
19
+ </button>
20
+ );
21
+ }
@@ -0,0 +1,26 @@
1
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
2
+ variant?: "primary" | "secondary";
3
+ children: React.ReactNode;
4
+ }
5
+
6
+ export function Button({
7
+ variant = "primary",
8
+ children,
9
+ className,
10
+ ...props
11
+ }: ButtonProps) {
12
+ const base = "px-4 py-2 rounded-lg font-medium transition-colors";
13
+ const variants = {
14
+ primary: "bg-blue-600 text-white hover:bg-blue-700",
15
+ secondary: "bg-gray-200 text-gray-800 hover:bg-gray-300",
16
+ };
17
+
18
+ return (
19
+ <button
20
+ className={`${base} ${variants[variant]} ${className ?? ""}`}
21
+ {...props}
22
+ >
23
+ {children}
24
+ </button>
25
+ );
26
+ }
@@ -15,4 +15,6 @@ body {
15
15
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
16
16
  sans-serif;
17
17
  line-height: 1.5;
18
+ background-color: var(--color-bg);
19
+ color: var(--color-fg);
18
20
  }
@@ -0,0 +1,19 @@
1
+ /* themes.css — vanilla CSS theme tokens
2
+ * Driven by the ThemeProvider (feat) / AppProvider (comp) via
3
+ * document.documentElement.dataset.theme.
4
+ */
5
+ :root {
6
+ --color-bg: #ffffff;
7
+ --color-fg: #111827;
8
+ --color-muted: #6b7280;
9
+ --color-primary: #6366f1;
10
+ --color-border: #e5e7eb;
11
+ }
12
+
13
+ :root[data-theme="dark"] {
14
+ --color-bg: #111827;
15
+ --color-fg: #f9fafb;
16
+ --color-muted: #9ca3af;
17
+ --color-primary: #818cf8;
18
+ --color-border: #374151;
19
+ }
@@ -0,0 +1,9 @@
1
+ /* themes.css — Tailwind v4 theme tokens
2
+ * Synced with ThemeProvider / AppProvider via
3
+ * document.documentElement.dataset.theme.
4
+ */
5
+ @custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
6
+
7
+ @theme {
8
+ --color-primary: #6366f1;
9
+ }
@@ -1 +0,0 @@
1
- export const API_BASE_URL = import.meta.env.VITE_API_URL || "http://localhost:3000";
@@ -1 +0,0 @@
1
- export const API_BASE_URL = import.meta.env.VITE_API_URL || "http://localhost:3000";
@@ -1,7 +0,0 @@
1
- export const ROUTES = {
2
- HOME: "/",
3
- ABOUT: "/about",
4
- LOGIN: "/login",
5
- DASHBOARD: "/dashboard",
6
- SETTINGS: "/settings",
7
- };
@@ -1,7 +0,0 @@
1
- export const ROUTES = {
2
- HOME: "/",
3
- ABOUT: "/about",
4
- LOGIN: "/login",
5
- DASHBOARD: "/dashboard",
6
- SETTINGS: "/settings",
7
- };
@@ -1,12 +0,0 @@
1
- import { useState } from "react";
2
- import { AppContext } from "./app-context";
3
-
4
- export function AppProvider({ children }) {
5
- const [theme, setTheme] = useState("light");
6
-
7
- return (
8
- <AppContext.Provider value={{ theme, setTheme }}>
9
- {children}
10
- </AppContext.Provider>
11
- );
12
- }
@@ -1,18 +0,0 @@
1
- import { useState, useEffect, type ReactNode } from "react";
2
- import { AppContext, type AppContextValue } from "./app-context";
3
-
4
- export function AppProvider({ children }: { children: ReactNode }) {
5
- const [theme, setTheme] = useState(() => localStorage.getItem("theme") ?? "light");
6
-
7
- useEffect(() => {
8
- localStorage.setItem("theme", theme);
9
- }, [theme]);
10
-
11
- const value: AppContextValue = { theme, setTheme };
12
-
13
- return (
14
- <AppContext.Provider value={value}>
15
- {children}
16
- </AppContext.Provider>
17
- );
18
- }
@@ -1,5 +0,0 @@
1
- import { createContext } from "react";
2
-
3
- // React Fast Refresh requires contexts to live in a separate file from
4
- // components, so the AppProvider component exports from AppContext.jsx.
5
- export const AppContext = createContext(null);
@@ -1 +0,0 @@
1
- export { useLocalStorage } from "./useLocalStorage";
@@ -1 +0,0 @@
1
- export { useLocalStorage } from "./useLocalStorage";
@@ -1 +0,0 @@
1
- export { MainLayout } from "./MainLayout";
@@ -1 +0,0 @@
1
- export { MainLayout } from "./MainLayout";
@@ -1,7 +0,0 @@
1
- body {
2
- margin: 0;
3
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
4
- sans-serif;
5
- -webkit-font-smoothing: antialiased;
6
- -moz-osx-font-smoothing: grayscale;
7
- }
@@ -1 +0,0 @@
1
- export { cn } from "./cn";
@@ -1 +0,0 @@
1
- export { cn } from "./cn";
@@ -1 +0,0 @@
1
- export const API_BASE_URL = import.meta.env.VITE_API_URL || "http://localhost:3000";
@@ -1 +0,0 @@
1
- export const API_BASE_URL = import.meta.env.VITE_API_URL || "http://localhost:3000";
@@ -1 +0,0 @@
1
- export { useLocalStorage } from "./useLocalStorage";
@@ -1 +0,0 @@
1
- export { useLocalStorage } from "./useLocalStorage";
@@ -1 +0,0 @@
1
- export { cn } from "./cn";
@@ -1 +0,0 @@
1
- export { cn } from "./cn";
@@ -1,19 +0,0 @@
1
- import axios from "axios";
2
- import { API_BASE_URL } from "@/config/constants";
3
-
4
- const api = axios.create({
5
- baseURL: API_BASE_URL,
6
- headers: {
7
- "Content-Type": "application/json",
8
- },
9
- });
10
-
11
- api.interceptors.request.use((config) => {
12
- const token = localStorage.getItem("access_token");
13
- if (token) {
14
- config.headers.Authorization = `Bearer ${token}`;
15
- }
16
- return config;
17
- });
18
-
19
- export default api;
@@ -1,19 +0,0 @@
1
- import axios from "axios";
2
- import { API_BASE_URL } from "@/config/constants";
3
-
4
- const api = axios.create({
5
- baseURL: API_BASE_URL,
6
- headers: {
7
- "Content-Type": "application/json",
8
- },
9
- });
10
-
11
- api.interceptors.request.use((config) => {
12
- const token = localStorage.getItem("access_token");
13
- if (token) {
14
- config.headers.Authorization = `Bearer ${token}`;
15
- }
16
- return config;
17
- });
18
-
19
- export default api;
@@ -1 +0,0 @@
1
- export { default as api } from "./axios";
@@ -1 +0,0 @@
1
- export { default as api } from "./axios";
@@ -1,19 +0,0 @@
1
- import axios from "axios";
2
- import { API_BASE_URL } from "@/config/constants";
3
-
4
- const api = axios.create({
5
- baseURL: API_BASE_URL,
6
- headers: {
7
- "Content-Type": "application/json",
8
- },
9
- });
10
-
11
- api.interceptors.request.use((config) => {
12
- const token = localStorage.getItem("access_token");
13
- if (token) {
14
- config.headers.Authorization = `Bearer ${token}`;
15
- }
16
- return config;
17
- });
18
-
19
- export default api;
@@ -1,19 +0,0 @@
1
- import axios from "axios";
2
- import { API_BASE_URL } from "@/config/constants";
3
-
4
- const api = axios.create({
5
- baseURL: API_BASE_URL,
6
- headers: {
7
- "Content-Type": "application/json",
8
- },
9
- });
10
-
11
- api.interceptors.request.use((config) => {
12
- const token = localStorage.getItem("access_token");
13
- if (token) {
14
- config.headers.Authorization = `Bearer ${token}`;
15
- }
16
- return config;
17
- });
18
-
19
- export default api;
@@ -1 +0,0 @@
1
- export { default as api } from "./axios";
@@ -1 +0,0 @@
1
- export { default as api } from "./axios";
@@ -1,27 +0,0 @@
1
- import { API_BASE_URL } from "@/config/constants";
2
-
3
- const apiClient = async (endpoint, options = {}) => {
4
- const token = localStorage.getItem("access_token");
5
-
6
- const headers = {
7
- "Content-Type": "application/json",
8
- ...options.headers,
9
- };
10
-
11
- if (token) {
12
- headers["Authorization"] = `Bearer ${token}`;
13
- }
14
-
15
- const response = await fetch(`${API_BASE_URL}${endpoint}`, {
16
- ...options,
17
- headers,
18
- });
19
-
20
- if (!response.ok) {
21
- throw new Error(`HTTP error! status: ${response.status}`);
22
- }
23
-
24
- return response.json();
25
- };
26
-
27
- export default apiClient;