moai-adk 0.35.1__py3-none-any.whl

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.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (502) hide show
  1. moai_adk/__init__.py +10 -0
  2. moai_adk/__main__.py +199 -0
  3. moai_adk/cli/__init__.py +6 -0
  4. moai_adk/cli/commands/__init__.py +17 -0
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +272 -0
  7. moai_adk/cli/commands/init.py +372 -0
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +104 -0
  10. moai_adk/cli/commands/update.py +2686 -0
  11. moai_adk/cli/main.py +13 -0
  12. moai_adk/cli/prompts/__init__.py +5 -0
  13. moai_adk/cli/prompts/init_prompts.py +219 -0
  14. moai_adk/cli/spec_status.py +263 -0
  15. moai_adk/cli/ui/__init__.py +44 -0
  16. moai_adk/cli/ui/progress.py +422 -0
  17. moai_adk/cli/ui/prompts.py +389 -0
  18. moai_adk/cli/ui/theme.py +129 -0
  19. moai_adk/cli/worktree/__init__.py +27 -0
  20. moai_adk/cli/worktree/__main__.py +31 -0
  21. moai_adk/cli/worktree/cli.py +683 -0
  22. moai_adk/cli/worktree/exceptions.py +89 -0
  23. moai_adk/cli/worktree/manager.py +493 -0
  24. moai_adk/cli/worktree/models.py +65 -0
  25. moai_adk/cli/worktree/registry.py +422 -0
  26. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  27. moai_adk/core/__init__.py +1 -0
  28. moai_adk/core/analysis/__init__.py +9 -0
  29. moai_adk/core/analysis/session_analyzer.py +400 -0
  30. moai_adk/core/claude_integration.py +393 -0
  31. moai_adk/core/command_helpers.py +270 -0
  32. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  33. moai_adk/core/config/__init__.py +19 -0
  34. moai_adk/core/config/auto_spec_config.py +340 -0
  35. moai_adk/core/config/migration.py +244 -0
  36. moai_adk/core/config/unified.py +436 -0
  37. moai_adk/core/context_manager.py +273 -0
  38. moai_adk/core/diagnostics/__init__.py +19 -0
  39. moai_adk/core/diagnostics/slash_commands.py +159 -0
  40. moai_adk/core/enterprise_features.py +1404 -0
  41. moai_adk/core/error_recovery_system.py +1902 -0
  42. moai_adk/core/event_driven_hook_system.py +1371 -0
  43. moai_adk/core/git/__init__.py +31 -0
  44. moai_adk/core/git/branch.py +25 -0
  45. moai_adk/core/git/branch_manager.py +129 -0
  46. moai_adk/core/git/checkpoint.py +134 -0
  47. moai_adk/core/git/commit.py +67 -0
  48. moai_adk/core/git/conflict_detector.py +413 -0
  49. moai_adk/core/git/event_detector.py +79 -0
  50. moai_adk/core/git/manager.py +216 -0
  51. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  52. moai_adk/core/input_validation_middleware.py +1006 -0
  53. moai_adk/core/integration/__init__.py +22 -0
  54. moai_adk/core/integration/engine.py +157 -0
  55. moai_adk/core/integration/integration_tester.py +226 -0
  56. moai_adk/core/integration/models.py +88 -0
  57. moai_adk/core/integration/utils.py +211 -0
  58. moai_adk/core/issue_creator.py +305 -0
  59. moai_adk/core/jit_context_loader.py +956 -0
  60. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  61. moai_adk/core/language_config.py +202 -0
  62. moai_adk/core/language_config_resolver.py +572 -0
  63. moai_adk/core/language_validator.py +543 -0
  64. moai_adk/core/mcp/setup.py +116 -0
  65. moai_adk/core/merge/__init__.py +9 -0
  66. moai_adk/core/merge/analyzer.py +605 -0
  67. moai_adk/core/migration/__init__.py +18 -0
  68. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  69. moai_adk/core/migration/backup_manager.py +277 -0
  70. moai_adk/core/migration/custom_element_scanner.py +358 -0
  71. moai_adk/core/migration/file_migrator.py +209 -0
  72. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  73. moai_adk/core/migration/selective_restorer.py +470 -0
  74. moai_adk/core/migration/template_utils.py +74 -0
  75. moai_adk/core/migration/user_selection_ui.py +338 -0
  76. moai_adk/core/migration/version_detector.py +139 -0
  77. moai_adk/core/migration/version_migrator.py +228 -0
  78. moai_adk/core/performance/__init__.py +6 -0
  79. moai_adk/core/performance/cache_system.py +316 -0
  80. moai_adk/core/performance/parallel_processor.py +116 -0
  81. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  82. moai_adk/core/project/__init__.py +1 -0
  83. moai_adk/core/project/backup_utils.py +70 -0
  84. moai_adk/core/project/checker.py +300 -0
  85. moai_adk/core/project/detector.py +293 -0
  86. moai_adk/core/project/initializer.py +387 -0
  87. moai_adk/core/project/phase_executor.py +716 -0
  88. moai_adk/core/project/validator.py +139 -0
  89. moai_adk/core/quality/__init__.py +6 -0
  90. moai_adk/core/quality/trust_checker.py +377 -0
  91. moai_adk/core/quality/validators/__init__.py +6 -0
  92. moai_adk/core/quality/validators/base_validator.py +19 -0
  93. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  94. moai_adk/core/robust_json_parser.py +611 -0
  95. moai_adk/core/rollback_manager.py +918 -0
  96. moai_adk/core/session_manager.py +651 -0
  97. moai_adk/core/skill_loading_system.py +579 -0
  98. moai_adk/core/spec/confidence_scoring.py +680 -0
  99. moai_adk/core/spec/ears_template_engine.py +1247 -0
  100. moai_adk/core/spec/quality_validator.py +687 -0
  101. moai_adk/core/spec_status_manager.py +478 -0
  102. moai_adk/core/template/__init__.py +7 -0
  103. moai_adk/core/template/backup.py +174 -0
  104. moai_adk/core/template/config.py +191 -0
  105. moai_adk/core/template/languages.py +43 -0
  106. moai_adk/core/template/merger.py +233 -0
  107. moai_adk/core/template/processor.py +1200 -0
  108. moai_adk/core/template_engine.py +310 -0
  109. moai_adk/core/template_variable_synchronizer.py +417 -0
  110. moai_adk/core/unified_permission_manager.py +745 -0
  111. moai_adk/core/user_behavior_analytics.py +851 -0
  112. moai_adk/core/version_sync.py +429 -0
  113. moai_adk/foundation/__init__.py +56 -0
  114. moai_adk/foundation/backend.py +1027 -0
  115. moai_adk/foundation/database.py +1115 -0
  116. moai_adk/foundation/devops.py +1585 -0
  117. moai_adk/foundation/ears.py +431 -0
  118. moai_adk/foundation/frontend.py +870 -0
  119. moai_adk/foundation/git/commit_templates.py +557 -0
  120. moai_adk/foundation/git.py +376 -0
  121. moai_adk/foundation/langs.py +484 -0
  122. moai_adk/foundation/ml_ops.py +1162 -0
  123. moai_adk/foundation/testing.py +1524 -0
  124. moai_adk/foundation/trust/trust_principles.py +676 -0
  125. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  126. moai_adk/project/__init__.py +0 -0
  127. moai_adk/project/configuration.py +1084 -0
  128. moai_adk/project/documentation.py +566 -0
  129. moai_adk/project/schema.py +447 -0
  130. moai_adk/statusline/__init__.py +38 -0
  131. moai_adk/statusline/alfred_detector.py +105 -0
  132. moai_adk/statusline/config.py +376 -0
  133. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  134. moai_adk/statusline/git_collector.py +190 -0
  135. moai_adk/statusline/main.py +322 -0
  136. moai_adk/statusline/metrics_tracker.py +78 -0
  137. moai_adk/statusline/renderer.py +343 -0
  138. moai_adk/statusline/update_checker.py +129 -0
  139. moai_adk/statusline/version_reader.py +741 -0
  140. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
  141. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  142. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  143. moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
  144. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  145. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  146. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  147. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  148. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  149. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  150. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  151. moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
  152. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  153. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  154. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  155. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  156. moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
  157. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  158. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  159. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  160. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  161. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  164. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  165. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  166. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  167. moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
  168. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  169. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  170. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  171. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  172. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  173. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  185. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  186. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  187. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  188. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  189. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
  190. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  191. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  192. moai_adk/templates/.claude/settings.json +172 -0
  193. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
  194. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  195. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
  196. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  200. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  201. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  202. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  203. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  204. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  205. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
  206. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
  207. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
  210. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  211. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  212. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  213. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  214. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
  215. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
  216. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
  217. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  221. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  222. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  223. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  224. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  230. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  231. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  232. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  233. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  280. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  281. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  282. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  283. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  284. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
  285. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
  286. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  287. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  288. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  289. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  290. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
  291. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
  292. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
  293. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
  294. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
  295. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
  297. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
  298. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
  304. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
  305. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
  306. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
  307. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
  308. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
  309. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
  310. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
  311. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
  312. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
  313. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
  314. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
  315. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
  316. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  318. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  319. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  320. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  321. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  331. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  332. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  333. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  334. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  338. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  339. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  340. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  341. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  342. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  343. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  344. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  345. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  346. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
  347. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  348. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  349. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  350. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  351. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  352. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  353. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  354. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  355. moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
  356. moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
  357. moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
  358. moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
  359. moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
  360. moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
  361. moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
  362. moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
  363. moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
  364. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
  365. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
  366. moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
  367. moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
  368. moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
  369. moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
  370. moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
  371. moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
  372. moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
  373. moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
  374. moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
  375. moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
  376. moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
  377. moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
  378. moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
  379. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
  380. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
  381. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
  382. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
  383. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
  384. moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
  385. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
  386. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
  387. moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
  388. moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
  389. moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
  390. moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
  391. moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  429. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  430. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  431. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  432. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  433. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  434. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  435. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  436. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  437. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  438. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  439. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  440. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  441. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  442. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  443. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  444. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  445. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  446. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  447. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  448. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  449. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  450. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  451. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  452. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  453. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  454. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  455. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  456. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  457. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  458. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  459. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  460. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  461. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  462. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  463. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  464. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  465. moai_adk/templates/.git-hooks/pre-commit +128 -0
  466. moai_adk/templates/.git-hooks/pre-push +365 -0
  467. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  468. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  469. moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
  470. moai_adk/templates/.gitignore +222 -0
  471. moai_adk/templates/.mcp.json +13 -0
  472. moai_adk/templates/.moai/config/config.yaml +58 -0
  473. moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
  474. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  475. moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
  476. moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
  477. moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
  478. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
  479. moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
  480. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  481. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  482. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  483. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  484. moai_adk/templates/.moai/config/sections/system.yaml +24 -0
  485. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  486. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  487. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  488. moai_adk/templates/CLAUDE.md +642 -0
  489. moai_adk/utils/__init__.py +30 -0
  490. moai_adk/utils/banner.py +38 -0
  491. moai_adk/utils/common.py +294 -0
  492. moai_adk/utils/link_validator.py +241 -0
  493. moai_adk/utils/logger.py +147 -0
  494. moai_adk/utils/safe_file_reader.py +206 -0
  495. moai_adk/utils/timeout.py +160 -0
  496. moai_adk/utils/toon_utils.py +256 -0
  497. moai_adk/version.py +22 -0
  498. moai_adk-0.35.1.dist-info/METADATA +3018 -0
  499. moai_adk-0.35.1.dist-info/RECORD +502 -0
  500. moai_adk-0.35.1.dist-info/WHEEL +4 -0
  501. moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
  502. moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,968 @@
1
+ # Frontend Development Examples
2
+
3
+ Multishot prompting examples demonstrating practical frontend patterns covering React 19, Next.js 16, Vue 3.5, and modern component architecture.
4
+
5
+ ---
6
+
7
+ ## Example 1: React 19 Server Components with Data Fetching
8
+
9
+ **Scenario**: Build a user dashboard with server-side data fetching and client interactivity.
10
+
11
+ **Input**:
12
+ ```tsx
13
+ // Need: User dashboard showing profile and recent activity
14
+ // Requirements:
15
+ // - Server-side data fetching for performance
16
+ // - Client-side interactivity for actions
17
+ // - Proper loading and error states
18
+ ```
19
+
20
+ **Output**:
21
+ ```tsx
22
+ // app/dashboard/page.tsx
23
+ import { Suspense } from 'react'
24
+ import { cache } from 'react'
25
+ import { getUserProfile, getUserActivity } from '@/lib/api/users'
26
+ import { DashboardSkeleton } from '@/components/skeletons'
27
+ import { UserProfile } from './UserProfile'
28
+ import { ActivityFeed } from './ActivityFeed'
29
+ import { DashboardActions } from './DashboardActions'
30
+
31
+ // Cache data fetching for request deduplication
32
+ const getUser = cache(async (userId: string) => {
33
+ return await getUserProfile(userId)
34
+ })
35
+
36
+ const getActivity = cache(async (userId: string) => {
37
+ return await getUserActivity(userId, { limit: 10 })
38
+ })
39
+
40
+ interface DashboardPageProps {
41
+ params: { userId: string }
42
+ }
43
+
44
+ export default async function DashboardPage({ params }: DashboardPageProps) {
45
+ const { userId } = params
46
+
47
+ return (
48
+ <div className="container mx-auto py-8">
49
+ <h1 className="text-3xl font-bold mb-8">Dashboard</h1>
50
+
51
+ <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
52
+ {/* Server Component - Profile */}
53
+ <div className="lg:col-span-1">
54
+ <Suspense fallback={<DashboardSkeleton type="profile" />}>
55
+ <UserProfileSection userId={userId} />
56
+ </Suspense>
57
+ </div>
58
+
59
+ {/* Server Component - Activity with streaming */}
60
+ <div className="lg:col-span-2">
61
+ <Suspense fallback={<DashboardSkeleton type="activity" />}>
62
+ <ActivitySection userId={userId} />
63
+ </Suspense>
64
+ </div>
65
+ </div>
66
+
67
+ {/* Client Component - Interactive Actions */}
68
+ <DashboardActions userId={userId} />
69
+ </div>
70
+ )
71
+ }
72
+
73
+ async function UserProfileSection({ userId }: { userId: string }) {
74
+ const user = await getUser(userId)
75
+
76
+ return <UserProfile user={user} />
77
+ }
78
+
79
+ async function ActivitySection({ userId }: { userId: string }) {
80
+ const activity = await getActivity(userId)
81
+
82
+ return <ActivityFeed activities={activity} />
83
+ }
84
+
85
+ // components/dashboard/DashboardActions.tsx
86
+ 'use client'
87
+
88
+ import { useState, useTransition } from 'react'
89
+ import { refreshDashboard } from '@/app/actions/dashboard'
90
+ import { Button } from '@/components/ui/button'
91
+
92
+ interface DashboardActionsProps {
93
+ userId: string
94
+ }
95
+
96
+ export function DashboardActions({ userId }: DashboardActionsProps) {
97
+ const [isPending, startTransition] = useTransition()
98
+ const [message, setMessage] = useState<string | null>(null)
99
+
100
+ const handleRefresh = () => {
101
+ startTransition(async () => {
102
+ const result = await refreshDashboard(userId)
103
+ setMessage(result.message)
104
+ })
105
+ }
106
+
107
+ return (
108
+ <div className="mt-6 flex items-center gap-4">
109
+ <Button
110
+ onClick={handleRefresh}
111
+ disabled={isPending}
112
+ >
113
+ {isPending ? 'Refreshing...' : 'Refresh Dashboard'}
114
+ </Button>
115
+
116
+ {message && (
117
+ <p className="text-sm text-muted-foreground">{message}</p>
118
+ )}
119
+ </div>
120
+ )
121
+ }
122
+ ```
123
+
124
+ **Explanation**: This pattern demonstrates React 19's server components for efficient data fetching, request deduplication with cache(), Suspense for streaming, and client components for interactivity.
125
+
126
+ ---
127
+
128
+ ## Example 2: Next.js 16 Server Actions with Form Handling
129
+
130
+ **Scenario**: Implement a user registration form with server-side validation.
131
+
132
+ **Input**:
133
+ ```tsx
134
+ // Need: Registration form with:
135
+ // - Server-side validation
136
+ // - Real-time feedback
137
+ // - Progressive enhancement (works without JS)
138
+ ```
139
+
140
+ **Output**:
141
+ ```tsx
142
+ // app/register/page.tsx
143
+ import { RegisterForm } from './RegisterForm'
144
+
145
+ export default function RegisterPage() {
146
+ return (
147
+ <div className="max-w-md mx-auto py-12">
148
+ <h1 className="text-2xl font-bold mb-6">Create Account</h1>
149
+ <RegisterForm />
150
+ </div>
151
+ )
152
+ }
153
+
154
+ // app/register/RegisterForm.tsx
155
+ 'use client'
156
+
157
+ import { useActionState } from 'react'
158
+ import { registerUser, type RegisterState } from '@/app/actions/auth'
159
+ import { Button } from '@/components/ui/button'
160
+ import { Input } from '@/components/ui/input'
161
+ import { Label } from '@/components/ui/label'
162
+ import { Alert, AlertDescription } from '@/components/ui/alert'
163
+
164
+ const initialState: RegisterState = {
165
+ success: false,
166
+ errors: {}
167
+ }
168
+
169
+ export function RegisterForm() {
170
+ const [state, formAction, isPending] = useActionState(
171
+ registerUser,
172
+ initialState
173
+ )
174
+
175
+ return (
176
+ <form action={formAction} className="space-y-4">
177
+ {state.errors?.general && (
178
+ <Alert variant="destructive">
179
+ <AlertDescription>{state.errors.general}</AlertDescription>
180
+ </Alert>
181
+ )}
182
+
183
+ <div className="space-y-2">
184
+ <Label htmlFor="name">Full Name</Label>
185
+ <Input
186
+ id="name"
187
+ name="name"
188
+ type="text"
189
+ placeholder="John Doe"
190
+ aria-describedby="name-error"
191
+ />
192
+ {state.errors?.name && (
193
+ <p id="name-error" className="text-sm text-destructive">
194
+ {state.errors.name}
195
+ </p>
196
+ )}
197
+ </div>
198
+
199
+ <div className="space-y-2">
200
+ <Label htmlFor="email">Email</Label>
201
+ <Input
202
+ id="email"
203
+ name="email"
204
+ type="email"
205
+ placeholder="john@example.com"
206
+ aria-describedby="email-error"
207
+ />
208
+ {state.errors?.email && (
209
+ <p id="email-error" className="text-sm text-destructive">
210
+ {state.errors.email}
211
+ </p>
212
+ )}
213
+ </div>
214
+
215
+ <div className="space-y-2">
216
+ <Label htmlFor="password">Password</Label>
217
+ <Input
218
+ id="password"
219
+ name="password"
220
+ type="password"
221
+ minLength={8}
222
+ aria-describedby="password-error"
223
+ />
224
+ {state.errors?.password && (
225
+ <p id="password-error" className="text-sm text-destructive">
226
+ {state.errors.password}
227
+ </p>
228
+ )}
229
+ </div>
230
+
231
+ <Button type="submit" className="w-full" disabled={isPending}>
232
+ {isPending ? 'Creating Account...' : 'Create Account'}
233
+ </Button>
234
+ </form>
235
+ )
236
+ }
237
+
238
+ // app/actions/auth.ts
239
+ 'use server'
240
+
241
+ import { z } from 'zod'
242
+ import { redirect } from 'next/navigation'
243
+ import { createUser } from '@/lib/users'
244
+
245
+ const registerSchema = z.object({
246
+ name: z.string().min(2, 'Name must be at least 2 characters'),
247
+ email: z.string().email('Please enter a valid email'),
248
+ password: z.string().min(8, 'Password must be at least 8 characters')
249
+ })
250
+
251
+ export interface RegisterState {
252
+ success: boolean
253
+ errors?: {
254
+ name?: string
255
+ email?: string
256
+ password?: string
257
+ general?: string
258
+ }
259
+ }
260
+
261
+ export async function registerUser(
262
+ prevState: RegisterState,
263
+ formData: FormData
264
+ ): Promise<RegisterState> {
265
+ // Parse and validate
266
+ const rawData = {
267
+ name: formData.get('name'),
268
+ email: formData.get('email'),
269
+ password: formData.get('password')
270
+ }
271
+
272
+ const validatedFields = registerSchema.safeParse(rawData)
273
+
274
+ if (!validatedFields.success) {
275
+ const fieldErrors = validatedFields.error.flatten().fieldErrors
276
+ return {
277
+ success: false,
278
+ errors: {
279
+ name: fieldErrors.name?.[0],
280
+ email: fieldErrors.email?.[0],
281
+ password: fieldErrors.password?.[0]
282
+ }
283
+ }
284
+ }
285
+
286
+ try {
287
+ await createUser(validatedFields.data)
288
+ } catch (error) {
289
+ if (error instanceof Error && error.message === 'EMAIL_EXISTS') {
290
+ return {
291
+ success: false,
292
+ errors: { email: 'This email is already registered' }
293
+ }
294
+ }
295
+ return {
296
+ success: false,
297
+ errors: { general: 'Something went wrong. Please try again.' }
298
+ }
299
+ }
300
+
301
+ redirect('/login?registered=true')
302
+ }
303
+ ```
304
+
305
+ **Explanation**: This pattern shows Next.js 16 server actions with useActionState for form handling, Zod validation, proper error messages, and progressive enhancement.
306
+
307
+ ---
308
+
309
+ ## Example 3: Vue 3.5 Composition API with TypeScript
310
+
311
+ **Scenario**: Create a reusable data table component with sorting and pagination.
312
+
313
+ **Input**:
314
+ ```vue
315
+ <!-- Need: Reusable data table with:
316
+ - Type-safe props and emits
317
+ - Sorting by column
318
+ - Pagination
319
+ - Loading and empty states -->
320
+ ```
321
+
322
+ **Output**:
323
+ ```vue
324
+ <!-- components/DataTable.vue -->
325
+ <script setup lang="ts" generic="T extends Record<string, unknown>">
326
+ import { computed, ref } from 'vue'
327
+
328
+ interface Column<T> {
329
+ key: keyof T
330
+ label: string
331
+ sortable?: boolean
332
+ render?: (value: T[keyof T], row: T) => string
333
+ }
334
+
335
+ interface Props {
336
+ data: T[]
337
+ columns: Column<T>[]
338
+ loading?: boolean
339
+ pageSize?: number
340
+ }
341
+
342
+ const props = withDefaults(defineProps<Props>(), {
343
+ loading: false,
344
+ pageSize: 10
345
+ })
346
+
347
+ const emit = defineEmits<{
348
+ rowClick: [row: T]
349
+ sort: [column: keyof T, direction: 'asc' | 'desc']
350
+ }>()
351
+
352
+ // Sorting state
353
+ const sortColumn = ref<keyof T | null>(null)
354
+ const sortDirection = ref<'asc' | 'desc'>('asc')
355
+
356
+ // Pagination state
357
+ const currentPage = ref(1)
358
+
359
+ // Computed: Sorted data
360
+ const sortedData = computed(() => {
361
+ if (!sortColumn.value) return props.data
362
+
363
+ return [...props.data].sort((a, b) => {
364
+ const aVal = a[sortColumn.value!]
365
+ const bVal = b[sortColumn.value!]
366
+
367
+ if (aVal === bVal) return 0
368
+
369
+ const comparison = aVal < bVal ? -1 : 1
370
+ return sortDirection.value === 'asc' ? comparison : -comparison
371
+ })
372
+ })
373
+
374
+ // Computed: Paginated data
375
+ const paginatedData = computed(() => {
376
+ const start = (currentPage.value - 1) * props.pageSize
377
+ return sortedData.value.slice(start, start + props.pageSize)
378
+ })
379
+
380
+ // Computed: Total pages
381
+ const totalPages = computed(() => {
382
+ return Math.ceil(props.data.length / props.pageSize)
383
+ })
384
+
385
+ // Methods
386
+ function handleSort(column: Column<T>) {
387
+ if (!column.sortable) return
388
+
389
+ if (sortColumn.value === column.key) {
390
+ sortDirection.value = sortDirection.value === 'asc' ? 'desc' : 'asc'
391
+ } else {
392
+ sortColumn.value = column.key
393
+ sortDirection.value = 'asc'
394
+ }
395
+
396
+ emit('sort', column.key, sortDirection.value)
397
+ }
398
+
399
+ function handleRowClick(row: T) {
400
+ emit('rowClick', row)
401
+ }
402
+
403
+ function goToPage(page: number) {
404
+ if (page >= 1 && page <= totalPages.value) {
405
+ currentPage.value = page
406
+ }
407
+ }
408
+
409
+ function getCellValue(row: T, column: Column<T>): string {
410
+ const value = row[column.key]
411
+ if (column.render) {
412
+ return column.render(value, row)
413
+ }
414
+ return String(value ?? '')
415
+ }
416
+ </script>
417
+
418
+ <template>
419
+ <div class="data-table">
420
+ <!-- Loading overlay -->
421
+ <div v-if="loading" class="loading-overlay">
422
+ <div class="spinner" />
423
+ </div>
424
+
425
+ <!-- Table -->
426
+ <table class="w-full">
427
+ <thead>
428
+ <tr class="border-b">
429
+ <th
430
+ v-for="column in columns"
431
+ :key="String(column.key)"
432
+ class="px-4 py-3 text-left"
433
+ :class="{ 'cursor-pointer hover:bg-muted': column.sortable }"
434
+ @click="handleSort(column)"
435
+ >
436
+ <div class="flex items-center gap-2">
437
+ {{ column.label }}
438
+ <span v-if="column.sortable && sortColumn === column.key">
439
+ {{ sortDirection === 'asc' ? '↑' : '↓' }}
440
+ </span>
441
+ </div>
442
+ </th>
443
+ </tr>
444
+ </thead>
445
+
446
+ <tbody>
447
+ <!-- Empty state -->
448
+ <tr v-if="!loading && data.length === 0">
449
+ <td :colspan="columns.length" class="px-4 py-8 text-center text-muted-foreground">
450
+ No data available
451
+ </td>
452
+ </tr>
453
+
454
+ <!-- Data rows -->
455
+ <tr
456
+ v-for="(row, index) in paginatedData"
457
+ :key="index"
458
+ class="border-b hover:bg-muted/50 cursor-pointer"
459
+ @click="handleRowClick(row)"
460
+ >
461
+ <td
462
+ v-for="column in columns"
463
+ :key="String(column.key)"
464
+ class="px-4 py-3"
465
+ >
466
+ {{ getCellValue(row, column) }}
467
+ </td>
468
+ </tr>
469
+ </tbody>
470
+ </table>
471
+
472
+ <!-- Pagination -->
473
+ <div v-if="totalPages > 1" class="flex items-center justify-between px-4 py-3 border-t">
474
+ <div class="text-sm text-muted-foreground">
475
+ Showing {{ (currentPage - 1) * pageSize + 1 }} to
476
+ {{ Math.min(currentPage * pageSize, data.length) }} of {{ data.length }}
477
+ </div>
478
+
479
+ <div class="flex gap-1">
480
+ <button
481
+ class="px-3 py-1 rounded hover:bg-muted disabled:opacity-50"
482
+ :disabled="currentPage === 1"
483
+ @click="goToPage(currentPage - 1)"
484
+ >
485
+ Previous
486
+ </button>
487
+
488
+ <button
489
+ v-for="page in totalPages"
490
+ :key="page"
491
+ class="px-3 py-1 rounded"
492
+ :class="page === currentPage ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'"
493
+ @click="goToPage(page)"
494
+ >
495
+ {{ page }}
496
+ </button>
497
+
498
+ <button
499
+ class="px-3 py-1 rounded hover:bg-muted disabled:opacity-50"
500
+ :disabled="currentPage === totalPages"
501
+ @click="goToPage(currentPage + 1)"
502
+ >
503
+ Next
504
+ </button>
505
+ </div>
506
+ </div>
507
+ </div>
508
+ </template>
509
+
510
+ <style scoped>
511
+ .data-table {
512
+ @apply relative overflow-hidden rounded-lg border;
513
+ }
514
+
515
+ .loading-overlay {
516
+ @apply absolute inset-0 bg-background/80 flex items-center justify-center z-10;
517
+ }
518
+
519
+ .spinner {
520
+ @apply w-8 h-8 border-4 border-primary border-t-transparent rounded-full animate-spin;
521
+ }
522
+ </style>
523
+
524
+ <!-- Usage Example -->
525
+ <!--
526
+ <script setup lang="ts">
527
+ import DataTable from '@/components/DataTable.vue'
528
+
529
+ interface User {
530
+ id: number
531
+ name: string
532
+ email: string
533
+ status: 'active' | 'inactive'
534
+ }
535
+
536
+ const users: User[] = [
537
+ { id: 1, name: 'John Doe', email: 'john@example.com', status: 'active' },
538
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', status: 'inactive' }
539
+ ]
540
+
541
+ const columns = [
542
+ { key: 'name' as const, label: 'Name', sortable: true },
543
+ { key: 'email' as const, label: 'Email', sortable: true },
544
+ {
545
+ key: 'status' as const,
546
+ label: 'Status',
547
+ render: (value: 'active' | 'inactive') =>
548
+ value === 'active' ? 'Active' : 'Inactive'
549
+ }
550
+ ]
551
+
552
+ function handleRowClick(user: User) {
553
+ console.log('Clicked:', user)
554
+ }
555
+ </script>
556
+
557
+ <template>
558
+ <DataTable
559
+ :data="users"
560
+ :columns="columns"
561
+ :page-size="10"
562
+ @row-click="handleRowClick"
563
+ />
564
+ </template>
565
+ -->
566
+ ```
567
+
568
+ **Explanation**: This Vue 3.5 pattern demonstrates generic components with TypeScript, the Composition API with computed properties, and comprehensive data table functionality.
569
+
570
+ ---
571
+
572
+ ## Common Patterns
573
+
574
+ ### Pattern 1: Compound Components
575
+
576
+ Build flexible, composable component APIs:
577
+
578
+ ```tsx
579
+ // components/Card/index.tsx
580
+ import { createContext, useContext, ReactNode } from 'react'
581
+
582
+ interface CardContextValue {
583
+ variant: 'default' | 'outlined' | 'elevated'
584
+ }
585
+
586
+ const CardContext = createContext<CardContextValue>({ variant: 'default' })
587
+
588
+ interface CardProps {
589
+ variant?: 'default' | 'outlined' | 'elevated'
590
+ children: ReactNode
591
+ className?: string
592
+ }
593
+
594
+ export function Card({ variant = 'default', children, className }: CardProps) {
595
+ return (
596
+ <CardContext.Provider value={{ variant }}>
597
+ <div className={cn('rounded-lg', variantStyles[variant], className)}>
598
+ {children}
599
+ </div>
600
+ </CardContext.Provider>
601
+ )
602
+ }
603
+
604
+ export function CardHeader({ children, className }: { children: ReactNode; className?: string }) {
605
+ return (
606
+ <div className={cn('px-6 py-4 border-b', className)}>
607
+ {children}
608
+ </div>
609
+ )
610
+ }
611
+
612
+ export function CardTitle({ children, className }: { children: ReactNode; className?: string }) {
613
+ return (
614
+ <h3 className={cn('text-lg font-semibold', className)}>
615
+ {children}
616
+ </h3>
617
+ )
618
+ }
619
+
620
+ export function CardContent({ children, className }: { children: ReactNode; className?: string }) {
621
+ return (
622
+ <div className={cn('px-6 py-4', className)}>
623
+ {children}
624
+ </div>
625
+ )
626
+ }
627
+
628
+ export function CardFooter({ children, className }: { children: ReactNode; className?: string }) {
629
+ const { variant } = useContext(CardContext)
630
+ return (
631
+ <div className={cn('px-6 py-4 border-t', className)}>
632
+ {children}
633
+ </div>
634
+ )
635
+ }
636
+
637
+ // Usage
638
+ <Card variant="elevated">
639
+ <CardHeader>
640
+ <CardTitle>Card Title</CardTitle>
641
+ </CardHeader>
642
+ <CardContent>
643
+ <p>Card content goes here.</p>
644
+ </CardContent>
645
+ <CardFooter>
646
+ <Button>Action</Button>
647
+ </CardFooter>
648
+ </Card>
649
+ ```
650
+
651
+ ### Pattern 2: Custom Hooks for Data Fetching
652
+
653
+ ```tsx
654
+ // hooks/useQuery.ts
655
+ import { useState, useEffect, useCallback } from 'react'
656
+
657
+ interface UseQueryOptions<T> {
658
+ enabled?: boolean
659
+ refetchInterval?: number
660
+ onSuccess?: (data: T) => void
661
+ onError?: (error: Error) => void
662
+ }
663
+
664
+ interface UseQueryResult<T> {
665
+ data: T | null
666
+ isLoading: boolean
667
+ isError: boolean
668
+ error: Error | null
669
+ refetch: () => Promise<void>
670
+ }
671
+
672
+ export function useQuery<T>(
673
+ queryFn: () => Promise<T>,
674
+ options: UseQueryOptions<T> = {}
675
+ ): UseQueryResult<T> {
676
+ const { enabled = true, refetchInterval, onSuccess, onError } = options
677
+
678
+ const [data, setData] = useState<T | null>(null)
679
+ const [isLoading, setIsLoading] = useState(enabled)
680
+ const [error, setError] = useState<Error | null>(null)
681
+
682
+ const fetchData = useCallback(async () => {
683
+ setIsLoading(true)
684
+ setError(null)
685
+
686
+ try {
687
+ const result = await queryFn()
688
+ setData(result)
689
+ onSuccess?.(result)
690
+ } catch (err) {
691
+ const error = err instanceof Error ? err : new Error('Unknown error')
692
+ setError(error)
693
+ onError?.(error)
694
+ } finally {
695
+ setIsLoading(false)
696
+ }
697
+ }, [queryFn, onSuccess, onError])
698
+
699
+ useEffect(() => {
700
+ if (enabled) {
701
+ fetchData()
702
+ }
703
+ }, [enabled, fetchData])
704
+
705
+ useEffect(() => {
706
+ if (refetchInterval && enabled) {
707
+ const interval = setInterval(fetchData, refetchInterval)
708
+ return () => clearInterval(interval)
709
+ }
710
+ }, [refetchInterval, enabled, fetchData])
711
+
712
+ return {
713
+ data,
714
+ isLoading,
715
+ isError: error !== null,
716
+ error,
717
+ refetch: fetchData
718
+ }
719
+ }
720
+
721
+ // Usage
722
+ function UserProfile({ userId }: { userId: string }) {
723
+ const { data: user, isLoading, error } = useQuery(
724
+ () => fetchUser(userId),
725
+ {
726
+ enabled: !!userId,
727
+ onSuccess: (user) => console.log('User loaded:', user.name)
728
+ }
729
+ )
730
+
731
+ if (isLoading) return <Skeleton />
732
+ if (error) return <ErrorMessage error={error} />
733
+
734
+ return <div>{user?.name}</div>
735
+ }
736
+ ```
737
+
738
+ ### Pattern 3: Performance Optimization with Memoization
739
+
740
+ ```tsx
741
+ import { memo, useMemo, useCallback, useDeferredValue } from 'react'
742
+
743
+ interface SearchListProps {
744
+ items: Item[]
745
+ searchTerm: string
746
+ onSelect: (item: Item) => void
747
+ }
748
+
749
+ export const SearchList = memo(function SearchList({
750
+ items,
751
+ searchTerm,
752
+ onSelect
753
+ }: SearchListProps) {
754
+ // Defer search for smoother typing
755
+ const deferredSearchTerm = useDeferredValue(searchTerm)
756
+
757
+ // Memoize filtered results
758
+ const filteredItems = useMemo(() => {
759
+ return items.filter(item =>
760
+ item.name.toLowerCase().includes(deferredSearchTerm.toLowerCase())
761
+ )
762
+ }, [items, deferredSearchTerm])
763
+
764
+ // Memoize callback
765
+ const handleSelect = useCallback((item: Item) => {
766
+ onSelect(item)
767
+ }, [onSelect])
768
+
769
+ // Show stale indicator while updating
770
+ const isStale = searchTerm !== deferredSearchTerm
771
+
772
+ return (
773
+ <div className={isStale ? 'opacity-70' : ''}>
774
+ {filteredItems.map(item => (
775
+ <SearchItem
776
+ key={item.id}
777
+ item={item}
778
+ onSelect={handleSelect}
779
+ />
780
+ ))}
781
+ </div>
782
+ )
783
+ })
784
+
785
+ // Memoized child component
786
+ const SearchItem = memo(function SearchItem({
787
+ item,
788
+ onSelect
789
+ }: {
790
+ item: Item
791
+ onSelect: (item: Item) => void
792
+ }) {
793
+ return (
794
+ <div onClick={() => onSelect(item)}>
795
+ {item.name}
796
+ </div>
797
+ )
798
+ })
799
+ ```
800
+
801
+ ---
802
+
803
+ ## Anti-Patterns (Patterns to Avoid)
804
+
805
+ ### Anti-Pattern 1: Prop Drilling
806
+
807
+ **Problem**: Passing props through many intermediate components.
808
+
809
+ ```tsx
810
+ // Incorrect approach
811
+ function App() {
812
+ const [user, setUser] = useState<User | null>(null)
813
+ return <Layout user={user} setUser={setUser} />
814
+ }
815
+
816
+ function Layout({ user, setUser }) {
817
+ return <Sidebar user={user} setUser={setUser} />
818
+ }
819
+
820
+ function Sidebar({ user, setUser }) {
821
+ return <UserMenu user={user} setUser={setUser} />
822
+ }
823
+ ```
824
+
825
+ **Solution**: Use context or state management.
826
+
827
+ ```tsx
828
+ // Correct approach
829
+ const UserContext = createContext<{
830
+ user: User | null
831
+ setUser: (user: User | null) => void
832
+ } | null>(null)
833
+
834
+ function UserProvider({ children }: { children: ReactNode }) {
835
+ const [user, setUser] = useState<User | null>(null)
836
+ return (
837
+ <UserContext.Provider value={{ user, setUser }}>
838
+ {children}
839
+ </UserContext.Provider>
840
+ )
841
+ }
842
+
843
+ function useUser() {
844
+ const context = useContext(UserContext)
845
+ if (!context) throw new Error('useUser must be used within UserProvider')
846
+ return context
847
+ }
848
+
849
+ function UserMenu() {
850
+ const { user, setUser } = useUser()
851
+ // Direct access without prop drilling
852
+ }
853
+ ```
854
+
855
+ ### Anti-Pattern 2: Inline Function Definitions
856
+
857
+ **Problem**: Creating new function references on every render.
858
+
859
+ ```tsx
860
+ // Incorrect approach
861
+ function List({ items }) {
862
+ return items.map(item => (
863
+ // New function created on every render
864
+ <Item key={item.id} onClick={() => handleClick(item.id)} />
865
+ ))
866
+ }
867
+ ```
868
+
869
+ **Solution**: Use useCallback or component-level handlers.
870
+
871
+ ```tsx
872
+ // Correct approach
873
+ function List({ items }) {
874
+ const handleClick = useCallback((id: string) => {
875
+ // Handle click
876
+ }, [])
877
+
878
+ return items.map(item => (
879
+ <Item
880
+ key={item.id}
881
+ id={item.id}
882
+ onClick={handleClick}
883
+ />
884
+ ))
885
+ }
886
+
887
+ // Or with proper memoization
888
+ const Item = memo(function Item({
889
+ id,
890
+ onClick
891
+ }: {
892
+ id: string
893
+ onClick: (id: string) => void
894
+ }) {
895
+ return <div onClick={() => onClick(id)}>Item {id}</div>
896
+ })
897
+ ```
898
+
899
+ ### Anti-Pattern 3: Fetching in useEffect
900
+
901
+ **Problem**: Client-side fetching when server-side would be better.
902
+
903
+ ```tsx
904
+ // Incorrect approach for Next.js
905
+ 'use client'
906
+ function UserPage({ userId }: { userId: string }) {
907
+ const [user, setUser] = useState(null)
908
+
909
+ useEffect(() => {
910
+ fetch(`/api/users/${userId}`)
911
+ .then(res => res.json())
912
+ .then(setUser)
913
+ }, [userId])
914
+
915
+ return <div>{user?.name}</div>
916
+ }
917
+ ```
918
+
919
+ **Solution**: Use server components for initial data.
920
+
921
+ ```tsx
922
+ // Correct approach
923
+ // app/users/[userId]/page.tsx
924
+ async function UserPage({ params }: { params: { userId: string } }) {
925
+ const user = await getUser(params.userId)
926
+ return <UserProfile user={user} />
927
+ }
928
+ ```
929
+
930
+ ---
931
+
932
+ ## Accessibility Patterns
933
+
934
+ ### Focus Management
935
+
936
+ ```tsx
937
+ function Modal({ isOpen, onClose, children }: ModalProps) {
938
+ const modalRef = useRef<HTMLDivElement>(null)
939
+ const previousActiveElement = useRef<HTMLElement | null>(null)
940
+
941
+ useEffect(() => {
942
+ if (isOpen) {
943
+ previousActiveElement.current = document.activeElement as HTMLElement
944
+ modalRef.current?.focus()
945
+ } else {
946
+ previousActiveElement.current?.focus()
947
+ }
948
+ }, [isOpen])
949
+
950
+ return (
951
+ <div
952
+ ref={modalRef}
953
+ role="dialog"
954
+ aria-modal="true"
955
+ tabIndex={-1}
956
+ onKeyDown={(e) => {
957
+ if (e.key === 'Escape') onClose()
958
+ }}
959
+ >
960
+ {children}
961
+ </div>
962
+ )
963
+ }
964
+ ```
965
+
966
+ ---
967
+
968
+ *For additional patterns and framework-specific optimizations, see the related skills and documentation.*