@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.
Files changed (102) hide show
  1. package/dependencies-matrix.json +76 -34
  2. package/dist/bin/commands/build.js +165 -161
  3. package/dist/bin/commands/bump.js +172 -160
  4. package/dist/bin/commands/cacheout.js +163 -157
  5. package/dist/bin/commands/create-app.js +205 -163
  6. package/dist/bin/commands/create-project.js +176 -161
  7. package/dist/bin/commands/deploy.js +480 -472
  8. package/dist/bin/commands/dev.js +164 -158
  9. package/dist/bin/commands/emu.js +164 -158
  10. package/dist/bin/commands/format.js +163 -157
  11. package/dist/bin/commands/lint.js +166 -157
  12. package/dist/bin/commands/make-admin.d.ts +11 -0
  13. package/dist/bin/commands/make-admin.d.ts.map +1 -0
  14. package/dist/bin/commands/make-admin.js +12 -0
  15. package/dist/bin/commands/make-admin.js.map +1 -0
  16. package/dist/bin/commands/preview.js +164 -158
  17. package/dist/bin/commands/sync-secrets.js +164 -158
  18. package/dist/bin/commands/wai.d.ts +11 -0
  19. package/dist/bin/commands/wai.d.ts.map +1 -0
  20. package/dist/bin/commands/wai.js +12 -0
  21. package/dist/bin/commands/wai.js.map +1 -0
  22. package/dist/bin/dndev.js +24 -8
  23. package/dist/bin/donotdev.js +24 -8
  24. package/dist/index.js +557 -514
  25. package/package.json +1 -1
  26. package/templates/app-demo/index.html.example +4 -0
  27. package/templates/app-demo/src/App.tsx.example +28 -10
  28. package/templates/app-demo/src/config/app.ts.example +68 -0
  29. package/templates/app-next/src/app/ClientLayout.tsx.example +4 -3
  30. package/templates/app-next/src/app/layout.tsx.example +17 -25
  31. package/templates/app-next/src/config/app.ts.example +75 -48
  32. package/templates/app-next/src/globals.css.example +10 -7
  33. package/templates/app-next/src/locales/dndev_en.json.example +68 -0
  34. package/templates/app-next/src/pages/locales/example_en.json.example +5 -0
  35. package/templates/app-vite/index.html.example +71 -34
  36. package/templates/app-vite/src/config/app.ts.example +75 -47
  37. package/templates/app-vite/src/globals.css.example +14 -6
  38. package/templates/app-vite/src/locales/dndev_en.json.example +68 -0
  39. package/templates/app-vite/src/pages/FormPageExample.tsx.example +152 -0
  40. package/templates/app-vite/src/pages/HomePage.tsx.example +81 -134
  41. package/templates/app-vite/src/pages/ListPageExample.tsx.example +88 -0
  42. package/templates/functions-firebase/README.md.example +25 -0
  43. package/templates/functions-firebase/build.mjs.example +8 -1
  44. package/templates/functions-firebase/functions-firebase/build.mjs.example +8 -1
  45. package/templates/functions-firebase/functions-firebase/src/index.ts.example +19 -25
  46. package/templates/functions-firebase/functions.config.js.example +35 -0
  47. package/templates/functions-firebase/tsconfig.json.example +3 -13
  48. package/templates/functions-vercel/tsconfig.json.example +1 -13
  49. package/templates/root-consumer/entities/ExampleEntity.ts.example +223 -0
  50. package/templates/root-consumer/entities/demo.ts.example +562 -0
  51. package/templates/root-consumer/entities/index.ts.example +15 -0
  52. package/templates/root-consumer/firebase.json.example +1 -1
  53. package/templates/root-consumer/guides/{AGENT_START_HERE.md.example → dndev/AGENT_START_HERE.md.example} +22 -0
  54. package/templates/root-consumer/guides/{COMPONENTS_ADV.md.example → dndev/COMPONENTS_ADV.md.example} +456 -360
  55. package/templates/root-consumer/guides/{COMPONENTS_ATOMIC.md.example → dndev/COMPONENTS_ATOMIC.md.example} +42 -0
  56. package/templates/root-consumer/guides/dndev/COMPONENTS_CRUD.md.example +231 -0
  57. package/templates/root-consumer/guides/{INDEX.md.example → dndev/INDEX.md.example} +3 -0
  58. package/templates/root-consumer/guides/{SETUP_APP_CONFIG.md.example → dndev/SETUP_APP_CONFIG.md.example} +5 -2
  59. package/templates/root-consumer/guides/{SETUP_AUTH.md.example → dndev/SETUP_AUTH.md.example} +30 -0
  60. package/templates/root-consumer/guides/{SETUP_BILLING.md.example → dndev/SETUP_BILLING.md.example} +44 -4
  61. package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +473 -0
  62. package/templates/root-consumer/guides/dndev/SETUP_FUNCTIONS.md.example +116 -0
  63. package/templates/root-consumer/guides/{SETUP_PAGES.md.example → dndev/SETUP_PAGES.md.example} +17 -0
  64. package/templates/root-consumer/guides/dndev/SETUP_PWA.md.example +213 -0
  65. package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +503 -0
  66. package/templates/root-consumer/guides/wai-way/WAI_WAY_CLI.md.example +404 -0
  67. package/templates/root-consumer/guides/wai-way/agents/architect.md.example +78 -0
  68. package/templates/root-consumer/guides/wai-way/agents/builder.md.example +87 -0
  69. package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +325 -0
  70. package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +100 -0
  71. package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +281 -0
  72. package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +77 -0
  73. package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +104 -0
  74. package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +124 -0
  75. package/templates/root-consumer/guides/wai-way/blueprints/4_configure.md.example +165 -0
  76. package/templates/root-consumer/guides/wai-way/context_map.json.example +95 -0
  77. package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +840 -0
  78. package/templates/root-consumer/guides/wai-way/page_patterns.md.example +686 -0
  79. package/templates/root-consumer/guides/wai-way/presets_guide.md.example +217 -0
  80. package/templates/root-consumer/guides/wai-way/spec_template.md.example +312 -0
  81. package/templates/root-consumer/vercel.json.example +315 -20
  82. package/templates/app-demo/src/Routes.tsx.example +0 -20
  83. package/templates/app-vite/src/Routes.tsx.example +0 -16
  84. package/templates/app-vite/src/pages/locales/README.md.example +0 -1
  85. package/templates/functions-firebase/functions-firebase/src/crud/createEntity.ts.example +0 -19
  86. package/templates/functions-firebase/functions-firebase/src/crud/deleteEntity.ts.example +0 -14
  87. package/templates/functions-firebase/functions-firebase/src/crud/getEntity.ts.example +0 -14
  88. package/templates/functions-firebase/functions-firebase/src/crud/index.ts.example +0 -12
  89. package/templates/functions-firebase/functions-firebase/src/crud/listEntities.ts.example +0 -14
  90. package/templates/functions-firebase/functions-firebase/src/crud/updateEntity.ts.example +0 -14
  91. package/templates/root-consumer/guides/COMPONENTS_CRUD.md.example +0 -70
  92. package/templates/root-consumer/guides/SETUP_FUNCTIONS.md.example +0 -62
  93. /package/templates/root-consumer/guides/{COMPONENTS_UI.md.example → dndev/COMPONENTS_UI.md.example} +0 -0
  94. /package/templates/root-consumer/guides/{ENV_SETUP.md.example → dndev/ENV_SETUP.md.example} +0 -0
  95. /package/templates/root-consumer/guides/{SETUP_I18N.md.example → dndev/SETUP_I18N.md.example} +0 -0
  96. /package/templates/root-consumer/guides/{SETUP_LAYOUTS.md.example → dndev/SETUP_LAYOUTS.md.example} +0 -0
  97. /package/templates/root-consumer/guides/{SETUP_OAUTH.md.example → dndev/SETUP_OAUTH.md.example} +0 -0
  98. /package/templates/root-consumer/guides/{SETUP_THEMES.md.example → dndev/SETUP_THEMES.md.example} +0 -0
  99. /package/templates/root-consumer/guides/{advanced → dndev/advanced}/APP_CHECK.md.example +0 -0
  100. /package/templates/root-consumer/guides/{advanced → dndev/advanced}/COOKIE_REFERENCE.md.example +0 -0
  101. /package/templates/root-consumer/guides/{advanced → dndev/advanced}/EMULATORS.md.example +0 -0
  102. /package/templates/root-consumer/guides/{advanced → dndev/advanced}/VERSION_CONTROL.md.example +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/cli",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Command-line interface for DoNotDev Framework",
5
5
  "type": "module",
6
6
  "private": false,
@@ -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
- // apps/demo/src/App.tsx
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 { BrowserRouter } from 'react-router-dom';
4
- import { TooltipProvider, Toaster } from '@donotdev/components';
9
+ import { ViteAppProviders } from '@donotdev/ui/vite';
5
10
 
6
- import { Routes } from './Routes';
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
- <BrowserRouter>
11
- <TooltipProvider>
12
- <Routes />
13
- <Toaster />
14
- </TooltipProvider>
15
- </BrowserRouter>
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, serverCookies }: ClientLayoutProps) {
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 Roboto
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
- export default async function RootLayout({
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 lang="en" className={`dndev-design-tokens ${themeClass}`}>
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={themeClass}>
46
- <ClientLayout serverCookies={cookieStore.toString()}>
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 configuration
3
- * @description Defines application metadata and feature flags
4
- * @version 0.0.1
5
- * @since 0.0.1
6
- * @author AMBROISE PARK Consulting
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
- * 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}}';
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
- * Application configuration object
40
- *
41
- * @version 0.0.1
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
- // Optional: Configure footer legal links
51
- // Remove any links you don't need
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
- // Add more links as needed:
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
- preset: 'docs', // 'landing' | 'admin' | 'moolti' | 'docs' | 'blog' | 'game' | 'plain'
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
- // Optional: Enable debug tools in development
66
- // debug: true,
76
+ // debug: true, // Enable debug tools in development
67
77
  },
68
- // Optional: Override auth routes
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
- * Uses --font-roboto CSS variable from next/font/local (defined in layout.tsx).
10
- * Next.js automatically handles font preloading and optimization.
11
- */
12
- :root {
13
- --font-sans: var(--font-roboto, 'Roboto', sans-serif);
14
- --font-family: var(--font-sans);
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
  }
@@ -0,0 +1,5 @@
1
+ {
2
+ "title": "Example Page",
3
+ "description": "Example page locale file that is dynamically loaded on demand only"
4
+ }
5
+
@@ -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
- margin: 0;
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
- top: 0;
56
- left: 0;
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: ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco, 'Liberation Mono', monospace !important;
74
- font-size: 2.4em;
75
- font-weight: 500;
76
- line-height: 1.8;
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: inline-flex;
83
- align-items: center;
84
- gap: 12px;
85
- }
86
- .shell-loader__dots span {
87
- display: inline-block;
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 span:nth-child(1) { animation-delay: 0s; }
95
- .shell-loader__dots span:nth-child(2) { animation-delay: 0.2s; }
96
- .shell-loader__dots span:nth-child(3) { animation-delay: 0.4s; }
97
- .shell-loader__content > :last-child {
110
+ .shell-loader__dots svg {
111
+ width: 100%;
112
+ height: 100%;
98
113
  display: block;
99
114
  }
100
- @keyframes blink {
101
- 0%, 80%, 100% { opacity: 0.3; }
102
- 40% { opacity: 1; }
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
- <span></span>
114
- <span></span>
115
- <span></span>
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>