prox-cli 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/bin/index.js +137 -0
  2. package/package.json +21 -0
  3. package/templates/next@14/.editorconfig +16 -0
  4. package/templates/next@14/.eslintrc.json +10 -0
  5. package/templates/next@14/.husky/pre-commit +1 -0
  6. package/templates/next@14/.prettierrc +14 -0
  7. package/templates/next@14/.yarnrc.yml +1 -0
  8. package/templates/next@14/README.md +36 -0
  9. package/templates/next@14/commitlint.config.js +0 -0
  10. package/templates/next@14/components.json +25 -0
  11. package/templates/next@14/cypress/e2e/spec.cy.ts +5 -0
  12. package/templates/next@14/cypress/fixtures/example.json +5 -0
  13. package/templates/next@14/cypress/support/commands.ts +37 -0
  14. package/templates/next@14/cypress/support/e2e.ts +17 -0
  15. package/templates/next@14/cypress.config.ts +9 -0
  16. package/templates/next@14/documentation/readme +1 -0
  17. package/templates/next@14/next.config.mjs +4 -0
  18. package/templates/next@14/package-lock.json +13597 -0
  19. package/templates/next@14/package.json +66 -0
  20. package/templates/next@14/postcss.config.mjs +8 -0
  21. package/templates/next@14/public/fonts/GeistMonoVF.woff +0 -0
  22. package/templates/next@14/public/fonts/GeistVF.woff +0 -0
  23. package/templates/next@14/public/images/global/proxy-logo.svg +1 -0
  24. package/templates/next@14/public/images/readme +1 -0
  25. package/templates/next@14/src/app/favicon.ico +0 -0
  26. package/templates/next@14/src/app/layout.tsx +24 -0
  27. package/templates/next@14/src/app/page.tsx +14 -0
  28. package/templates/next@14/src/components/layouts/readme +1 -0
  29. package/templates/next@14/src/components/providers/index.tsx +17 -0
  30. package/templates/next@14/src/components/providers/modules/readme +1 -0
  31. package/templates/next@14/src/components/shared/readme +1 -0
  32. package/templates/next@14/src/components/skeletons/readme +1 -0
  33. package/templates/next@14/src/components/ui/button.tsx +60 -0
  34. package/templates/next@14/src/components/ui/readme +1 -0
  35. package/templates/next@14/src/components/ui/svgs/npm.tsx +13 -0
  36. package/templates/next@14/src/components/ui/svgs/npmWordmark.tsx +12 -0
  37. package/templates/next@14/src/components/welcome-component.tsx +37 -0
  38. package/templates/next@14/src/configuration/readme +1 -0
  39. package/templates/next@14/src/fonts/index.ts +13 -0
  40. package/templates/next@14/src/i18n/messages/ar.json +0 -0
  41. package/templates/next@14/src/i18n/messages/en.json +0 -0
  42. package/templates/next@14/src/i18n/navigation.ts +6 -0
  43. package/templates/next@14/src/i18n/request.ts +17 -0
  44. package/templates/next@14/src/i18n/routing.ts +14 -0
  45. package/templates/next@14/src/lib/actions/readme +1 -0
  46. package/templates/next@14/src/lib/api/readme +1 -0
  47. package/templates/next@14/src/lib/constants/readme +1 -0
  48. package/templates/next@14/src/lib/context/readme +1 -0
  49. package/templates/next@14/src/lib/hooks/readme +1 -0
  50. package/templates/next@14/src/lib/schema/readme +1 -0
  51. package/templates/next@14/src/lib/seo/readme +1 -0
  52. package/templates/next@14/src/lib/storage/local.storage.ts +54 -0
  53. package/templates/next@14/src/lib/storage/session.storage.ts +54 -0
  54. package/templates/next@14/src/lib/types/readme +1 -0
  55. package/templates/next@14/src/lib/utils/cn.util.ts +6 -0
  56. package/templates/next@14/src/lib/utils.ts +6 -0
  57. package/templates/next@14/src/middleware.ts +19 -0
  58. package/templates/next@14/src/store/readme +1 -0
  59. package/templates/next@14/src/styles/globals.css +78 -0
  60. package/templates/next@14/src/tests/e2e.spec.tsx +9 -0
  61. package/templates/next@14/tailwind.config.ts +63 -0
  62. package/templates/next@14/tsconfig.json +37 -0
  63. package/templates/next@14/vitest.config.mts +10 -0
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "next14",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint",
10
+ "test": "vitest",
11
+ "cypress:open": "cypress open",
12
+ "prepare": "husky",
13
+ "commit": "cz"
14
+ },
15
+ "dependencies": {
16
+ "@radix-ui/react-slot": "^1.2.4",
17
+ "@tanstack/react-query": "5.90.12",
18
+ "class-variance-authority": "^0.7.1",
19
+ "clsx": "^2.1.1",
20
+ "lucide-react": "0.562.0",
21
+ "next": "14.2.35",
22
+ "next-auth": "4.24.13",
23
+ "next-intl": "4.6.1",
24
+ "react": "18",
25
+ "react-dom": "18",
26
+ "react-hook-form": "7.69.0",
27
+ "tailwind-merge": "^3.4.0",
28
+ "tailwindcss-animate": "1.0.7",
29
+ "zod": "4.2.1",
30
+ "zustand": "5.0.9"
31
+ },
32
+ "devDependencies": {
33
+ "@commitlint/cli": "20.2.0",
34
+ "@commitlint/config-conventional": "20.2.0",
35
+ "@hookform/devtools": "4.4.0",
36
+ "@tanstack/react-query-devtools": "5.91.1",
37
+ "@testing-library/dom": "10.4.1",
38
+ "@testing-library/react": "16.3.1",
39
+ "@trivago/prettier-plugin-sort-imports": "6.0.0",
40
+ "@types/jsdom": "27",
41
+ "@types/node": "20",
42
+ "@types/react": "18",
43
+ "@types/react-dom": "18",
44
+ "@vitejs/plugin-react": "5.1.2",
45
+ "commitizen": "^4.3.1",
46
+ "cypress": "15.8.1",
47
+ "cz-conventional-changelog": "^3.3.0",
48
+ "eslint": "8",
49
+ "eslint-config-next": "14.2.35",
50
+ "husky": "9.1.7",
51
+ "jsdom": "27.3.0",
52
+ "postcss": "8",
53
+ "prettier": "3.7.4",
54
+ "prettier-plugin-css-order": "2.1.2",
55
+ "prettier-plugin-tailwindcss": "0.7.2",
56
+ "tailwindcss": "3.4.1",
57
+ "typescript": "5",
58
+ "vite-tsconfig-paths": "6.0.3",
59
+ "vitest": "4.0.16"
60
+ },
61
+ "config": {
62
+ "commitizen": {
63
+ "path": "./node_modules/cz-conventional-changelog"
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,8 @@
1
+ /** @type {import('postcss-load-config').Config} */
2
+ const config = {
3
+ plugins: {
4
+ tailwindcss: {},
5
+ },
6
+ };
7
+
8
+ export default config;
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 255.92 72.3"><path d="M124.8,268.39v24.2h-5.4v-70h30.7c30.4,0,30.4,45.8,0,45.8Zm0-40.8v35.9h25.3c23.3,0,23.3-35.9,0-35.9Z" transform="translate(-119.4 -222.01)"/><path d="M241.15,292.88h-7.1l-24.2-26.5h-19.1v26.5h-5.4v-70h30.8c15.2,0,22.9,10.9,23,21.8.1,11.41-7.4,21.41-22.7,21.41Zm-50.4-31.6h24.8c12.2,0,17.6-6.9,17.7-16.7.1-8.21-5.5-16.71-17.1-16.71h-25.4Z" transform="translate(-119.4 -222.01)"/><path d="M315.65,258.21c-.1,18.4-11.8,36.11-35.3,36.11s-35.3-17.81-35.3-36.31c0-18.8,11.7-36,35.3-36S315.75,239.31,315.65,258.21Zm-65.3-.1c.1,15.8,10.1,31.21,30,31.21s30.1-15.41,30.1-31.21c0-16.2-10-31.1-30.1-31.1S250.25,241.61,250.35,258.11Z" transform="translate(-119.4 -222.01)"/><path d="M350.62,263.06l24.7,29.12v.09h-6.15l-21.72-26-21.72,26h-6.15v-.09l24.7-29.12,3.17-3.33Z" transform="translate(-119.4 -222.01)"/><path d="M344.28,251.54l-24.7-29.12v-.08h6.15l21.72,26,21.72-26h6.15v.08l-24.7,29.12-3.17,3.33Z" transform="translate(-119.4 -222.01)"/></svg>
@@ -0,0 +1 @@
1
+ this for put all images
@@ -0,0 +1,24 @@
1
+ import { geistSans, geistMono } from "@fonts";
2
+ import "@styles/globals.css";
3
+ import type { Metadata } from "next";
4
+ import { ReactNode } from "react";
5
+
6
+ export const metadata: Metadata = {
7
+ title: "Create Next App",
8
+ description: "Generated by create next app",
9
+ };
10
+
11
+ /**
12
+ * RootLayout is the root layout component for the application.
13
+ * It wraps all pages with the base HTML and body structure, and provides font and CSS classes.
14
+ *
15
+ * @param children - The React node(s) to render within the layout.
16
+ * @returns The root HTML layout for the app.
17
+ */
18
+ export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) {
19
+ return (
20
+ <html lang="en">
21
+ <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>{children}</body>
22
+ </html>
23
+ );
24
+ }
@@ -0,0 +1,14 @@
1
+ import WelcomeComponent from "@components/welcome-component";
2
+
3
+ /**
4
+ * HomePage
5
+ * The main landing page component for the application.
6
+ * Renders the community welcome section.
7
+ *
8
+ * @returns {JSX.Element} The homepage element.
9
+ */
10
+ export default function HomePage() {
11
+ return (
12
+ <WelcomeComponent />
13
+ );
14
+ }
@@ -0,0 +1 @@
1
+ this for put all folders layouts components as header, footer
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Root Provider component.
3
+ * Use this component to include all app-level providers (e.g. theme, auth, etc).
4
+ * Place any new providers here to ensure context is available throughout the app.
5
+ *
6
+ * Example:
7
+ * <ThemeProvider>
8
+ * <AuthProvider>
9
+ * {children}
10
+ * </AuthProvider>
11
+ * </ThemeProvider>
12
+ */
13
+ export default function RootProviders() {
14
+ return (
15
+ <div>index</div>
16
+ )
17
+ }
@@ -0,0 +1 @@
1
+ this for put all files components providers
@@ -0,0 +1 @@
1
+ this for put all files components shared or edit some components with your team
@@ -0,0 +1 @@
1
+ this for put all files components skeletons
@@ -0,0 +1,60 @@
1
+ import * as React from "react"
2
+ import { Slot } from "@radix-ui/react-slot"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils/cn.util"
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
13
+ destructive:
14
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
15
+ outline:
16
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
17
+ secondary:
18
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19
+ ghost:
20
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
21
+ link: "text-primary underline-offset-4 hover:underline",
22
+ },
23
+ size: {
24
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
25
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
26
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
27
+ icon: "size-9",
28
+ "icon-sm": "size-8",
29
+ "icon-lg": "size-10",
30
+ },
31
+ },
32
+ defaultVariants: {
33
+ variant: "default",
34
+ size: "default",
35
+ },
36
+ }
37
+ )
38
+
39
+ function Button({
40
+ className,
41
+ variant,
42
+ size,
43
+ asChild = false,
44
+ ...props
45
+ }: React.ComponentProps<"button"> &
46
+ VariantProps<typeof buttonVariants> & {
47
+ asChild?: boolean
48
+ }) {
49
+ const Comp = asChild ? Slot : "button"
50
+
51
+ return (
52
+ <Comp
53
+ data-slot="button"
54
+ className={cn(buttonVariants({ variant, size, className }))}
55
+ {...props}
56
+ />
57
+ )
58
+ }
59
+
60
+ export { Button, buttonVariants }
@@ -0,0 +1 @@
1
+ this for put all files components shadcn
@@ -0,0 +1,13 @@
1
+ import type { SVGProps } from "react";
2
+
3
+ const Npm = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg {...props} viewBox="0 0 2500 2500">
5
+ <path fill="#c00" d="M0 0h2500v2500H0z" />
6
+ <path
7
+ fill="#fff"
8
+ d="M1241.5 268.5h-973v1962.9h972.9V763.5h495v1467.9h495V268.5z"
9
+ />
10
+ </svg>
11
+ );
12
+
13
+ export { Npm };
@@ -0,0 +1,12 @@
1
+ import type { SVGProps } from "react";
2
+
3
+ const NpmWordmark = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg {...props} viewBox="0 0 128 128">
5
+ <path
6
+ fill="#cb3837"
7
+ d="M2 38.5h124v43.71H64v7.29H36.44v-7.29H2Zm6.89 36.43h13.78V53.07h6.89v21.86h6.89V45.79H8.89Zm34.44-29.14v36.42h13.78v-7.28h13.78V45.79Zm13.78 7.29H64v14.56h-6.89Zm20.67-7.29v29.14h13.78V53.07h6.89v21.86h6.89V53.07h6.89v21.86h6.89V45.79Z"
8
+ />
9
+ </svg>
10
+ );
11
+
12
+ export { NpmWordmark };
@@ -0,0 +1,37 @@
1
+ import { NpmWordmark } from "./ui/svgs/npmWordmark";
2
+ import { Button } from "@/components/ui/button";
3
+ import { cn } from "@/lib/utils/cn.util";
4
+ import { Github } from "lucide-react";
5
+
6
+ interface WelcomeComponentProps {
7
+ className?: string;
8
+ }
9
+
10
+ export default function WelcomeComponent({ className }: WelcomeComponentProps) {
11
+ return (
12
+ <section className={cn(className)}>
13
+ <div className="h-screen container mx-auto">
14
+ <div className="h-full flex flex-col items-center justify-center gap-5">
15
+ <img src="/images/global/proxy-logo.svg" alt="logo" width="200" height="100" />
16
+ <h2 className="text-center text-3xl font-semibold">
17
+ A CLI tool for fast and
18
+ <br />
19
+ <span className="text-muted-foreground/80">consistent project scaffolding</span>
20
+ </h2>
21
+ <div className="flex items-center gap-4">
22
+ <Button size="lg" variant="outline" asChild>
23
+ <a href="https://github.com/MahmoudKamel0/projectify-cli" target="_blank" className="size-10">
24
+ <Github />
25
+ </a>
26
+ </Button>
27
+ <Button size="lg" variant="outline" asChild>
28
+ <a href="https://shadcnblocks.com" target="_blank" className="size-10">
29
+ <NpmWordmark />
30
+ </a>
31
+ </Button>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </section>
36
+ );
37
+ }
@@ -0,0 +1 @@
1
+ this for put all files code configs etc (nextauth, ....)
@@ -0,0 +1,13 @@
1
+ import localFont from "next/font/local";
2
+
3
+ export const geistSans = localFont({
4
+ src: "../../public/fonts/GeistVF.woff",
5
+ variable: "--font-geist-sans",
6
+ weight: "100 900",
7
+ });
8
+
9
+ export const geistMono = localFont({
10
+ src: "../../public/fonts/GeistMonoVF.woff",
11
+ variable: "--font-geist-mono",
12
+ weight: "100 900",
13
+ });
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ import { routing } from "./routing";
2
+ import { createNavigation } from "next-intl/navigation";
3
+
4
+ // Lightweight wrappers around Next.js' navigation
5
+ // APIs that consider the routing configuration
6
+ export const { Link, redirect, usePathname, useRouter, getPathname } = createNavigation(routing);
@@ -0,0 +1,17 @@
1
+ import { routing } from "./routing";
2
+ import { hasLocale } from "next-intl";
3
+ import { getRequestConfig } from "next-intl/server";
4
+
5
+ export default getRequestConfig(async ({ requestLocale }) => {
6
+ // Get the requested locale
7
+ const requested = await requestLocale;
8
+ const locale = hasLocale(routing.locales, requested) ? requested : routing.defaultLocale;
9
+
10
+ // Define reusable flag for Arabic
11
+ const isArabic = locale === "ar";
12
+
13
+ return {
14
+ locale,
15
+ messages: (await import(`./messages/${locale}.json`)).default,
16
+ };
17
+ });
@@ -0,0 +1,14 @@
1
+ import { defineRouting } from "next-intl/routing";
2
+
3
+ export const routing = defineRouting({
4
+ // A list of all locales that are supported
5
+ locales: ["en", "ar"],
6
+
7
+ // Used when no locale matches
8
+ defaultLocale: "en",
9
+
10
+ // Map of pathnames to localized pathnames
11
+ pathnames: {
12
+ // TODO: write any pathnames
13
+ },
14
+ });
@@ -0,0 +1 @@
1
+ this for put all files server actions
@@ -0,0 +1 @@
1
+ this for put all files function handle apis
@@ -0,0 +1 @@
1
+ this for put all files constants
@@ -0,0 +1 @@
1
+ this for put all files context
@@ -0,0 +1 @@
1
+ this for put all files schema validations
@@ -0,0 +1 @@
1
+ this for put all files types
@@ -0,0 +1 @@
1
+ this for put all files seo
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Provides a set of utility methods for interacting with the browser's localStorage.
3
+ * The 'local' object includes methods for storing, retrieving, and managing data
4
+ * within local storage, ensuring values are handled with JSON serialization.
5
+ * All methods are immutable due to Object.freeze.
6
+ */
7
+ export const local = Object.freeze({
8
+ /**
9
+ * The number of key/value pairs currently present in the local storage.
10
+ */
11
+ length: localStorage.length,
12
+
13
+ /**
14
+ * Retrieves the parsed value associated with the given key from local storage.
15
+ * @param key - The key to retrieve the value for.
16
+ * @returns The parsed value, or null if the key does not exist.
17
+ */
18
+ get(key: string) {
19
+ return JSON.parse(localStorage.getItem(key) as string);
20
+ },
21
+
22
+ /**
23
+ * Stores a key/value pair in local storage. The value is stringified before storage.
24
+ * @param key - The key to set.
25
+ * @param value - The value to store (will be stringified).
26
+ */
27
+ set(key: string, value: unknown) {
28
+ return localStorage.setItem(key, JSON.stringify(value));
29
+ },
30
+
31
+ /**
32
+ * Removes the specified key and its associated value from local storage.
33
+ * @param key - The key to remove.
34
+ */
35
+ delete(key: string) {
36
+ return localStorage.removeItem(key);
37
+ },
38
+
39
+ /**
40
+ * Clears all key/value pairs from local storage.
41
+ */
42
+ drop() {
43
+ return localStorage.clear();
44
+ },
45
+
46
+ /**
47
+ * Returns the name of the key at the given position in local storage.
48
+ * @param index - The index of the key to retrieve.
49
+ * @returns The name of the key, or null if the index is out of bounds.
50
+ */
51
+ key(index: number) {
52
+ return localStorage.key(index);
53
+ },
54
+ });
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Provides a set of utility methods for interacting with the browser's sessionStorage.
3
+ * The 'session' object includes methods for storing, retrieving, and managing data
4
+ * within session storage, ensuring values are handled with JSON serialization.
5
+ * All methods are immutable due to Object.freeze.
6
+ */
7
+ export const session = Object.freeze({
8
+ /**
9
+ * The number of key/value pairs currently present in the session storage.
10
+ */
11
+ length: sessionStorage.length,
12
+
13
+ /**
14
+ * Retrieves the parsed value associated with the given key from session storage.
15
+ * @param key - The key to retrieve the value for.
16
+ * @returns The parsed value, or null if the key does not exist.
17
+ */
18
+ get(key: string) {
19
+ return JSON.parse(sessionStorage.getItem(key) as string);
20
+ },
21
+
22
+ /**
23
+ * Stores a key/value pair in session storage. The value is stringified before storage.
24
+ * @param key - The key to set.
25
+ * @param value - The value to store (will be stringified).
26
+ */
27
+ set(key: string, value: unknown) {
28
+ return sessionStorage.setItem(key, JSON.stringify(value));
29
+ },
30
+
31
+ /**
32
+ * Removes the specified key and its associated value from session storage.
33
+ * @param key - The key to remove.
34
+ */
35
+ delete(key: string) {
36
+ return sessionStorage.removeItem(key);
37
+ },
38
+
39
+ /**
40
+ * Clears all key/value pairs from session storage.
41
+ */
42
+ drop() {
43
+ return sessionStorage.clear();
44
+ },
45
+
46
+ /**
47
+ * Returns the name of the key at the given position in session storage.
48
+ * @param index - The index of the key to retrieve.
49
+ * @returns The name of the key, or null if the index is out of bounds.
50
+ */
51
+ key(index: number) {
52
+ return sessionStorage.key(index);
53
+ },
54
+ });
@@ -0,0 +1 @@
1
+ this for put all files types
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export const cn = (...inputs: ClassValue[]) => {
5
+ return twMerge(clsx(inputs));
6
+ };
@@ -0,0 +1,6 @@
1
+ import { type ClassValue, clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,19 @@
1
+ import { routing } from "@i18n/routing";
2
+ import createMiddleware from "next-intl/middleware";
3
+ import { NextRequest } from "next/server";
4
+
5
+ const intlMiddleware = createMiddleware(routing);
6
+ const PROTECTED_ROUTES = ["/wishlist", "/checkout", "/profile", "/dashboard"];
7
+
8
+ export default async function middleware(req: NextRequest) {
9
+ const { pathname } = req.nextUrl;
10
+
11
+ return intlMiddleware(req);
12
+ }
13
+
14
+ export const config = {
15
+ // Match all pathnames except for
16
+ // - … if they start with `/api`, `/trpc`, `/_next` or `/_vercel`
17
+ // - … the ones containing a dot (e.g. `favicon.ico`)
18
+ matcher: "/((?!api|trpc|_next|_vercel|.*\\..*).*)",
19
+ };
@@ -0,0 +1 @@
1
+ this for put all files store managements
@@ -0,0 +1,78 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer utilities {
6
+ .text-balance {
7
+ text-wrap: balance;
8
+ }
9
+ }
10
+
11
+
12
+
13
+ @layer base {
14
+ :root {
15
+ --background: 0 0% 100%;
16
+ --foreground: 0 0% 3.9%;
17
+ --card: 0 0% 100%;
18
+ --card-foreground: 0 0% 3.9%;
19
+ --popover: 0 0% 100%;
20
+ --popover-foreground: 0 0% 3.9%;
21
+ --primary: 0 0% 9%;
22
+ --primary-foreground: 0 0% 98%;
23
+ --secondary: 0 0% 96.1%;
24
+ --secondary-foreground: 0 0% 9%;
25
+ --muted: 0 0% 96.1%;
26
+ --muted-foreground: 0 0% 45.1%;
27
+ --accent: 0 0% 96.1%;
28
+ --accent-foreground: 0 0% 9%;
29
+ --destructive: 0 84.2% 60.2%;
30
+ --destructive-foreground: 0 0% 98%;
31
+ --border: 0 0% 89.8%;
32
+ --input: 0 0% 89.8%;
33
+ --ring: 0 0% 3.9%;
34
+ --chart-1: 12 76% 61%;
35
+ --chart-2: 173 58% 39%;
36
+ --chart-3: 197 37% 24%;
37
+ --chart-4: 43 74% 66%;
38
+ --chart-5: 27 87% 67%;
39
+ --radius: 0.5rem;
40
+ }
41
+ .dark {
42
+ --background: 0 0% 3.9%;
43
+ --foreground: 0 0% 98%;
44
+ --card: 0 0% 3.9%;
45
+ --card-foreground: 0 0% 98%;
46
+ --popover: 0 0% 3.9%;
47
+ --popover-foreground: 0 0% 98%;
48
+ --primary: 0 0% 98%;
49
+ --primary-foreground: 0 0% 9%;
50
+ --secondary: 0 0% 14.9%;
51
+ --secondary-foreground: 0 0% 98%;
52
+ --muted: 0 0% 14.9%;
53
+ --muted-foreground: 0 0% 63.9%;
54
+ --accent: 0 0% 14.9%;
55
+ --accent-foreground: 0 0% 98%;
56
+ --destructive: 0 62.8% 30.6%;
57
+ --destructive-foreground: 0 0% 98%;
58
+ --border: 0 0% 14.9%;
59
+ --input: 0 0% 14.9%;
60
+ --ring: 0 0% 83.1%;
61
+ --chart-1: 220 70% 50%;
62
+ --chart-2: 160 60% 45%;
63
+ --chart-3: 30 80% 55%;
64
+ --chart-4: 280 65% 60%;
65
+ --chart-5: 340 75% 55%;
66
+ }
67
+ }
68
+
69
+
70
+
71
+ @layer base {
72
+ * {
73
+ @apply border-border;
74
+ }
75
+ body {
76
+ @apply bg-background text-foreground;
77
+ }
78
+ }
@@ -0,0 +1,9 @@
1
+ import Home from "@app/page";
2
+ import { render, screen } from "@testing-library/react";
3
+ import { expect, test } from "vitest";
4
+
5
+ test("Page", () => {
6
+ render(<Home />);
7
+ // Replace "" with the test id you expect to be present in the component
8
+ expect(screen.getByTestId("home-page")).toBeDefined();
9
+ });