flyee 0.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/LICENSE +21 -0
- package/README.md +134 -0
- package/bin/install.js +357 -0
- package/bridge/bridge.py +1780 -0
- package/bridge/local_tracker.py +722 -0
- package/core/agents/backend-specialist.md +266 -0
- package/core/agents/code-archaeologist.md +106 -0
- package/core/agents/database-architect.md +226 -0
- package/core/agents/debugger.md +225 -0
- package/core/agents/devops-engineer.md +323 -0
- package/core/agents/documentation-writer.md +104 -0
- package/core/agents/explorer-agent.md +73 -0
- package/core/agents/frontend-specialist.md +743 -0
- package/core/agents/game-developer.md +162 -0
- package/core/agents/mobile-developer.md +377 -0
- package/core/agents/orchestrator.md +416 -0
- package/core/agents/penetration-tester.md +188 -0
- package/core/agents/performance-optimizer.md +187 -0
- package/core/agents/product-manager.md +112 -0
- package/core/agents/product-owner.md +95 -0
- package/core/agents/project-planner.md +470 -0
- package/core/agents/qa-automation-engineer.md +103 -0
- package/core/agents/security-auditor.md +170 -0
- package/core/agents/seo-specialist.md +111 -0
- package/core/agents/stitch-designer.md +190 -0
- package/core/agents/tdd-reviewer.md +282 -0
- package/core/agents/test-engineer.md +158 -0
- package/core/scripts/auto_preview.py +148 -0
- package/core/scripts/checklist.py +243 -0
- package/core/scripts/cost_report.py +149 -0
- package/core/scripts/doc-sync-check.py +461 -0
- package/core/scripts/parse_user_stories.py +79 -0
- package/core/scripts/prepare_notion_updates.py +172 -0
- package/core/scripts/print_create_payload.py +18 -0
- package/core/scripts/session_manager.py +120 -0
- package/core/scripts/task_complete.py +127 -0
- package/core/scripts/verify_all.py +327 -0
- package/core/skills/analytics-strategy/SKILL.md +128 -0
- package/core/skills/api-patterns/SKILL.md +81 -0
- package/core/skills/api-patterns/api-style.md +42 -0
- package/core/skills/api-patterns/auth.md +24 -0
- package/core/skills/api-patterns/documentation.md +26 -0
- package/core/skills/api-patterns/graphql.md +41 -0
- package/core/skills/api-patterns/rate-limiting.md +31 -0
- package/core/skills/api-patterns/response.md +37 -0
- package/core/skills/api-patterns/rest.md +40 -0
- package/core/skills/api-patterns/scripts/api_validator.py +211 -0
- package/core/skills/api-patterns/security-testing.md +122 -0
- package/core/skills/api-patterns/trpc.md +41 -0
- package/core/skills/api-patterns/versioning.md +22 -0
- package/core/skills/app-builder/SKILL.md +75 -0
- package/core/skills/app-builder/agent-coordination.md +71 -0
- package/core/skills/app-builder/feature-building.md +53 -0
- package/core/skills/app-builder/project-detection.md +34 -0
- package/core/skills/app-builder/scaffolding.md +118 -0
- package/core/skills/app-builder/tech-stack.md +40 -0
- package/core/skills/app-builder/templates/SKILL.md +39 -0
- package/core/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/core/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/core/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/core/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/core/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/core/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/core/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/core/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/core/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/core/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/core/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/core/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/core/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/core/skills/architecture/SKILL.md +55 -0
- package/core/skills/architecture/context-discovery.md +43 -0
- package/core/skills/architecture/examples.md +94 -0
- package/core/skills/architecture/pattern-selection.md +68 -0
- package/core/skills/architecture/patterns-reference.md +50 -0
- package/core/skills/architecture/trade-off-analysis.md +77 -0
- package/core/skills/atomic-design/SKILL.md +282 -0
- package/core/skills/atomic-design/references/classification-guide.md +132 -0
- package/core/skills/atomic-design/references/quality-checklist.md +60 -0
- package/core/skills/atomic-design/references/stacks/stack-blade.md +254 -0
- package/core/skills/atomic-design/references/stacks/stack-nextjs.md +272 -0
- package/core/skills/atomic-design/references/stacks/stack-react.md +239 -0
- package/core/skills/atomic-design/references/stacks/stack-vue.md +224 -0
- package/core/skills/bash-linux/SKILL.md +199 -0
- package/core/skills/behavioral-modes/SKILL.md +242 -0
- package/core/skills/brainstorming/SKILL.md +163 -0
- package/core/skills/brainstorming/dynamic-questioning.md +373 -0
- package/core/skills/checkpointing-patterns/SKILL.md +163 -0
- package/core/skills/clean-code/SKILL.md +201 -0
- package/core/skills/code-review-checklist/SKILL.md +109 -0
- package/core/skills/code-truth-validation/SKILL.md +149 -0
- package/core/skills/component-library-discovery/SKILL.md +154 -0
- package/core/skills/content-strategy/SKILL.md +222 -0
- package/core/skills/context-budget/SKILL.md +155 -0
- package/core/skills/context-gathering-patterns/SKILL.md +278 -0
- package/core/skills/cost-tracking/SKILL.md +206 -0
- package/core/skills/database-design/SKILL.md +52 -0
- package/core/skills/database-design/database-selection.md +43 -0
- package/core/skills/database-design/indexing.md +39 -0
- package/core/skills/database-design/migrations.md +48 -0
- package/core/skills/database-design/optimization.md +36 -0
- package/core/skills/database-design/orm-selection.md +30 -0
- package/core/skills/database-design/schema-design.md +56 -0
- package/core/skills/database-design/scripts/schema_validator.py +172 -0
- package/core/skills/deployment-procedures/SKILL.md +295 -0
- package/core/skills/design-md/README.md +34 -0
- package/core/skills/design-md/SKILL.md +172 -0
- package/core/skills/design-md/examples/DESIGN.md +154 -0
- package/core/skills/design-system-enforcement/SKILL.md +339 -0
- package/core/skills/doc.md +177 -0
- package/core/skills/document-registry/SKILL.md +130 -0
- package/core/skills/documentation-publishing/SKILL.md +174 -0
- package/core/skills/documentation-templates/SKILL.md +194 -0
- package/core/skills/enhance-prompt/README.md +34 -0
- package/core/skills/enhance-prompt/SKILL.md +204 -0
- package/core/skills/enhance-prompt/references/KEYWORDS.md +114 -0
- package/core/skills/frontend-design/SKILL.md +430 -0
- package/core/skills/frontend-design/animation-guide.md +331 -0
- package/core/skills/frontend-design/color-system.md +311 -0
- package/core/skills/frontend-design/decision-trees.md +418 -0
- package/core/skills/frontend-design/motion-graphics.md +306 -0
- package/core/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/core/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/core/skills/frontend-design/typography-system.md +345 -0
- package/core/skills/frontend-design/ux-psychology.md +541 -0
- package/core/skills/frontend-design/visual-effects.md +383 -0
- package/core/skills/game-development/2d-games/SKILL.md +119 -0
- package/core/skills/game-development/3d-games/SKILL.md +135 -0
- package/core/skills/game-development/SKILL.md +167 -0
- package/core/skills/game-development/game-art/SKILL.md +185 -0
- package/core/skills/game-development/game-audio/SKILL.md +190 -0
- package/core/skills/game-development/game-design/SKILL.md +129 -0
- package/core/skills/game-development/mobile-games/SKILL.md +108 -0
- package/core/skills/game-development/multiplayer/SKILL.md +132 -0
- package/core/skills/game-development/pc-games/SKILL.md +144 -0
- package/core/skills/game-development/vr-ar/SKILL.md +123 -0
- package/core/skills/game-development/web-games/SKILL.md +150 -0
- package/core/skills/geo-fundamentals/SKILL.md +156 -0
- package/core/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/core/skills/git-workflow/SKILL.md +263 -0
- package/core/skills/history-check-patterns/SKILL.md +125 -0
- package/core/skills/i18n-localization/SKILL.md +154 -0
- package/core/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/core/skills/integration-completeness/SKILL.md +219 -0
- package/core/skills/intelligent-routing/SKILL.md +370 -0
- package/core/skills/lint-and-validate/SKILL.md +45 -0
- package/core/skills/lint-and-validate/scripts/lint_runner.py +173 -0
- package/core/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/core/skills/local-verification/SKILL.md +195 -0
- package/core/skills/mcp-builder/SKILL.md +176 -0
- package/core/skills/mobile-design/SKILL.md +394 -0
- package/core/skills/mobile-design/decision-trees.md +516 -0
- package/core/skills/mobile-design/mobile-backend.md +491 -0
- package/core/skills/mobile-design/mobile-color-system.md +420 -0
- package/core/skills/mobile-design/mobile-debugging.md +122 -0
- package/core/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/core/skills/mobile-design/mobile-navigation.md +458 -0
- package/core/skills/mobile-design/mobile-performance.md +767 -0
- package/core/skills/mobile-design/mobile-testing.md +356 -0
- package/core/skills/mobile-design/mobile-typography.md +433 -0
- package/core/skills/mobile-design/platform-android.md +666 -0
- package/core/skills/mobile-design/platform-ios.md +561 -0
- package/core/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/core/skills/mobile-design/touch-psychology.md +537 -0
- package/core/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/core/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/core/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/core/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/core/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/core/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/core/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/core/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/core/skills/nextjs-react-expert/SKILL.md +267 -0
- package/core/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/core/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/core/skills/nodejs-best-practices/SKILL.md +333 -0
- package/core/skills/notion-task-patterns/SKILL.md +2529 -0
- package/core/skills/page-specifications/SKILL.md +367 -0
- package/core/skills/parallel-agents/SKILL.md +175 -0
- package/core/skills/performance-profiling/SKILL.md +143 -0
- package/core/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/core/skills/plan-writing/SKILL.md +190 -0
- package/core/skills/powershell-windows/SKILL.md +167 -0
- package/core/skills/project-foundation/SKILL.md +117 -0
- package/core/skills/project-setup/SKILL.md +141 -0
- package/core/skills/project-tracking-patterns/SKILL.md +357 -0
- package/core/skills/project-type-discovery/SKILL.md +239 -0
- package/core/skills/python-patterns/SKILL.md +441 -0
- package/core/skills/qa-test-generation/SKILL.md +156 -0
- package/core/skills/react-components/README.md +36 -0
- package/core/skills/react-components/SKILL.md +47 -0
- package/core/skills/react-components/examples/gold-standard-card.tsx +80 -0
- package/core/skills/react-components/package-lock.json +231 -0
- package/core/skills/react-components/package.json +16 -0
- package/core/skills/react-components/resources/architecture-checklist.md +15 -0
- package/core/skills/react-components/resources/component-template.tsx +37 -0
- package/core/skills/react-components/resources/stitch-api-reference.md +14 -0
- package/core/skills/react-components/resources/style-guide.json +27 -0
- package/core/skills/react-components/scripts/fetch-stitch.sh +30 -0
- package/core/skills/react-components/scripts/validate.js +68 -0
- package/core/skills/red-team-tactics/SKILL.md +199 -0
- package/core/skills/remotion/README.md +105 -0
- package/core/skills/remotion/SKILL.md +393 -0
- package/core/skills/remotion/examples/WalkthroughComposition.tsx +78 -0
- package/core/skills/remotion/examples/screens.json +56 -0
- package/core/skills/remotion/resources/composition-checklist.md +124 -0
- package/core/skills/remotion/resources/screen-slide-template.tsx +123 -0
- package/core/skills/remotion/scripts/download-stitch-asset.sh +38 -0
- package/core/skills/seo-fundamentals/SKILL.md +129 -0
- package/core/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/core/skills/server-management/SKILL.md +161 -0
- package/core/skills/session-resilience/SKILL.md +199 -0
- package/core/skills/shadcn-ui/README.md +248 -0
- package/core/skills/shadcn-ui/SKILL.md +326 -0
- package/core/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/core/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/core/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/core/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/core/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/core/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/core/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/core/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/core/skills/state-machine/SKILL.md +264 -0
- package/core/skills/stitch-loop/README.md +54 -0
- package/core/skills/stitch-loop/SKILL.md +203 -0
- package/core/skills/stitch-loop/examples/SITE.md +73 -0
- package/core/skills/stitch-loop/examples/next-prompt.md +25 -0
- package/core/skills/stitch-loop/resources/baton-schema.md +61 -0
- package/core/skills/stitch-loop/resources/site-template.md +104 -0
- package/core/skills/systematic-debugging/SKILL.md +109 -0
- package/core/skills/tailwind-patterns/SKILL.md +284 -0
- package/core/skills/tdd-validation/SKILL.md +243 -0
- package/core/skills/tdd-workflow/SKILL.md +284 -0
- package/core/skills/testing-patterns/SKILL.md +196 -0
- package/core/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/core/skills/ui-ux-discovery/SKILL.md +329 -0
- package/core/skills/ui-validation/SKILL.md +190 -0
- package/core/skills/ui-validation/scripts/ui_antipattern_check.py +317 -0
- package/core/skills/verification-gate/SKILL.md +205 -0
- package/core/skills/vulnerability-scanner/SKILL.md +276 -0
- package/core/skills/vulnerability-scanner/checklists.md +121 -0
- package/core/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/core/skills/web-design-guidelines/SKILL.md +57 -0
- package/core/skills/webapp-testing/SKILL.md +187 -0
- package/core/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/core/templates/ARCHITECTURE.template.md +407 -0
- package/core/templates/project-resources.example.json +71 -0
- package/core/workflows/atomic.md +182 -0
- package/core/workflows/brainstorm.md +134 -0
- package/core/workflows/check-task.md +242 -0
- package/core/workflows/copy-collect.md +306 -0
- package/core/workflows/create-agent.md +33 -0
- package/core/workflows/create-skill.md +39 -0
- package/core/workflows/create-workflow.md +33 -0
- package/core/workflows/create.md +92 -0
- package/core/workflows/debug.md +186 -0
- package/core/workflows/demand.md +443 -0
- package/core/workflows/deploy.md +260 -0
- package/core/workflows/discovery.md +267 -0
- package/core/workflows/document.md +272 -0
- package/core/workflows/ds-components.md +296 -0
- package/core/workflows/ds-init.md +58 -0
- package/core/workflows/ds-refactor.md +245 -0
- package/core/workflows/ds-references.md +197 -0
- package/core/workflows/ds-styleguide.md +237 -0
- package/core/workflows/ds-token-diff.md +103 -0
- package/core/workflows/ds-tokens.md +317 -0
- package/core/workflows/ds-validate.md +309 -0
- package/core/workflows/execute.md +483 -0
- package/core/workflows/extract-template.md +278 -0
- package/core/workflows/fix-failed-tests.md +160 -0
- package/core/workflows/init-project.md +386 -0
- package/core/workflows/legacy-project.md +849 -0
- package/core/workflows/log.md +97 -0
- package/core/workflows/new-project.md +610 -0
- package/core/workflows/new-project.md.bak +3292 -0
- package/core/workflows/new-task.md +404 -0
- package/core/workflows/orchestrate.md +237 -0
- package/core/workflows/page-build.md +296 -0
- package/core/workflows/plan.md +89 -0
- package/core/workflows/prd.md +255 -0
- package/core/workflows/preview.md +81 -0
- package/core/workflows/review-page.md +304 -0
- package/core/workflows/status.md +86 -0
- package/core/workflows/stitch.md +226 -0
- package/core/workflows/task-complete.md +473 -0
- package/core/workflows/task-update.md +163 -0
- package/core/workflows/tdd.md +344 -0
- package/core/workflows/test.md +251 -0
- package/core/workflows/ui-ux-pro-max.md +437 -0
- package/core/workflows/ux-mobile-optimize.md +262 -0
- package/core/workflows/ux-mobile-validate.md +297 -0
- package/engine-files/GEMINI.md +69 -0
- package/package.json +47 -0
- package/runtime-adapters/antigravity.js +26 -0
- package/runtime-adapters/claude.js +57 -0
- package/runtime-adapters/codex.js +51 -0
- package/runtime-adapters/copilot.js +51 -0
- package/runtime-adapters/cursor.js +51 -0
- package/runtime-adapters/gemini-cli.js +30 -0
- package/runtime-adapters/opencode.js +51 -0
- package/runtime-adapters/windsurf.js +51 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Stack Adapter: Laravel Blade + Alpine.js
|
|
2
|
+
|
|
3
|
+
> For Laravel projects using Blade components, Tailwind CSS, and Alpine.js for interactivity.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Folder Structure
|
|
8
|
+
|
|
9
|
+
For a component named `button` in the **atoms** category:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
resources/views/components/atoms/
|
|
13
|
+
└── button.blade.php
|
|
14
|
+
|
|
15
|
+
app/View/Components/Atoms/
|
|
16
|
+
└── Button.php
|
|
17
|
+
|
|
18
|
+
tests/Unit/Components/Atoms/
|
|
19
|
+
└── ButtonTest.php
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Category paths (Blade views):**
|
|
23
|
+
- `resources/views/components/atoms/` — button, input, icon, badge
|
|
24
|
+
- `resources/views/components/molecules/` — search-bar, form-field
|
|
25
|
+
- `resources/views/components/organisms/` — header, card, modal
|
|
26
|
+
|
|
27
|
+
**Category paths (Component classes):**
|
|
28
|
+
- `app/View/Components/Atoms/`
|
|
29
|
+
- `app/View/Components/Molecules/`
|
|
30
|
+
- `app/View/Components/Organisms/`
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Required Files (3 minimum)
|
|
35
|
+
|
|
36
|
+
### 1. Component Class — `app/View/Components/Atoms/Button.php`
|
|
37
|
+
|
|
38
|
+
```php
|
|
39
|
+
<?php
|
|
40
|
+
|
|
41
|
+
namespace App\View\Components\Atoms;
|
|
42
|
+
|
|
43
|
+
use Illuminate\View\Component;
|
|
44
|
+
|
|
45
|
+
class Button extends Component
|
|
46
|
+
{
|
|
47
|
+
/**
|
|
48
|
+
* @param 'primary'|'secondary' $variant
|
|
49
|
+
* @param 'sm'|'md'|'lg' $size
|
|
50
|
+
* @param bool $disabled
|
|
51
|
+
*/
|
|
52
|
+
public function __construct(
|
|
53
|
+
public string $variant = 'primary',
|
|
54
|
+
public string $size = 'md',
|
|
55
|
+
public bool $disabled = false,
|
|
56
|
+
) {}
|
|
57
|
+
|
|
58
|
+
public function render()
|
|
59
|
+
{
|
|
60
|
+
return view('components.atoms.button');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public function classes(): string
|
|
64
|
+
{
|
|
65
|
+
return implode(' ', array_filter([
|
|
66
|
+
'button',
|
|
67
|
+
"button--{$this->variant}",
|
|
68
|
+
"button--{$this->size}",
|
|
69
|
+
]));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Rules:**
|
|
75
|
+
- PHPDoc for all constructor parameters with union types
|
|
76
|
+
- Promoted constructor properties
|
|
77
|
+
- Helper methods for computed values (like CSS classes)
|
|
78
|
+
- Namespace follows folder structure
|
|
79
|
+
|
|
80
|
+
### 2. Blade Template — `resources/views/components/atoms/button.blade.php`
|
|
81
|
+
|
|
82
|
+
```blade
|
|
83
|
+
<button
|
|
84
|
+
{{ $attributes->merge(['class' => $classes()]) }}
|
|
85
|
+
@if($disabled) disabled @endif
|
|
86
|
+
{{ $attributes->except(['class']) }}
|
|
87
|
+
>
|
|
88
|
+
{{ $slot }}
|
|
89
|
+
</button>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Rules:**
|
|
93
|
+
- Use `$attributes->merge()` for class merging
|
|
94
|
+
- Use `$slot` (not `$children`)
|
|
95
|
+
- Keep templates minimal — logic in Component class
|
|
96
|
+
- Design tokens via Tailwind/CSS classes mapped to variables
|
|
97
|
+
|
|
98
|
+
#### With Alpine.js interactivity:
|
|
99
|
+
|
|
100
|
+
```blade
|
|
101
|
+
<button
|
|
102
|
+
{{ $attributes->merge(['class' => $classes()]) }}
|
|
103
|
+
@if($disabled) disabled @endif
|
|
104
|
+
x-data="{ loading: false }"
|
|
105
|
+
x-on:click="loading = true; $dispatch('button-click')"
|
|
106
|
+
x-bind:class="{ 'button--loading': loading }"
|
|
107
|
+
>
|
|
108
|
+
<span x-show="!loading">{{ $slot }}</span>
|
|
109
|
+
<span x-show="loading" x-cloak>Loading...</span>
|
|
110
|
+
</button>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 3. Test — `tests/Unit/Components/Atoms/ButtonTest.php`
|
|
114
|
+
|
|
115
|
+
```php
|
|
116
|
+
<?php
|
|
117
|
+
|
|
118
|
+
namespace Tests\Unit\Components\Atoms;
|
|
119
|
+
|
|
120
|
+
use App\View\Components\Atoms\Button;
|
|
121
|
+
use Tests\TestCase;
|
|
122
|
+
|
|
123
|
+
class ButtonTest extends TestCase
|
|
124
|
+
{
|
|
125
|
+
public function test_renders_with_default_props(): void
|
|
126
|
+
{
|
|
127
|
+
$component = new Button();
|
|
128
|
+
|
|
129
|
+
$this->assertEquals('primary', $component->variant);
|
|
130
|
+
$this->assertEquals('md', $component->size);
|
|
131
|
+
$this->assertFalse($component->disabled);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public function test_generates_correct_classes(): void
|
|
135
|
+
{
|
|
136
|
+
$component = new Button(variant: 'secondary', size: 'lg');
|
|
137
|
+
|
|
138
|
+
$this->assertStringContainsString('button--secondary', $component->classes());
|
|
139
|
+
$this->assertStringContainsString('button--lg', $component->classes());
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public function test_renders_in_view(): void
|
|
143
|
+
{
|
|
144
|
+
$view = $this->component(Button::class, [
|
|
145
|
+
'variant' => 'primary',
|
|
146
|
+
]);
|
|
147
|
+
|
|
148
|
+
$view->assertSee('button--primary');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public function test_disabled_state(): void
|
|
152
|
+
{
|
|
153
|
+
$view = $this->component(Button::class, [
|
|
154
|
+
'disabled' => true,
|
|
155
|
+
]);
|
|
156
|
+
|
|
157
|
+
$view->assertSee('disabled');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Rules:**
|
|
163
|
+
- PHPUnit (Laravel default)
|
|
164
|
+
- Test: construction, class generation, rendering, states
|
|
165
|
+
- Location: `tests/Unit/Components/{Category}/`
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Usage in Blade Views
|
|
170
|
+
|
|
171
|
+
```blade
|
|
172
|
+
{{-- Basic usage --}}
|
|
173
|
+
<x-atoms.button variant="primary">
|
|
174
|
+
Save
|
|
175
|
+
</x-atoms.button>
|
|
176
|
+
|
|
177
|
+
{{-- With attributes --}}
|
|
178
|
+
<x-atoms.button
|
|
179
|
+
variant="secondary"
|
|
180
|
+
size="lg"
|
|
181
|
+
wire:click="submit"
|
|
182
|
+
class="mt-4"
|
|
183
|
+
>
|
|
184
|
+
Submit Form
|
|
185
|
+
</x-atoms.button>
|
|
186
|
+
|
|
187
|
+
{{-- Molecule using atoms --}}
|
|
188
|
+
<x-molecules.search-bar
|
|
189
|
+
placeholder="Search..."
|
|
190
|
+
action="/search"
|
|
191
|
+
/>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Styling Approach
|
|
197
|
+
|
|
198
|
+
Blade projects typically use **Tailwind CSS** for styling. Map design tokens via `tailwind.config.js`:
|
|
199
|
+
|
|
200
|
+
```js
|
|
201
|
+
// tailwind.config.js
|
|
202
|
+
module.exports = {
|
|
203
|
+
theme: {
|
|
204
|
+
extend: {
|
|
205
|
+
colors: {
|
|
206
|
+
primary: 'var(--color-primary)',
|
|
207
|
+
secondary: 'var(--color-secondary)',
|
|
208
|
+
},
|
|
209
|
+
spacing: {
|
|
210
|
+
xs: 'var(--spacing-xs)',
|
|
211
|
+
sm: 'var(--spacing-sm)',
|
|
212
|
+
md: 'var(--spacing-md)',
|
|
213
|
+
lg: 'var(--spacing-lg)',
|
|
214
|
+
xl: 'var(--spacing-xl)',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Or use BEM with a separate SCSS file:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
resources/css/components/atoms/_button.scss
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Import in `app.css`:
|
|
228
|
+
```css
|
|
229
|
+
@import 'components/atoms/button';
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Artisan Helper
|
|
235
|
+
|
|
236
|
+
Create components quickly via artisan:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
php artisan make:component Atoms/Button
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
This generates both the class and view. Adjust namespace and paths as needed.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Infrastructure Detection
|
|
247
|
+
|
|
248
|
+
| Check | File to Scan | When Present |
|
|
249
|
+
|-------|-------------|-------------|
|
|
250
|
+
| Laravel | `artisan` file in root | ✅ Blade adapter |
|
|
251
|
+
| Blade views | `resources/views/` | ✅ Standard location |
|
|
252
|
+
| Alpine.js | `package.json` → `alpinejs` | Interactive components |
|
|
253
|
+
| Tailwind | `tailwind.config.*` | Utility-first styling |
|
|
254
|
+
| PHPUnit | `phpunit.xml` | Test framework |
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Stack Adapter: Next.js (App Router + TypeScript)
|
|
2
|
+
|
|
3
|
+
> Extends the React adapter with Next.js-specific patterns: Server/Client boundary, CSS Modules, and App Router conventions.
|
|
4
|
+
> **Base:** Read [stack-react.md](stack-react.md) first — this adapter adds Next.js-specific rules on top.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Key Difference: Server vs Client Components
|
|
9
|
+
|
|
10
|
+
Next.js App Router components are **Server Components by default**. This affects how Atomic Design components are structured.
|
|
11
|
+
|
|
12
|
+
### When to use `'use client'`
|
|
13
|
+
|
|
14
|
+
| Needs | Directive | Examples |
|
|
15
|
+
|-------|-----------|---------|
|
|
16
|
+
| onClick, onChange, onSubmit | `'use client'` | Button, Input, Toggle, SearchBar |
|
|
17
|
+
| useState, useEffect, useRef | `'use client'` | Modal, Accordion, Tabs |
|
|
18
|
+
| Browser APIs (window, localStorage) | `'use client'` | ThemeSwitcher, ScrollToTop |
|
|
19
|
+
| Static rendering only | **None** (Server) | Badge, Avatar, Icon, Card (display-only) |
|
|
20
|
+
| Data fetching (async component) | **None** (Server) | DataTable with `fetch()`, UserProfile |
|
|
21
|
+
|
|
22
|
+
### Rule of Thumb
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Does this component handle user interaction or use React hooks?
|
|
26
|
+
├── YES → 'use client' (first line of the .tsx file)
|
|
27
|
+
└── NO → Server Component (no directive needed)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> 🔴 **Push `'use client'` as far DOWN the tree as possible.**
|
|
31
|
+
> A Header (Organism) can be a Server Component if only its SearchBar (Molecule) needs interactivity.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Folder Structure
|
|
36
|
+
|
|
37
|
+
For a component named `Button` in the **atoms** category:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
src/components/atoms/Button/
|
|
41
|
+
├── index.ts # Barrel export
|
|
42
|
+
├── Button.tsx # Component ('use client' if interactive)
|
|
43
|
+
├── Button.module.scss # CSS Modules (Next.js default)
|
|
44
|
+
├── Button.types.ts # TypeScript interfaces
|
|
45
|
+
├── Button.test.tsx # Tests (Vitest + RTL)
|
|
46
|
+
└── Button.stories.tsx # Storybook story (optional)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Category paths:**
|
|
50
|
+
- `src/components/atoms/` — Button, Input, Icon, Badge
|
|
51
|
+
- `src/components/molecules/` — SearchBar, FormField, NavItem
|
|
52
|
+
- `src/components/organisms/` — Header, Modal, DataTable
|
|
53
|
+
|
|
54
|
+
**Path alias:** Always use `@/components/...` (configured in `tsconfig.json`).
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Required Files
|
|
59
|
+
|
|
60
|
+
### 1. Types — `Button.types.ts` (ALWAYS FIRST)
|
|
61
|
+
|
|
62
|
+
Same as React adapter. No Next.js-specific changes.
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
export interface ButtonProps {
|
|
66
|
+
readonly children: React.ReactNode;
|
|
67
|
+
readonly variant?: 'primary' | 'secondary' | 'ghost';
|
|
68
|
+
readonly size?: 'sm' | 'md' | 'lg';
|
|
69
|
+
readonly disabled?: boolean;
|
|
70
|
+
readonly onClick?: () => void;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. Component — `Button.tsx` (with `'use client'`)
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
'use client';
|
|
78
|
+
|
|
79
|
+
import type { ButtonProps } from './Button.types';
|
|
80
|
+
import styles from './Button.module.scss';
|
|
81
|
+
import clsx from 'clsx';
|
|
82
|
+
|
|
83
|
+
export default function Button({
|
|
84
|
+
children,
|
|
85
|
+
variant = 'primary',
|
|
86
|
+
size = 'md',
|
|
87
|
+
disabled = false,
|
|
88
|
+
onClick,
|
|
89
|
+
}: ButtonProps) {
|
|
90
|
+
return (
|
|
91
|
+
<button
|
|
92
|
+
className={clsx(
|
|
93
|
+
styles.button,
|
|
94
|
+
styles[`button--${variant}`],
|
|
95
|
+
styles[`button--${size}`],
|
|
96
|
+
)}
|
|
97
|
+
disabled={disabled}
|
|
98
|
+
onClick={onClick}
|
|
99
|
+
>
|
|
100
|
+
{children}
|
|
101
|
+
</button>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Next.js-specific rules:**
|
|
107
|
+
- `'use client'` as first line if component uses interactivity/hooks
|
|
108
|
+
- **Named function export** (preferred in Next.js over `const + React.FC`)
|
|
109
|
+
- Default export for the component
|
|
110
|
+
- CSS Modules import with `clsx` for class composition
|
|
111
|
+
|
|
112
|
+
### 3. Styles — `Button.module.scss` (CSS Modules)
|
|
113
|
+
|
|
114
|
+
```scss
|
|
115
|
+
.button {
|
|
116
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
117
|
+
font-size: var(--font-size-md);
|
|
118
|
+
font-weight: var(--font-weight-medium);
|
|
119
|
+
border: 1px solid transparent;
|
|
120
|
+
border-radius: var(--radius-md);
|
|
121
|
+
cursor: pointer;
|
|
122
|
+
transition: background-color 0.2s ease, opacity 0.2s ease;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.button--primary {
|
|
126
|
+
background-color: var(--color-primary);
|
|
127
|
+
color: var(--color-background);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.button--secondary {
|
|
131
|
+
background-color: transparent;
|
|
132
|
+
color: var(--color-primary);
|
|
133
|
+
border-color: var(--color-primary);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.button--ghost {
|
|
137
|
+
background-color: transparent;
|
|
138
|
+
color: var(--color-text);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.button--sm { padding: var(--spacing-xs) var(--spacing-sm); font-size: var(--font-size-sm); }
|
|
142
|
+
.button--lg { padding: var(--spacing-md) var(--spacing-lg); font-size: var(--font-size-lg); }
|
|
143
|
+
|
|
144
|
+
.button:hover:not(:disabled) { opacity: 0.85; }
|
|
145
|
+
|
|
146
|
+
.button:disabled {
|
|
147
|
+
opacity: 0.5;
|
|
148
|
+
cursor: not-allowed;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**CSS Modules rules:**
|
|
153
|
+
- File extension: `.module.scss` (NOT `.styles.scss`)
|
|
154
|
+
- Import as: `import styles from './Button.module.scss'`
|
|
155
|
+
- Classes accessed via `styles.button`, `styles['button--primary']`
|
|
156
|
+
- BEM modifiers use bracket notation: `styles['button--variant']`
|
|
157
|
+
- Design tokens via CSS variables still work (they're global)
|
|
158
|
+
|
|
159
|
+
> **Note:** BEM nesting (`&--modifier`) does NOT work with CSS Modules because class names are hashed. Use flat selectors instead.
|
|
160
|
+
|
|
161
|
+
### 4. Tests — `Button.test.tsx`
|
|
162
|
+
|
|
163
|
+
Same as React adapter (Vitest + React Testing Library). No changes.
|
|
164
|
+
|
|
165
|
+
### 5. Barrel Export — `index.ts`
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
export { default } from './Button';
|
|
169
|
+
export type { ButtonProps } from './Button.types';
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Server Component Example (no `'use client'`)
|
|
175
|
+
|
|
176
|
+
For a **display-only** component like a Badge:
|
|
177
|
+
|
|
178
|
+
```tsx
|
|
179
|
+
// No 'use client' — this is a Server Component
|
|
180
|
+
import type { BadgeProps } from './Badge.types';
|
|
181
|
+
import styles from './Badge.module.scss';
|
|
182
|
+
import clsx from 'clsx';
|
|
183
|
+
|
|
184
|
+
export default function Badge({ children, variant = 'default' }: BadgeProps) {
|
|
185
|
+
return (
|
|
186
|
+
<span className={clsx(styles.badge, styles[`badge--${variant}`])}>
|
|
187
|
+
{children}
|
|
188
|
+
</span>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Server Components **cannot:**
|
|
194
|
+
- Use `onClick`, `onChange`, or any event handlers
|
|
195
|
+
- Use `useState`, `useEffect`, `useRef`, or any hooks
|
|
196
|
+
- Use browser APIs (`window`, `document`, `localStorage`)
|
|
197
|
+
|
|
198
|
+
Server Components **can:**
|
|
199
|
+
- Be `async` and fetch data directly
|
|
200
|
+
- Import and render other Server Components
|
|
201
|
+
- Import and render Client Components
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Composition with shadcn/ui
|
|
206
|
+
|
|
207
|
+
shadcn components in Next.js already include `'use client'` where needed:
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
'use client';
|
|
211
|
+
|
|
212
|
+
import { Button as ShadcnButton } from '@/components/ui/button';
|
|
213
|
+
import type { ButtonProps } from './Button.types';
|
|
214
|
+
import styles from './Button.module.scss';
|
|
215
|
+
import clsx from 'clsx';
|
|
216
|
+
|
|
217
|
+
export default function Button({ children, variant, ...props }: ButtonProps) {
|
|
218
|
+
return (
|
|
219
|
+
<ShadcnButton className={clsx(styles.button, styles[`button--${variant}`])} {...props}>
|
|
220
|
+
{children}
|
|
221
|
+
</ShadcnButton>
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Storybook Caveat
|
|
229
|
+
|
|
230
|
+
> ⚠️ **Server Components do NOT render in Storybook.** Only create stories for Client Components.
|
|
231
|
+
|
|
232
|
+
For Server Components, test rendering via Vitest with RSC support or integration tests.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Token File Location
|
|
237
|
+
|
|
238
|
+
In Next.js, the global CSS file is typically:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
src/app/globals.css (App Router)
|
|
242
|
+
src/styles/globals.css (alternative)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Add design tokens as `:root` variables in `globals.css`. They will be available to all CSS Modules via `var(--token-name)`.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Infrastructure Detection
|
|
250
|
+
|
|
251
|
+
| Check | File to Scan | Install Command |
|
|
252
|
+
|-------|-------------|----------------|
|
|
253
|
+
| Next.js | `next.config.*` | — |
|
|
254
|
+
| TypeScript | `tsconfig.json` | Built-in with Next.js |
|
|
255
|
+
| SCSS | `package.json` → `sass` | `npm install -D sass` |
|
|
256
|
+
| clsx | `package.json` → `clsx` | `npm install clsx` |
|
|
257
|
+
| Vitest | `vitest.config.*` | `npm install -D vitest @testing-library/react @testing-library/jest-dom @vitejs/plugin-react` |
|
|
258
|
+
| Storybook | `.storybook/` dir | `npx storybook@latest init` |
|
|
259
|
+
| shadcn | `components.json` | `npx shadcn@latest init` |
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Quick Reference: React vs Next.js Adapter
|
|
264
|
+
|
|
265
|
+
| Aspect | React (`stack-react.md`) | Next.js (this file) |
|
|
266
|
+
|--------|------------------------|---------------------|
|
|
267
|
+
| Styles | `.styles.scss` (direct import) | `.module.scss` (CSS Modules) |
|
|
268
|
+
| BEM nesting | `&--modifier` in SCSS | Flat selectors (no nesting) |
|
|
269
|
+
| Class composition | String concatenation | `clsx()` utility |
|
|
270
|
+
| Component style | `React.FC<Props>` | Named function export |
|
|
271
|
+
| Server Components | N/A | Default, push `'use client'` down |
|
|
272
|
+
| Path alias | Optional | `@/components/...` (standard) |
|