@donotdev/cli 0.0.18 → 0.0.19
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 +55 -156
- package/dist/bin/commands/coach.js +8177 -0
- package/dist/bin/commands/create-app.js +5 -5
- package/dist/bin/commands/create-project.js +10 -7
- package/dist/bin/commands/deploy.js +81 -59
- package/dist/bin/commands/doctor.js +243 -698
- package/dist/bin/commands/emu.js +2 -2
- package/dist/bin/commands/format.js +4 -1
- package/dist/bin/commands/get-demo.js +8351 -0
- package/dist/bin/commands/make-admin.js +773 -152
- package/dist/bin/commands/setup.js +519 -1711
- package/dist/bin/commands/staging.js +17852 -0
- package/dist/bin/commands/sync-secrets.js +2 -11
- package/dist/bin/commands/type-check.js +7733 -1713
- package/dist/bin/dndev.js +913 -185
- package/dist/bin/donotdev.js +913 -185
- package/dist/index.js +96 -65
- package/package.json +1 -1
- package/templates/app-demo/index.html.example +147 -10
- package/templates/app-demo/src/App.tsx.example +7 -13
- package/templates/app-demo/src/config/app.ts.example +12 -48
- package/templates/app-demo/src/entities/product.ts.example +38 -0
- package/templates/app-demo/src/globals.css.example +5 -1
- package/templates/app-demo/src/main.tsx.example +13 -7
- package/templates/app-demo/src/pages/ChangelogPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/DashboardPage.tsx.example +15 -0
- package/templates/app-demo/src/pages/HomePage.tsx.example +3 -77
- package/templates/app-demo/src/pages/PricingPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/ProductsPage.tsx.example +17 -0
- package/templates/app-demo/src/pages/ProfilePage.tsx.example +16 -0
- package/templates/app-demo/src/pages/SettingsPage.tsx.example +15 -0
- package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +112 -0
- package/templates/app-demo/src/pages/ShowcasePage.tsx.example +91 -0
- package/templates/app-demo/src/pages/legal/LegalPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +14 -0
- package/templates/app-demo/tsconfig.json.example +1 -1
- package/templates/app-demo/vite.config.ts.example +23 -48
- package/templates/app-expo/README.md.example +1 -1
- package/templates/app-expo/app/index.tsx.example +1 -1
- package/templates/app-vite/src/pages/HomePage.tsx.example +8 -10
- package/templates/overlay-firebase/env.fragment.example +1 -1
- package/templates/overlay-firebase/env.fragment.expo.example +1 -1
- package/templates/overlay-firebase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-supabase/env.fragment.example +1 -1
- package/templates/overlay-supabase/env.fragment.expo.example +1 -1
- package/templates/overlay-supabase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-vercel/env.fragment.example +1 -1
- package/templates/overlay-vercel/env.fragment.nextjs.example +1 -1
- package/templates/root-consumer/AI.md.example +4 -3
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +21 -6
- package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +16 -179
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +19 -21
- package/templates/root-consumer/guides/dndev/GOTCHAS.md.example +14 -3
- package/templates/root-consumer/guides/dndev/INDEX.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_APP_CONFIG.md.example +3 -3
- package/templates/root-consumer/guides/dndev/SETUP_BLOG.md.example +19 -2
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +35 -1
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_LAYOUTS.md.example +32 -0
- package/templates/root-consumer/guides/dndev/SETUP_OAUTH_PROVIDERS.md.example +1 -1
- package/templates/root-consumer/guides/dndev/SETUP_PAGES.md.example +19 -15
- package/templates/root-consumer/guides/dndev/SETUP_STRIPE.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +37 -16
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +18 -18
- package/templates/root-consumer/guides/dndev/essences_reference.css.example +119 -2
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +6 -0
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +4 -5
- package/templates/root-consumer/guides/wai-way/page_patterns.md.example +2 -2
- package/dist/bin/commands/agent-setup.d.ts +0 -6
- package/dist/bin/commands/agent-setup.d.ts.map +0 -1
- package/dist/bin/commands/agent-setup.js.map +0 -1
- package/dist/bin/commands/build.d.ts +0 -11
- package/dist/bin/commands/build.d.ts.map +0 -1
- package/dist/bin/commands/build.js.map +0 -1
- package/dist/bin/commands/bump.d.ts +0 -11
- package/dist/bin/commands/bump.d.ts.map +0 -1
- package/dist/bin/commands/bump.js.map +0 -1
- package/dist/bin/commands/cacheout.d.ts +0 -11
- package/dist/bin/commands/cacheout.d.ts.map +0 -1
- package/dist/bin/commands/cacheout.js.map +0 -1
- package/dist/bin/commands/create-app.d.ts +0 -11
- package/dist/bin/commands/create-app.d.ts.map +0 -1
- package/dist/bin/commands/create-app.js.map +0 -1
- package/dist/bin/commands/create-project.d.ts +0 -11
- package/dist/bin/commands/create-project.d.ts.map +0 -1
- package/dist/bin/commands/create-project.js.map +0 -1
- package/dist/bin/commands/deploy.d.ts +0 -11
- package/dist/bin/commands/deploy.d.ts.map +0 -1
- package/dist/bin/commands/deploy.js.map +0 -1
- package/dist/bin/commands/dev.d.ts +0 -11
- package/dist/bin/commands/dev.d.ts.map +0 -1
- package/dist/bin/commands/dev.js.map +0 -1
- package/dist/bin/commands/doctor.d.ts +0 -6
- package/dist/bin/commands/doctor.d.ts.map +0 -1
- package/dist/bin/commands/doctor.js.map +0 -1
- package/dist/bin/commands/emu.d.ts +0 -11
- package/dist/bin/commands/emu.d.ts.map +0 -1
- package/dist/bin/commands/emu.js.map +0 -1
- package/dist/bin/commands/format.d.ts +0 -11
- package/dist/bin/commands/format.d.ts.map +0 -1
- package/dist/bin/commands/format.js.map +0 -1
- package/dist/bin/commands/make-admin.d.ts +0 -11
- package/dist/bin/commands/make-admin.d.ts.map +0 -1
- package/dist/bin/commands/make-admin.js.map +0 -1
- package/dist/bin/commands/preview.d.ts +0 -11
- package/dist/bin/commands/preview.d.ts.map +0 -1
- package/dist/bin/commands/preview.js.map +0 -1
- package/dist/bin/commands/setup.d.ts +0 -6
- package/dist/bin/commands/setup.d.ts.map +0 -1
- package/dist/bin/commands/setup.js.map +0 -1
- package/dist/bin/commands/sync-secrets.d.ts +0 -11
- package/dist/bin/commands/sync-secrets.d.ts.map +0 -1
- package/dist/bin/commands/sync-secrets.js.map +0 -1
- package/dist/bin/commands/type-check.d.ts +0 -14
- package/dist/bin/commands/type-check.d.ts.map +0 -1
- package/dist/bin/commands/type-check.js.map +0 -1
- package/dist/bin/commands/wai.d.ts +0 -11
- package/dist/bin/commands/wai.d.ts.map +0 -1
- package/dist/bin/commands/wai.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/templates/app-demo/src/components/ThemeToggle.tsx.example +0 -48
- package/templates/app-demo/src/pages/DetailPage.tsx.example +0 -103
- package/templates/app-demo/src/pages/FullPage.tsx.example +0 -142
- package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +0 -266
- package/templates/app-demo/src/pages/components/LayoutRoute.tsx.example +0 -20
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
// apps/demo/src/main.tsx
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Demo application entry point
|
|
5
|
+
* @description Main entry point for the DoNotDev framework demo application
|
|
6
|
+
*
|
|
7
|
+
* Initializes React with StrictMode for development safety.
|
|
8
|
+
* Shell loader management is handled by BaseStoresInitializer for optimal timing.
|
|
9
|
+
*
|
|
10
|
+
* @version 0.0.1
|
|
11
|
+
* @since 0.0.1
|
|
12
|
+
* @author AMBROISE PARK Consulting
|
|
13
|
+
*/
|
|
14
|
+
|
|
3
15
|
import './globals.css';
|
|
4
16
|
import React from 'react';
|
|
5
17
|
import ReactDOM from 'react-dom/client';
|
|
6
18
|
|
|
7
19
|
import { App } from './App';
|
|
8
20
|
|
|
21
|
+
// Ensure the root element exists
|
|
9
22
|
const rootElement = document.getElementById('root');
|
|
10
23
|
if (!rootElement) {
|
|
11
24
|
throw new Error(
|
|
@@ -13,13 +26,6 @@ if (!rootElement) {
|
|
|
13
26
|
);
|
|
14
27
|
}
|
|
15
28
|
|
|
16
|
-
// Remove shell loader (fade out then remove)
|
|
17
|
-
const shellLoader = document.getElementById('shell-loader');
|
|
18
|
-
if (shellLoader) {
|
|
19
|
-
shellLoader.classList.add('shell-loader--fading');
|
|
20
|
-
window.setTimeout(() => shellLoader.remove(), 300);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
29
|
ReactDOM.createRoot(rootElement).render(
|
|
24
30
|
<React.StrictMode>
|
|
25
31
|
<App />
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { History } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { WhatsNewTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <History />,
|
|
9
|
+
preset: 'docs',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function ChangelogPage() {
|
|
13
|
+
return <WhatsNewTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LayoutDashboard } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { DashboardTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <LayoutDashboard />,
|
|
9
|
+
auth: true,
|
|
10
|
+
preset: 'admin',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default function DashboardPage() {
|
|
14
|
+
return <DashboardTemplate />;
|
|
15
|
+
}
|
|
@@ -1,79 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { useMemo } from 'react';
|
|
4
|
-
import { useNavigate, useOutletContext } from 'react-router-dom';
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
Badge,
|
|
8
|
-
Card,
|
|
9
|
-
Grid,
|
|
10
|
-
Section,
|
|
11
|
-
Stack,
|
|
12
|
-
} from '@donotdev/components';
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
COMPONENT_CONFIGS,
|
|
16
|
-
getCSSFamilies,
|
|
17
|
-
} from './components/componentConfig';
|
|
18
|
-
import type { CSSFamily } from './components/ComponentsData';
|
|
19
|
-
|
|
20
|
-
type LayoutContext = {
|
|
21
|
-
selectedTab: CSSFamily | 'all';
|
|
22
|
-
searchQuery: string;
|
|
23
|
-
};
|
|
1
|
+
import { HomeTemplate } from '@donotdev/templates';
|
|
24
2
|
|
|
25
3
|
export default function HomePage() {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
selectedTab,
|
|
29
|
-
searchQuery,
|
|
30
|
-
} = useOutletContext<LayoutContext>();
|
|
31
|
-
|
|
32
|
-
const componentsInTab = useMemo(() => {
|
|
33
|
-
return COMPONENT_CONFIGS.filter((config) => {
|
|
34
|
-
if (selectedTab !== 'all' && config.cssFamily !== selectedTab)
|
|
35
|
-
return false;
|
|
36
|
-
|
|
37
|
-
const matchesSearch =
|
|
38
|
-
searchQuery === '' ||
|
|
39
|
-
config.name.toLowerCase().includes(searchQuery.toLowerCase());
|
|
40
|
-
|
|
41
|
-
return matchesSearch;
|
|
42
|
-
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
43
|
-
}, [selectedTab, searchQuery]);
|
|
44
|
-
|
|
45
|
-
const cssFamilies = getCSSFamilies();
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<Section
|
|
49
|
-
title={
|
|
50
|
-
cssFamilies.find((f) => f.id === selectedTab)?.label ||
|
|
51
|
-
'Components'
|
|
52
|
-
}
|
|
53
|
-
subtitle={`${componentsInTab.length} components`}
|
|
54
|
-
>
|
|
55
|
-
<Grid cols="auto-fit" minColWidth="240px">
|
|
56
|
-
{componentsInTab.map((config) => {
|
|
57
|
-
const isFullPageComponent = config.cssFamily === 'layout';
|
|
58
|
-
return (
|
|
59
|
-
<Card
|
|
60
|
-
key={config.id}
|
|
61
|
-
title={config.name}
|
|
62
|
-
onClick={() =>
|
|
63
|
-
isFullPageComponent
|
|
64
|
-
? navigate('/full')
|
|
65
|
-
: navigate(`/component/${config.id}`)
|
|
66
|
-
}
|
|
67
|
-
>
|
|
68
|
-
<Stack direction="row" justify="end">
|
|
69
|
-
<Badge variant="secondary">
|
|
70
|
-
{cssFamilies.find((f) => f.id === config.cssFamily)?.label || config.cssFamily}
|
|
71
|
-
</Badge>
|
|
72
|
-
</Stack>
|
|
73
|
-
</Card>
|
|
74
|
-
);
|
|
75
|
-
})}
|
|
76
|
-
</Grid>
|
|
77
|
-
</Section>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
4
|
+
return <HomeTemplate />;
|
|
5
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CreditCard } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { SubscriptionTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <CreditCard />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function PricingPage() {
|
|
13
|
+
return <SubscriptionTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Package } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { ProductCardListTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import { productEntity } from '../entities/product';
|
|
6
|
+
|
|
7
|
+
import type { PageMeta } from '@donotdev/core';
|
|
8
|
+
|
|
9
|
+
export const meta: PageMeta = {
|
|
10
|
+
icon: <Package />,
|
|
11
|
+
auth: true,
|
|
12
|
+
preset: 'admin',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default function ProductsPage() {
|
|
16
|
+
return <ProductCardListTemplate entity={productEntity} />;
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { User } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { ProfileTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <User />,
|
|
9
|
+
auth: true,
|
|
10
|
+
preset: 'admin',
|
|
11
|
+
hideFromMenu: true,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function ProfilePage() {
|
|
15
|
+
return <ProfileTemplate billingPath="/pricing" />;
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Settings } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { SettingsTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <Settings />,
|
|
9
|
+
auth: true,
|
|
10
|
+
preset: 'admin',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default function SettingsPage() {
|
|
14
|
+
return <SettingsTemplate />;
|
|
15
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useParams, Navigate } from 'react-router-dom';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Badge,
|
|
6
|
+
Grid,
|
|
7
|
+
Stack,
|
|
8
|
+
Text,
|
|
9
|
+
} from '@donotdev/components';
|
|
10
|
+
import { PageContainer } from '@donotdev/ui';
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
COMPONENT_CONFIGS,
|
|
14
|
+
getCSSFamilies,
|
|
15
|
+
} from './components/componentConfig';
|
|
16
|
+
import { ComponentRenderer } from './components/ComponentRenderer';
|
|
17
|
+
|
|
18
|
+
import type { PageMeta } from '@donotdev/core';
|
|
19
|
+
import type { ComponentConfig } from './components/componentConfig';
|
|
20
|
+
|
|
21
|
+
export const meta: PageMeta = {
|
|
22
|
+
route: { params: ['id'] },
|
|
23
|
+
hideFromMenu: true,
|
|
24
|
+
preset: 'admin',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default function ShowcaseDetailPage() {
|
|
28
|
+
const { id } = useParams<{ id: string }>();
|
|
29
|
+
|
|
30
|
+
const config = useMemo(() => {
|
|
31
|
+
return COMPONENT_CONFIGS.find((c) => c.id === id);
|
|
32
|
+
}, [id]);
|
|
33
|
+
|
|
34
|
+
const cssFamilies = getCSSFamilies();
|
|
35
|
+
|
|
36
|
+
if (!config) {
|
|
37
|
+
return <Navigate to="/showcase" replace />;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const generateVariants = (
|
|
41
|
+
config: ComponentConfig
|
|
42
|
+
): Array<Record<string, any>> => {
|
|
43
|
+
const variants: Array<Record<string, any>> = [{}];
|
|
44
|
+
|
|
45
|
+
const dimensions = ['variant', 'size', 'tone', 'type', 'side', 'mode'] as const;
|
|
46
|
+
|
|
47
|
+
dimensions.forEach((dim) => {
|
|
48
|
+
const values = config.variants[dim];
|
|
49
|
+
if (values?.length) {
|
|
50
|
+
const newVariants: Array<Record<string, any>> = [];
|
|
51
|
+
variants.forEach((base) => {
|
|
52
|
+
values.forEach((value) => {
|
|
53
|
+
newVariants.push({ ...base, [dim]: value });
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
variants.length = 0;
|
|
57
|
+
variants.push(...newVariants);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return variants.length > 0 ? variants : [{}];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const allVariants = generateVariants(config);
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<PageContainer>
|
|
68
|
+
<Stack gap="large" align="center">
|
|
69
|
+
<Stack gap="tight" align="center">
|
|
70
|
+
<Text level="h2">{config.name}</Text>
|
|
71
|
+
<Badge variant="outline">
|
|
72
|
+
{cssFamilies.find((f) => f.id === config.cssFamily)?.label ||
|
|
73
|
+
config.cssFamily}
|
|
74
|
+
</Badge>
|
|
75
|
+
</Stack>
|
|
76
|
+
|
|
77
|
+
<Grid cols="auto-fit" minColWidth="320px" gap="large">
|
|
78
|
+
{allVariants.map((variantProps, idx) => {
|
|
79
|
+
const variantLabels = Object.entries(variantProps)
|
|
80
|
+
.filter(([_, v]) => v)
|
|
81
|
+
.map(([k, v]) => `${k}: ${v}`);
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<Stack key={idx} align="center">
|
|
85
|
+
{variantLabels.length > 0 && (
|
|
86
|
+
<Stack
|
|
87
|
+
direction="row"
|
|
88
|
+
gap="tight"
|
|
89
|
+
wrap="wrap"
|
|
90
|
+
justify="center"
|
|
91
|
+
>
|
|
92
|
+
{variantLabels.map((label) => (
|
|
93
|
+
<Badge key={label} variant="secondary">
|
|
94
|
+
{label}
|
|
95
|
+
</Badge>
|
|
96
|
+
))}
|
|
97
|
+
</Stack>
|
|
98
|
+
)}
|
|
99
|
+
<Stack align="center" justify="center">
|
|
100
|
+
<ComponentRenderer
|
|
101
|
+
config={config}
|
|
102
|
+
variantProps={variantProps}
|
|
103
|
+
/>
|
|
104
|
+
</Stack>
|
|
105
|
+
</Stack>
|
|
106
|
+
);
|
|
107
|
+
})}
|
|
108
|
+
</Grid>
|
|
109
|
+
</Stack>
|
|
110
|
+
</PageContainer>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
|
+
import { Component } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Badge,
|
|
7
|
+
Card,
|
|
8
|
+
Grid,
|
|
9
|
+
Input,
|
|
10
|
+
Section,
|
|
11
|
+
Stack,
|
|
12
|
+
Tabs,
|
|
13
|
+
} from '@donotdev/components';
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
COMPONENT_CONFIGS,
|
|
17
|
+
getCSSFamilies,
|
|
18
|
+
} from './components/componentConfig';
|
|
19
|
+
|
|
20
|
+
import type { PageMeta } from '@donotdev/core';
|
|
21
|
+
import type { CSSFamily } from './components/ComponentsData';
|
|
22
|
+
|
|
23
|
+
export const meta: PageMeta = {
|
|
24
|
+
icon: <Component />,
|
|
25
|
+
preset: 'admin',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default function ShowcasePage() {
|
|
29
|
+
const navigate = useNavigate();
|
|
30
|
+
const [selectedTab, setSelectedTab] = useState<CSSFamily | 'all'>('all');
|
|
31
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
32
|
+
|
|
33
|
+
const componentsInTab = useMemo(() => {
|
|
34
|
+
return COMPONENT_CONFIGS.filter((config) => {
|
|
35
|
+
if (selectedTab !== 'all' && config.cssFamily !== selectedTab)
|
|
36
|
+
return false;
|
|
37
|
+
return (
|
|
38
|
+
searchQuery === '' ||
|
|
39
|
+
config.name.toLowerCase().includes(searchQuery.toLowerCase())
|
|
40
|
+
);
|
|
41
|
+
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
42
|
+
}, [selectedTab, searchQuery]);
|
|
43
|
+
|
|
44
|
+
const cssFamilies = getCSSFamilies();
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Stack gap="large">
|
|
48
|
+
<Stack direction="row" gap="medium" align="end" wrap="wrap">
|
|
49
|
+
<Input
|
|
50
|
+
placeholder="Filter components..."
|
|
51
|
+
value={searchQuery}
|
|
52
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
53
|
+
/>
|
|
54
|
+
</Stack>
|
|
55
|
+
|
|
56
|
+
<Tabs
|
|
57
|
+
items={cssFamilies.map((family) => ({
|
|
58
|
+
value: family.id,
|
|
59
|
+
label: family.label,
|
|
60
|
+
content: null,
|
|
61
|
+
}))}
|
|
62
|
+
value={selectedTab}
|
|
63
|
+
onValueChange={(value) => setSelectedTab(value as CSSFamily | 'all')}
|
|
64
|
+
/>
|
|
65
|
+
|
|
66
|
+
<Section
|
|
67
|
+
title={
|
|
68
|
+
cssFamilies.find((f) => f.id === selectedTab)?.label || 'Components'
|
|
69
|
+
}
|
|
70
|
+
>
|
|
71
|
+
<Grid cols={[1, 2, 3, 4]} gap="medium">
|
|
72
|
+
{componentsInTab.map((config) => (
|
|
73
|
+
<Card
|
|
74
|
+
key={config.id}
|
|
75
|
+
title={config.name}
|
|
76
|
+
clickable
|
|
77
|
+
onClick={() => navigate(`/showcase/${config.id}`)}
|
|
78
|
+
>
|
|
79
|
+
<Stack direction="row" justify="end">
|
|
80
|
+
<Badge variant="secondary">
|
|
81
|
+
{cssFamilies.find((f) => f.id === config.cssFamily)?.label ||
|
|
82
|
+
config.cssFamily}
|
|
83
|
+
</Badge>
|
|
84
|
+
</Stack>
|
|
85
|
+
</Card>
|
|
86
|
+
))}
|
|
87
|
+
</Grid>
|
|
88
|
+
</Section>
|
|
89
|
+
</Stack>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Scale } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { LegalNoticeTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <Scale />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function LegalPage() {
|
|
13
|
+
return <LegalNoticeTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Shield } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { PrivacyPolicyTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <Shield />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function PrivacyPage() {
|
|
13
|
+
return <PrivacyPolicyTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FileText } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { TermsOfServiceTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <FileText />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function TermsPage() {
|
|
13
|
+
return <TermsOfServiceTemplate />;
|
|
14
|
+
}
|
|
@@ -1,53 +1,28 @@
|
|
|
1
1
|
// apps/demo/vite.config.ts
|
|
2
|
-
import react from '@vitejs/plugin-react';
|
|
3
|
-
import { defineConfig } from 'vite';
|
|
4
|
-
import tsconfigPaths from 'vite-tsconfig-paths';
|
|
5
|
-
import autoprefixer from 'autoprefixer';
|
|
6
|
-
// @ts-expect-error - postcss-import doesn't have type definitions
|
|
7
|
-
import postcssImport from 'postcss-import';
|
|
8
|
-
import postcssNesting from 'postcss-nesting';
|
|
9
|
-
import { resolve as pathResolve } from 'node:path';
|
|
10
|
-
import { createRequire } from 'node:module';
|
|
11
2
|
|
|
12
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Vite build configuration for the demo app
|
|
5
|
+
* @description Configures Vite build tool with application settings, development server, HMR, and file watching options for the demo application.
|
|
6
|
+
* @version 0.0.1
|
|
7
|
+
* @since 0.0.1
|
|
8
|
+
* @author AMBROISE PARK Consulting
|
|
9
|
+
*/
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!id.startsWith('.')) {
|
|
30
|
-
try {
|
|
31
|
-
return require.resolve(id, { paths: [basedir] });
|
|
32
|
-
} catch {
|
|
33
|
-
// Fallback to relative resolution
|
|
34
|
-
return pathResolve(basedir, id);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
// Relative imports
|
|
38
|
-
return pathResolve(basedir, id);
|
|
39
|
-
},
|
|
40
|
-
}),
|
|
41
|
-
postcssNesting,
|
|
42
|
-
autoprefixer,
|
|
43
|
-
],
|
|
11
|
+
import { defineViteConfig } from '@donotdev/core/vite';
|
|
12
|
+
|
|
13
|
+
import { appConfig } from './src/config/app';
|
|
14
|
+
|
|
15
|
+
// Features and SEO are now in app.ts (runtime config)
|
|
16
|
+
// Only build-time configs (routes, themes, i18n, assets) go here
|
|
17
|
+
export default defineViteConfig({
|
|
18
|
+
appConfig,
|
|
19
|
+
server: {
|
|
20
|
+
port: 3003,
|
|
21
|
+
https: false,
|
|
22
|
+
|
|
23
|
+
// HMR Configuration - Enabled for debugging
|
|
24
|
+
hmr: {
|
|
25
|
+
overlay: true, // Show error overlay in browser
|
|
44
26
|
},
|
|
45
27
|
},
|
|
46
|
-
|
|
47
|
-
include: ['react', 'react-dom', 'react/jsx-runtime'],
|
|
48
|
-
},
|
|
49
|
-
resolve: {
|
|
50
|
-
dedupe: ['react', 'react-dom'],
|
|
51
|
-
preserveSymlinks: false,
|
|
52
|
-
},
|
|
53
|
-
});
|
|
28
|
+
});
|
|
@@ -8,7 +8,7 @@ Mobile app built with DoNotDev Framework and Expo.
|
|
|
8
8
|
|
|
9
9
|
- Node.js 20+ and Bun 1.3+
|
|
10
10
|
- Expo Go app on your phone (for development)
|
|
11
|
-
-
|
|
11
|
+
- Provider configured (run `dndev coach` then `dndev setup`)
|
|
12
12
|
|
|
13
13
|
### Development
|
|
14
14
|
|
|
@@ -51,17 +51,15 @@ export default function HomePage() {
|
|
|
51
51
|
/>
|
|
52
52
|
|
|
53
53
|
<Card
|
|
54
|
-
title="2.
|
|
54
|
+
title="2. Provider Setup"
|
|
55
55
|
content={[
|
|
56
|
-
'Run: dndev
|
|
57
|
-
'This
|
|
58
|
-
' -
|
|
59
|
-
' -
|
|
60
|
-
'
|
|
61
|
-
'
|
|
62
|
-
'
|
|
63
|
-
' - Download service account key',
|
|
64
|
-
' - Enable Auth + Firestore in Firebase Console',
|
|
56
|
+
'Run: dndev coach',
|
|
57
|
+
'This shows what to configure:',
|
|
58
|
+
' - Which dashboard to visit',
|
|
59
|
+
' - What to copy and where to paste it',
|
|
60
|
+
'Fill in your .env values, then run:',
|
|
61
|
+
' dndev setup',
|
|
62
|
+
'Setup validates, automates, and health-checks.',
|
|
65
63
|
]}
|
|
66
64
|
/>
|
|
67
65
|
</Grid>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
VITE_FIREBASE_API_KEY=
|
|
8
8
|
VITE_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
EXPO_PUBLIC_FIREBASE_API_KEY=
|
|
8
8
|
EXPO_PUBLIC_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
8
8
|
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
VITE_SUPABASE_URL=
|
|
12
12
|
VITE_SUPABASE_PUBLIC_KEY=
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
EXPO_PUBLIC_SUPABASE_URL=
|
|
12
12
|
EXPO_PUBLIC_SUPABASE_PUBLIC_KEY=
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
NEXT_PUBLIC_SUPABASE_URL=
|
|
12
12
|
NEXT_PUBLIC_SUPABASE_PUBLIC_KEY=
|