create-next-pro-cli 0.1.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 (106) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/CODE_OF_CONDUCT.md +33 -0
  3. package/CONTRIBUTING.md +44 -0
  4. package/FONCTIONALITY.md +25 -0
  5. package/README.md +292 -0
  6. package/bin.ts +2 -0
  7. package/bun.lock +27 -0
  8. package/create-next-pro-completion.sh +36 -0
  9. package/install.sh +18 -0
  10. package/package.json +32 -0
  11. package/public/logo.svg +76 -0
  12. package/src/index.ts +511 -0
  13. package/src/scaffold-dev.ts +89 -0
  14. package/src/scaffold.ts +70 -0
  15. package/templates/Component/Component.tsx +13 -0
  16. package/templates/Component/component.json +4 -0
  17. package/templates/Page/default.tsx +0 -0
  18. package/templates/Page/error.tsx +38 -0
  19. package/templates/Page/global-error.tsx +0 -0
  20. package/templates/Page/layout.tsx +0 -0
  21. package/templates/Page/loading.tsx +17 -0
  22. package/templates/Page/not-found.tsx +0 -0
  23. package/templates/Page/page-ui.tsx +22 -0
  24. package/templates/Page/page.json +4 -0
  25. package/templates/Page/page.tsx +24 -0
  26. package/templates/Page/route.ts +0 -0
  27. package/templates/Page/template.tsx +0 -0
  28. package/templates/Projects/default/README.md +36 -0
  29. package/templates/Projects/default/eslint.config.mjs +16 -0
  30. package/templates/Projects/default/messages/en/_global_ui.json +30 -0
  31. package/templates/Projects/default/messages/en/_home.json +4 -0
  32. package/templates/Projects/default/messages/en/dashboard.json +14 -0
  33. package/templates/Projects/default/messages/en/login.json +7 -0
  34. package/templates/Projects/default/messages/en/register.json +7 -0
  35. package/templates/Projects/default/messages/en/settings.json +4 -0
  36. package/templates/Projects/default/messages/en/user_info.json +4 -0
  37. package/templates/Projects/default/messages/en.ts +4 -0
  38. package/templates/Projects/default/messages/fr/_global_ui.json +30 -0
  39. package/templates/Projects/default/messages/fr/_home.json +4 -0
  40. package/templates/Projects/default/messages/fr/dashboard.json +14 -0
  41. package/templates/Projects/default/messages/fr/login.json +7 -0
  42. package/templates/Projects/default/messages/fr/register.json +7 -0
  43. package/templates/Projects/default/messages/fr/settings.json +4 -0
  44. package/templates/Projects/default/messages/fr/user_info.json +4 -0
  45. package/templates/Projects/default/messages/fr.ts +4 -0
  46. package/templates/Projects/default/messages/getMergedMessages.ts +31 -0
  47. package/templates/Projects/default/middleware.ts +11 -0
  48. package/templates/Projects/default/next.config.ts +12 -0
  49. package/templates/Projects/default/package.json +32 -0
  50. package/templates/Projects/default/postcss.config.mjs +5 -0
  51. package/templates/Projects/default/public/cnp-logo.ico +0 -0
  52. package/templates/Projects/default/public/cnp-logo.png +0 -0
  53. package/templates/Projects/default/public/cnp-logo.svg +76 -0
  54. package/templates/Projects/default/public/file.svg +1 -0
  55. package/templates/Projects/default/public/globe.svg +1 -0
  56. package/templates/Projects/default/public/next.svg +1 -0
  57. package/templates/Projects/default/public/vercel.svg +1 -0
  58. package/templates/Projects/default/public/window.svg +1 -0
  59. package/templates/Projects/default/src/app/[locale]/(public)/_home/loading.tsx +1 -0
  60. package/templates/Projects/default/src/app/[locale]/(public)/_home/page.tsx +16 -0
  61. package/templates/Projects/default/src/app/[locale]/(public)/layout.tsx +11 -0
  62. package/templates/Projects/default/src/app/[locale]/(public)/login/page.tsx +19 -0
  63. package/templates/Projects/default/src/app/[locale]/(public)/register/page.tsx +23 -0
  64. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/error.tsx +38 -0
  65. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/loading.tsx +17 -0
  66. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/page.tsx +12 -0
  67. package/templates/Projects/default/src/app/[locale]/(user)/layout.tsx +12 -0
  68. package/templates/Projects/default/src/app/[locale]/(user)/settings/loading.tsx +17 -0
  69. package/templates/Projects/default/src/app/[locale]/(user)/settings/page.tsx +12 -0
  70. package/templates/Projects/default/src/app/[locale]/(user)/user_info/loading.tsx +17 -0
  71. package/templates/Projects/default/src/app/[locale]/(user)/user_info/page.tsx +12 -0
  72. package/templates/Projects/default/src/app/[locale]/layout.tsx +32 -0
  73. package/templates/Projects/default/src/app/[locale]/loading.tsx +17 -0
  74. package/templates/Projects/default/src/app/[locale]/not-found.tsx +22 -0
  75. package/templates/Projects/default/src/app/[locale]/page.tsx +116 -0
  76. package/templates/Projects/default/src/app/api/auth/[...nextauth]/route.ts +81 -0
  77. package/templates/Projects/default/src/app/api/auth/[...nextauth].ts +0 -0
  78. package/templates/Projects/default/src/app/api/auth/post-login/route.ts +27 -0
  79. package/templates/Projects/default/src/app/api/me/route.ts +15 -0
  80. package/templates/Projects/default/src/app/favicon.ico +0 -0
  81. package/templates/Projects/default/src/app/layout.tsx +11 -0
  82. package/templates/Projects/default/src/app/not-found.tsx +17 -0
  83. package/templates/Projects/default/src/app/page.tsx +6 -0
  84. package/templates/Projects/default/src/app/sitemap.ts +27 -0
  85. package/templates/Projects/default/src/app/styles/globals.css +26 -0
  86. package/templates/Projects/default/src/app/ui/dashboard/MainDashboard.tsx +21 -0
  87. package/templates/Projects/default/src/app/ui/dashboard/StatsCard.tsx +14 -0
  88. package/templates/Projects/default/src/app/ui/dashboard/WelcomeCard.tsx +10 -0
  89. package/templates/Projects/default/src/auth.config.ts +0 -0
  90. package/templates/Projects/default/src/config.ts +4 -0
  91. package/templates/Projects/default/src/lib/auth/isConnected.ts +16 -0
  92. package/templates/Projects/default/src/lib/i18n/navigation.ts +19 -0
  93. package/templates/Projects/default/src/lib/i18n/request.ts +31 -0
  94. package/templates/Projects/default/src/lib/i18n/routing.ts +20 -0
  95. package/templates/Projects/default/src/ui/_global/BackButton.tsx +15 -0
  96. package/templates/Projects/default/src/ui/_global/GlobalHeader.tsx +34 -0
  97. package/templates/Projects/default/src/ui/_global/GlobalMain.tsx +15 -0
  98. package/templates/Projects/default/src/ui/_global/LocaleSwitcher.tsx +38 -0
  99. package/templates/Projects/default/src/ui/_global/PublicNav.tsx +30 -0
  100. package/templates/Projects/default/src/ui/_global/UserNav.tsx +32 -0
  101. package/templates/Projects/default/src/ui/dashboard/StatsCard.tsx +14 -0
  102. package/templates/Projects/default/src/ui/dashboard/WelcomeCard.tsx +10 -0
  103. package/templates/Projects/default/src/ui/dashboard/page.tsx +22 -0
  104. package/templates/Projects/default/tailwind.config.ts +1 -0
  105. package/templates/Projects/default/tsconfig.json +34 -0
  106. package/tsconfig.json +27 -0
@@ -0,0 +1,38 @@
1
+ // app/[locale]/template/error.tsx
2
+ "use client"; // Error boundaries must be Client Components
3
+
4
+ import { useEffect } from "react";
5
+
6
+ export default function Error({
7
+ error,
8
+ reset,
9
+ }: {
10
+ error: Error & { digest?: string };
11
+ reset: () => void;
12
+ }) {
13
+ useEffect(() => {
14
+ // Log the error to an error reporting service
15
+ console.error(error);
16
+ }, [error]);
17
+
18
+ return (
19
+ <div>
20
+ <h2>Something went wrong!</h2>
21
+ <button
22
+ onClick={
23
+ // Attempt to recover by trying to re-render the segment
24
+ () => reset()
25
+ }
26
+ >
27
+ Try again
28
+ </button>
29
+ </div>
30
+ );
31
+ }
32
+ // This page is used to handle errors in the application
33
+ // You can customize this page to display a user-friendly error message
34
+ // or redirect to a different page if needed
35
+ // This is part of the Next.js app directory structure and will be automatically used by Next.js
36
+ // when an error occurs in the application
37
+ // Make sure to handle errors gracefully to improve user experience
38
+ // You can also log errors or send them to an error tracking service
File without changes
File without changes
@@ -0,0 +1,17 @@
1
+ // app/[locale]/template/loading.tsx
2
+ "use client";
3
+
4
+ export default function Loading() {
5
+ return (
6
+ <div className="flex flex-col flex-1 items-center justify-center">
7
+ <p className="text-gray-500">Loading ...</p>
8
+ </div>
9
+ );
10
+ }
11
+ // This component is used to show a loading state while the page is being prepared
12
+ // You can customize it with a spinner, skeletons, or any loading UI you prefer
13
+ // It will be displayed when the page is loading, for example during data fetching or component rendering
14
+ // This is useful for providing feedback to users that something is happening in the background
15
+ // You can also use this to implement a more complex loading state with animations or placeholders
16
+ // Make sure to keep it lightweight to avoid blocking the main thread
17
+ // This component is part of the Next.js app directory structure and will be automatically used by Next.js
File without changes
@@ -0,0 +1,22 @@
1
+ ("");
2
+ import { useTranslations } from "next-intl";
3
+ import BackButton from "@/ui/_global/BackButton";
4
+ import WelcomeCard from "@/ui/dashboard/WelcomeCard";
5
+ import StatsCard from "@/ui/dashboard/StatsCard";
6
+
7
+ export default function Dashboard() {
8
+ const t = useTranslations("dashboard");
9
+ return (
10
+ <>
11
+ <div className="flex items-center justify-between mb-6">
12
+ <h1 className="text-2xl font-bold">{t("title")}</h1>
13
+ <BackButton />
14
+ </div>
15
+ <p className="text-muted mb-8">{t("description")}</p>
16
+ <section className="grid grid-cols-1 md:grid-cols-2 gap-6">
17
+ <WelcomeCard t={t} />
18
+ <StatsCard t={t} />
19
+ </section>
20
+ </>
21
+ );
22
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Page template",
3
+ "description": "Welcome to your page template"
4
+ }
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { useTranslations } from "next-intl";
3
+ import BackButton from "@/ui/_global/BackButton";
4
+
5
+ export default function templatePage() {
6
+ const t = useTranslations("template");
7
+ return (
8
+ <main className="py-8 px-4 max-w-3xl mx-auto">
9
+ <div className="flex items-center justify-between mb-6">
10
+ <h1 className="text-2xl font-bold">{t("title")}</h1>
11
+ <BackButton />
12
+ </div>
13
+ <p className="text-muted mb-8">{t("description")}</p>
14
+ <section className="grid grid-cols-1 md:grid-cols-2 gap-6"></section>
15
+ </main>
16
+ );
17
+ }
18
+ // This page is the main entry point for the page
19
+ // It uses the `useTranslations` hook to fetch localized strings
20
+ // The `t` function is used to get the translated strings for the page
21
+ // You can add more components or logic here to build your page
22
+ // This is part of the Next.js app directory structure
23
+ // It will be automatically rendered when the user navigates to the page
24
+ // Make sure to define the translations in your locale files
File without changes
File without changes
@@ -0,0 +1,36 @@
1
+ // README.mdThis is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-pro`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
+
3
+ ## Getting Started
4
+
5
+ First, run the development server:
6
+
7
+ ```bash
8
+ npm run dev
9
+ # or
10
+ yarn dev
11
+ # or
12
+ pnpm dev
13
+ # or
14
+ bun dev
15
+ ```
16
+
17
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+ You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+
21
+ This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
+
23
+ ## Learn More
24
+
25
+ To learn more about Next.js, take a look at the following resources:
26
+
27
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
+
30
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
+
32
+ ## Deploy on Vercel
33
+
34
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
+
36
+ Check out [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
@@ -0,0 +1,16 @@
1
+ import { dirname } from "path";
2
+ import { fileURLToPath } from "url";
3
+ import { FlatCompat } from "@eslint/eslintrc";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+
8
+ const compat = new FlatCompat({
9
+ baseDirectory: __dirname,
10
+ });
11
+
12
+ const eslintConfig = [
13
+ ...compat.extends("next/core-web-vitals", "next/typescript"),
14
+ ];
15
+
16
+ export default eslintConfig;
@@ -0,0 +1,30 @@
1
+ {
2
+ "public_nav": {
3
+ "links": {
4
+ "home": "Home",
5
+ "login": "Login",
6
+ "register": "Register",
7
+ "about": "About Us",
8
+ "contact": "Contact Us",
9
+ "privacy_policy": "Privacy Policy",
10
+ "terms_of_service": "Terms of Service",
11
+ "help": "Help",
12
+ "faq": "FAQ",
13
+ "blog": "Blog",
14
+ "careers": "Careers",
15
+ "support": "Support",
16
+ "language": "Language",
17
+ "dark_mode": "Dark Mode",
18
+ "light_mode": "Light Mode",
19
+ "search": "Search"
20
+ }
21
+ },
22
+ "user_nav": {
23
+ "links": {
24
+ "home": "Home",
25
+ "dashboard": "Dashboard",
26
+ "settings": "Settings",
27
+ "user_info": "User Information"
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Home",
3
+ "description": "Welcome to your homepage"
4
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "title": "Dashboard",
3
+ "description": "Overview of your account",
4
+ "widgets": {
5
+ "welcome": "Welcome to your dashboard!",
6
+ "description": "Here you can see an overview of the number of people who have signed up.",
7
+ "stats": {
8
+ "title": "Your Stats",
9
+ "views": "Views",
10
+ "likes": "Likes",
11
+ "comments": "Comments"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "title": "Connect",
3
+ "description": "Sign in to access your account.",
4
+ "login_with_google": "Login with Google",
5
+ "login_with_github": "Login with GitHub",
6
+ "login_with_email": "Login with Email"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "title": "Register",
3
+ "description": "Sign up to access your account.",
4
+ "register_with_google": "Register with Google",
5
+ "register_with_github": "Register with GitHub",
6
+ "register_with_email": "Register with Email"
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "User Settings",
3
+ "description": "View and edit your personal settings."
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "User Information",
3
+ "description": "View and edit your personal information."
4
+ }
@@ -0,0 +1,4 @@
1
+ import getMergedMessages from "./getMergedMessages";
2
+
3
+ const messages = await getMergedMessages(import.meta.url);
4
+ export default messages;
@@ -0,0 +1,30 @@
1
+ {
2
+ "public_nav": {
3
+ "links": {
4
+ "home": "Accueil",
5
+ "login": "Connexion",
6
+ "register": "S'inscrire",
7
+ "about": "À propos de nous",
8
+ "contact": "Nous contacter",
9
+ "privacy_policy": "Politique de confidentialité",
10
+ "terms_of_service": "Conditions d'utilisation",
11
+ "help": "Aide",
12
+ "faq": "FAQ",
13
+ "blog": "Blog",
14
+ "careers": "Carrières",
15
+ "support": "Support",
16
+ "language": "Langue",
17
+ "dark_mode": "Mode sombre",
18
+ "light_mode": "Mode clair",
19
+ "search": "Recherche"
20
+ }
21
+ },
22
+ "user_nav": {
23
+ "links": {
24
+ "home": "Accueil",
25
+ "dashboard": "Tableau de bord",
26
+ "settings": "Paramètres",
27
+ "user_info": "Informations sur l'utilisateur"
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Bienvenue sur notre site",
3
+ "description": "Commencez votre exploration dès maintenant."
4
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "title": "Tableau de bord",
3
+ "description": "Aperçu de votre compte",
4
+ "widgets": {
5
+ "welcome": "Bienvenue sur votre tableau de bord !",
6
+ "description": "Ici, vous pouvez voir un aperçu du nombre de personnes qui se sont inscrites.",
7
+ "stats": {
8
+ "title": "Vos statistiques",
9
+ "views": "Vues",
10
+ "likes": "J'aime",
11
+ "comments": "Commentaires"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "title": "Connexion",
3
+ "description": "Connectez-vous pour accéder à votre compte.",
4
+ "login_with_google": "Se connecter avec Google",
5
+ "login_with_github": "Se connecter avec GitHub",
6
+ "login_with_email": "Se connecter avec Email"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "title": "Inscription",
3
+ "description": "Inscrivez-vous pour accéder à votre compte.",
4
+ "register_with_google": "S'inscrire avec Google",
5
+ "register_with_github": "S'inscrire avec GitHub",
6
+ "register_with_email": "S'inscrire avec Email"
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Paramètres utilisateur",
3
+ "description": "Consultez et modifiez vos paramètres personnels."
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Informations utilisateur",
3
+ "description": "Consultez et modifiez vos informations personnelles."
4
+ }
@@ -0,0 +1,4 @@
1
+ import getMergedMessages from "./getMergedMessages";
2
+
3
+ const messages = await getMergedMessages(import.meta.url);
4
+ export default messages;
@@ -0,0 +1,31 @@
1
+ // lib/i18n/getMergedMessages.ts
2
+ import { readdir, readFile } from "fs/promises";
3
+ import { join, basename } from "path";
4
+
5
+ export default async function getMergedMessages(currentModuleFilename: string) {
6
+ const locale = basename(currentModuleFilename, ".ts");
7
+ const basePath = join(process.cwd(), "messages", locale);
8
+ const merged: Record<string, any> = {};
9
+
10
+ try {
11
+ const files = await readdir(basePath);
12
+ for (const file of files) {
13
+ if (file.endsWith(".json")) {
14
+ try {
15
+ const content = await readFile(join(basePath, file), "utf8");
16
+ const key = basename(file, ".json");
17
+ merged[key] = JSON.parse(content);
18
+ } catch (err) {
19
+ console.error(
20
+ `❌ Failed to read ${file} for locale '${locale}':`,
21
+ err
22
+ );
23
+ }
24
+ }
25
+ }
26
+ } catch (err) {
27
+ console.error(`❌ Failed to read directory '${basePath}':`, err);
28
+ }
29
+
30
+ return merged;
31
+ }
@@ -0,0 +1,11 @@
1
+ import createMiddleware from "next-intl/middleware";
2
+ import { routing } from "@/lib/i18n/routing";
3
+
4
+ export default createMiddleware(routing);
5
+
6
+ export const config = {
7
+ // Match all pathnames except for
8
+ // - … if they start with `/api`, `/trpc`, `/_next` or `/_vercel`
9
+ // - … the ones containing a dot (e.g. `favicon.ico`)
10
+ matcher: "/((?!api|trpc|_next|_vercel|.*\\..*).*)",
11
+ };
@@ -0,0 +1,12 @@
1
+ import { NextConfig } from "next";
2
+ import createNextIntlPlugin from "next-intl/plugin";
3
+
4
+ const nextConfig: NextConfig = {
5
+ /* devIndicators: {
6
+ buildActivity: true,
7
+ }, */
8
+ };
9
+
10
+ const withNextIntl = createNextIntlPlugin("./src/lib/i18n/request.ts");
11
+
12
+ export default withNextIntl(nextConfig);
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "my-next-app",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev --turbopack",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "cookie": "^1.0.2",
13
+ "jsonwebtoken": "^9.0.2",
14
+ "next": "15.4.5",
15
+ "next-auth": "^4.24.11",
16
+ "next-intl": "^4.3.4",
17
+ "react": "19.1.0",
18
+ "react-dom": "19.1.0"
19
+ },
20
+ "devDependencies": {
21
+ "@eslint/eslintrc": "^3",
22
+ "@tailwindcss/postcss": "^4",
23
+ "@types/jsonwebtoken": "^9.0.10",
24
+ "@types/node": "^20",
25
+ "@types/react": "^19",
26
+ "@types/react-dom": "^19",
27
+ "eslint": "^9",
28
+ "eslint-config-next": "15.4.5",
29
+ "tailwindcss": "^4",
30
+ "typescript": "^5"
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ plugins: ["@tailwindcss/postcss"],
3
+ };
4
+
5
+ export default config;
@@ -0,0 +1,76 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="112.24746mm"
6
+ height="112.24745mm"
7
+ viewBox="0 0 112.24746 112.24745"
8
+ version="1.1"
9
+ id="svg1484"
10
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
11
+ sodipodi:docname="cnp-logo.svg"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ xmlns:svg="http://www.w3.org/2000/svg">
16
+ <sodipodi:namedview
17
+ id="namedview1486"
18
+ pagecolor="#ffffff"
19
+ bordercolor="#000000"
20
+ borderopacity="0.25"
21
+ inkscape:showpageshadow="2"
22
+ inkscape:pageopacity="0.0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#d1d1d1"
25
+ inkscape:document-units="mm"
26
+ showgrid="false"
27
+ inkscape:zoom="0.76078844"
28
+ inkscape:cx="-1.3144259"
29
+ inkscape:cy="251.71255"
30
+ inkscape:window-width="1920"
31
+ inkscape:window-height="1007"
32
+ inkscape:window-x="0"
33
+ inkscape:window-y="0"
34
+ inkscape:window-maximized="1"
35
+ inkscape:current-layer="layer1" />
36
+ <defs
37
+ id="defs1481" />
38
+ <g
39
+ inkscape:label="Calque 1"
40
+ inkscape:groupmode="layer"
41
+ id="layer1"
42
+ transform="translate(-53.773225,-81.94302)">
43
+ <g
44
+ id="g1385"
45
+ transform="matrix(0.26458333,0,0,0.26458333,201.36845,241.5967)">
46
+ <rect
47
+ style="fill:#ffffff;stroke-width:0.895961;-inkscape-stroke:none;paint-order:stroke fill markers;stop-color:#000000"
48
+ id="rect1073"
49
+ width="300"
50
+ height="300"
51
+ x="370.79443"
52
+ y="-112.50255"
53
+ transform="rotate(-135.57968)" />
54
+ <path
55
+ d="m -241.8353,-300.88743 c -5.48362,-4.07465 -6.9802,-9.81191 -3.75252,-15.21916 2.06433,-3.38583 29.76875,-38.02867 42.69319,-53.38544 4.01322,-4.7685 7.29676,-8.931 7.29676,-9.25 0,-0.31901 -25.8382,-0.58001 -57.41821,-0.58001 -31.58002,0 -58.14666,-0.27953 -59.03699,-0.62118 -2.78999,-1.07062 -4.5448,-5.96651 -4.5448,-12.67994 0,-7.31726 1.38538,-12.16578 3.81988,-13.36871 0.92406,-0.45659 27.66212,-1.05517 59.41789,-1.33017 l 57.73777,-0.5 -7.19511,-8.5 -43.49499,-51.42428 c -3.1585,-5.39795 -0.32305,-12.74756 6.03088,-15.63234 8.80205,-3.99626 14.69126,-1.00858 23.00814,7.93888 l 83.67554,81.9993 -90.55578,92.40693 c -6.7551,6.89319 -14.20625,2.03185 -17.68165,0.14612 z"
56
+ style="fill:#000000"
57
+ id="path953-7"
58
+ sodipodi:nodetypes="ccssssssscccscccc" />
59
+ <path
60
+ d="m -288.79372,-297.36779 c -4.25765,-0.76506 -7.12135,-3.46831 -8.18755,-7.72897 -0.3601,-1.43864 -0.3179,-4.81015 0.079,-6.29963 0.6803,-2.55472 2.4806,-5.04059 4.5128,-6.23159 2.15975,-1.26571 5.72415,-1.74707 8.38285,-1.13211 3.5277,0.81595 6.2231,3.55787 7.2258,7.35053 0.4254,1.60884 0.4281,5.09577 0.01,6.68671 -0.9115,3.42883 -3.2396,5.93976 -6.427,6.9318 -1.4874,0.46292 -4.2192,0.66974 -5.5909,0.42326 z m 3.8337,-4.14317 c 1.4069,-0.41781 2.5839,-1.4751 3.2279,-2.89977 0.4382,-0.96936 0.5015,-1.43023 0.5015,-3.65334 0,-2.45698 -0.024,-2.59322 -0.7074,-3.98098 -1.124,-2.28309 -2.9392,-3.28336 -5.5317,-3.04827 -1.573,0.14263 -2.8367,0.82406 -3.7489,2.02149 -1.05265,1.38201 -1.39555,2.844 -1.29315,5.51422 0.073,1.9093 0.1696,2.40913 0.6377,3.30738 0.73805,1.41634 1.60785,2.20002 2.96035,2.66715 1.3874,0.47922 2.5137,0.49977 3.9537,0.0721 z m -136.05385,-6.65448 v -10.58162 h 2.286 2.2859 l 3.9436,5.8728 c 2.1689,3.23004 4.283,6.34867 4.6979,6.93029 l 0.7543,1.05749 v -6.93029 -6.93029 h 2.2222 2.2221 v 10.58162 10.58163 h -2.2801 -2.2802 l -4.1808,-6.08443 c -2.2994,-3.34644 -4.3663,-6.32253 -4.5932,-6.61352 -0.4113,-0.52767 -0.4124,-0.51145 -0.4171,6.08443 v 6.61352 h -2.328 -2.328 z m 22.4329,0 v -10.58162 h 6.7723 6.7722 v 2.01051 2.01051 h -4.5501 -4.5501 v 2.32795 2.32796 h 4.2327 4.2326 v 1.90022 1.90022 l -4.1796,0.0574 -4.1799,0.0574 v 2.29095 2.29094 l 4.5606,-0.0231 c 2.5083,-0.0127 4.6036,0.0194 4.6559,0.0713 0.053,0.0519 0.065,0.95989 0.027,2.01769 l -0.068,1.92328 h -6.863 -6.8631 z m 19.5992,5.26832 c 1.9233,-2.92232 3.4485,-5.43915 3.3896,-5.59296 -0.059,-0.15381 -1.5239,-2.40551 -3.2552,-5.00378 -1.7311,-2.59826 -3.2185,-4.84316 -3.3053,-4.98866 -0.1225,-0.20595 0.4308,-0.26454 2.4989,-0.26454 h 2.6563 l 2.1481,3.29335 2.148,3.29335 2.1391,-3.29249 2.139,-3.29249 2.4867,-8.5e-4 c 1.3676,-4.2e-4 2.4867,0.0491 2.4867,0.11016 0,0.061 -1.4505,2.32288 -3.2232,5.02627 -1.7727,2.70339 -3.2222,5.10572 -3.2211,5.33852 0,0.2328 1.5478,2.73271 3.4369,5.55535 l 3.435,5.13209 h -2.7219 -2.7219 l -2.2034,-3.3799 -2.2033,-3.3799 -2.2012,3.3799 -2.201,3.37989 h -2.6018 -2.6018 z m 23.9971,-3.25781 v -8.57111 h -3.2803 -3.2802 v -2.01051 -2.01051 h 8.677 8.6769 v 2.01051 2.01051 h -3.0688 -3.0685 v 8.57111 8.57112 h -2.328 -2.328 z m 20.3168,-2.03448 V -318.795 l 5.1321,0.095 c 5.9104,0.10938 6.7248,0.29611 8.5851,1.96861 1.5199,1.3665 2.0456,2.67293 2.0476,5.08907 0,1.72046 -0.064,2.04934 -0.6369,3.16845 -0.4285,0.83803 -0.9759,1.50374 -1.6645,2.02413 -1.5734,1.1892 -2.7676,1.50525 -6.1186,1.61948 l -2.9193,0.0995 0.062,3.57374 0.062,3.57375 -2.2752,-2.1e-4 -2.2749,-4.2e-4 z m 9.6753,-0.75271 c 1.0348,-0.49111 1.5394,-1.4045 1.5404,-2.78842 8e-4,-1.3177 -0.4053,-2.13039 -1.3506,-2.70146 -0.539,-0.32561 -1.0835,-0.39836 -2.9871,-0.39904 l -2.3279,-8.4e-4 -0.059,3.12158 -0.059,3.12158 h 2.2488 c 1.6621,0 2.4429,-0.0922 2.9935,-0.35342 z m 9.16,0.75556 v -10.60275 l 5.3438,0.088 c 6.0045,0.0988 6.8325,0.26882 8.575,1.76031 2.4332,2.08271 2.8625,6.44999 0.9003,9.15869 -0.5808,0.80172 -2.0013,2.01077 -2.5951,2.20871 -0.185,0.0616 2.3709,4.59169 4.2392,7.51366 l 0.3045,0.47617 h -2.6225 -2.6225 l -2.0049,-3.69722 -2.0048,-3.69722 -1.4285,-0.006 -1.4285,-0.006 v 3.70357 3.70356 h -2.328 -2.3279 v -10.60274 z m 9.9395,-0.98446 c 1.8999,-0.95844 2.0652,-4.11636 0.2768,-5.28849 -0.4401,-0.28841 -1.1309,-0.3893 -3.0643,-0.44755 l -2.4961,-0.0752 v 3.09096 3.09097 l 2.275,-4.3e-4 c 1.7447,-2.1e-4 2.4461,-0.0866 3.0086,-0.37035 z m -95.2273,-16.00809 c -4.6939,-1.04536 -7.4827,-5.11056 -7.4928,-10.92182 -0.01,-3.48792 0.7494,-5.81708 2.5284,-7.79577 2.9162,-3.24352 7.9231,-4.25831 12.5254,-2.53866 2.2651,0.8464 4.6574,3.8232 5.0511,6.28563 l 0.1398,0.87431 h -2.4508 -2.4511 l -0.4434,-1.00262 c -0.563,-1.27276 -1.1557,-1.91473 -2.2217,-2.40677 -1.0217,-0.4715 -3.3988,-0.53345 -4.3982,-0.11462 -2.8229,1.18296 -4.1612,5.0386 -3.2063,9.23707 0.5698,2.50541 2.0726,4.07677 4.2939,4.48988 2.5024,0.46538 4.6363,-0.44074 5.5449,-2.35455 l 0.511,-1.07615 h 2.3724 2.3724 l -0.3221,1.11107 c -0.678,2.33853 -2.5193,4.61258 -4.4301,5.47118 -2.2462,1.00933 -5.3971,1.30435 -7.9228,0.74182 z m 16.0839,-10.72245 v -10.80552 l 5.8728,0.0652 c 6.5826,0.073 6.909,0.13835 8.6776,1.73615 2.9123,2.63116 2.4256,8.46271 -0.8896,10.65865 -0.551,0.3649 -1.0955,0.69472 -1.21,0.73293 -0.1148,0.0382 0.7324,1.59079 1.8824,3.45018 1.1502,1.8594 2.3079,3.73785 2.5731,4.17434 l 0.4821,0.79362 h -2.7395 -2.7396 l -2.1982,-3.86229 -2.1981,-3.8623 h -1.4276 -1.4276 v 3.8623 3.86229 h -2.328 -2.328 z m 10.0239,-1.12607 c 1.167,-0.48764 1.616,-1.25901 1.616,-2.77687 0,-1.03212 -0.1001,-1.44523 -0.4589,-1.9018 -0.7358,-0.93542 -1.5879,-1.16687 -4.2961,-1.16687 h -2.4406 v 3.06867 3.06867 h 2.4406 c 1.5953,0 2.6824,-0.10106 3.139,-0.2918 z m 10.5045,1.03252 v -10.89908 h 7.0897 7.0897 v 2.00646 2.00646 l -4.7089,0.057 -4.7088,0.057 -0.06,2.38086 -0.06,2.38087 h 4.4512 4.4514 v 2.01051 2.01051 h -4.4443 -4.4444 v 2.32405 2.32406 l 4.9204,0.0568 4.9206,0.0568 0.061,2.06341 0.061,2.06342 h -7.3089 -7.3089 z m 17.1423,10.82775 c 0,-0.0466 1.3203,-3.64474 2.9341,-7.99584 1.6138,-4.3511 3.4011,-9.1791 3.9717,-10.72888 l 1.0374,-2.81778 h 2.8489 c 2.171,0 2.8687,0.0662 2.9315,0.27819 0.08,0.26867 7.4611,20.20771 7.764,20.97199 0.1391,0.35115 -0.029,0.37297 -2.4424,0.31745 l -2.5917,-0.0596 -0.7929,-2.22215 -0.7928,-2.22214 -4.2124,-0.0571 -4.2122,-0.0571 -0.7487,2.27928 -0.7488,2.27929 -2.4728,0.0596 c -1.3602,0.0328 -2.4729,0.0215 -2.4729,-0.0251 z m 12.1875,-12.57372 c -0.7291,-2.18246 -1.3729,-4.11096 -1.4306,-4.28556 -0.058,-0.1746 -0.7061,1.49201 -1.4411,3.70357 -0.7349,2.21156 -1.3799,4.14006 -1.4334,4.28556 -0.075,0.20339 0.5646,0.26454 2.7667,0.26454 h 2.864 z m 14.4782,3.75648 v -8.88857 h -3.2804 -3.2803 v -1.90469 -1.9047 h 8.8887 8.8885 v 1.89918 1.89919 l -3.2274,0.0584 -3.2274,0.0584 -0.055,8.83565 -0.055,8.83566 h -2.3256 -2.3257 z m 14.6027,-2.01051 v -10.89908 h 7.0896 7.0897 l 2e-4,2.06342 2e-4,2.06342 -4.7619,-0.0606 -4.7619,-0.0606 v 2.4415 2.4415 h 4.4443 4.4442 v 2.01051 2.01051 h -4.4442 -4.4443 v 2.32795 2.32796 h 4.9733 4.97335 v 2.11633 2.11632 h -7.30125 -7.3013 z"
61
+ style="fill:#000000;stroke-width:0.211633"
62
+ id="path996-5" />
63
+ <path
64
+ d="m -417.80895,-456.2471 c -2.6521,-2.65213 -3.143,-6.39063 -1.2929,-9.84753 0.6389,-1.19383 6.6372,-8.25175 13.3295,-15.68426 l 12.1679,-13.51366 -10.9444,-12 c -6.0194,-6.6 -11.7911,-13.35 -12.8258,-15 -2.2909,-3.65298 -2.4091,-7.31218 -0.3322,-10.27749 1.3695,-1.95515 2.4442,-2.22251 8.9338,-2.22251 h 7.3771 l 16.2884,17.48448 c 8.9586,9.61647 16.6336,18.41754 17.0554,19.55794 0.4614,1.24714 0.2016,3.34558 -0.6517,5.26552 -1.8905,4.25322 -30.9394,35.8639 -34.3663,37.39696 -1.4814,0.66269 -4.8513,1.22519 -7.4888,1.25 -3.7949,0.0357 -5.3076,-0.46707 -7.25,-2.40945 z m 69.78419,-38.2591 0.26125,-40.78635 h 9.64368 9.64368 l 15.85632,25.70167 c 8.72098,14.13592 16.20765,25.72342 16.63706,25.75 0.42941,0.0266 0.73782,-11.46302 0.68537,-25.53245 l -0.0954,-25.58078 9.06462,-0.34229 9.06463,-0.34229 v 40.95805 40.95806 l -10.12982,-0.28499 -10.12978,-0.28498 -15.12018,-23.18428 c -8.3161,-12.75136 -15.4728,-23.52897 -15.90377,-23.95026 -0.43097,-0.42128 -0.73612,10.01164 -0.67811,23.18428 l 0.10548,23.95026 -9.58314,0.28635 -9.58314,0.28635 z"
65
+ style="fill:#000000"
66
+ id="path1243" />
67
+ <rect
68
+ style="fill:#000000;stroke-width:0.797604;-inkscape-stroke:none;paint-order:stroke fill markers;stop-color:#000000"
69
+ id="rect1326"
70
+ width="159.32465"
71
+ height="11.760501"
72
+ x="-508.67618"
73
+ y="-398.26614" />
74
+ </g>
75
+ </g>
76
+ </svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
@@ -0,0 +1 @@
1
+ // app/[locale]/_main/loading.tsx
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { useTranslations } from "next-intl";
3
+ // import Test from "@/ui/_home/test/page";
4
+
5
+ export default function HomePage() {
6
+ const t = useTranslations("_home");
7
+ return (
8
+ <main className="py-8 px-4 max-w-3xl mx-auto">
9
+ {/* <Test /> */}
10
+ <div className="flex items-center justify-between mb-6">
11
+ <h1 className="text-2xl font-bold">{t("title")}</h1>
12
+ </div>
13
+ <p className="text-muted mt-2">{t("description")}</p>
14
+ </main>
15
+ );
16
+ }
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+
3
+ export default function PublicLayout({
4
+ children,
5
+ params,
6
+ }: {
7
+ children: React.ReactNode;
8
+ params: { locale: string };
9
+ }) {
10
+ return children;
11
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { useTranslations } from "next-intl";
3
+ import { signIn } from "next-auth/react";
4
+
5
+ export default function LoginPage() {
6
+ const t = useTranslations("login");
7
+ return (
8
+ <main className="py-8 px-4 max-w-3xl mx-auto">
9
+ <h1 className="text-2xl font-bold">{t("title")}</h1>
10
+ <p className="text-muted mt-2">{t("description")}</p>
11
+ <button
12
+ onClick={() => signIn("google")}
13
+ className="mt-6 w-full py-2 px-4 rounded bg-blue-600 text-white font-semibold hover:bg-blue-700 transition"
14
+ >
15
+ {t("login_with_google")}
16
+ </button>
17
+ </main>
18
+ );
19
+ }