achira-wf 3.1.0
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/.achira/ARCHITECTURE.md +296 -0
- package/.achira/core/agents/backend-specialist.md +263 -0
- package/.achira/core/agents/code-archaeologist.md +106 -0
- package/.achira/core/agents/database-architect.md +226 -0
- package/.achira/core/agents/debugger.md +225 -0
- package/.achira/core/agents/devops-engineer.md +242 -0
- package/.achira/core/agents/documentation-writer.md +104 -0
- package/.achira/core/agents/explorer-agent.md +73 -0
- package/.achira/core/agents/frontend-specialist.md +593 -0
- package/.achira/core/agents/game-developer.md +162 -0
- package/.achira/core/agents/mobile-developer.md +377 -0
- package/.achira/core/agents/orchestrator.md +416 -0
- package/.achira/core/agents/penetration-tester.md +188 -0
- package/.achira/core/agents/performance-optimizer.md +187 -0
- package/.achira/core/agents/product-manager.md +112 -0
- package/.achira/core/agents/product-owner.md +95 -0
- package/.achira/core/agents/project-planner.md +413 -0
- package/.achira/core/agents/qa-automation-engineer.md +103 -0
- package/.achira/core/agents/security-auditor.md +170 -0
- package/.achira/core/agents/seo-specialist.md +111 -0
- package/.achira/core/agents/test-engineer.md +158 -0
- package/.achira/core/mcp_config.json +24 -0
- package/.achira/core/shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.achira/core/shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.achira/core/shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.achira/core/shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.achira/core/shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.achira/core/shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.achira/core/shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.achira/core/shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.achira/core/shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.achira/core/shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.achira/core/shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.achira/core/shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.achira/core/shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/__pycache__/generate_theme.cpython-314.pyc +0 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/generate_theme.py +99 -0
- package/.achira/core/shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/.achira/core/skills/api-patterns/SKILL.md +81 -0
- package/.achira/core/skills/api-patterns/api-style.md +42 -0
- package/.achira/core/skills/api-patterns/auth.md +24 -0
- package/.achira/core/skills/api-patterns/documentation.md +26 -0
- package/.achira/core/skills/api-patterns/graphql.md +41 -0
- package/.achira/core/skills/api-patterns/rate-limiting.md +31 -0
- package/.achira/core/skills/api-patterns/response.md +37 -0
- package/.achira/core/skills/api-patterns/rest.md +40 -0
- package/.achira/core/skills/api-patterns/scripts/api_validator.py +211 -0
- package/.achira/core/skills/api-patterns/security-testing.md +122 -0
- package/.achira/core/skills/api-patterns/trpc.md +41 -0
- package/.achira/core/skills/api-patterns/versioning.md +22 -0
- package/.achira/core/skills/app-builder/SKILL.md +98 -0
- package/.achira/core/skills/app-builder/agent-coordination.md +71 -0
- package/.achira/core/skills/app-builder/feature-building.md +53 -0
- package/.achira/core/skills/app-builder/project-detection.md +34 -0
- package/.achira/core/skills/app-builder/scaffolding.md +118 -0
- package/.achira/core/skills/app-builder/tech-stack.md +40 -0
- package/.achira/core/skills/app-builder/templates/SKILL.md +39 -0
- package/.achira/core/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/.achira/core/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/.achira/core/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/.achira/core/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/.achira/core/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/.achira/core/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/.achira/core/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/.achira/core/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/.achira/core/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/.achira/core/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/.achira/core/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/.achira/core/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/.achira/core/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/.achira/core/skills/architecture/SKILL.md +55 -0
- package/.achira/core/skills/architecture/context-discovery.md +43 -0
- package/.achira/core/skills/architecture/examples.md +94 -0
- package/.achira/core/skills/architecture/pattern-selection.md +68 -0
- package/.achira/core/skills/architecture/patterns-reference.md +50 -0
- package/.achira/core/skills/architecture/trade-off-analysis.md +77 -0
- package/.achira/core/skills/bash-linux/SKILL.md +199 -0
- package/.achira/core/skills/behavioral-modes/SKILL.md +242 -0
- package/.achira/core/skills/brainstorming/SKILL.md +163 -0
- package/.achira/core/skills/brainstorming/dynamic-questioning.md +350 -0
- package/.achira/core/skills/clean-code/SKILL.md +201 -0
- package/.achira/core/skills/code-review-checklist/SKILL.md +109 -0
- package/.achira/core/skills/database-design/SKILL.md +52 -0
- package/.achira/core/skills/database-design/database-selection.md +43 -0
- package/.achira/core/skills/database-design/indexing.md +39 -0
- package/.achira/core/skills/database-design/migrations.md +48 -0
- package/.achira/core/skills/database-design/optimization.md +36 -0
- package/.achira/core/skills/database-design/orm-selection.md +30 -0
- package/.achira/core/skills/database-design/schema-design.md +56 -0
- package/.achira/core/skills/database-design/scripts/schema_validator.py +172 -0
- package/.achira/core/skills/deployment-procedures/SKILL.md +241 -0
- package/.achira/core/skills/doc.md +177 -0
- package/.achira/core/skills/documentation-templates/SKILL.md +194 -0
- package/.achira/core/skills/frontend-design/SKILL.md +418 -0
- package/.achira/core/skills/frontend-design/animation-guide.md +331 -0
- package/.achira/core/skills/frontend-design/color-system.md +311 -0
- package/.achira/core/skills/frontend-design/decision-trees.md +418 -0
- package/.achira/core/skills/frontend-design/motion-graphics.md +306 -0
- package/.achira/core/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/.achira/core/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/.achira/core/skills/frontend-design/typography-system.md +345 -0
- package/.achira/core/skills/frontend-design/ux-psychology.md +1116 -0
- package/.achira/core/skills/frontend-design/visual-effects.md +383 -0
- package/.achira/core/skills/game-development/2d-games/SKILL.md +119 -0
- package/.achira/core/skills/game-development/3d-games/SKILL.md +135 -0
- package/.achira/core/skills/game-development/SKILL.md +167 -0
- package/.achira/core/skills/game-development/game-art/SKILL.md +185 -0
- package/.achira/core/skills/game-development/game-audio/SKILL.md +190 -0
- package/.achira/core/skills/game-development/game-design/SKILL.md +129 -0
- package/.achira/core/skills/game-development/mobile-games/SKILL.md +108 -0
- package/.achira/core/skills/game-development/multiplayer/SKILL.md +132 -0
- package/.achira/core/skills/game-development/pc-games/SKILL.md +144 -0
- package/.achira/core/skills/game-development/vr-ar/SKILL.md +123 -0
- package/.achira/core/skills/game-development/web-games/SKILL.md +150 -0
- package/.achira/core/skills/geo-fundamentals/SKILL.md +156 -0
- package/.achira/core/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/.achira/core/skills/i18n-localization/SKILL.md +154 -0
- package/.achira/core/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/.achira/core/skills/intelligent-routing/SKILL.md +335 -0
- package/.achira/core/skills/lint-and-validate/SKILL.md +45 -0
- package/.achira/core/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/.achira/core/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/.achira/core/skills/mcp-builder/SKILL.md +176 -0
- package/.achira/core/skills/mobile-design/SKILL.md +394 -0
- package/.achira/core/skills/mobile-design/decision-trees.md +516 -0
- package/.achira/core/skills/mobile-design/mobile-backend.md +491 -0
- package/.achira/core/skills/mobile-design/mobile-color-system.md +420 -0
- package/.achira/core/skills/mobile-design/mobile-debugging.md +122 -0
- package/.achira/core/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/.achira/core/skills/mobile-design/mobile-navigation.md +458 -0
- package/.achira/core/skills/mobile-design/mobile-performance.md +767 -0
- package/.achira/core/skills/mobile-design/mobile-testing.md +356 -0
- package/.achira/core/skills/mobile-design/mobile-typography.md +433 -0
- package/.achira/core/skills/mobile-design/platform-android.md +666 -0
- package/.achira/core/skills/mobile-design/platform-ios.md +561 -0
- package/.achira/core/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/.achira/core/skills/mobile-design/touch-psychology.md +537 -0
- package/.achira/core/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/.achira/core/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/.achira/core/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/.achira/core/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/.achira/core/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/.achira/core/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/.achira/core/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/.achira/core/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/.achira/core/skills/nextjs-react-expert/SKILL.md +286 -0
- package/.achira/core/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/.achira/core/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/.achira/core/skills/nodejs-best-practices/SKILL.md +333 -0
- package/.achira/core/skills/parallel-agents/SKILL.md +175 -0
- package/.achira/core/skills/performance-profiling/SKILL.md +143 -0
- package/.achira/core/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/.achira/core/skills/plan-writing/SKILL.md +152 -0
- package/.achira/core/skills/powershell-windows/SKILL.md +167 -0
- package/.achira/core/skills/project-setup/SKILL.md +291 -0
- package/.achira/core/skills/python-patterns/SKILL.md +441 -0
- package/.achira/core/skills/red-team-tactics/SKILL.md +199 -0
- package/.achira/core/skills/rust-pro/SKILL.md +176 -0
- package/.achira/core/skills/seo-fundamentals/SKILL.md +129 -0
- package/.achira/core/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/.achira/core/skills/server-management/SKILL.md +161 -0
- package/.achira/core/skills/systematic-debugging/SKILL.md +109 -0
- package/.achira/core/skills/tailwind-patterns/SKILL.md +269 -0
- package/.achira/core/skills/tdd-workflow/SKILL.md +149 -0
- package/.achira/core/skills/testing-patterns/SKILL.md +178 -0
- package/.achira/core/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/.achira/core/skills/vulnerability-scanner/SKILL.md +276 -0
- package/.achira/core/skills/vulnerability-scanner/checklists.md +121 -0
- package/.achira/core/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/.achira/core/skills/web-design-guidelines/SKILL.md +57 -0
- package/.achira/core/skills/webapp-testing/SKILL.md +187 -0
- package/.achira/core/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/.achira/rules/GEMINI.md +273 -0
- package/.achira/scripts/__pycache__/checklist.cpython-314.pyc +0 -0
- package/.achira/scripts/__pycache__/shared_utils.cpython-314.pyc +0 -0
- package/.achira/scripts/__pycache__/verify_all.cpython-314.pyc +0 -0
- package/.achira/scripts/auto_preview.py +148 -0
- package/.achira/scripts/checklist.py +193 -0
- package/.achira/scripts/session_manager.py +120 -0
- package/.achira/scripts/shared_utils.py +64 -0
- package/.achira/scripts/verify_all.py +304 -0
- package/.achira/workflows/brainstorm.md +113 -0
- package/.achira/workflows/create.md +59 -0
- package/.achira/workflows/debug.md +103 -0
- package/.achira/workflows/deploy.md +176 -0
- package/.achira/workflows/enhance.md +63 -0
- package/.achira/workflows/html+js+css.md +363 -0
- package/.achira/workflows/next.js.md +316 -0
- package/.achira/workflows/orchestrate.md +237 -0
- package/.achira/workflows/plan.md +89 -0
- package/.achira/workflows/preview.md +81 -0
- package/.achira/workflows/react+vite.md +280 -0
- package/.achira/workflows/registry.json +35 -0
- package/.achira/workflows/status.md +86 -0
- package/.achira/workflows/test.md +144 -0
- package/.achira/workflows/ui-ux-pro-max.md +296 -0
- package/.agent/workflows/brainstorm.md +113 -0
- package/.agent/workflows/create.md +59 -0
- package/.agent/workflows/debug.md +103 -0
- package/.agent/workflows/deploy.md +176 -0
- package/.agent/workflows/enhance.md +63 -0
- package/.agent/workflows/html+js+css.md +363 -0
- package/.agent/workflows/next.js.md +316 -0
- package/.agent/workflows/orchestrate.md +237 -0
- package/.agent/workflows/plan.md +89 -0
- package/.agent/workflows/preview.md +81 -0
- package/.agent/workflows/react+vite.md +280 -0
- package/.agent/workflows/status.md +86 -0
- package/.agent/workflows/test.md +144 -0
- package/.agent/workflows/ui-ux-pro-max.md +296 -0
- package/LICENSE +21 -0
- package/README.md +110 -0
- package/cli.js +293 -0
- package/package.json +48 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Scaffold a clean, scalable vanilla HTML + CSS + JavaScript project with clear separation of concerns.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
// turbo-all
|
|
6
|
+
|
|
7
|
+
## Philosophy
|
|
8
|
+
|
|
9
|
+
This workflow enforces a strict separation between structure, style, and behavior.
|
|
10
|
+
|
|
11
|
+
- **HTML** = Structure only. No inline styles, no inline scripts.
|
|
12
|
+
- **CSS** = Styling only. Split by concern: globals, layout, page-specific.
|
|
13
|
+
- **JS** = Behavior only. Modular ES modules — one entry point, shared utils.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Create the Project Structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
mkdir src
|
|
21
|
+
mkdir src/pages
|
|
22
|
+
mkdir src/styles
|
|
23
|
+
mkdir src/scripts
|
|
24
|
+
mkdir src/components
|
|
25
|
+
mkdir public
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Final structure:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
project/
|
|
32
|
+
├── public/
|
|
33
|
+
├── src/
|
|
34
|
+
│ ├── pages/
|
|
35
|
+
│ │ └── index.html
|
|
36
|
+
│ ├── styles/
|
|
37
|
+
│ │ ├── globals.css
|
|
38
|
+
│ │ ├── layout.css
|
|
39
|
+
│ │ └── index.css
|
|
40
|
+
│ ├── scripts/
|
|
41
|
+
│ │ ├── main.js
|
|
42
|
+
│ │ └── utils.js
|
|
43
|
+
│ └── components/
|
|
44
|
+
├── jsconfig.json
|
|
45
|
+
├── .gitignore
|
|
46
|
+
└── README.md
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 2. Create `src/pages/index.html`
|
|
52
|
+
|
|
53
|
+
The entry point. Links all CSS and the JS module. No styles or scripts inline.
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<!DOCTYPE html>
|
|
57
|
+
<html lang="en">
|
|
58
|
+
<head>
|
|
59
|
+
<meta charset="UTF-8" />
|
|
60
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
61
|
+
<title>My Project</title>
|
|
62
|
+
|
|
63
|
+
<!-- Global reset + variables -->
|
|
64
|
+
<link rel="stylesheet" href="../styles/globals.css" />
|
|
65
|
+
<!-- Reusable layout utilities -->
|
|
66
|
+
<link rel="stylesheet" href="../styles/layout.css" />
|
|
67
|
+
<!-- Page-specific styles -->
|
|
68
|
+
<link rel="stylesheet" href="../styles/index.css" />
|
|
69
|
+
</head>
|
|
70
|
+
<body>
|
|
71
|
+
<div class="container">
|
|
72
|
+
<h1>Hello World</h1>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<!-- module: enables import/export -->
|
|
76
|
+
<script type="module" src="../scripts/main.js"></script>
|
|
77
|
+
</body>
|
|
78
|
+
</html>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. Create `src/styles/globals.css`
|
|
84
|
+
|
|
85
|
+
The single source of truth for CSS variables and the global reset.
|
|
86
|
+
No component-specific styles go here.
|
|
87
|
+
|
|
88
|
+
```css
|
|
89
|
+
/* Modern Reset */
|
|
90
|
+
*,
|
|
91
|
+
*::before,
|
|
92
|
+
*::after {
|
|
93
|
+
margin: 0;
|
|
94
|
+
padding: 0;
|
|
95
|
+
box-sizing: border-box;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
html {
|
|
99
|
+
font-size: 16px;
|
|
100
|
+
scroll-behavior: smooth;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
img,
|
|
104
|
+
picture,
|
|
105
|
+
video,
|
|
106
|
+
canvas,
|
|
107
|
+
svg {
|
|
108
|
+
display: block;
|
|
109
|
+
max-width: 100%;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
button {
|
|
113
|
+
cursor: pointer;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* Design Tokens */
|
|
117
|
+
:root {
|
|
118
|
+
--color-primary: #6366f1;
|
|
119
|
+
--color-bg: #ffffff;
|
|
120
|
+
--color-text: #111827;
|
|
121
|
+
--color-subtle: #6b7280;
|
|
122
|
+
--font-sans: system-ui, -apple-system, sans-serif;
|
|
123
|
+
--transition-default: all 0.2s ease;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media (prefers-color-scheme: dark) {
|
|
127
|
+
:root {
|
|
128
|
+
--color-bg: #0f172a;
|
|
129
|
+
--color-text: #f8fafc;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
body {
|
|
134
|
+
font-family: var(--font-sans);
|
|
135
|
+
background-color: var(--color-bg);
|
|
136
|
+
color: var(--color-text);
|
|
137
|
+
line-height: 1.6;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 4. Create `src/styles/layout.css`
|
|
144
|
+
|
|
145
|
+
Shared structural utilities across all pages. Not page-specific.
|
|
146
|
+
|
|
147
|
+
```css
|
|
148
|
+
/* Centered content wrapper */
|
|
149
|
+
.container {
|
|
150
|
+
width: min(1100px, 90%);
|
|
151
|
+
margin: 0 auto;
|
|
152
|
+
padding: 2rem 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* Utility layout classes */
|
|
156
|
+
.flex {
|
|
157
|
+
display: flex;
|
|
158
|
+
}
|
|
159
|
+
.flex-col {
|
|
160
|
+
flex-direction: column;
|
|
161
|
+
}
|
|
162
|
+
.flex-center {
|
|
163
|
+
display: flex;
|
|
164
|
+
align-items: center;
|
|
165
|
+
justify-content: center;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.grid {
|
|
169
|
+
display: grid;
|
|
170
|
+
}
|
|
171
|
+
.grid-2 {
|
|
172
|
+
grid-template-columns: repeat(2, 1fr);
|
|
173
|
+
gap: 1.5rem;
|
|
174
|
+
}
|
|
175
|
+
.grid-3 {
|
|
176
|
+
grid-template-columns: repeat(3, 1fr);
|
|
177
|
+
gap: 1.5rem;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 5. Create `src/styles/index.css`
|
|
184
|
+
|
|
185
|
+
Styles for the index page only. Each page gets its own file.
|
|
186
|
+
|
|
187
|
+
```css
|
|
188
|
+
/* index page styles */
|
|
189
|
+
h1 {
|
|
190
|
+
color: var(--color-primary);
|
|
191
|
+
font-size: 2.5rem;
|
|
192
|
+
margin-bottom: 1rem;
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 6. Create `src/scripts/utils.js`
|
|
199
|
+
|
|
200
|
+
Pure, reusable helper functions. No DOM access. No side effects.
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
/**
|
|
204
|
+
* One-call app initializer. Add further calls here as the app grows.
|
|
205
|
+
*/
|
|
206
|
+
export function initApp() {
|
|
207
|
+
console.log("[App] Initialized");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Convenience wrapper: returns a single element or null.
|
|
212
|
+
* @param {string} selector
|
|
213
|
+
* @returns {Element|null}
|
|
214
|
+
*/
|
|
215
|
+
export function qs(selector) {
|
|
216
|
+
return document.querySelector(selector);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Convenience wrapper: returns a NodeList.
|
|
221
|
+
* @param {string} selector
|
|
222
|
+
* @returns {NodeList}
|
|
223
|
+
*/
|
|
224
|
+
export function qsAll(selector) {
|
|
225
|
+
return document.querySelectorAll(selector);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 7. Create `src/scripts/main.js`
|
|
232
|
+
|
|
233
|
+
The single JS entry point. Imports utils, hooks into `DOMContentLoaded`.
|
|
234
|
+
Page-specific logic starts here, but delegates to modules.
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
import { initApp } from "./utils.js";
|
|
238
|
+
|
|
239
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
240
|
+
initApp();
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 8. Create `jsconfig.json`
|
|
247
|
+
|
|
248
|
+
Enable IntelliSense, type-checking via JSDoc, and module resolution in VS Code.
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"compilerOptions": {
|
|
253
|
+
"checkJs": true,
|
|
254
|
+
"moduleResolution": "node",
|
|
255
|
+
"target": "ES2020",
|
|
256
|
+
"module": "ES2020"
|
|
257
|
+
},
|
|
258
|
+
"include": ["src/**/*.js"],
|
|
259
|
+
"exclude": ["node_modules"]
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 9. Create `.gitignore`
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
node_modules/
|
|
269
|
+
dist/
|
|
270
|
+
.DS_Store
|
|
271
|
+
*.log
|
|
272
|
+
.env
|
|
273
|
+
.env.local
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 10. Create `README.md`
|
|
279
|
+
|
|
280
|
+
```markdown
|
|
281
|
+
# Project Name
|
|
282
|
+
|
|
283
|
+
A clean HTML + CSS + JS project.
|
|
284
|
+
|
|
285
|
+
## Structure
|
|
286
|
+
|
|
287
|
+
| Folder | Purpose |
|
|
288
|
+
| ----------------- | ----------------------------------------------------------------------------------- |
|
|
289
|
+
| `src/pages/` | HTML entry points — one file per page |
|
|
290
|
+
| `src/styles/` | `globals.css` (design tokens), `layout.css` (utilities), `page.css` (page-specific) |
|
|
291
|
+
| `src/scripts/` | `main.js` (entry), `utils.js` (shared helpers) |
|
|
292
|
+
| `src/components/` | Reusable HTML snippets (loaded/injected via JS if needed) |
|
|
293
|
+
| `public/` | Static assets: images, fonts, favicon |
|
|
294
|
+
|
|
295
|
+
## Rules
|
|
296
|
+
|
|
297
|
+
- No inline CSS
|
|
298
|
+
- No inline scripts
|
|
299
|
+
- Use CSS variables from `globals.css`
|
|
300
|
+
- Use `type="module"` on all script tags
|
|
301
|
+
- One CSS file per page (mirroring `src/pages/`)
|
|
302
|
+
|
|
303
|
+
## Dev Server
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
npm run dev
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## 11. Initialize npm and Install Dev Server
|
|
315
|
+
|
|
316
|
+
```
|
|
317
|
+
npm init -y
|
|
318
|
+
npm install -D vite
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Add to `package.json`:
|
|
322
|
+
|
|
323
|
+
```json
|
|
324
|
+
"scripts": {
|
|
325
|
+
"dev": "vite src/pages --port=3000 --open",
|
|
326
|
+
"build": "vite build",
|
|
327
|
+
"preview": "vite preview"
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Run:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
npm run dev
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Scaling Rules
|
|
340
|
+
|
|
341
|
+
As the project grows, follow this pattern:
|
|
342
|
+
|
|
343
|
+
```
|
|
344
|
+
src/
|
|
345
|
+
├── pages/
|
|
346
|
+
│ ├── index.html ← each page has its own HTML
|
|
347
|
+
│ ├── about.html
|
|
348
|
+
│ └── contact.html
|
|
349
|
+
├── styles/
|
|
350
|
+
│ ├── globals.css ← shared always
|
|
351
|
+
│ ├── layout.css ← shared always
|
|
352
|
+
│ ├── index.css ← page-specific
|
|
353
|
+
│ ├── about.css
|
|
354
|
+
│ └── contact.css
|
|
355
|
+
├── scripts/
|
|
356
|
+
│ ├── main.js ← one per page (or shared entry + conditionals)
|
|
357
|
+
│ └── utils.js
|
|
358
|
+
└── components/ ← HTML snippets injected via fetch() or JS
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
- Never let `globals.css` accumulate page-specific rules.
|
|
362
|
+
- Never use `<style>` tags inside HTML files.
|
|
363
|
+
- Never write logic inside event listeners — delegate to named functions.
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Scaffold a scalable, production-ready Next.js App Router project with feature-based architecture.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
// turbo-all
|
|
6
|
+
|
|
7
|
+
## Goals
|
|
8
|
+
|
|
9
|
+
- App Router for routing + layouts
|
|
10
|
+
- Feature-based domain grouping
|
|
11
|
+
- Clear Server vs. Client Component boundaries
|
|
12
|
+
- Scalable from side project to SaaS
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. Create the Next.js Project
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
npx -y create-next-app@latest ./ --typescript --eslint --tailwind=false --app --src-dir --import-alias "@/*" --use-npm
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Install Core Dependencies
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
npm install axios lucide-react zod zustand
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 3. Create the Full Directory Structure
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
mkdir src/components/ui src/components/layout src/components/feature
|
|
36
|
+
mkdir src/features/auth src/features/user
|
|
37
|
+
mkdir src/lib src/hooks src/services src/store src/styles src/types
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Full structure:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
src/
|
|
44
|
+
├── app/ # Next.js App Router (routing only)
|
|
45
|
+
│ ├── layout.tsx
|
|
46
|
+
│ ├── page.tsx
|
|
47
|
+
│ ├── globals.css
|
|
48
|
+
│ ├── (marketing)/ # Public-facing route group
|
|
49
|
+
│ │ └── page.tsx
|
|
50
|
+
│ ├── (dashboard)/ # Authenticated route group
|
|
51
|
+
│ │ └── layout.tsx
|
|
52
|
+
│ └── api/ # Route handlers
|
|
53
|
+
│
|
|
54
|
+
├── components/ # Shared UI
|
|
55
|
+
│ ├── ui/ # Primitives: Button, Card, Modal
|
|
56
|
+
│ ├── layout/ # Navbar, Sidebar, Footer
|
|
57
|
+
│ └── feature/ # Composed feature-specific UI
|
|
58
|
+
│
|
|
59
|
+
├── features/ # Feature-based domain logic
|
|
60
|
+
│ ├── auth/
|
|
61
|
+
│ │ ├── components/
|
|
62
|
+
│ │ ├── hooks/
|
|
63
|
+
│ │ ├── actions.ts # Server Actions (Mutations)
|
|
64
|
+
│ │ ├── service.ts
|
|
65
|
+
│ │ └── types.ts
|
|
66
|
+
│ └── user/
|
|
67
|
+
│ ├── components/
|
|
68
|
+
│ ├── hooks/
|
|
69
|
+
│ ├── service.ts
|
|
70
|
+
│ └── types.ts
|
|
71
|
+
│
|
|
72
|
+
├── lib/ # Shared utilities (no external deps)
|
|
73
|
+
│ ├── fetcher.ts
|
|
74
|
+
│ ├── constants.ts
|
|
75
|
+
│ ├── validators.ts
|
|
76
|
+
│ └── env.ts # Zod-validated environment variables
|
|
77
|
+
│
|
|
78
|
+
├── hooks/ # Global shared React hooks
|
|
79
|
+
├── services/ # External API integrations
|
|
80
|
+
├── store/ # Global state (Zustand)
|
|
81
|
+
├── styles/ # CSS Modules for complex, shared styles
|
|
82
|
+
└── types/ # Global TypeScript type definitions
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 4. Set Up `src/app/globals.css`
|
|
88
|
+
|
|
89
|
+
Replace default globals with a clean token-based reset.
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
*,
|
|
93
|
+
*::before,
|
|
94
|
+
*::after {
|
|
95
|
+
margin: 0;
|
|
96
|
+
padding: 0;
|
|
97
|
+
box-sizing: border-box;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
html {
|
|
101
|
+
font-size: 16px;
|
|
102
|
+
scroll-behavior: smooth;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
img,
|
|
106
|
+
picture,
|
|
107
|
+
video,
|
|
108
|
+
canvas,
|
|
109
|
+
svg {
|
|
110
|
+
display: block;
|
|
111
|
+
max-width: 100%;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
button {
|
|
115
|
+
cursor: pointer;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:root {
|
|
119
|
+
--color-primary: #6366f1;
|
|
120
|
+
--color-bg: #ffffff;
|
|
121
|
+
--color-text: #111827;
|
|
122
|
+
--font-sans: var(--font-geist-sans), system-ui, sans-serif;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@media (prefers-color-scheme: dark) {
|
|
126
|
+
:root {
|
|
127
|
+
--color-bg: #0f172a;
|
|
128
|
+
--color-text: #f8fafc;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
body {
|
|
133
|
+
font-family: var(--font-sans);
|
|
134
|
+
background-color: var(--color-bg);
|
|
135
|
+
color: var(--color-text);
|
|
136
|
+
line-height: 1.6;
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 5. Create Root Layout `src/app/layout.tsx`
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
import type { Metadata } from "next";
|
|
146
|
+
import "./globals.css";
|
|
147
|
+
|
|
148
|
+
export const metadata: Metadata = {
|
|
149
|
+
title: "My App",
|
|
150
|
+
description: "Generated with achira-wf",
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export default function RootLayout({
|
|
154
|
+
children,
|
|
155
|
+
}: {
|
|
156
|
+
children: React.ReactNode;
|
|
157
|
+
}) {
|
|
158
|
+
return (
|
|
159
|
+
<html lang="en">
|
|
160
|
+
<body>{children}</body>
|
|
161
|
+
</html>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 6. Create Home Page `src/app/page.tsx`
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
export default function HomePage() {
|
|
172
|
+
return (
|
|
173
|
+
<main>
|
|
174
|
+
<h1>Hello from Next.js App Router</h1>
|
|
175
|
+
</main>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 7. Set Up Example Feature (`auth`)
|
|
183
|
+
|
|
184
|
+
### `src/features/auth/types.ts`
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
export interface User {
|
|
188
|
+
id: string;
|
|
189
|
+
email: string;
|
|
190
|
+
name: string;
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### `src/features/auth/service.ts`
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
import axios from "axios";
|
|
198
|
+
import type { User } from "./types";
|
|
199
|
+
|
|
200
|
+
export async function getMe(): Promise<User> {
|
|
201
|
+
const { data } = await axios.get("/api/auth/me");
|
|
202
|
+
return data;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### `src/features/auth/hooks/useUser.ts`
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
"use client";
|
|
210
|
+
import { useState, useEffect } from "react";
|
|
211
|
+
import { getMe } from "../service";
|
|
212
|
+
import type { User } from "../types";
|
|
213
|
+
|
|
214
|
+
export function useUser() {
|
|
215
|
+
const [user, setUser] = useState<User | null>(null);
|
|
216
|
+
const [loading, setLoading] = useState(true);
|
|
217
|
+
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
getMe()
|
|
220
|
+
.then(setUser)
|
|
221
|
+
.finally(() => setLoading(false));
|
|
222
|
+
}, []);
|
|
223
|
+
|
|
224
|
+
return { user, loading };
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 8. Set Up Shared Lib
|
|
231
|
+
|
|
232
|
+
### `src/lib/constants.ts`
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
export const APP_NAME = "My App";
|
|
236
|
+
export const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "";
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### `src/lib/fetcher.ts`
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
export async function fetcher<T>(url: string): Promise<T> {
|
|
243
|
+
const res = await fetch(url);
|
|
244
|
+
if (!res.ok) throw new Error(`Fetch error: ${res.status}`);
|
|
245
|
+
return res.json();
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### `src/lib/env.ts`
|
|
250
|
+
|
|
251
|
+
Validate environment variables at build time with Zod. Import this in `layout.tsx` or a server-only module so it runs at startup.
|
|
252
|
+
|
|
253
|
+
```ts
|
|
254
|
+
import { z } from "zod";
|
|
255
|
+
|
|
256
|
+
const envSchema = z.object({
|
|
257
|
+
NEXT_PUBLIC_API_URL: z.string().url().optional().default(""),
|
|
258
|
+
NEXT_PUBLIC_APP_ENV: z
|
|
259
|
+
.enum(["development", "staging", "production"])
|
|
260
|
+
.default("development"),
|
|
261
|
+
DATABASE_URL: z.string().min(1, "DATABASE_URL is required"),
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
export const env = envSchema.parse(process.env);
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 9. Create `.env.example`
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
NEXT_PUBLIC_API_URL=
|
|
273
|
+
NEXT_PUBLIC_APP_ENV=development
|
|
274
|
+
DATABASE_URL=
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 10. CSS Strategy Note
|
|
280
|
+
|
|
281
|
+
| Location | Use For |
|
|
282
|
+
| ------------------------- | --------------------------------------------------------------------------------------- |
|
|
283
|
+
| `src/app/globals.css` | CSS reset, CSS custom properties (`:root`), global body styles |
|
|
284
|
+
| `src/styles/*.module.css` | Complex, shared styles used across multiple components (e.g., form layouts, card grids) |
|
|
285
|
+
| Co-located `.module.css` | Component-specific styles that live next to their component file |
|
|
286
|
+
|
|
287
|
+
**Rule:** Default to co-located CSS Modules. Only use `src/styles/` for truly cross-cutting layouts that don't belong to any single component.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 11. Start the Dev Server
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
npm run dev
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Component Guidelines
|
|
300
|
+
|
|
301
|
+
| Rule | Reason |
|
|
302
|
+
| ----------------------------------------- | --------------------------------------------- |
|
|
303
|
+
| Default to **Server Components** | Better performance, less JS sent to client |
|
|
304
|
+
| Use `"use client"` only at the leaf level | Keeps SSR benefits higher in the tree |
|
|
305
|
+
| No business logic in `page.tsx` | Pages are wiring only — delegate to features |
|
|
306
|
+
| Services handle all network calls | Hooks are for state/effects, not fetching raw |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Scalability Path
|
|
311
|
+
|
|
312
|
+
| Stage | Add |
|
|
313
|
+
| ---------- | -------------------------------------------------------- |
|
|
314
|
+
| Small | `app/`, `components/`, `lib/` |
|
|
315
|
+
| Growing | Introduce `features/`, `services/`, feature-scoped hooks |
|
|
316
|
+
| Enterprise | Strict feature boundaries, API abstraction, `store/` |
|