feat: update frontend configuration and add authentication flow

- Updated package.json to include new dependencies and modify scripts for Vite.
- Added postcss.config.js for Tailwind CSS and Autoprefixer integration.
- Created app.css to define Tailwind CSS styles and custom CSS variables.
- Modified +layout.svelte to import app.css and check authentication on mount.
- Updated +page.svelte to redirect users based on authentication status.
- Added login page with form handling for user authentication.
- Changed Svelte adapter to '@sveltejs/adapter-node' and added Vite preprocess.
- Created tailwind.config.js for Tailwind CSS configuration.
- Updated vite.config.ts to remove Tailwind CSS plugin as it's now handled in postcss.config.js.
This commit is contained in:
Yogesh Ojha
2026-01-24 15:11:14 +05:30
parent 77e93659d1
commit a2e3fd2e1e
10 changed files with 1169 additions and 615 deletions
+915 -603
View File
File diff suppressed because it is too large Load Diff
+7 -3
View File
@@ -4,7 +4,7 @@
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"dev": "vite dev --host",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''",
@@ -22,13 +22,14 @@
"@sveltejs/kit": "^2.49.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.1.17",
"@types/node": "^24",
"autoprefixer": "^10.4.23",
"clsx": "^2.1.1",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-svelte": "^3.13.1",
"globals": "^16.5.0",
"postcss": "^8.5.6",
"prettier": "^3.7.4",
"prettier-plugin-svelte": "^3.4.0",
"prettier-plugin-tailwindcss": "^0.7.2",
@@ -36,10 +37,13 @@
"svelte-check": "^4.3.4",
"tailwind-merge": "^3.4.0",
"tailwind-variants": "^3.2.2",
"tailwindcss": "^4.1.17",
"tailwindcss": "^3.4.19",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.48.1",
"vite": "^7.2.6"
},
"dependencies": {
"lucide-svelte": "^0.563.0"
}
}
+6
View File
@@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
};
+59
View File
@@ -0,0 +1,59 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 240 5.9% 10%;
--primary-foreground: 0 0% 98%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
--ring: 240 10% 3.9%;
--radius: 0.5rem;
}
.dark {
--background: 240 10% 3.9%;
--foreground: 0 0% 98%;
--card: 240 10% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 240 10% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 240 5.9% 10%;
--secondary: 240 3.7% 15.9%;
--secondary-foreground: 0 0% 98%;
--muted: 240 3.7% 15.9%;
--muted-foreground: 240 5% 64.9%;
--accent: 240 3.7% 15.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
--border: 240 3.7% 15.9%;
--input: 240 3.7% 15.9%;
--ring: 240 4.9% 83.9%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
}
+7 -3
View File
@@ -1,9 +1,13 @@
<script lang="ts">
import './layout.css';
import favicon from '$lib/assets/favicon.svg';
import '../app.css';
import { auth } from '$stores/auth.svelte';
import { onMount } from 'svelte';
let { children } = $props();
onMount(() => {
auth.checkAuth();
});
</script>
<svelte:head><link rel="icon" href={favicon} /></svelte:head>
{@render children()}
+18 -2
View File
@@ -1,2 +1,18 @@
<h1>Welcome to SvelteKit</h1>
<p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p>
<script lang="ts">
import { goto } from '$app/navigation';
import { auth } from '$stores/auth.svelte';
$effect(() => {
if (!auth.isLoading) {
if (auth.isAuthenticated) {
goto('/dashboard');
} else {
goto('/login');
}
}
});
</script>
<div class="min-h-screen flex items-center justify-center">
<p class="text-muted-foreground">Loading...</p>
</div>
+78
View File
@@ -0,0 +1,78 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { auth } from '$stores/auth.svelte';
import { Button, Input, Card, CardHeader, CardTitle, CardDescription, CardContent } from '$components/ui';
import { Radar } from 'lucide-svelte';
let username = $state('');
let password = $state('');
let error = $state('');
let isLoading = $state(false);
// Redirect if already authenticated
$effect(() => {
if (auth.isAuthenticated && !auth.isLoading) {
goto('/dashboard');
}
});
async function handleSubmit(e: SubmitEvent) {
e.preventDefault();
error = '';
isLoading = true;
const result = await auth.login(username, password);
if (result.success) {
goto('/dashboard');
} else {
error = result.error || 'Login failed';
}
isLoading = false;
}
</script>
<div class="min-h-screen flex items-center justify-center bg-background p-4">
<Card class="w-full max-w-md">
<CardHeader class="text-center">
<div class="flex justify-center mb-4">
<Radar class="h-12 w-12 text-primary" />
</div>
<CardTitle>Welcome Back</CardTitle>
<CardDescription>Sign in to your reNgine account</CardDescription>
</CardHeader>
<CardContent>
<form onsubmit={handleSubmit} class="space-y-4">
<div class="space-y-2">
<label for="username" class="text-sm font-medium">Username</label>
<Input
id="username"
type="text"
placeholder="username"
bind:value={username}
required
/>
</div>
<div class="space-y-2">
<label for="password" class="text-sm font-medium">Password</label>
<Input
id="password"
type="password"
placeholder="••••••••"
bind:value={password}
required
/>
</div>
{#if error}
<p class="text-sm text-destructive">{error}</p>
{/if}
<Button type="submit" class="w-full" disabled={isLoading}>
{isLoading ? 'Signing in...' : 'Sign In'}
</Button>
</form>
</CardContent>
</Card>
</div>
+5 -2
View File
@@ -1,6 +1,9 @@
import adapter from '@sveltejs/adapter-auto';
import adapter from '@sveltejs/adapter-node';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
preprocess: vitePreprocess(),
kit: {
adapter: adapter(),
alias: {
@@ -11,4 +14,4 @@ const config = {
}
};
export default config;
export default config;
+73
View File
@@ -0,0 +1,73 @@
import { fontFamily } from 'tailwindcss/defaultTheme';
/** @type {import('tailwindcss').Config} */
export default {
darkMode: ['class'],
content: ['./src/**/*.{html,js,svelte,ts}'],
safelist: ['dark'],
theme: {
container: {
center: true,
padding: '2rem',
screens: {
'2xl': '1400px'
}
},
extend: {
colors: {
border: 'hsl(var(--border) / <alpha-value>)',
input: 'hsl(var(--input) / <alpha-value>)',
ring: 'hsl(var(--ring) / <alpha-value>)',
background: 'hsl(var(--background) / <alpha-value>)',
foreground: 'hsl(var(--foreground) / <alpha-value>)',
primary: {
DEFAULT: 'hsl(var(--primary) / <alpha-value>)',
foreground: 'hsl(var(--primary-foreground) / <alpha-value>)'
},
secondary: {
DEFAULT: 'hsl(var(--secondary) / <alpha-value>)',
foreground: 'hsl(var(--secondary-foreground) / <alpha-value>)'
},
destructive: {
DEFAULT: 'hsl(var(--destructive) / <alpha-value>)',
foreground: 'hsl(var(--destructive-foreground) / <alpha-value>)'
},
muted: {
DEFAULT: 'hsl(var(--muted) / <alpha-value>)',
foreground: 'hsl(var(--muted-foreground) / <alpha-value>)'
},
accent: {
DEFAULT: 'hsl(var(--accent) / <alpha-value>)',
foreground: 'hsl(var(--accent-foreground) / <alpha-value>)'
},
popover: {
DEFAULT: 'hsl(var(--popover) / <alpha-value>)',
foreground: 'hsl(var(--popover-foreground) / <alpha-value>)'
},
card: {
DEFAULT: 'hsl(var(--card) / <alpha-value>)',
foreground: 'hsl(var(--card-foreground) / <alpha-value>)'
},
sidebar: {
DEFAULT: 'hsl(var(--sidebar-background))',
foreground: 'hsl(var(--sidebar-foreground))',
primary: 'hsl(var(--sidebar-primary))',
'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
accent: 'hsl(var(--sidebar-accent))',
'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
border: 'hsl(var(--sidebar-border))',
ring: 'hsl(var(--sidebar-ring))'
}
},
borderRadius: {
xl: 'calc(var(--radius) + 4px)',
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)'
},
fontFamily: {
sans: [...fontFamily.sans]
}
}
}
};
+1 -2
View File
@@ -1,9 +1,8 @@
import tailwindcss from '@tailwindcss/vite';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [tailwindcss(), sveltekit()],
plugins: [sveltekit()],
server: {
proxy: {
'/api': {