create-saptarishi-starter 1.0.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.
- package/bin/index.js +71 -0
- package/package.json +25 -0
- package/template/AGENTS.md +5 -0
- package/template/CLAUDE.md +1 -0
- package/template/README.md +36 -0
- package/template/app/favicon.ico +0 -0
- package/template/app/forgot-password/page.tsx +100 -0
- package/template/app/globals.css +438 -0
- package/template/app/layout.tsx +31 -0
- package/template/app/loading.tsx +5 -0
- package/template/app/maintenance/page.tsx +72 -0
- package/template/app/not-authorized/page.tsx +39 -0
- package/template/app/not-found.tsx +32 -0
- package/template/app/page.tsx +163 -0
- package/template/app/reset-password/page.tsx +172 -0
- package/template/app/set-password/page.tsx +134 -0
- package/template/components/commoncomponents/action-confirmation-dialog.tsx +67 -0
- package/template/components/commoncomponents/daterange.tsx +75 -0
- package/template/components/commoncomponents/error-alert-dialog.tsx +57 -0
- package/template/components/commoncomponents/globalloader.tsx +18 -0
- package/template/components/commoncomponents/logout-confirmation-dialog.tsx +55 -0
- package/template/components/commoncomponents/react-day-picker.tsx +13 -0
- package/template/components/commoncomponents/system-assistance.tsx +153 -0
- package/template/components/commoncomponents/underconstruction.tsx +30 -0
- package/template/components/ui/accordion.tsx +66 -0
- package/template/components/ui/alert-dialog.tsx +157 -0
- package/template/components/ui/alert.tsx +66 -0
- package/template/components/ui/aspect-ratio.tsx +11 -0
- package/template/components/ui/avatar.tsx +109 -0
- package/template/components/ui/badge.tsx +48 -0
- package/template/components/ui/breadcrumb.tsx +109 -0
- package/template/components/ui/button-group.tsx +83 -0
- package/template/components/ui/button.tsx +65 -0
- package/template/components/ui/calendar.tsx +220 -0
- package/template/components/ui/card.tsx +146 -0
- package/template/components/ui/carousel.tsx +242 -0
- package/template/components/ui/chart.tsx +373 -0
- package/template/components/ui/checkbox.tsx +32 -0
- package/template/components/ui/collapsible.tsx +33 -0
- package/template/components/ui/combobox.tsx +310 -0
- package/template/components/ui/command.tsx +184 -0
- package/template/components/ui/context-menu.tsx +252 -0
- package/template/components/ui/dialog.tsx +158 -0
- package/template/components/ui/direction.tsx +22 -0
- package/template/components/ui/drawer.tsx +131 -0
- package/template/components/ui/dropdown-menu.tsx +257 -0
- package/template/components/ui/empty.tsx +104 -0
- package/template/components/ui/field.tsx +248 -0
- package/template/components/ui/hover-card.tsx +44 -0
- package/template/components/ui/input-group.tsx +170 -0
- package/template/components/ui/input-otp.tsx +77 -0
- package/template/components/ui/input.tsx +59 -0
- package/template/components/ui/item.tsx +193 -0
- package/template/components/ui/kbd.tsx +26 -0
- package/template/components/ui/label.tsx +27 -0
- package/template/components/ui/menubar.tsx +284 -0
- package/template/components/ui/multi-select-combobox.tsx +296 -0
- package/template/components/ui/native-select.tsx +56 -0
- package/template/components/ui/navigation-menu.tsx +167 -0
- package/template/components/ui/pagination.tsx +127 -0
- package/template/components/ui/popover.tsx +89 -0
- package/template/components/ui/progress.tsx +31 -0
- package/template/components/ui/radio-group.tsx +45 -0
- package/template/components/ui/resizable.tsx +50 -0
- package/template/components/ui/scroll-area.tsx +58 -0
- package/template/components/ui/select.tsx +190 -0
- package/template/components/ui/separator.tsx +28 -0
- package/template/components/ui/sheet.tsx +143 -0
- package/template/components/ui/sidebar.tsx +743 -0
- package/template/components/ui/skeleton.tsx +13 -0
- package/template/components/ui/slider.tsx +63 -0
- package/template/components/ui/sonner.tsx +40 -0
- package/template/components/ui/spinner.tsx +15 -0
- package/template/components/ui/switch.tsx +35 -0
- package/template/components/ui/table.tsx +157 -0
- package/template/components/ui/tabs.tsx +91 -0
- package/template/components/ui/textarea.tsx +18 -0
- package/template/components/ui/toggle-group.tsx +83 -0
- package/template/components/ui/toggle.tsx +47 -0
- package/template/components/ui/tooltip.tsx +57 -0
- package/template/components.json +25 -0
- package/template/eslint.config.mjs +18 -0
- package/template/hooks/use-mobile.ts +20 -0
- package/template/lib/utils.ts +6 -0
- package/template/lib/validators/forgot-password.ts +10 -0
- package/template/lib/validators/reset-password.ts +19 -0
- package/template/next.config.ts +7 -0
- package/template/package.json +45 -0
- package/template/postcss.config.mjs +7 -0
- package/template/public/error.svg +8 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/login.svg +199 -0
- package/template/public/next.svg +1 -0
- package/template/public/not-authorized.svg +23 -0
- package/template/public/not-found.svg +146 -0
- package/template/public/sap.png +0 -0
- package/template/public/saptarishi.png +0 -0
- package/template/public/sign.png +0 -0
- package/template/public/underconstruction.svg +86 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/tsconfig.json +34 -0
- package/template/types/dialog-types.ts +59 -0
- package/template/types/forgotpassword.ts +8 -0
- package/template/types/profile.ts +23 -0
package/bin/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { execSync } = require("child_process");
|
|
6
|
+
const inquirer = require("inquirer");
|
|
7
|
+
const chalk = require("chalk");
|
|
8
|
+
const ora = require("ora");
|
|
9
|
+
|
|
10
|
+
async function run() {
|
|
11
|
+
console.log(chalk.bold("\nSaptarishi Starter\n"));
|
|
12
|
+
|
|
13
|
+
let projectName = process.argv[2];
|
|
14
|
+
|
|
15
|
+
if (!projectName) {
|
|
16
|
+
const answer = await inquirer.prompt([
|
|
17
|
+
{
|
|
18
|
+
type: "input",
|
|
19
|
+
name: "name",
|
|
20
|
+
message: "Project name:",
|
|
21
|
+
default: "my-app",
|
|
22
|
+
},
|
|
23
|
+
]);
|
|
24
|
+
projectName = answer.name;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const isCurrentDir = projectName === ".";
|
|
28
|
+
const targetPath = isCurrentDir
|
|
29
|
+
? process.cwd()
|
|
30
|
+
: path.join(process.cwd(), projectName);
|
|
31
|
+
|
|
32
|
+
const templatePath = path.join(__dirname, "../template");
|
|
33
|
+
|
|
34
|
+
if (!isCurrentDir && fs.existsSync(targetPath)) {
|
|
35
|
+
console.log(chalk.red("Directory already exists"));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!isCurrentDir) {
|
|
40
|
+
fs.mkdirSync(targetPath);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const spinner = ora("Creating project...").start();
|
|
44
|
+
|
|
45
|
+
fs.cpSync(templatePath, targetPath, { recursive: true });
|
|
46
|
+
|
|
47
|
+
if (!isCurrentDir) {
|
|
48
|
+
const pkgPath = path.join(targetPath, "package.json");
|
|
49
|
+
if (fs.existsSync(pkgPath)) {
|
|
50
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
51
|
+
pkg.name = projectName;
|
|
52
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
spinner.text = "Installing dependencies...";
|
|
57
|
+
execSync("npm install", { cwd: targetPath, stdio: "ignore" });
|
|
58
|
+
|
|
59
|
+
spinner.succeed("Project created successfully");
|
|
60
|
+
|
|
61
|
+
console.log("\nNext steps:\n");
|
|
62
|
+
|
|
63
|
+
if (!isCurrentDir) {
|
|
64
|
+
console.log(` cd ${projectName}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
console.log(" npm run dev\n");
|
|
68
|
+
console.log("Application will be available at http://localhost:3000\n");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
run();
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-saptarishi-starter",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Next.js starter CLI by Sriram",
|
|
5
|
+
"bin": {
|
|
6
|
+
"create-saptarishi-starter": "bin/index.js"
|
|
7
|
+
},
|
|
8
|
+
"type": "commonjs",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"nextjs",
|
|
11
|
+
"starter",
|
|
12
|
+
"cli"
|
|
13
|
+
],
|
|
14
|
+
"author": "Sriram",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/Sriramgandrothu/create-saptarishi-starter.git"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"chalk": "^4.1.2",
|
|
22
|
+
"inquirer": "^8.2.7",
|
|
23
|
+
"ora": "^5.4.1"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<!-- BEGIN:nextjs-agent-rules -->
|
|
2
|
+
# This is NOT the Next.js you know
|
|
3
|
+
|
|
4
|
+
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
|
|
5
|
+
<!-- END:nextjs-agent-rules -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](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 our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
|
Binary file
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import Image from "next/image";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { useRouter } from "next/navigation";
|
|
6
|
+
import { Button } from "@/components/ui/button";
|
|
7
|
+
import { Input } from "@/components/ui/input";
|
|
8
|
+
|
|
9
|
+
import { forgotPasswordSchema } from "@/lib/validators/forgot-password";
|
|
10
|
+
import type { ForgotPasswordForm } from "@/types/forgotpassword";
|
|
11
|
+
|
|
12
|
+
export default function ForgotPasswordPage() {
|
|
13
|
+
const router = useRouter();
|
|
14
|
+
|
|
15
|
+
const [form, setForm] = useState<ForgotPasswordForm>({ email: "" });
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
const [message, setMessage] = useState("");
|
|
18
|
+
const [error, setError] = useState("");
|
|
19
|
+
|
|
20
|
+
const submit = async () => {
|
|
21
|
+
setMessage("");
|
|
22
|
+
setError("");
|
|
23
|
+
|
|
24
|
+
const parsed = forgotPasswordSchema.safeParse(form);
|
|
25
|
+
|
|
26
|
+
if (!parsed.success) {
|
|
27
|
+
setError(parsed.error.issues[0].message);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
setLoading(true);
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
setMessage(
|
|
35
|
+
"If this email is registered, you will receive a password reset link shortly.",
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
setForm({ email: "" });
|
|
39
|
+
} catch {
|
|
40
|
+
setError("Network error. Please try again.");
|
|
41
|
+
} finally {
|
|
42
|
+
setLoading(false);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<div className="min-h-screen flex items-center justify-center px-4 sm:px-6">
|
|
48
|
+
<Button
|
|
49
|
+
variant="ghost"
|
|
50
|
+
onClick={() => router.back()}
|
|
51
|
+
className="absolute top-3 left-3 sm:top-4 sm:left-4"
|
|
52
|
+
>
|
|
53
|
+
← Back
|
|
54
|
+
</Button>
|
|
55
|
+
|
|
56
|
+
<div className="w-full max-w-md space-y-4 bg-white/0">
|
|
57
|
+
<div className="flex justify-center mt-6 sm:mt-8">
|
|
58
|
+
<Image
|
|
59
|
+
src="/saptarishi.png"
|
|
60
|
+
alt="Saptarishi"
|
|
61
|
+
width={100}
|
|
62
|
+
height={50}
|
|
63
|
+
priority
|
|
64
|
+
className="h-auto w-24 sm:w-28 md:w-32"
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<h2 className="mt-4 sm:mt-5 text-xl font-semibold text-center sm:text-left">
|
|
69
|
+
Forgot Password
|
|
70
|
+
</h2>
|
|
71
|
+
|
|
72
|
+
{message && (
|
|
73
|
+
<div className="bg-green-100 text-green-700 text-sm p-3 rounded-lg">
|
|
74
|
+
{message}
|
|
75
|
+
</div>
|
|
76
|
+
)}
|
|
77
|
+
|
|
78
|
+
{error && (
|
|
79
|
+
<div className="bg-red-100 text-red-700 text-sm p-3 rounded-lg">
|
|
80
|
+
{error}
|
|
81
|
+
</div>
|
|
82
|
+
)}
|
|
83
|
+
|
|
84
|
+
<Input
|
|
85
|
+
placeholder="Enter your registered email"
|
|
86
|
+
value={form.email}
|
|
87
|
+
onChange={(e) => setForm({ ...form, email: e.target.value })}
|
|
88
|
+
/>
|
|
89
|
+
|
|
90
|
+
<Button
|
|
91
|
+
onClick={submit}
|
|
92
|
+
disabled={loading}
|
|
93
|
+
className="bg-blue-600 hover:bg-blue-500 block sm:mx-0 mx-auto"
|
|
94
|
+
>
|
|
95
|
+
{loading ? "Sending..." : "Send Reset Link"}
|
|
96
|
+
</Button>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@custom-variant dark (&:is(.dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--color-background: var(--background);
|
|
8
|
+
--color-foreground: var(--foreground);
|
|
9
|
+
--font-sans: var(--font-poppins);
|
|
10
|
+
--font-mono: var(--font-poppins);
|
|
11
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
12
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
13
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
14
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
15
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
16
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
17
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
18
|
+
--color-sidebar: var(--sidebar);
|
|
19
|
+
--color-chart-5: var(--chart-5);
|
|
20
|
+
--color-chart-4: var(--chart-4);
|
|
21
|
+
--color-chart-3: var(--chart-3);
|
|
22
|
+
--color-chart-2: var(--chart-2);
|
|
23
|
+
--color-chart-1: var(--chart-1);
|
|
24
|
+
--color-ring: var(--ring);
|
|
25
|
+
--color-input: var(--input);
|
|
26
|
+
--color-border: var(--border);
|
|
27
|
+
--color-destructive: var(--destructive);
|
|
28
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
29
|
+
--color-accent: var(--accent);
|
|
30
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
31
|
+
--color-muted: var(--muted);
|
|
32
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
33
|
+
--color-secondary: var(--secondary);
|
|
34
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
35
|
+
--color-primary: var(--primary);
|
|
36
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
37
|
+
--color-popover: var(--popover);
|
|
38
|
+
--color-card-foreground: var(--card-foreground);
|
|
39
|
+
--color-card: var(--card);
|
|
40
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
41
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
42
|
+
--radius-lg: var(--radius);
|
|
43
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
44
|
+
--radius-2xl: calc(var(--radius) + 8px);
|
|
45
|
+
--radius-3xl: calc(var(--radius) + 12px);
|
|
46
|
+
--radius-4xl: calc(var(--radius) + 16px);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:root {
|
|
50
|
+
--radius: 0.625rem;
|
|
51
|
+
--background: oklch(1 0 0);
|
|
52
|
+
--foreground: oklch(0.129 0.042 264.695);
|
|
53
|
+
--card: oklch(1 0 0);
|
|
54
|
+
--card-foreground: oklch(0.129 0.042 264.695);
|
|
55
|
+
--popover: oklch(1 0 0);
|
|
56
|
+
--popover-foreground: oklch(0.129 0.042 264.695);
|
|
57
|
+
--primary: oklch(0.208 0.042 265.755);
|
|
58
|
+
--primary-foreground: oklch(0.984 0.003 247.858);
|
|
59
|
+
--secondary: oklch(0.968 0.007 247.896);
|
|
60
|
+
--secondary-foreground: oklch(0.208 0.042 265.755);
|
|
61
|
+
--muted: oklch(0.968 0.007 247.896);
|
|
62
|
+
--muted-foreground: oklch(0.554 0.046 257.417);
|
|
63
|
+
--accent: oklch(0.968 0.007 247.896);
|
|
64
|
+
--accent-foreground: oklch(0.208 0.042 265.755);
|
|
65
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
66
|
+
--border: oklch(0.929 0.013 255.508);
|
|
67
|
+
--input: oklch(0.929 0.013 255.508);
|
|
68
|
+
--ring: oklch(0.704 0.04 256.788);
|
|
69
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
70
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
71
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
72
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
73
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
74
|
+
--sidebar: oklch(0.984 0.003 247.858);
|
|
75
|
+
--sidebar-foreground: oklch(0.129 0.042 264.695);
|
|
76
|
+
--sidebar-primary: oklch(0.208 0.042 265.755);
|
|
77
|
+
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
|
|
78
|
+
--sidebar-accent: oklch(0.968 0.007 247.896);
|
|
79
|
+
--sidebar-accent-foreground: oklch(0.208 0.042 265.755);
|
|
80
|
+
--sidebar-border: oklch(0.929 0.013 255.508);
|
|
81
|
+
--sidebar-ring: oklch(0.704 0.04 256.788);
|
|
82
|
+
--app-font: var(--font-poppins);
|
|
83
|
+
--app-font-size: 100%;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.dark {
|
|
87
|
+
--background: oklch(0.129 0.042 264.695);
|
|
88
|
+
--foreground: oklch(0.984 0.003 247.858);
|
|
89
|
+
--card: oklch(0.208 0.042 265.755);
|
|
90
|
+
--card-foreground: oklch(0.984 0.003 247.858);
|
|
91
|
+
--popover: oklch(0.208 0.042 265.755);
|
|
92
|
+
--popover-foreground: oklch(0.984 0.003 247.858);
|
|
93
|
+
--primary: oklch(0.929 0.013 255.508);
|
|
94
|
+
--primary-foreground: oklch(0.208 0.042 265.755);
|
|
95
|
+
--secondary: oklch(0.279 0.041 260.031);
|
|
96
|
+
--secondary-foreground: oklch(0.984 0.003 247.858);
|
|
97
|
+
--muted: oklch(0.279 0.041 260.031);
|
|
98
|
+
--muted-foreground: oklch(0.704 0.04 256.788);
|
|
99
|
+
--accent: oklch(0.279 0.041 260.031);
|
|
100
|
+
--accent-foreground: oklch(0.984 0.003 247.858);
|
|
101
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
102
|
+
--border: oklch(1 0 0 / 10%);
|
|
103
|
+
--input: oklch(1 0 0 / 15%);
|
|
104
|
+
--ring: oklch(0.551 0.027 264.364);
|
|
105
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
106
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
107
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
108
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
109
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
110
|
+
--sidebar: oklch(0.208 0.042 265.755);
|
|
111
|
+
--sidebar-foreground: oklch(0.984 0.003 247.858);
|
|
112
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
113
|
+
--sidebar-primary-foreground: oklch(0.984 0.003 247.858);
|
|
114
|
+
--sidebar-accent: oklch(0.279 0.041 260.031);
|
|
115
|
+
--sidebar-accent-foreground: oklch(0.984 0.003 247.858);
|
|
116
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
117
|
+
--sidebar-ring: oklch(0.551 0.027 264.364);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@layer base {
|
|
121
|
+
* {
|
|
122
|
+
@apply border-border outline-ring/50;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
body {
|
|
126
|
+
@apply bg-background text-foreground;
|
|
127
|
+
font-family: var(--app-font);
|
|
128
|
+
transition: font-family 0.2s ease;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
html {
|
|
132
|
+
font-size: var(--app-font-size);
|
|
133
|
+
transition: font-size 0.2s ease;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@media (min-width: 1280px) {
|
|
137
|
+
html {
|
|
138
|
+
font-size: 90%;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.lost-root {
|
|
144
|
+
min-height: 100vh;
|
|
145
|
+
background: radial-gradient(circle at top, #f4f4f4 0%, #ededed 60%, #e6e6e6 100%);
|
|
146
|
+
display: flex;
|
|
147
|
+
align-items: center;
|
|
148
|
+
justify-content: center;
|
|
149
|
+
padding: 24px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.lost-container {
|
|
153
|
+
max-width: 720px;
|
|
154
|
+
width: 100%;
|
|
155
|
+
text-align: center;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.lost-illustration {
|
|
159
|
+
position: relative;
|
|
160
|
+
width: 100%;
|
|
161
|
+
height: min(360px, 70vw);
|
|
162
|
+
margin-bottom: 36px;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.lost-img {
|
|
166
|
+
object-fit: contain;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.lost-title {
|
|
170
|
+
font-family: var(--font-sans);
|
|
171
|
+
font-size: clamp(28px, 4vw, 36px);
|
|
172
|
+
font-weight: 600;
|
|
173
|
+
color: #111;
|
|
174
|
+
margin-bottom: 12px;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.lost-subtitle {
|
|
178
|
+
font-family: var(--font-sans);
|
|
179
|
+
font-size: 14px;
|
|
180
|
+
line-height: 1.6;
|
|
181
|
+
color: #6b6b6b;
|
|
182
|
+
margin-bottom: 28px;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.lost-button {
|
|
186
|
+
display: inline-flex;
|
|
187
|
+
align-items: center;
|
|
188
|
+
justify-content: center;
|
|
189
|
+
padding: 10px 22px;
|
|
190
|
+
border-radius: 999px;
|
|
191
|
+
background: #000;
|
|
192
|
+
color: #fff;
|
|
193
|
+
font-size: 13px;
|
|
194
|
+
font-weight: 500;
|
|
195
|
+
text-decoration: none;
|
|
196
|
+
transition: transform 0.15s ease, opacity 0.15s ease;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.lost-button:hover {
|
|
200
|
+
transform: translateY(-1px);
|
|
201
|
+
opacity: 0.9;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
@media (max-width: 480px) {
|
|
205
|
+
.lost-subtitle {
|
|
206
|
+
font-size: 13px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.lost-illustration {
|
|
210
|
+
height: 280px;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.error-root {
|
|
215
|
+
min-height: 100vh;
|
|
216
|
+
background: #ffffff;
|
|
217
|
+
display: flex;
|
|
218
|
+
align-items: center;
|
|
219
|
+
justify-content: center;
|
|
220
|
+
position: relative;
|
|
221
|
+
padding: 24px;
|
|
222
|
+
overflow: hidden;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.error-container {
|
|
226
|
+
text-align: center;
|
|
227
|
+
max-width: 520px;
|
|
228
|
+
width: 100%;
|
|
229
|
+
z-index: 2;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.error-illustration {
|
|
233
|
+
position: relative;
|
|
234
|
+
width: 100%;
|
|
235
|
+
height: 200px;
|
|
236
|
+
margin-bottom: 28px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.error-img {
|
|
240
|
+
object-fit: contain;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.error-title {
|
|
244
|
+
font-family: var(--font-sans);
|
|
245
|
+
font-size: clamp(24px, 4vw, 32px);
|
|
246
|
+
font-weight: 700;
|
|
247
|
+
color: #3b0ca3;
|
|
248
|
+
margin-bottom: 12px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.error-subtitle {
|
|
252
|
+
font-family: var(--font-sans);
|
|
253
|
+
font-size: 14px;
|
|
254
|
+
line-height: 1.6;
|
|
255
|
+
color: #9a9a9a;
|
|
256
|
+
margin-bottom: 24px;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.error-button {
|
|
260
|
+
display: inline-flex;
|
|
261
|
+
align-items: center;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
padding: 10px 26px;
|
|
264
|
+
border-radius: 6px;
|
|
265
|
+
background: #3b0ca3;
|
|
266
|
+
color: #ffffff;
|
|
267
|
+
font-size: 13px;
|
|
268
|
+
font-weight: 500;
|
|
269
|
+
text-decoration: none;
|
|
270
|
+
transition: transform 0.15s ease, opacity 0.15s ease;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.error-button:hover {
|
|
274
|
+
transform: translateY(-1px);
|
|
275
|
+
opacity: 0.9;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.error-bg-icon {
|
|
279
|
+
position: absolute;
|
|
280
|
+
right: -20px;
|
|
281
|
+
bottom: 0px;
|
|
282
|
+
width: 160px;
|
|
283
|
+
height: 160px;
|
|
284
|
+
opacity: 1;
|
|
285
|
+
pointer-events: none;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.error-bg-img {
|
|
289
|
+
object-fit: contain;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
@media (max-width: 480px) {
|
|
293
|
+
.error-illustration {
|
|
294
|
+
height: 170px;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.error-bg-icon {
|
|
298
|
+
width: 140px;
|
|
299
|
+
height: 140px;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.breath {
|
|
304
|
+
animation: breath 2s ease-in-out infinite;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
@keyframes breath {
|
|
308
|
+
0% {
|
|
309
|
+
transform: scale(1);
|
|
310
|
+
opacity: 0.7;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
50% {
|
|
314
|
+
transform: scale(1.1);
|
|
315
|
+
opacity: 1;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
100% {
|
|
319
|
+
transform: scale(1);
|
|
320
|
+
opacity: 0.7;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.breath {
|
|
325
|
+
animation: breath 2s ease-in-out infinite;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@keyframes breath {
|
|
329
|
+
0% {
|
|
330
|
+
transform: scale(1);
|
|
331
|
+
opacity: 0.7;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
50% {
|
|
335
|
+
transform: scale(1.1);
|
|
336
|
+
opacity: 1;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
100% {
|
|
340
|
+
transform: scale(1);
|
|
341
|
+
opacity: 0.7;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
input[type="password"]::-ms-reveal,
|
|
346
|
+
input[type="password"]::-ms-clear {
|
|
347
|
+
display: none;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
@keyframes blob {
|
|
351
|
+
0% {
|
|
352
|
+
transform: translate(0px, 0px) scale(1);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
33% {
|
|
356
|
+
transform: translate(30px, -50px) scale(1.1);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
66% {
|
|
360
|
+
transform: translate(-20px, 20px) scale(0.9);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
100% {
|
|
364
|
+
transform: translate(0px, 0px) scale(1);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.animate-blob {
|
|
369
|
+
animation: blob 7s infinite;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.animation-delay-2000 {
|
|
373
|
+
animation-delay: 2s;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.animation-delay-4000 {
|
|
377
|
+
animation-delay: 4s;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.thin-scrollbar::-webkit-scrollbar {
|
|
381
|
+
width: 6px;
|
|
382
|
+
height: 4px;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
::-webkit-scrollbar {
|
|
386
|
+
width: 3px;
|
|
387
|
+
height: 3px;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
::-webkit-scrollbar-track {
|
|
391
|
+
border-radius: 100vh;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
::-webkit-scrollbar-thumb {
|
|
395
|
+
background: #7677f4;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
::-webkit-scrollbar-thumb:hover {
|
|
399
|
+
background: #7677f4;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.scrollbar::-webkit-scrollbar {
|
|
403
|
+
width: 3px;
|
|
404
|
+
height: 6px;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.custom-links a {
|
|
408
|
+
@apply text-primary;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.scrollbar::-webkit-scrollbar-track {
|
|
412
|
+
border-radius: 100vh;
|
|
413
|
+
background: #d6d7d8;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.scrollbar::-webkit-scrollbar-thumb {
|
|
417
|
+
background: #7677f4;
|
|
418
|
+
border-radius: 100vh;
|
|
419
|
+
border: 1px solid #7677f4;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.scrollbar::-webkit-scrollbar-thumb:hover {
|
|
423
|
+
background: #7677f4;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.scrollbar-hidden::-webkit-scrollbar {
|
|
427
|
+
display: none;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.scrollbar-hidden {
|
|
431
|
+
-ms-overflow-style: none;
|
|
432
|
+
scrollbar-width: none;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/* Marquee Hover */
|
|
436
|
+
.marquee-wrapper:hover .animate-marquee {
|
|
437
|
+
animation-play-state: paused;
|
|
438
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import { Poppins } from "next/font/google";
|
|
3
|
+
import "./globals.css";
|
|
4
|
+
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
5
|
+
import { Toaster } from "sonner";
|
|
6
|
+
|
|
7
|
+
const poppins = Poppins({
|
|
8
|
+
subsets: ["latin"],
|
|
9
|
+
weight: ["300", "400", "500", "600", "700"],
|
|
10
|
+
variable: "--font-poppins",
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const metadata: Metadata = {
|
|
14
|
+
title: "Saptarishi Solutions",
|
|
15
|
+
description: "Developed by Team SRS",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default function RootLayout({
|
|
19
|
+
children,
|
|
20
|
+
}: Readonly<{
|
|
21
|
+
children: React.ReactNode;
|
|
22
|
+
}>) {
|
|
23
|
+
return (
|
|
24
|
+
<html lang="en" className={`${poppins.variable} h-full antialiased`}>
|
|
25
|
+
<body className="min-h-full flex flex-col">
|
|
26
|
+
<TooltipProvider>{children}</TooltipProvider>
|
|
27
|
+
<Toaster richColors position="top-right" />
|
|
28
|
+
</body>
|
|
29
|
+
</html>
|
|
30
|
+
);
|
|
31
|
+
}
|