ma-agents 3.18.0-beta.2 → 3.18.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.
Files changed (168) hide show
  1. package/README.md +2 -2
  2. package/bin/cli.js +29 -32
  3. package/docs/architecture.md +2 -2
  4. package/lib/bmad-cache/cache-manifest.json +0 -12
  5. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +1 -1
  6. package/lib/bmad.js +33 -34
  7. package/package.json +1 -1
  8. package/scripts/build-bmad-cache.js +18 -9
  9. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +0 -56
  10. package/lib/bmad-cache/gds/.markdownlint-cli2.yaml +0 -35
  11. package/lib/bmad-cache/gds/.nvmrc +0 -1
  12. package/lib/bmad-cache/gds/.prettierignore +0 -9
  13. package/lib/bmad-cache/gds/CNAME +0 -1
  14. package/lib/bmad-cache/gds/LICENSE +0 -26
  15. package/lib/bmad-cache/gds/README.md +0 -134
  16. package/lib/bmad-cache/gds/_git_preserved/HEAD +0 -1
  17. package/lib/bmad-cache/gds/_git_preserved/config +0 -13
  18. package/lib/bmad-cache/gds/_git_preserved/description +0 -1
  19. package/lib/bmad-cache/gds/_git_preserved/hooks/applypatch-msg.sample +0 -15
  20. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +0 -74
  21. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +0 -168
  22. package/lib/bmad-cache/gds/_git_preserved/hooks/post-update.sample +0 -8
  23. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-applypatch.sample +0 -14
  24. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-commit.sample +0 -49
  25. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-merge-commit.sample +0 -13
  26. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-push.sample +0 -53
  27. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-rebase.sample +0 -169
  28. package/lib/bmad-cache/gds/_git_preserved/hooks/pre-receive.sample +0 -24
  29. package/lib/bmad-cache/gds/_git_preserved/hooks/prepare-commit-msg.sample +0 -42
  30. package/lib/bmad-cache/gds/_git_preserved/hooks/push-to-checkout.sample +0 -78
  31. package/lib/bmad-cache/gds/_git_preserved/hooks/sendemail-validate.sample +0 -77
  32. package/lib/bmad-cache/gds/_git_preserved/hooks/update.sample +0 -128
  33. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  34. package/lib/bmad-cache/gds/_git_preserved/info/exclude +0 -6
  35. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  36. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack +0 -0
  37. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  38. package/lib/bmad-cache/gds/_git_preserved/packed-refs +0 -2
  39. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +0 -1
  40. package/lib/bmad-cache/gds/_git_preserved/shallow +0 -1
  41. package/lib/bmad-cache/gds/eslint.config.mjs +0 -141
  42. package/lib/bmad-cache/gds/package.json +0 -91
  43. package/lib/bmad-cache/gds/prettier.config.mjs +0 -32
  44. package/lib/bmad-cache/gds/src/agents/gds-agent-game-architect/customize.toml +0 -57
  45. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +0 -59
  46. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +0 -129
  47. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/gametest/qa-index.csv +0 -18
  48. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -55
  49. package/lib/bmad-cache/gds/src/agents/gds-agent-tech-writer/customize.toml +0 -65
  50. package/lib/bmad-cache/gds/src/module-help.csv +0 -30
  51. package/lib/bmad-cache/gds/src/module.yaml +0 -113
  52. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/customize.toml +0 -41
  53. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-brainstorm-game/game-brain-methods.csv +0 -26
  54. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +0 -116
  55. package/lib/bmad-cache/gds/src/workflows/1-preproduction/research/gds-domain-research/customize.toml +0 -41
  56. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-narrative/customize.toml +0 -41
  57. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/game-types.csv +0 -25
  58. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/genre-complexity.csv +0 -26
  59. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +0 -190
  60. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +0 -99
  61. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +0 -290
  62. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +0 -190
  63. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +0 -84
  64. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +0 -319
  65. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +0 -101
  66. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-check-implementation-readiness/customize.toml +0 -41
  67. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-create-epics-and-stories/customize.toml +0 -41
  68. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +0 -508
  69. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/customize.toml +0 -41
  70. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +0 -428
  71. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +0 -392
  72. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/pattern-categories.csv +0 -13
  73. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-generate-project-context/customize.toml +0 -41
  74. package/lib/bmad-cache/gds/src/workflows/4-production/gds-code-review/customize.toml +0 -41
  75. package/lib/bmad-cache/gds/src/workflows/4-production/gds-correct-course/customize.toml +0 -41
  76. package/lib/bmad-cache/gds/src/workflows/4-production/gds-create-story/customize.toml +0 -41
  77. package/lib/bmad-cache/gds/src/workflows/4-production/gds-dev-story/customize.toml +0 -41
  78. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +0 -62
  79. package/lib/bmad-cache/gds/src/workflows/4-production/gds-retrospective/customize.toml +0 -41
  80. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/customize.toml +0 -41
  81. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-planning/sprint-status-template.yaml +0 -55
  82. package/lib/bmad-cache/gds/src/workflows/4-production/gds-sprint-status/customize.toml +0 -41
  83. package/lib/bmad-cache/gds/src/workflows/gametest/gds-e2e-scaffold/customize.toml +0 -41
  84. package/lib/bmad-cache/gds/src/workflows/gametest/gds-performance-test/customize.toml +0 -41
  85. package/lib/bmad-cache/gds/src/workflows/gametest/gds-playtest-plan/customize.toml +0 -41
  86. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-automate/customize.toml +0 -41
  87. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-design/customize.toml +0 -41
  88. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-framework/customize.toml +0 -41
  89. package/lib/bmad-cache/gds/src/workflows/gametest/gds-test-review/customize.toml +0 -41
  90. package/lib/bmad-cache/gds/src/workflows/gds-document-project/customize.toml +0 -41
  91. package/lib/bmad-cache/gds/src/workflows/gds-document-project/documentation-requirements.csv +0 -12
  92. package/lib/bmad-cache/gds/src/workflows/gds-document-project/templates/project-scan-report-schema.json +0 -160
  93. package/lib/bmad-cache/gds/src/workflows/gds-quick-flow/gds-quick-dev/customize.toml +0 -41
  94. package/lib/bmad-cache/gds/tools/build-docs.mjs +0 -450
  95. package/lib/bmad-cache/gds/website/astro.config.mjs +0 -142
  96. package/lib/bmad-cache/gds/website/public/favicon.ico +0 -0
  97. package/lib/bmad-cache/gds/website/public/img/bmad-dark.png +0 -0
  98. package/lib/bmad-cache/gds/website/public/img/bmad-light.png +0 -0
  99. package/lib/bmad-cache/gds/website/src/components/Banner.astro +0 -71
  100. package/lib/bmad-cache/gds/website/src/components/Header.astro +0 -94
  101. package/lib/bmad-cache/gds/website/src/components/MobileMenuFooter.astro +0 -33
  102. package/lib/bmad-cache/gds/website/src/content/config.ts +0 -6
  103. package/lib/bmad-cache/gds/website/src/content/docs +0 -1
  104. package/lib/bmad-cache/gds/website/src/lib/site-url.mjs +0 -25
  105. package/lib/bmad-cache/gds/website/src/rehype-base-paths.js +0 -88
  106. package/lib/bmad-cache/gds/website/src/rehype-markdown-links.js +0 -117
  107. package/lib/bmad-cache/gds/website/src/styles/custom.css +0 -503
  108. package/lib/bmad-cache/wds/.claude-plugin/marketplace.json +0 -35
  109. package/lib/bmad-cache/wds/.markdownlint-cli2.yaml +0 -38
  110. package/lib/bmad-cache/wds/.nvmrc +0 -1
  111. package/lib/bmad-cache/wds/.prettierignore +0 -9
  112. package/lib/bmad-cache/wds/LICENSE +0 -27
  113. package/lib/bmad-cache/wds/README.md +0 -139
  114. package/lib/bmad-cache/wds/_git_preserved/HEAD +0 -1
  115. package/lib/bmad-cache/wds/_git_preserved/config +0 -13
  116. package/lib/bmad-cache/wds/_git_preserved/description +0 -1
  117. package/lib/bmad-cache/wds/_git_preserved/hooks/applypatch-msg.sample +0 -15
  118. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +0 -74
  119. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +0 -168
  120. package/lib/bmad-cache/wds/_git_preserved/hooks/post-update.sample +0 -8
  121. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-applypatch.sample +0 -14
  122. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-commit.sample +0 -49
  123. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-merge-commit.sample +0 -13
  124. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-push.sample +0 -53
  125. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-rebase.sample +0 -169
  126. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-receive.sample +0 -24
  127. package/lib/bmad-cache/wds/_git_preserved/hooks/prepare-commit-msg.sample +0 -42
  128. package/lib/bmad-cache/wds/_git_preserved/hooks/push-to-checkout.sample +0 -78
  129. package/lib/bmad-cache/wds/_git_preserved/hooks/sendemail-validate.sample +0 -77
  130. package/lib/bmad-cache/wds/_git_preserved/hooks/update.sample +0 -128
  131. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  132. package/lib/bmad-cache/wds/_git_preserved/info/exclude +0 -6
  133. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  134. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack +0 -0
  135. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  136. package/lib/bmad-cache/wds/_git_preserved/packed-refs +0 -2
  137. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +0 -1
  138. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +0 -1
  139. package/lib/bmad-cache/wds/_git_preserved/shallow +0 -1
  140. package/lib/bmad-cache/wds/eslint.config.mjs +0 -152
  141. package/lib/bmad-cache/wds/package.json +0 -82
  142. package/lib/bmad-cache/wds/prettier.config.mjs +0 -32
  143. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +0 -80
  144. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +0 -52
  145. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +0 -70
  146. package/lib/bmad-cache/wds/src/module-help.csv +0 -19
  147. package/lib/bmad-cache/wds/src/module.yaml +0 -173
  148. package/lib/bmad-cache/wds/src/scripts/README.md +0 -155
  149. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +0 -202
  150. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +0 -158
  151. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +0 -229
  152. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +0 -120
  153. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +0 -201
  154. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +0 -301
  155. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-1-project-brief/templates/platform-requirements.template.yaml +0 -69
  156. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/resources/wds-7-design-system/templates/catalog.template.html +0 -363
  157. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/templates/platform-requirements.template.yaml +0 -69
  158. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +0 -450
  159. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/design-delivery.template.yaml +0 -104
  160. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/test-scenario.template.yaml +0 -192
  161. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +0 -387
  162. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.css +0 -164
  163. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.html +0 -18
  164. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.js +0 -430
  165. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/demo-data-template.json +0 -63
  166. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/page-template.html +0 -465
  167. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/work-file-template.yaml +0 -264
  168. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/templates/catalog.template.html +0 -363
@@ -1,465 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="se">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>[Page-Number] [Page Name] - [Project Name]</title>
7
-
8
- <!-- Tailwind CSS via CDN -->
9
- <script src="https://cdn.tailwindcss.com"></script>
10
-
11
- <!-- Tailwind Config (Design Tokens) -->
12
- <script>
13
- tailwind.config = {
14
- theme: {
15
- extend: {
16
- colors: {
17
- '[project-name]': {
18
- 50: '#eff6ff',
19
- 100: '#dbeafe',
20
- 500: '#2563eb',
21
- 600: '#1d4ed8',
22
- 700: '#1e40af',
23
- }
24
- },
25
- fontFamily: {
26
- sans: ['Inter', 'system-ui', 'sans-serif'],
27
- }
28
- }
29
- }
30
- }
31
- </script>
32
-
33
- <!-- Google Fonts -->
34
- <link rel="preconnect" href="https://fonts.googleapis.com">
35
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
36
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
37
-
38
- <!-- Dev Mode Styles (feedback/testing tool) -->
39
- <link rel="stylesheet" href="components/dev-mode.css">
40
-
41
- <!-- Custom Styles (minimal - only what Tailwind can't do) -->
42
- <style>
43
- /* Custom styles that can't be done with Tailwind */
44
- /* Example: Complex animations, special overlays, etc. */
45
- </style>
46
- </head>
47
- <body class="min-h-screen bg-gray-50 font-sans">
48
- <!-- ========================================================================
49
- DEV MODE TOGGLE (for easy feedback - copy Object IDs)
50
- ======================================================================== -->
51
- <button id="dev-mode-toggle" class="dev-mode-toggle" title="Toggle Dev Mode (Ctrl+E)">
52
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
53
- <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>
54
- <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>
55
- </svg>
56
- <span>Dev Mode: OFF</span>
57
- </button>
58
- <div id="dev-mode-tooltip" class="dev-mode-tooltip" style="display: none;"></div>
59
- <!-- ========================================================================
60
- HEADER
61
- ======================================================================== -->
62
- <header class="bg-white border-b border-gray-200 px-4 py-3 flex items-center justify-between">
63
- <!-- Back Button -->
64
- <button
65
- id="[page]-header-back"
66
- data-object-id="[page]-header-back"
67
- onclick="history.back()"
68
- class="text-gray-600 hover:text-gray-900 font-medium text-sm transition-colors"
69
- >
70
- ← [Back Text]
71
- </button>
72
-
73
- <!-- Page Title -->
74
- <h1
75
- id="[page]-header-title"
76
- data-object-id="[page]-header-title"
77
- class="text-lg font-semibold text-gray-900"
78
- >
79
- [Page Title]
80
- </h1>
81
-
82
- <!-- Spacer (for alignment) -->
83
- <div class="w-20"></div>
84
-
85
- <!-- Optional: Language Selector or Action Button -->
86
- <!-- <button class="text-[project-name]-600">Action</button> -->
87
- </header>
88
-
89
- <!-- ========================================================================
90
- MAIN CONTENT
91
- ======================================================================== -->
92
- <main class="max-w-md mx-auto p-4">
93
- <form id="[page]Form" class="space-y-4" onsubmit="handleSubmit(event)">
94
-
95
- <!-- ============================================================
96
- SECTION 1: Example - Picture Upload
97
- ============================================================ -->
98
- <div class="flex items-center gap-4 mb-6">
99
- <button
100
- type="button"
101
- id="[page]-picture-upload"
102
- data-object-id="[page]-picture-upload"
103
- onclick="handlePictureUpload()"
104
- class="w-24 h-24 rounded-full bg-gray-100 border-2 border-dashed border-gray-300 flex items-center justify-center hover:border-[project-name]-500 hover:bg-gray-50 transition-all cursor-pointer"
105
- >
106
- <img id="picturePreview" class="hidden w-full h-full rounded-full object-cover" alt="Preview" />
107
- <svg class="w-10 h-10 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
108
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"></path>
109
- </svg>
110
- </button>
111
- <input type="file" id="pictureInput" accept="image/*" class="hidden">
112
-
113
- <div class="flex-1">
114
- <label class="text-sm text-gray-700 font-medium">
115
- [Upload Label]
116
- </label>
117
- <p class="text-xs text-red-600 hidden" id="pictureError"></p>
118
- </div>
119
- </div>
120
-
121
- <!-- ============================================================
122
- SECTION 2: Example - Text Input
123
- ============================================================ -->
124
- <div>
125
- <input
126
- type="text"
127
- id="[page]-input-[field]"
128
- data-object-id="[page]-input-[field]"
129
- name="[fieldName]"
130
- placeholder="[Placeholder] *"
131
- class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[project-name]-500 focus:border-transparent transition-all"
132
- required
133
- />
134
- <p class="text-sm text-red-600 hidden mt-1" id="[field]Error"></p>
135
- </div>
136
-
137
- <!-- ============================================================
138
- SECTION 3: Example - Split Button (Binary Choice)
139
- ============================================================ -->
140
- <div
141
- id="[page]-split-[choice]"
142
- data-object-id="[page]-split-[choice]"
143
- class="grid grid-cols-2 gap-0 border border-gray-300 rounded-lg overflow-hidden"
144
- >
145
- <button
146
- type="button"
147
- id="choice1"
148
- onclick="selectChoice('option1')"
149
- class="py-2 text-center font-medium text-gray-700 hover:bg-gray-50 transition-colors"
150
- >
151
- [Option 1]
152
- </button>
153
- <button
154
- type="button"
155
- id="choice2"
156
- onclick="selectChoice('option2')"
157
- class="py-2 text-center font-medium text-gray-700 hover:bg-gray-50 transition-colors border-l border-gray-300"
158
- >
159
- [Option 2]
160
- </button>
161
- </div>
162
-
163
- <!-- ============================================================
164
- SECTION 4: Example - Textarea
165
- ============================================================ -->
166
- <div>
167
- <textarea
168
- id="[page]-textarea-[field]"
169
- data-object-id="[page]-textarea-[field]"
170
- name="[fieldName]"
171
- placeholder="[Placeholder]"
172
- maxlength="500"
173
- rows="3"
174
- oninput="updateCharCounter()"
175
- class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[project-name]-500 focus:border-transparent resize-none"
176
- ></textarea>
177
- <p class="text-xs text-gray-500 text-right hidden" id="charCounter"></p>
178
- </div>
179
-
180
- <!-- ============================================================
181
- SUBMIT BUTTON
182
- ============================================================ -->
183
- <button
184
- type="submit"
185
- id="[page]-button-submit"
186
- data-object-id="[page]-button-submit"
187
- class="w-full py-3 bg-[project-name]-600 text-white rounded-lg font-semibold hover:bg-[project-name]-700 focus:outline-none focus:ring-2 focus:ring-[project-name]-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-all flex items-center justify-center gap-2"
188
- >
189
- <span id="submitButtonText">[Submit Text]</span>
190
- <svg id="submitButtonSpinner" class="hidden animate-spin w-5 h-5" fill="none" viewBox="0 0 24 24">
191
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
192
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
193
- </svg>
194
- </button>
195
- </form>
196
- </main>
197
-
198
- <!-- ========================================================================
199
- SUCCESS TOAST
200
- ======================================================================== -->
201
- <div id="successToast" class="hidden fixed bottom-6 left-1/2 -translate-x-1/2 bg-gray-900 text-white px-6 py-3 rounded-lg shadow-lg flex items-center gap-2 z-50 animate-slide-up">
202
- <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
203
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path>
204
- </svg>
205
- <span id="toastMessage">[Success Message]</span>
206
- </div>
207
-
208
- <!-- ========================================================================
209
- ERROR BANNER (optional)
210
- ======================================================================== -->
211
- <div id="errorBanner" class="hidden fixed top-20 left-1/2 -translate-x-1/2 max-w-md w-full mx-4 bg-red-50 border border-red-200 rounded-lg p-4 flex items-start gap-3 z-50">
212
- <svg class="w-5 h-5 text-red-600 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
213
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"></path>
214
- </svg>
215
- <div class="flex-1">
216
- <p class="font-medium text-red-900">Error</p>
217
- <p class="text-sm text-red-700" id="errorMessage">[Error message]</p>
218
- </div>
219
- <button onclick="hideErrorBanner()" class="text-red-600 hover:text-red-900">
220
- <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
221
- <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
222
- </svg>
223
- </button>
224
- </div>
225
-
226
- <!-- ========================================================================
227
- MODALS (add as needed - example: image crop modal)
228
- ======================================================================== -->
229
- <!-- Image Crop Modal Template (uncomment if using image upload) -->
230
- <!--
231
- <div id="cropModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4">
232
- <div class="bg-white rounded-lg max-w-md w-full overflow-hidden">
233
- <div class="flex items-center justify-between px-4 py-3 border-b border-gray-200">
234
- <button onclick="cancelCrop()" class="text-[project-name]-600 font-medium">Cancel</button>
235
- <h2 class="font-semibold text-gray-900">Crop Image</h2>
236
- <button onclick="replaceImage()" class="text-[project-name]-600 font-medium">Replace</button>
237
- </div>
238
- <div class="p-4">
239
- <div class="relative bg-gray-100 rounded-lg overflow-hidden" style="height: 300px;">
240
- <img id="cropImage" src="" alt="Crop" class="w-full h-full object-contain">
241
- </div>
242
- <input type="range" id="zoomSlider" min="10" max="200" value="100"
243
- class="w-full mt-4 accent-[project-name]-600">
244
- </div>
245
- <div class="p-4">
246
- <button onclick="confirmCrop()"
247
- class="w-full py-3 bg-[project-name]-600 text-white rounded-lg font-semibold hover:bg-[project-name]-700">
248
- Use Image
249
- </button>
250
- </div>
251
- </div>
252
- </div>
253
- -->
254
-
255
- <!-- ========================================================================
256
- JAVASCRIPT - Shared Scripts
257
- ======================================================================== -->
258
- <script src="shared/prototype-api.js"></script>
259
- <script src="shared/init.js"></script>
260
- <script src="shared/utils.js"></script>
261
-
262
- <!-- ========================================================================
263
- JAVASCRIPT - Dev Mode (feedback tool)
264
- ======================================================================== -->
265
- <script src="components/dev-mode.js"></script>
266
-
267
- <!-- ========================================================================
268
- JAVASCRIPT - Component Scripts (load as needed)
269
- ======================================================================== -->
270
- <!-- <script src="components/image-crop.js"></script> -->
271
- <!-- <script src="components/toast.js"></script> -->
272
- <!-- <script src="components/modal.js"></script> -->
273
- <!-- <script src="components/form-validation.js"></script> -->
274
-
275
- <!-- ========================================================================
276
- JAVASCRIPT - Page-Specific Script (if complex logic)
277
- ======================================================================== -->
278
- <!-- Option 1: External file (if >150 lines) -->
279
- <!-- <script src="pages/[page-number]-[page-name].js"></script> -->
280
-
281
- <!-- Option 2: Inline script (preferred for <150 lines) -->
282
- <script>
283
- /**
284
- * Page: [Page Number] [Page Name]
285
- * Purpose: [Brief description]
286
- */
287
-
288
- // ================================================================
289
- // STATE MANAGEMENT
290
- // ================================================================
291
- let formData = {
292
- // Initialize form state
293
- };
294
-
295
- // ================================================================
296
- // INITIALIZATION
297
- // ================================================================
298
- window.initPage = function() {
299
- console.log('📄 [Page Name] loaded');
300
-
301
- // Page-specific initialization
302
- loadPageData();
303
- };
304
-
305
- async function loadPageData() {
306
- try {
307
- // Load any required data
308
- const user = await window.PrototypeAPI.getUser();
309
- console.log('👤 Current user:', user);
310
-
311
- // Pre-fill form if needed
312
-
313
- } catch (error) {
314
- console.error('❌ Error loading data:', error);
315
- }
316
- }
317
-
318
- // ================================================================
319
- // FORM HANDLING
320
- // ================================================================
321
- async function handleSubmit(event) {
322
- event.preventDefault();
323
-
324
- // Validate
325
- if (!validateForm()) {
326
- return;
327
- }
328
-
329
- // Show loading
330
- setLoadingState(true);
331
-
332
- try {
333
- // Collect form data
334
- const data = {
335
- // Extract form values
336
- };
337
-
338
- // API call
339
- console.log('📤 Submitting:', data);
340
- const result = await window.PrototypeAPI.[method](data);
341
- console.log('✅ Success:', result);
342
-
343
- // Show success
344
- showToast('[Success message]', 'success');
345
-
346
- // Navigate (after delay)
347
- setTimeout(() => {
348
- window.location.href = '[next-page].html';
349
- }, 1500);
350
-
351
- } catch (error) {
352
- console.error('❌ Error:', error);
353
- showErrorBanner(error.message);
354
- } finally {
355
- setLoadingState(false);
356
- }
357
- }
358
-
359
- function validateForm() {
360
- let isValid = true;
361
-
362
- // Validate each field
363
- // Example:
364
- // const name = document.getElementById('[field]').value;
365
- // if (!name) {
366
- // showFieldError('[field]', 'This field is required');
367
- // isValid = false;
368
- // }
369
-
370
- return isValid;
371
- }
372
-
373
- // ================================================================
374
- // UI INTERACTIONS
375
- // ================================================================
376
- function handlePictureUpload() {
377
- document.getElementById('pictureInput').click();
378
- }
379
-
380
- function selectChoice(choice) {
381
- // Handle choice selection
382
- console.log('Choice selected:', choice);
383
- }
384
-
385
- function updateCharCounter() {
386
- const textarea = document.getElementById('[page]-textarea-[field]');
387
- const counter = document.getElementById('charCounter');
388
- const current = textarea.value.length;
389
- const max = textarea.maxLength;
390
-
391
- counter.textContent = `${current}/${max}`;
392
- counter.classList.remove('hidden');
393
- }
394
-
395
- // ================================================================
396
- // FEEDBACK
397
- // ================================================================
398
- function setLoadingState(isLoading) {
399
- const btn = document.getElementById('[page]-button-submit');
400
- const text = document.getElementById('submitButtonText');
401
- const spinner = document.getElementById('submitButtonSpinner');
402
-
403
- btn.disabled = isLoading;
404
- text.classList.toggle('hidden', isLoading);
405
- spinner.classList.toggle('hidden', !isLoading);
406
- }
407
-
408
- function showToast(message, type = 'success') {
409
- const toast = document.getElementById('successToast');
410
- const messageEl = document.getElementById('toastMessage');
411
-
412
- messageEl.textContent = message;
413
- toast.classList.remove('hidden');
414
-
415
- setTimeout(() => {
416
- toast.classList.add('hidden');
417
- }, 3000);
418
- }
419
-
420
- function showErrorBanner(message) {
421
- const banner = document.getElementById('errorBanner');
422
- const messageEl = document.getElementById('errorMessage');
423
-
424
- messageEl.textContent = message;
425
- banner.classList.remove('hidden');
426
-
427
- setTimeout(() => {
428
- banner.classList.add('hidden');
429
- }, 5000);
430
- }
431
-
432
- function hideErrorBanner() {
433
- document.getElementById('errorBanner').classList.add('hidden');
434
- }
435
-
436
- function showFieldError(fieldId, message) {
437
- const errorEl = document.getElementById(`${fieldId}Error`);
438
- const inputEl = document.getElementById(fieldId);
439
-
440
- if (errorEl) {
441
- errorEl.textContent = message;
442
- errorEl.classList.remove('hidden');
443
- }
444
-
445
- if (inputEl) {
446
- inputEl.classList.add('border-red-500');
447
- }
448
- }
449
-
450
- function clearFieldError(fieldId) {
451
- const errorEl = document.getElementById(`${fieldId}Error`);
452
- const inputEl = document.getElementById(fieldId);
453
-
454
- if (errorEl) {
455
- errorEl.classList.add('hidden');
456
- }
457
-
458
- if (inputEl) {
459
- inputEl.classList.remove('border-red-500');
460
- }
461
- }
462
- </script>
463
- </body>
464
- </html>
465
-