@donotdev/cli 0.0.5 → 0.0.7
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/dependencies-matrix.json +76 -34
- package/dist/bin/commands/build.js +165 -161
- package/dist/bin/commands/bump.js +172 -160
- package/dist/bin/commands/cacheout.js +163 -157
- package/dist/bin/commands/create-app.js +205 -163
- package/dist/bin/commands/create-project.js +176 -161
- package/dist/bin/commands/deploy.js +480 -472
- package/dist/bin/commands/dev.js +164 -158
- package/dist/bin/commands/emu.js +164 -158
- package/dist/bin/commands/format.js +163 -157
- package/dist/bin/commands/lint.js +166 -157
- package/dist/bin/commands/make-admin.d.ts +11 -0
- package/dist/bin/commands/make-admin.d.ts.map +1 -0
- package/dist/bin/commands/make-admin.js +12 -0
- package/dist/bin/commands/make-admin.js.map +1 -0
- package/dist/bin/commands/preview.js +164 -158
- package/dist/bin/commands/sync-secrets.js +164 -158
- package/dist/bin/commands/wai.d.ts +11 -0
- package/dist/bin/commands/wai.d.ts.map +1 -0
- package/dist/bin/commands/wai.js +12 -0
- package/dist/bin/commands/wai.js.map +1 -0
- package/dist/bin/dndev.js +24 -8
- package/dist/bin/donotdev.js +24 -8
- package/dist/index.js +557 -514
- package/package.json +1 -1
- package/templates/app-demo/index.html.example +4 -0
- package/templates/app-demo/src/App.tsx.example +28 -10
- package/templates/app-demo/src/config/app.ts.example +68 -0
- package/templates/app-next/src/app/ClientLayout.tsx.example +4 -3
- package/templates/app-next/src/app/layout.tsx.example +17 -25
- package/templates/app-next/src/config/app.ts.example +75 -48
- package/templates/app-next/src/globals.css.example +10 -7
- package/templates/app-next/src/locales/dndev_en.json.example +68 -0
- package/templates/app-next/src/pages/locales/example_en.json.example +5 -0
- package/templates/app-vite/index.html.example +71 -34
- package/templates/app-vite/src/config/app.ts.example +75 -47
- package/templates/app-vite/src/globals.css.example +14 -6
- package/templates/app-vite/src/locales/dndev_en.json.example +68 -0
- package/templates/app-vite/src/pages/FormPageExample.tsx.example +152 -0
- package/templates/app-vite/src/pages/HomePage.tsx.example +81 -134
- package/templates/app-vite/src/pages/ListPageExample.tsx.example +88 -0
- package/templates/functions-firebase/README.md.example +25 -0
- package/templates/functions-firebase/build.mjs.example +8 -1
- package/templates/functions-firebase/functions-firebase/build.mjs.example +8 -1
- package/templates/functions-firebase/functions-firebase/src/index.ts.example +19 -25
- package/templates/functions-firebase/functions.config.js.example +35 -0
- package/templates/functions-firebase/tsconfig.json.example +3 -13
- package/templates/functions-vercel/tsconfig.json.example +1 -13
- package/templates/root-consumer/entities/ExampleEntity.ts.example +223 -0
- package/templates/root-consumer/entities/demo.ts.example +562 -0
- package/templates/root-consumer/entities/index.ts.example +15 -0
- package/templates/root-consumer/firebase.json.example +1 -1
- package/templates/root-consumer/guides/{AGENT_START_HERE.md.example → dndev/AGENT_START_HERE.md.example} +22 -0
- package/templates/root-consumer/guides/{COMPONENTS_ADV.md.example → dndev/COMPONENTS_ADV.md.example} +456 -360
- package/templates/root-consumer/guides/{COMPONENTS_ATOMIC.md.example → dndev/COMPONENTS_ATOMIC.md.example} +42 -0
- package/templates/root-consumer/guides/dndev/COMPONENTS_CRUD.md.example +231 -0
- package/templates/root-consumer/guides/{INDEX.md.example → dndev/INDEX.md.example} +3 -0
- package/templates/root-consumer/guides/{SETUP_APP_CONFIG.md.example → dndev/SETUP_APP_CONFIG.md.example} +5 -2
- package/templates/root-consumer/guides/{SETUP_AUTH.md.example → dndev/SETUP_AUTH.md.example} +30 -0
- package/templates/root-consumer/guides/{SETUP_BILLING.md.example → dndev/SETUP_BILLING.md.example} +44 -4
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +473 -0
- package/templates/root-consumer/guides/dndev/SETUP_FUNCTIONS.md.example +116 -0
- package/templates/root-consumer/guides/{SETUP_PAGES.md.example → dndev/SETUP_PAGES.md.example} +17 -0
- package/templates/root-consumer/guides/dndev/SETUP_PWA.md.example +213 -0
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +503 -0
- package/templates/root-consumer/guides/wai-way/WAI_WAY_CLI.md.example +404 -0
- package/templates/root-consumer/guides/wai-way/agents/architect.md.example +78 -0
- package/templates/root-consumer/guides/wai-way/agents/builder.md.example +87 -0
- package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +325 -0
- package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +100 -0
- package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +281 -0
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +77 -0
- package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +104 -0
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +124 -0
- package/templates/root-consumer/guides/wai-way/blueprints/4_configure.md.example +165 -0
- package/templates/root-consumer/guides/wai-way/context_map.json.example +95 -0
- package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +840 -0
- package/templates/root-consumer/guides/wai-way/page_patterns.md.example +686 -0
- package/templates/root-consumer/guides/wai-way/presets_guide.md.example +217 -0
- package/templates/root-consumer/guides/wai-way/spec_template.md.example +312 -0
- package/templates/root-consumer/vercel.json.example +315 -20
- package/templates/app-demo/src/Routes.tsx.example +0 -20
- package/templates/app-vite/src/Routes.tsx.example +0 -16
- package/templates/app-vite/src/pages/locales/README.md.example +0 -1
- package/templates/functions-firebase/functions-firebase/src/crud/createEntity.ts.example +0 -19
- package/templates/functions-firebase/functions-firebase/src/crud/deleteEntity.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/crud/getEntity.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/crud/index.ts.example +0 -12
- package/templates/functions-firebase/functions-firebase/src/crud/listEntities.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/crud/updateEntity.ts.example +0 -14
- package/templates/root-consumer/guides/COMPONENTS_CRUD.md.example +0 -70
- package/templates/root-consumer/guides/SETUP_FUNCTIONS.md.example +0 -62
- /package/templates/root-consumer/guides/{COMPONENTS_UI.md.example → dndev/COMPONENTS_UI.md.example} +0 -0
- /package/templates/root-consumer/guides/{ENV_SETUP.md.example → dndev/ENV_SETUP.md.example} +0 -0
- /package/templates/root-consumer/guides/{SETUP_I18N.md.example → dndev/SETUP_I18N.md.example} +0 -0
- /package/templates/root-consumer/guides/{SETUP_LAYOUTS.md.example → dndev/SETUP_LAYOUTS.md.example} +0 -0
- /package/templates/root-consumer/guides/{SETUP_OAUTH.md.example → dndev/SETUP_OAUTH.md.example} +0 -0
- /package/templates/root-consumer/guides/{SETUP_THEMES.md.example → dndev/SETUP_THEMES.md.example} +0 -0
- /package/templates/root-consumer/guides/{advanced → dndev/advanced}/APP_CHECK.md.example +0 -0
- /package/templates/root-consumer/guides/{advanced → dndev/advanced}/COOKIE_REFERENCE.md.example +0 -0
- /package/templates/root-consumer/guides/{advanced → dndev/advanced}/EMULATORS.md.example +0 -0
- /package/templates/root-consumer/guides/{advanced → dndev/advanced}/VERSION_CONTROL.md.example +0 -0
package/package.json
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>DoNotDev Components Demo</title>
|
|
7
|
+
|
|
8
|
+
<!-- ✅ PERFORMANCE: Critical font preloads (loads before CSS) -->
|
|
9
|
+
<link rel="preload" href="/fonts/Inter-latin.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
10
|
+
|
|
7
11
|
<style>
|
|
8
12
|
body {
|
|
9
13
|
margin: 0;
|
|
@@ -1,17 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Main application component
|
|
3
|
+
* @description Root application component with configuration-driven architecture
|
|
4
|
+
* @version 0.0.4
|
|
5
|
+
* @since 0.0.1
|
|
6
|
+
* @author AMBROISE PARK Consulting
|
|
7
|
+
*/
|
|
2
8
|
|
|
3
|
-
import {
|
|
4
|
-
import { TooltipProvider, Toaster } from '@donotdev/components';
|
|
9
|
+
import { ViteAppProviders } from '@donotdev/ui/vite';
|
|
5
10
|
|
|
6
|
-
import {
|
|
11
|
+
import { appConfig } from './config/app';
|
|
7
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Main application component
|
|
15
|
+
*
|
|
16
|
+
* Configuration-driven architecture with smart defaults.
|
|
17
|
+
* Layout preset comes from appConfig.preset (configured in config/app.ts).
|
|
18
|
+
* Routes are automatically discovered from src/pages/*Page.tsx files.
|
|
19
|
+
*
|
|
20
|
+
* Note: HomePage.tsx in src/pages/ is automatically used for the root route "/"
|
|
21
|
+
*
|
|
22
|
+
* @version 0.0.4
|
|
23
|
+
* @since 0.0.1
|
|
24
|
+
* @author AMBROISE PARK Consulting
|
|
25
|
+
*/
|
|
8
26
|
export function App() {
|
|
9
27
|
return (
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
28
|
+
<ViteAppProviders
|
|
29
|
+
config={appConfig}
|
|
30
|
+
layout={{
|
|
31
|
+
breadcrumbs: 'smart', // 'smart' | 'always' | 'never'
|
|
32
|
+
}}
|
|
33
|
+
/>
|
|
16
34
|
);
|
|
17
35
|
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Application configuration
|
|
3
|
+
* @description Defines application metadata and feature flags
|
|
4
|
+
* @version 0.0.1
|
|
5
|
+
* @since 0.0.1
|
|
6
|
+
* @author AMBROISE PARK Consulting
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { AppConfig } from '@donotdev/core';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Application name constant
|
|
13
|
+
*
|
|
14
|
+
* @version 0.0.1
|
|
15
|
+
* @since 0.0.1
|
|
16
|
+
* @author AMBROISE PARK Consulting
|
|
17
|
+
*/
|
|
18
|
+
export const APP_NAME = '{{appName}}';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Application short name constant
|
|
22
|
+
*
|
|
23
|
+
* @version 0.0.1
|
|
24
|
+
* @since 0.0.1
|
|
25
|
+
* @author AMBROISE PARK Consulting
|
|
26
|
+
*/
|
|
27
|
+
export const APP_SHORT_NAME = '{{appShortName}}';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Application description constant
|
|
31
|
+
*
|
|
32
|
+
* @version 0.0.1
|
|
33
|
+
* @since 0.0.1
|
|
34
|
+
* @author AMBROISE PARK Consulting
|
|
35
|
+
*/
|
|
36
|
+
export const APP_DESCRIPTION = 'DoNotDev Components Demo';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Application configuration object
|
|
40
|
+
*
|
|
41
|
+
* @version 0.0.1
|
|
42
|
+
* @since 0.0.1
|
|
43
|
+
* @author AMBROISE PARK Consulting
|
|
44
|
+
*/
|
|
45
|
+
export const appConfig: AppConfig = {
|
|
46
|
+
app: {
|
|
47
|
+
name: APP_NAME,
|
|
48
|
+
shortName: APP_SHORT_NAME,
|
|
49
|
+
description: APP_DESCRIPTION,
|
|
50
|
+
},
|
|
51
|
+
preset: 'landing', // 'landing' | 'admin' | 'moolti' | 'docs' | 'blog' | 'game' | 'plain'
|
|
52
|
+
features: {
|
|
53
|
+
// Optional: Enable debug tools in development
|
|
54
|
+
// debug: true,
|
|
55
|
+
},
|
|
56
|
+
// Optional: Override query cache defaults
|
|
57
|
+
// Framework defaults (infinite cache - cost-optimized):
|
|
58
|
+
// - staleTime: Infinity (data never becomes stale)
|
|
59
|
+
// - refetchOnWindowFocus: false (no auto-refetch on focus)
|
|
60
|
+
// - refetchOnReconnect: false (no auto-refetch on reconnect)
|
|
61
|
+
// This minimizes API costs and is ideal for single-admin apps with manual refresh buttons.
|
|
62
|
+
// Uncomment below to enable auto-refetch behavior:
|
|
63
|
+
// query: {
|
|
64
|
+
// staleTime: 1000 * 60 * 5, // 5 minutes - data becomes stale after 5 minutes
|
|
65
|
+
// refetchOnWindowFocus: true, // Automatically refetch when window regains focus
|
|
66
|
+
// refetchOnReconnect: true, // Automatically refetch when network reconnects
|
|
67
|
+
// },
|
|
68
|
+
};
|
|
@@ -6,7 +6,6 @@ import { appConfig } from '../config/app';
|
|
|
6
6
|
|
|
7
7
|
interface ClientLayoutProps {
|
|
8
8
|
children: React.ReactNode;
|
|
9
|
-
serverCookies?: string;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
/**
|
|
@@ -17,13 +16,14 @@ interface ClientLayoutProps {
|
|
|
17
16
|
* Layout prop is for breadcrumbs and slot customizations only.
|
|
18
17
|
* CSS variable overrides should be done in themes.css.
|
|
19
18
|
* Override only what you need - everything else has sensible defaults.
|
|
19
|
+
*
|
|
20
|
+
* Theme detection happens client-side to avoid Next.js 16 race condition.
|
|
20
21
|
*/
|
|
21
|
-
export function ClientLayout({ children
|
|
22
|
+
export function ClientLayout({ children }: ClientLayoutProps) {
|
|
22
23
|
return (
|
|
23
24
|
<div id="root">
|
|
24
25
|
<NextJsAppProviders
|
|
25
26
|
config={appConfig}
|
|
26
|
-
serverCookies={serverCookies}
|
|
27
27
|
layout={{
|
|
28
28
|
breadcrumbs: 'smart', // 'smart' | 'always' | 'never'
|
|
29
29
|
header: {
|
|
@@ -37,3 +37,4 @@ export function ClientLayout({ children, serverCookies }: ClientLayoutProps) {
|
|
|
37
37
|
</div>
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
|
+
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { Metadata } from 'next';
|
|
2
|
-
import { cookies } from 'next/headers';
|
|
3
2
|
import '../globals.css';
|
|
4
3
|
import { ClientLayout } from './ClientLayout';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Framework fonts are loaded via CSS @font-face rules in dndev.css
|
|
8
7
|
*
|
|
9
|
-
* The framework CSS includes optimized @font-face declarations for
|
|
10
|
-
* with proper unicode-range subsetting for performance.
|
|
8
|
+
* The framework CSS includes optimized @font-face declarations for Inter
|
|
9
|
+
* (default) and Roboto (optional) with proper unicode-range subsetting for performance.
|
|
11
10
|
* Fonts are copied from framework to public/fonts/ by AssetDiscovery during build.
|
|
12
11
|
*/
|
|
13
12
|
|
|
@@ -16,36 +15,29 @@ export const metadata: Metadata = {
|
|
|
16
15
|
description: 'Next.js site using DNDev framework',
|
|
17
16
|
};
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Root layout for Next.js App Router
|
|
20
|
+
*
|
|
21
|
+
* Theme detection happens client-side via ClientLayout to avoid
|
|
22
|
+
* Next.js 16 + Turbopack race condition with async layouts.
|
|
23
|
+
* Brief FOUC possible on first load, but prevents build-manifest.json errors.
|
|
24
|
+
*/
|
|
25
|
+
export default function RootLayout({
|
|
20
26
|
children,
|
|
21
27
|
}: {
|
|
22
28
|
children: React.ReactNode;
|
|
23
29
|
}) {
|
|
24
|
-
/**
|
|
25
|
-
* SSR: Read theme from cookies to apply correct theme class to HTML
|
|
26
|
-
*
|
|
27
|
-
* This ensures the server-rendered HTML has the correct theme class,
|
|
28
|
-
* preventing FOUC (Flash of Unstyled Content) when client hydrates.
|
|
29
|
-
*
|
|
30
|
-
* Flow:
|
|
31
|
-
* 1. Server reads cookie → applies theme class to <html>/<body>
|
|
32
|
-
* 2. NextJsStoresInitializer hydrates store from cookie
|
|
33
|
-
* 3. Client hydrates → Zustand persist matches server state
|
|
34
|
-
* 4. setAvailableThemes() ensures DOM matches persisted theme
|
|
35
|
-
*/
|
|
36
|
-
const cookieStore = await cookies();
|
|
37
|
-
const themeCookie = cookieStore.get('dndev-theme');
|
|
38
|
-
const themeClass = themeCookie?.value || 'light';
|
|
39
|
-
|
|
40
30
|
return (
|
|
41
|
-
<html
|
|
31
|
+
<html
|
|
32
|
+
lang="en"
|
|
33
|
+
className="dndev-design-tokens light"
|
|
34
|
+
suppressHydrationWarning
|
|
35
|
+
>
|
|
42
36
|
<head>
|
|
43
37
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
44
38
|
</head>
|
|
45
|
-
<body className=
|
|
46
|
-
<ClientLayout
|
|
47
|
-
{children}
|
|
48
|
-
</ClientLayout>
|
|
39
|
+
<body className="light">
|
|
40
|
+
<ClientLayout>{children}</ClientLayout>
|
|
49
41
|
</body>
|
|
50
42
|
</html>
|
|
51
43
|
);
|
|
@@ -1,75 +1,102 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Application
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* @fileoverview Application Configuration
|
|
3
|
+
*
|
|
4
|
+
* THIS FILE IS YOUR MAIN CONFIGURATION. Update the values below.
|
|
5
|
+
*
|
|
6
|
+
* QUICK START:
|
|
7
|
+
* 1. Set APP_NAME and APP_SHORT_NAME
|
|
8
|
+
* 2. Choose your preset (see guide below)
|
|
9
|
+
* 3. Configure footer links
|
|
10
|
+
* 4. Run `bun dev` - everything else is automatic
|
|
7
11
|
*/
|
|
8
12
|
|
|
9
13
|
import type { AppConfig } from '@donotdev/core';
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* @version 0.0.1
|
|
15
|
-
* @since 0.0.1
|
|
16
|
-
* @author AMBROISE PARK Consulting
|
|
17
|
-
*/
|
|
18
|
-
export const APP_NAME = '{{appName}}';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// APP IDENTITY - Update these values
|
|
17
|
+
// ============================================================================
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
* Application short name constant
|
|
22
|
-
*
|
|
23
|
-
* @version 0.0.1
|
|
24
|
-
* @since 0.0.1
|
|
25
|
-
* @author AMBROISE PARK Consulting
|
|
26
|
-
*/
|
|
19
|
+
export const APP_NAME = '{{appName}}';
|
|
27
20
|
export const APP_SHORT_NAME = '{{appShortName}}';
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Application description constant
|
|
31
|
-
*
|
|
32
|
-
* @version 0.0.1
|
|
33
|
-
* @since 0.0.1
|
|
34
|
-
* @author AMBROISE PARK Consulting
|
|
35
|
-
*/
|
|
36
21
|
export const APP_DESCRIPTION = 'Built with DoNotDev Framework';
|
|
37
22
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
* @since 0.0.1
|
|
43
|
-
* @author AMBROISE PARK Consulting
|
|
44
|
-
*/
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// MAIN CONFIGURATION
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
45
27
|
export const appConfig: AppConfig = {
|
|
46
28
|
app: {
|
|
47
29
|
name: APP_NAME,
|
|
48
30
|
shortName: APP_SHORT_NAME,
|
|
49
31
|
description: APP_DESCRIPTION,
|
|
50
|
-
//
|
|
51
|
-
|
|
32
|
+
// url: 'https://yourapp.com', // Uncomment for production
|
|
33
|
+
|
|
34
|
+
// Footer legal links - remove any you don't need
|
|
52
35
|
footer: {
|
|
53
36
|
legalLinks: [
|
|
54
37
|
{ path: '#cookie-settings', label: 'footer.legal.cookieSettings' },
|
|
55
38
|
{ path: '/legal/privacy', label: 'footer.legal.privacyPolicy' },
|
|
56
39
|
{ path: '/legal/terms', label: 'footer.legal.termsOfService' },
|
|
57
|
-
//
|
|
58
|
-
// { path: '/legal/legal-notice', label: 'footer.legal.legalNotice' },
|
|
59
|
-
// { path: '/license', label: 'License' },
|
|
40
|
+
// { path: '/legal/notice', label: 'footer.legal.legalNotice' },
|
|
60
41
|
],
|
|
61
42
|
},
|
|
62
43
|
},
|
|
63
|
-
|
|
44
|
+
|
|
45
|
+
// ==========================================================================
|
|
46
|
+
// PRESET GUIDE - Choose your layout
|
|
47
|
+
// ==========================================================================
|
|
48
|
+
//
|
|
49
|
+
// 'landing' → Marketing site. Full-width sections, centered content, no sidebar.
|
|
50
|
+
// Best for: Homepage, product pages, pricing, landing pages.
|
|
51
|
+
//
|
|
52
|
+
// 'admin' → Dashboard app. Collapsible sidebar, header with user menu.
|
|
53
|
+
// Best for: Admin panels, CRM, internal tools, CRUD apps.
|
|
54
|
+
//
|
|
55
|
+
// 'moolti' → Multi-panel. Left sidebar nav, optional right context sidebar.
|
|
56
|
+
// Best for: Complex apps with nested navigation, settings panels.
|
|
57
|
+
//
|
|
58
|
+
// 'docs' → Documentation. Left sidebar TOC, right sidebar on-page nav.
|
|
59
|
+
// Best for: Documentation sites, knowledge bases, help centers.
|
|
60
|
+
//
|
|
61
|
+
// 'blog' → Blog layout. Wide content area, optional category sidebar.
|
|
62
|
+
// Best for: Blog, news, articles, content-heavy sites.
|
|
63
|
+
//
|
|
64
|
+
// 'game' → Fullscreen. Minimal chrome, focus on content area.
|
|
65
|
+
// Best for: Games, immersive experiences, presentations.
|
|
66
|
+
//
|
|
67
|
+
// 'plain' → No layout. Just your pages, you handle everything.
|
|
68
|
+
// Best for: Custom layouts, embedded widgets, special cases.
|
|
69
|
+
//
|
|
70
|
+
preset: 'docs',
|
|
71
|
+
|
|
72
|
+
// ==========================================================================
|
|
73
|
+
// FEATURES - Uncomment to enable
|
|
74
|
+
// ==========================================================================
|
|
64
75
|
features: {
|
|
65
|
-
//
|
|
66
|
-
// debug: true,
|
|
76
|
+
// debug: true, // Enable debug tools in development
|
|
67
77
|
},
|
|
68
|
-
|
|
78
|
+
|
|
79
|
+
// ==========================================================================
|
|
80
|
+
// AUTH CONFIG - Uncomment to customize
|
|
81
|
+
// ==========================================================================
|
|
69
82
|
// auth: {
|
|
70
|
-
// authRoute: '/signin',
|
|
71
|
-
// roleRoute: '/403',
|
|
72
|
-
// tierRoute: '/pricing',
|
|
83
|
+
// authRoute: '/signin', // Redirect when auth required
|
|
84
|
+
// roleRoute: '/403', // Redirect when role insufficient
|
|
85
|
+
// tierRoute: '/pricing', // Redirect when subscription required
|
|
86
|
+
// profilePath: '/profile', // Profile page path (undefined to hide)
|
|
87
|
+
// authMenuItems: [ // Custom menu items for logged-in users
|
|
88
|
+
// { path: '/dashboard', label: 'Dashboard' },
|
|
89
|
+
// ],
|
|
73
90
|
// },
|
|
74
|
-
};
|
|
75
91
|
|
|
92
|
+
// ==========================================================================
|
|
93
|
+
// QUERY CACHE - Uncomment to enable auto-refetch
|
|
94
|
+
// ==========================================================================
|
|
95
|
+
// Default: Infinite cache (cost-optimized, manual refresh)
|
|
96
|
+
// Uncomment for auto-refetch behavior:
|
|
97
|
+
// query: {
|
|
98
|
+
// staleTime: 1000 * 60 * 5, // 5 minutes
|
|
99
|
+
// refetchOnWindowFocus: true,
|
|
100
|
+
// refetchOnReconnect: true,
|
|
101
|
+
// },
|
|
102
|
+
};
|
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
/**
|
|
7
7
|
* Font configuration
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
* Framework defaults to Inter (defined in @donotdev/components/styles/variables.css).
|
|
10
|
+
* Fonts are loaded via CSS @font-face rules in @donotdev/ui/assets/fonts/fonts.css
|
|
11
|
+
* and copied to public/fonts/ by AssetDiscovery during build.
|
|
12
|
+
*
|
|
13
|
+
* To override, uncomment and customize:
|
|
14
|
+
* :root {
|
|
15
|
+
* --font-sans: 'YourFont', sans-serif;
|
|
16
|
+
* --font-family: var(--font-sans);
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
@@ -496,6 +496,10 @@
|
|
|
496
496
|
"copied": "Copied!",
|
|
497
497
|
"copyCodeToClipboard": "Copy code to clipboard"
|
|
498
498
|
},
|
|
499
|
+
"video": {
|
|
500
|
+
"clickToWatch": "Click to watch video",
|
|
501
|
+
"watchVideo": "Watch Video"
|
|
502
|
+
},
|
|
499
503
|
"inspector": {
|
|
500
504
|
"pageSource": "Page Source",
|
|
501
505
|
"inspectPageSourceCode": "Inspect page source code"
|
|
@@ -512,5 +516,69 @@
|
|
|
512
516
|
"goHome": "Go Home",
|
|
513
517
|
"goBack": "Go Back",
|
|
514
518
|
"contactSupport": "If the problem persists, please contact support."
|
|
519
|
+
},
|
|
520
|
+
"redirectOverlay": {
|
|
521
|
+
"phases": {
|
|
522
|
+
"connecting": "Connecting to secure server...",
|
|
523
|
+
"preparing": "Preparing your session...",
|
|
524
|
+
"redirecting": "Redirecting...",
|
|
525
|
+
"timeout": "Taking longer than expected..."
|
|
526
|
+
},
|
|
527
|
+
"cancel": "Cancel",
|
|
528
|
+
"doNotRefresh": "Please do not refresh or press back",
|
|
529
|
+
"default": {
|
|
530
|
+
"title": "Redirecting",
|
|
531
|
+
"message": "Please wait while we redirect you...",
|
|
532
|
+
"subtitle": "This may take a moment",
|
|
533
|
+
"ariaLabel": "Redirecting, please wait"
|
|
534
|
+
},
|
|
535
|
+
"stripe-checkout": {
|
|
536
|
+
"title": "Redirecting to Stripe",
|
|
537
|
+
"message": "Initializing secure payment...",
|
|
538
|
+
"subtitle": "This may take a moment on first load",
|
|
539
|
+
"ariaLabel": "Preparing secure checkout, please wait"
|
|
540
|
+
},
|
|
541
|
+
"stripe-portal": {
|
|
542
|
+
"title": "Redirecting to Stripe",
|
|
543
|
+
"message": "Opening billing portal...",
|
|
544
|
+
"subtitle": "Manage your subscription and invoices",
|
|
545
|
+
"ariaLabel": "Opening billing portal, please wait"
|
|
546
|
+
},
|
|
547
|
+
"oauth-google": {
|
|
548
|
+
"title": "Signing in with Google",
|
|
549
|
+
"message": "Connecting to Google...",
|
|
550
|
+
"subtitle": "You will be redirected to sign in",
|
|
551
|
+
"ariaLabel": "Signing in with Google, please wait"
|
|
552
|
+
},
|
|
553
|
+
"oauth-github": {
|
|
554
|
+
"title": "Signing in with GitHub",
|
|
555
|
+
"message": "Connecting to GitHub...",
|
|
556
|
+
"subtitle": "You will be redirected to sign in",
|
|
557
|
+
"ariaLabel": "Signing in with GitHub, please wait"
|
|
558
|
+
},
|
|
559
|
+
"oauth-apple": {
|
|
560
|
+
"title": "Signing in with Apple",
|
|
561
|
+
"message": "Connecting to Apple...",
|
|
562
|
+
"subtitle": "You will be redirected to sign in",
|
|
563
|
+
"ariaLabel": "Signing in with Apple, please wait"
|
|
564
|
+
},
|
|
565
|
+
"oauth-microsoft": {
|
|
566
|
+
"title": "Signing in with Microsoft",
|
|
567
|
+
"message": "Connecting to Microsoft...",
|
|
568
|
+
"subtitle": "You will be redirected to sign in",
|
|
569
|
+
"ariaLabel": "Signing in with Microsoft, please wait"
|
|
570
|
+
},
|
|
571
|
+
"oauth-facebook": {
|
|
572
|
+
"title": "Signing in with Facebook",
|
|
573
|
+
"message": "Connecting to Facebook...",
|
|
574
|
+
"subtitle": "You will be redirected to sign in",
|
|
575
|
+
"ariaLabel": "Signing in with Facebook, please wait"
|
|
576
|
+
},
|
|
577
|
+
"auth-email-link": {
|
|
578
|
+
"title": "Sending verification",
|
|
579
|
+
"message": "Preparing your verification link...",
|
|
580
|
+
"subtitle": "Check your email inbox",
|
|
581
|
+
"ariaLabel": "Sending verification email, please wait"
|
|
582
|
+
}
|
|
515
583
|
}
|
|
516
584
|
}
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
<!-- ✅ PWA: Manifest link (if exists) -->
|
|
17
17
|
<link rel="manifest" href="/manifest.json" />
|
|
18
18
|
|
|
19
|
+
<!-- ✅ PERFORMANCE: Load fonts early to avoid preload warnings -->
|
|
20
|
+
<link rel="stylesheet" href="/fonts/fonts.css" />
|
|
21
|
+
|
|
19
22
|
<!-- ✅ PERFORMANCE: Preconnect to external domains (OAuth providers) -->
|
|
20
23
|
<!-- GitHub OAuth -->
|
|
21
24
|
<link rel="preconnect" href="https://github.com">
|
|
@@ -34,9 +37,13 @@
|
|
|
34
37
|
<!-- ✅ PERFORMANCE: Critical CSS inlined here by build -->
|
|
35
38
|
<style>
|
|
36
39
|
/* Critical above-the-fold styles */
|
|
40
|
+
html, body {
|
|
41
|
+
margin: 0;
|
|
42
|
+
padding: 0;
|
|
43
|
+
box-sizing: border-box;
|
|
44
|
+
}
|
|
37
45
|
body {
|
|
38
|
-
|
|
39
|
-
font-family: var(--font-family, ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco, 'Liberation Mono', monospace);
|
|
46
|
+
font-family: 'Inter', var(--font-family, ui-sans-serif, system-ui, -apple-system, sans-serif);
|
|
40
47
|
line-height: 1.5;
|
|
41
48
|
-webkit-font-smoothing: antialiased;
|
|
42
49
|
-moz-osx-font-smoothing: grayscale;
|
|
@@ -52,54 +59,85 @@
|
|
|
52
59
|
/* Critical shell loader styles - pure CSS, instant render */
|
|
53
60
|
#shell-loader {
|
|
54
61
|
position: fixed;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
width: 100%;
|
|
58
|
-
height: 100%;
|
|
59
|
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
62
|
+
inset: 0;
|
|
63
|
+
background: #000000;
|
|
60
64
|
display: flex;
|
|
61
65
|
align-items: center;
|
|
62
66
|
justify-content: center;
|
|
63
67
|
z-index: 9999;
|
|
64
68
|
opacity: 1;
|
|
65
69
|
transition: opacity 0.3s ease-out;
|
|
70
|
+
will-change: opacity;
|
|
71
|
+
/* Isolate from framework CSS */
|
|
72
|
+
margin: 0;
|
|
73
|
+
padding: 0;
|
|
74
|
+
box-sizing: border-box;
|
|
66
75
|
}
|
|
67
76
|
#shell-loader.shell-loader--fading {
|
|
68
77
|
opacity: 0;
|
|
78
|
+
pointer-events: none;
|
|
69
79
|
}
|
|
70
80
|
.shell-loader__content {
|
|
71
81
|
text-align: center;
|
|
72
82
|
color: white;
|
|
73
|
-
font-family:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
|
|
84
|
+
width: 100%;
|
|
85
|
+
max-width: 500px;
|
|
86
|
+
/* Prevent layout shifts from framework CSS */
|
|
87
|
+
margin: 0;
|
|
88
|
+
padding: 0;
|
|
89
|
+
box-sizing: border-box;
|
|
90
|
+
line-height: 1.2;
|
|
77
91
|
}
|
|
78
92
|
.shell-loader__brand {
|
|
79
93
|
display: block;
|
|
94
|
+
font-size: clamp(3rem, 10vw, 5rem);
|
|
95
|
+
font-weight: 800;
|
|
96
|
+
letter-spacing: -0.05em;
|
|
97
|
+
margin: 0 0 1rem 0;
|
|
98
|
+
padding: 0;
|
|
99
|
+
box-sizing: border-box;
|
|
80
100
|
}
|
|
101
|
+
/* ECG Waveform Animation - stroke-dasharray (performant, cross-browser, standard SVG technique) */
|
|
81
102
|
.shell-loader__dots {
|
|
82
|
-
display:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
width: 12px;
|
|
89
|
-
height: 12px;
|
|
90
|
-
border-radius: 50%;
|
|
91
|
-
background: white;
|
|
92
|
-
animation: blink 1.4s infinite;
|
|
103
|
+
display: block;
|
|
104
|
+
width: 300px;
|
|
105
|
+
height: 60px;
|
|
106
|
+
margin: 0 auto;
|
|
107
|
+
padding: 0;
|
|
108
|
+
box-sizing: border-box;
|
|
93
109
|
}
|
|
94
|
-
.shell-loader__dots
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.shell-loader__content > :last-child {
|
|
110
|
+
.shell-loader__dots svg {
|
|
111
|
+
width: 100%;
|
|
112
|
+
height: 100%;
|
|
98
113
|
display: block;
|
|
99
114
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
115
|
+
.shell-loader__dots path {
|
|
116
|
+
stroke: #667eea;
|
|
117
|
+
stroke-width: 3;
|
|
118
|
+
fill: none;
|
|
119
|
+
stroke-linecap: round;
|
|
120
|
+
stroke-linejoin: round;
|
|
121
|
+
stroke-dasharray: 400;
|
|
122
|
+
stroke-dashoffset: 400;
|
|
123
|
+
animation: ecg-draw 2s linear infinite;
|
|
124
|
+
}
|
|
125
|
+
@keyframes ecg-draw {
|
|
126
|
+
0% {
|
|
127
|
+
stroke-dashoffset: 400;
|
|
128
|
+
opacity: 0;
|
|
129
|
+
}
|
|
130
|
+
10% {
|
|
131
|
+
opacity: 1;
|
|
132
|
+
}
|
|
133
|
+
70% {
|
|
134
|
+
stroke-dashoffset: 0;
|
|
135
|
+
opacity: 1;
|
|
136
|
+
}
|
|
137
|
+
90%, 100% {
|
|
138
|
+
stroke-dashoffset: 0;
|
|
139
|
+
opacity: 0;
|
|
140
|
+
}
|
|
103
141
|
}
|
|
104
142
|
</style>
|
|
105
143
|
</head>
|
|
@@ -110,11 +148,10 @@
|
|
|
110
148
|
<div class="shell-loader__content">
|
|
111
149
|
<span class="shell-loader__brand">DoNotDev</span>
|
|
112
150
|
<span class="shell-loader__dots">
|
|
113
|
-
<
|
|
114
|
-
|
|
115
|
-
|
|
151
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 60" preserveAspectRatio="xMidYMid meet">
|
|
152
|
+
<path d="M0,30 L100,30 L110,20 L120,30 L130,30 L140,5 L150,55 L160,30 L175,30 L190,20 L205,30 L300,30" />
|
|
153
|
+
</svg>
|
|
116
154
|
</span>
|
|
117
|
-
<span>is loading</span>
|
|
118
155
|
</div>
|
|
119
156
|
</div>
|
|
120
157
|
|
|
@@ -124,4 +161,4 @@
|
|
|
124
161
|
<!-- ✅ PERFORMANCE: Module script with proper attributes -->
|
|
125
162
|
<script type="module" src="/src/main.tsx"></script>
|
|
126
163
|
</body>
|
|
127
|
-
</html>
|
|
164
|
+
</html>
|