@dartix-software-solutions/create-fullstack-app 2.0.12 → 2.0.14

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 (84) hide show
  1. package/dist/backends/fastapi/templates/app/core/config.py.hbs +13 -13
  2. package/dist/backends/fastapi/templates/app/main.py.hbs +31 -31
  3. package/dist/backends/fastapi/templates/app/routers/health.py.hbs +8 -8
  4. package/dist/backends/fastapi/templates/app/routers/users.py.hbs +30 -30
  5. package/dist/backends/fastapi/templates/app/schemas/user.py.hbs +12 -12
  6. package/dist/backends/fastapi/templates/requirements.txt.hbs +6 -6
  7. package/dist/bin/create-fullstack-app.js +1 -1
  8. package/dist/{chunk-36CSXSDC.js → chunk-JQDTKR4K.js} +110 -43
  9. package/dist/databases/mongodb/templates/connection.ts.hbs +15 -15
  10. package/dist/databases/mongodb/templates/health-check.ts.hbs +11 -11
  11. package/dist/databases/mysql/templates/connection.ts.hbs +14 -14
  12. package/dist/databases/mysql/templates/health-check.ts.hbs +12 -12
  13. package/dist/databases/postgres/templates/connection.ts.hbs +14 -14
  14. package/dist/databases/postgres/templates/health-check.ts.hbs +12 -12
  15. package/dist/databases/redis/templates/connection.ts.hbs +14 -14
  16. package/dist/databases/redis/templates/health-check.ts.hbs +10 -10
  17. package/dist/databases/sqlite/templates/connection.ts.hbs +12 -12
  18. package/dist/databases/sqlite/templates/health-check.ts.hbs +10 -10
  19. package/dist/frontend-extras/react-table/templates/components/SampleTable.tsx.hbs +25 -25
  20. package/dist/frontend-extras/react-table/templates/data/sample-table-data.ts.hbs +4 -4
  21. package/dist/frontends/mobile/expo/templates/App.react-navigation.tsx.hbs +10 -10
  22. package/dist/frontends/mobile/expo/templates/app/(auth)/_layout.tsx.hbs +5 -5
  23. package/dist/frontends/mobile/expo/templates/app/(auth)/login.tsx.hbs +3 -3
  24. package/dist/frontends/mobile/expo/templates/app/(auth)/register.tsx.hbs +3 -3
  25. package/dist/frontends/mobile/expo/templates/app/(tabs)/_layout.tsx.hbs +11 -11
  26. package/dist/frontends/mobile/expo/templates/app/(tabs)/index.tsx.hbs +3 -3
  27. package/dist/frontends/mobile/expo/templates/app/(tabs)/profile.tsx.hbs +3 -3
  28. package/dist/frontends/mobile/expo/templates/app/(tabs)/settings.tsx.hbs +3 -3
  29. package/dist/frontends/mobile/expo/templates/app/+not-found.tsx.hbs +14 -14
  30. package/dist/frontends/mobile/expo/templates/app/_layout.tsx.hbs +11 -11
  31. package/dist/frontends/mobile/expo/templates/app/index.tsx.hbs +29 -29
  32. package/dist/frontends/mobile/expo/templates/types/router.ts.hbs +10 -10
  33. package/dist/frontends/mobile/react-native-cli/templates/app.json.hbs +4 -4
  34. package/dist/frontends/mobile/react-native-cli/templates/babel.config.js.hbs +14 -14
  35. package/dist/frontends/mobile/react-native-cli/templates/components/Avatar.tsx.hbs +29 -29
  36. package/dist/frontends/mobile/react-native-cli/templates/types/env.d.ts.hbs +3 -3
  37. package/dist/frontends/web/angular/templates/index.html.hbs +12 -12
  38. package/dist/frontends/web/angular/templates/main.ts.hbs +5 -5
  39. package/dist/frontends/web/angular/templates/pages/dashboard/dashboard.component.html.hbs +3 -3
  40. package/dist/frontends/web/angular/templates/pages/dashboard/dashboard.component.ts.hbs +10 -10
  41. package/dist/frontends/web/angular/templates/styles.css.hbs +11 -11
  42. package/dist/frontends/web/vue/templates/App.vue.hbs +9 -9
  43. package/dist/frontends/web/vue/templates/components/Layout.vue.hbs +17 -17
  44. package/dist/frontends/web/vue/templates/components/LoadingSpinner.vue.hbs +7 -7
  45. package/dist/frontends/web/vue/templates/components/Navbar.vue.hbs +24 -24
  46. package/dist/frontends/web/vue/templates/composables/useApi.ts.hbs +8 -8
  47. package/dist/frontends/web/vue/templates/composables/useAuth.ts.hbs +20 -20
  48. package/dist/frontends/web/vue/templates/env.d.ts.hbs +1 -1
  49. package/dist/frontends/web/vue/templates/index.html.hbs +12 -12
  50. package/dist/frontends/web/vue/templates/lib/config.ts.hbs +2 -2
  51. package/dist/frontends/web/vue/templates/main.ts.hbs +9 -9
  52. package/dist/frontends/web/vue/templates/pages/About.vue.hbs +6 -6
  53. package/dist/frontends/web/vue/templates/pages/Dashboard.vue.hbs +21 -21
  54. package/dist/frontends/web/vue/templates/pages/Home.vue.hbs +19 -19
  55. package/dist/frontends/web/vue/templates/pages/Login.vue.hbs +34 -34
  56. package/dist/frontends/web/vue/templates/pages/NotFound.vue.hbs +7 -7
  57. package/dist/frontends/web/vue/templates/router/index.ts.hbs +34 -34
  58. package/dist/frontends/web/vue/templates/stores/app.ts.hbs +8 -8
  59. package/dist/frontends/web/vue/templates/tsconfig.json.hbs +15 -15
  60. package/dist/frontends/web/vue/templates/vite.config.ts.hbs +6 -6
  61. package/dist/index.js +1 -1
  62. package/dist/orms/prisma/file-map.js +1 -0
  63. package/dist/orms/prisma/meta.js +5 -2
  64. package/dist/orms/prisma/templates/db-client.ts.hbs +10 -1
  65. package/dist/orms/prisma/templates/injection-module-import.hbs +1 -1
  66. package/dist/orms/prisma/templates/injection-module-register.hbs +1 -1
  67. package/dist/orms/prisma/templates/models/user.ts.hbs +3 -3
  68. package/dist/orms/prisma/templates/prisma.config.ts.hbs +12 -0
  69. package/dist/orms/prisma/templates/prisma.module.ts.hbs +9 -9
  70. package/dist/orms/prisma/templates/prisma.service.ts.hbs +24 -13
  71. package/dist/orms/prisma/templates/schema.prisma.hbs +0 -1
  72. package/dist/orms/prisma/templates/services/user.service.nestjs.ts.hbs +16 -16
  73. package/dist/orms/prisma/templates/services/user.service.ts.hbs +10 -10
  74. package/package.json +1 -1
  75. package/dist/plugins/devops/docker/templates/.dockerignore.hbs +0 -5
  76. package/dist/plugins/devops/gitlab-ci/templates/.gitlab-ci.yml.hbs +0 -14
  77. package/dist/plugins/devtools/eslint/templates/.eslintignore.hbs +0 -3
  78. package/dist/plugins/devtools/lint-staged/templates/.lintstagedrc.hbs +0 -5
  79. package/dist/plugins/devtools/prettier/templates/.prettierignore.hbs +0 -4
  80. package/dist/plugins/devtools/prettier/templates/.prettierrc.hbs +0 -6
  81. package/dist/plugins/mobile-navigation/expo-router/templates/.gitkeep +0 -0
  82. package/dist/plugins/testing/detox/templates/.detoxrc.js.hbs +0 -7
  83. package/dist/plugins/testing/maestro/templates/.maestro/home.yaml.hbs +0 -4
  84. package/dist/plugins/testing/maestro/templates/.maestro/login.yaml.hbs +0 -5
@@ -1,10 +1,10 @@
1
- import { getRedis } from './redis-connection.js';
2
-
3
- export async function checkRedisHealth(): Promise<boolean> {
4
- try {
5
- const pong = await getRedis().ping();
6
- return pong === 'PONG';
7
- } catch {
8
- return false;
9
- }
10
- }
1
+ import { getRedis } from './redis-connection.js';
2
+
3
+ export async function checkRedisHealth(): Promise<boolean> {
4
+ try {
5
+ const pong = await getRedis().ping();
6
+ return pong === 'PONG';
7
+ } catch {
8
+ return false;
9
+ }
10
+ }
@@ -1,12 +1,12 @@
1
- import Database from 'better-sqlite3';
2
-
3
- let db: Database.Database | null = null;
4
-
5
- export function getSqliteDatabase(): Database.Database {
6
- if (!db) {
7
- const fromEnv = process.env.SQLITE_PATH ?? process.env.DATABASE_URL?.replace(/^file:(\.\/)?/, '');
8
- const path = fromEnv || './dev.db';
9
- db = new Database(path);
10
- }
11
- return db;
12
- }
1
+ import Database from 'better-sqlite3';
2
+
3
+ let db: Database.Database | null = null;
4
+
5
+ export function getSqliteDatabase(): Database.Database {
6
+ if (!db) {
7
+ const fromEnv = process.env.SQLITE_PATH ?? process.env.DATABASE_URL?.replace(/^file:(\.\/)?/, '');
8
+ const path = fromEnv || './dev.db';
9
+ db = new Database(path);
10
+ }
11
+ return db;
12
+ }
@@ -1,10 +1,10 @@
1
- import { getSqliteDatabase } from './db-connection.js';
2
-
3
- export function checkSqliteHealth(): boolean {
4
- try {
5
- getSqliteDatabase().prepare('SELECT 1').get();
6
- return true;
7
- } catch {
8
- return false;
9
- }
10
- }
1
+ import { getSqliteDatabase } from './db-connection.js';
2
+
3
+ export function checkSqliteHealth(): boolean {
4
+ try {
5
+ getSqliteDatabase().prepare('SELECT 1').get();
6
+ return true;
7
+ } catch {
8
+ return false;
9
+ }
10
+ }
@@ -1,25 +1,25 @@
1
- import { useMemo } from 'react';
2
-
3
- type Row = { id: string; name: string; email: string };
4
-
5
- export function SampleTable({ rows }: { rows: Row[] }): JSX.Element {
6
- const data = useMemo(() => rows, [rows]);
7
- return (
8
- <table>
9
- <thead>
10
- <tr>
11
- <th>Name</th>
12
- <th>Email</th>
13
- </tr>
14
- </thead>
15
- <tbody>
16
- {data.map((row) => (
17
- <tr key={row.id}>
18
- <td>{row.name}</td>
19
- <td>{row.email}</td>
20
- </tr>
21
- ))}
22
- </tbody>
23
- </table>
24
- );
25
- }
1
+ import { useMemo } from 'react';
2
+
3
+ type Row = { id: string; name: string; email: string };
4
+
5
+ export function SampleTable({ rows }: { rows: Row[] }): JSX.Element {
6
+ const data = useMemo(() => rows, [rows]);
7
+ return (
8
+ <table>
9
+ <thead>
10
+ <tr>
11
+ <th>Name</th>
12
+ <th>Email</th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ {data.map((row) => (
17
+ <tr key={row.id}>
18
+ <td>{row.name}</td>
19
+ <td>{row.email}</td>
20
+ </tr>
21
+ ))}
22
+ </tbody>
23
+ </table>
24
+ );
25
+ }
@@ -1,4 +1,4 @@
1
- export const sampleTableData = [
2
- { id: '1', name: 'Alice', email: 'alice@example.com' },
3
- { id: '2', name: 'Bob', email: 'bob@example.com' },
4
- ];
1
+ export const sampleTableData = [
2
+ { id: '1', name: 'Alice', email: 'alice@example.com' },
3
+ { id: '2', name: 'Bob', email: 'bob@example.com' },
4
+ ];
@@ -1,10 +1,10 @@
1
- import { SafeAreaProvider } from 'react-native-safe-area-context';
2
- import RootNavigator from './src/navigation/RootNavigator';
3
-
4
- export default function App() {
5
- return (
6
- <SafeAreaProvider>
7
- <RootNavigator />
8
- </SafeAreaProvider>
9
- );
10
- }
1
+ import { SafeAreaProvider } from 'react-native-safe-area-context';
2
+ import RootNavigator from './src/navigation/RootNavigator';
3
+
4
+ export default function App() {
5
+ return (
6
+ <SafeAreaProvider>
7
+ <RootNavigator />
8
+ </SafeAreaProvider>
9
+ );
10
+ }
@@ -1,5 +1,5 @@
1
- import { Stack } from 'expo-router';
2
-
3
- export default function AuthLayout() {
4
- return <Stack screenOptions={{ headerShown: true }} />;
5
- }
1
+ import { Stack } from 'expo-router';
2
+
3
+ export default function AuthLayout() {
4
+ return <Stack screenOptions={{ headerShown: true }} />;
5
+ }
@@ -1,3 +1,3 @@
1
- import LoginScreen from '../../src/screens/LoginScreen';
2
-
3
- export default LoginScreen;
1
+ import LoginScreen from '../../src/screens/LoginScreen';
2
+
3
+ export default LoginScreen;
@@ -1,3 +1,3 @@
1
- import RegisterScreen from '../../src/screens/RegisterScreen';
2
-
3
- export default RegisterScreen;
1
+ import RegisterScreen from '../../src/screens/RegisterScreen';
2
+
3
+ export default RegisterScreen;
@@ -1,11 +1,11 @@
1
- import { Tabs } from 'expo-router';
2
-
3
- export default function TabsLayout() {
4
- return (
5
- <Tabs>
6
- <Tabs.Screen name="index" options={{ title: 'Home' }} />
7
- <Tabs.Screen name="profile" options={{ title: 'Profile' }} />
8
- <Tabs.Screen name="settings" options={{ title: 'Settings' }} />
9
- </Tabs>
10
- );
11
- }
1
+ import { Tabs } from 'expo-router';
2
+
3
+ export default function TabsLayout() {
4
+ return (
5
+ <Tabs>
6
+ <Tabs.Screen name="index" options={{ title: 'Home' }} />
7
+ <Tabs.Screen name="profile" options={{ title: 'Profile' }} />
8
+ <Tabs.Screen name="settings" options={{ title: 'Settings' }} />
9
+ </Tabs>
10
+ );
11
+ }
@@ -1,3 +1,3 @@
1
- import HomeScreen from '../../src/screens/HomeScreen';
2
-
3
- export default HomeScreen;
1
+ import HomeScreen from '../../src/screens/HomeScreen';
2
+
3
+ export default HomeScreen;
@@ -1,3 +1,3 @@
1
- import ProfileScreen from '../../src/screens/ProfileScreen';
2
-
3
- export default ProfileScreen;
1
+ import ProfileScreen from '../../src/screens/ProfileScreen';
2
+
3
+ export default ProfileScreen;
@@ -1,3 +1,3 @@
1
- import SettingsScreen from '../../src/screens/SettingsScreen';
2
-
3
- export default SettingsScreen;
1
+ import SettingsScreen from '../../src/screens/SettingsScreen';
2
+
3
+ export default SettingsScreen;
@@ -1,14 +1,14 @@
1
- import { Link, Stack } from 'expo-router';
2
- import { Text, View } from 'react-native';
3
-
4
- export default function NotFoundScreen() {
5
- return (
6
- <>
7
- <Stack.Screen options={{ title: 'Not found' }} />
8
- <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', gap: 8 }}>
9
- <Text>Screen not found.</Text>
10
- <Link href="/">Go home</Link>
11
- </View>
12
- </>
13
- );
14
- }
1
+ import { Link, Stack } from 'expo-router';
2
+ import { Text, View } from 'react-native';
3
+
4
+ export default function NotFoundScreen() {
5
+ return (
6
+ <>
7
+ <Stack.Screen options={{ title: 'Not found' }} />
8
+ <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', gap: 8 }}>
9
+ <Text>Screen not found.</Text>
10
+ <Link href="/">Go home</Link>
11
+ </View>
12
+ </>
13
+ );
14
+ }
@@ -1,11 +1,11 @@
1
- import { Stack } from 'expo-router';
2
- import { StatusBar } from 'expo-status-bar';
3
-
4
- export default function RootLayout() {
5
- return (
6
- <>
7
- <StatusBar style="auto" />
8
- <Stack screenOptions={{ headerShown: false }} />
9
- </>
10
- );
11
- }
1
+ import { Stack } from 'expo-router';
2
+ import { StatusBar } from 'expo-status-bar';
3
+
4
+ export default function RootLayout() {
5
+ return (
6
+ <>
7
+ <StatusBar style="auto" />
8
+ <Stack screenOptions={{ headerShown: false }} />
9
+ </>
10
+ );
11
+ }
@@ -1,29 +1,29 @@
1
- {{#if hasAuth}}
2
- import { ActivityIndicator, View } from 'react-native';
3
- import { Redirect } from 'expo-router';
4
- import { useAuth } from '../src/hooks/useAuth';
5
-
6
- export default function IndexScreen() {
7
- const { isReady, isAuthenticated } = useAuth();
8
-
9
- if (!isReady) {
10
- return (
11
- <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
12
- <ActivityIndicator size="large" />
13
- </View>
14
- );
15
- }
16
-
17
- if (!isAuthenticated) {
18
- return <Redirect href="/(auth)/login" />;
19
- }
20
-
21
- return <Redirect href="/(tabs)" />;
22
- }
23
- {{else}}
24
- import { Redirect } from 'expo-router';
25
-
26
- export default function IndexScreen() {
27
- return <Redirect href="/(tabs)" />;
28
- }
29
- {{/if}}
1
+ {{#if hasAuth}}
2
+ import { ActivityIndicator, View } from 'react-native';
3
+ import { Redirect } from 'expo-router';
4
+ import { useAuth } from '../src/hooks/useAuth';
5
+
6
+ export default function IndexScreen() {
7
+ const { isReady, isAuthenticated } = useAuth();
8
+
9
+ if (!isReady) {
10
+ return (
11
+ <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
12
+ <ActivityIndicator size="large" />
13
+ </View>
14
+ );
15
+ }
16
+
17
+ if (!isAuthenticated) {
18
+ return <Redirect href="/(auth)/login" />;
19
+ }
20
+
21
+ return <Redirect href="/(tabs)" />;
22
+ }
23
+ {{else}}
24
+ import { Redirect } from 'expo-router';
25
+
26
+ export default function IndexScreen() {
27
+ return <Redirect href="/(tabs)" />;
28
+ }
29
+ {{/if}}
@@ -1,10 +1,10 @@
1
- export type AppRoutes =
2
- | '/'
3
- | '/(tabs)'
4
- | '/(tabs)/profile'
5
- | '/(tabs)/settings'
6
- {{#if hasAuth}}
7
- | '/(auth)/login'
8
- | '/(auth)/register'
9
- {{/if}}
10
- ;
1
+ export type AppRoutes =
2
+ | '/'
3
+ | '/(tabs)'
4
+ | '/(tabs)/profile'
5
+ | '/(tabs)/settings'
6
+ {{#if hasAuth}}
7
+ | '/(auth)/login'
8
+ | '/(auth)/register'
9
+ {{/if}}
10
+ ;
@@ -1,4 +1,4 @@
1
- {
2
- "name": "{{camelCase projectName}}",
3
- "displayName": "{{projectName}}"
4
- }
1
+ {
2
+ "name": "{{camelCase projectName}}",
3
+ "displayName": "{{projectName}}"
4
+ }
@@ -1,14 +1,14 @@
1
- module.exports = {
2
- presets: ['module:@react-native/babel-preset'],
3
- plugins: [
4
- [
5
- 'module:react-native-dotenv',
6
- {
7
- moduleName: '@env',
8
- path: '.env',
9
- safe: false,
10
- allowUndefined: true,
11
- },
12
- ],
13
- ],
14
- };
1
+ module.exports = {
2
+ presets: ['module:@react-native/babel-preset'],
3
+ plugins: [
4
+ [
5
+ 'module:react-native-dotenv',
6
+ {
7
+ moduleName: '@env',
8
+ path: '.env',
9
+ safe: false,
10
+ allowUndefined: true,
11
+ },
12
+ ],
13
+ ],
14
+ };
@@ -1,29 +1,29 @@
1
- import { Image, Text, View, StyleSheet } from 'react-native';
2
-
3
- type Props = { name: string; uri?: string; size?: number };
4
-
5
- export function Avatar({ name, uri, size = 40 }: Props) {
6
- const initial = name.trim().charAt(0).toUpperCase() || '?';
7
- if (uri) {
8
- return (
9
- <Image
10
- source={{ uri }}
11
- style={{ width: size, height: size, borderRadius: size / 2 }}
12
- />
13
- );
14
- }
15
- return (
16
- <View style={[styles.circle, { width: size, height: size, borderRadius: size / 2 }]}>
17
- <Text style={[styles.text, { fontSize: size * 0.4 }]}>{initial}</Text>
18
- </View>
19
- );
20
- }
21
-
22
- const styles = StyleSheet.create({
23
- circle: {
24
- backgroundColor: '#e4e4e7',
25
- alignItems: 'center',
26
- justifyContent: 'center',
27
- },
28
- text: { fontWeight: '700', color: '#3f3f46' },
29
- });
1
+ import { Image, Text, View, StyleSheet } from 'react-native';
2
+
3
+ type Props = { name: string; uri?: string; size?: number };
4
+
5
+ export function Avatar({ name, uri, size = 40 }: Props) {
6
+ const initial = name.trim().charAt(0).toUpperCase() || '?';
7
+ if (uri) {
8
+ return (
9
+ <Image
10
+ source={{ uri }}
11
+ style={{ width: size, height: size, borderRadius: size / 2 }}
12
+ />
13
+ );
14
+ }
15
+ return (
16
+ <View style={[styles.circle, { width: size, height: size, borderRadius: size / 2 }]}>
17
+ <Text style={[styles.text, { fontSize: size * 0.4 }]}>{initial}</Text>
18
+ </View>
19
+ );
20
+ }
21
+
22
+ const styles = StyleSheet.create({
23
+ circle: {
24
+ backgroundColor: '#e4e4e7',
25
+ alignItems: 'center',
26
+ justifyContent: 'center',
27
+ },
28
+ text: { fontWeight: '700', color: '#3f3f46' },
29
+ });
@@ -1,3 +1,3 @@
1
- declare module '@env' {
2
- export const RN_API_URL: string | undefined;
3
- }
1
+ declare module '@env' {
2
+ export const RN_API_URL: string | undefined;
3
+ }
@@ -1,12 +1,12 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <title>{{projectName}}</title>
6
- <base href="/" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- </head>
9
- <body>
10
- <app-root></app-root>
11
- </body>
12
- </html>
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>{{projectName}}</title>
6
+ <base href="/" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
8
+ </head>
9
+ <body>
10
+ <app-root></app-root>
11
+ </body>
12
+ </html>
@@ -1,5 +1,5 @@
1
- import { bootstrapApplication } from '@angular/platform-browser';
2
- import { appConfig } from './app/app.config';
3
- import { AppComponent } from './app/app.component';
4
-
5
- bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { appConfig } from './app/app.config';
3
+ import { AppComponent } from './app/app.component';
4
+
5
+ bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));
@@ -1,3 +1,3 @@
1
- <h1>Dashboard</h1>
2
- <p>You are signed in.</p>
3
- <p><a routerLink="/">Back home</a></p>
1
+ <h1>Dashboard</h1>
2
+ <p>You are signed in.</p>
3
+ <p><a routerLink="/">Back home</a></p>
@@ -1,10 +1,10 @@
1
- import { Component } from '@angular/core';
2
- import { RouterLink } from '@angular/router';
3
-
4
- @Component({
5
- selector: 'app-dashboard',
6
- standalone: true,
7
- imports: [RouterLink],
8
- templateUrl: './dashboard.component.html',
9
- })
10
- export class DashboardComponent {}
1
+ import { Component } from '@angular/core';
2
+ import { RouterLink } from '@angular/router';
3
+
4
+ @Component({
5
+ selector: 'app-dashboard',
6
+ standalone: true,
7
+ imports: [RouterLink],
8
+ templateUrl: './dashboard.component.html',
9
+ })
10
+ export class DashboardComponent {}
@@ -1,11 +1,11 @@
1
- *,
2
- *::before,
3
- *::after {
4
- box-sizing: border-box;
5
- }
6
-
7
- body {
8
- margin: 0;
9
- font-family: system-ui, sans-serif;
10
- line-height: 1.5;
11
- }
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ margin: 0;
9
+ font-family: system-ui, sans-serif;
10
+ line-height: 1.5;
11
+ }
@@ -1,9 +1,9 @@
1
- <script setup lang="ts">
2
- import Layout from './components/Layout.vue';
3
- </script>
4
-
5
- <template>
6
- <Layout>
7
- <RouterView />
8
- </Layout>
9
- </template>
1
+ <script setup lang="ts">
2
+ import Layout from './components/Layout.vue';
3
+ </script>
4
+
5
+ <template>
6
+ <Layout>
7
+ <RouterView />
8
+ </Layout>
9
+ </template>
@@ -1,17 +1,17 @@
1
- <script setup lang="ts">
2
- import Navbar from './Navbar.vue';
3
- </script>
4
-
5
- <template>
6
- <div class="layout">
7
- <Navbar />
8
- <main class="content">
9
- <slot />
10
- </main>
11
- </div>
12
- </template>
13
-
14
- <style scoped>
15
- .layout { min-height: 100vh; }
16
- .content { padding: 1rem 1.5rem; }
17
- </style>
1
+ <script setup lang="ts">
2
+ import Navbar from './Navbar.vue';
3
+ </script>
4
+
5
+ <template>
6
+ <div class="layout">
7
+ <Navbar />
8
+ <main class="content">
9
+ <slot />
10
+ </main>
11
+ </div>
12
+ </template>
13
+
14
+ <style scoped>
15
+ .layout { min-height: 100vh; }
16
+ .content { padding: 1rem 1.5rem; }
17
+ </style>
@@ -1,7 +1,7 @@
1
- <template>
2
- <div role="status" aria-live="polite" class="loading">Loading...</div>
3
- </template>
4
-
5
- <style scoped>
6
- .loading { padding: 1rem; text-align: center; }
7
- </style>
1
+ <template>
2
+ <div role="status" aria-live="polite" class="loading">Loading...</div>
3
+ </template>
4
+
5
+ <style scoped>
6
+ .loading { padding: 1rem; text-align: center; }
7
+ </style>