synthos 0.10.0 → 0.11.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 (312) hide show
  1. package/README.md +5 -5
  2. package/default-pages/elevenlabs_effects_studio/chat-history.json +1 -0
  3. package/default-pages/elevenlabs_effects_studio/page.html +1345 -1363
  4. package/default-pages/elevenlabs_effects_studio/page.json +13 -11
  5. package/default-pages/elevenlabs_voice_studio/chat-history.json +1 -0
  6. package/default-pages/elevenlabs_voice_studio/page.html +782 -801
  7. package/default-pages/elevenlabs_voice_studio/page.json +13 -11
  8. package/default-pages/json_tools/chat-history.json +1 -0
  9. package/default-pages/json_tools/page.html +70 -90
  10. package/default-pages/json_tools/page.json +12 -10
  11. package/default-pages/my_notes/chat-history.json +1 -0
  12. package/default-pages/my_notes/page.html +115 -131
  13. package/default-pages/my_notes/page.json +14 -12
  14. package/default-pages/neon_asteroids/chat-history.json +1 -0
  15. package/default-pages/neon_asteroids/page.html +1777 -1803
  16. package/default-pages/neon_asteroids/page.json +14 -12
  17. package/default-pages/oregon_trail/chat-history.json +1 -0
  18. package/default-pages/oregon_trail/page.html +290 -307
  19. package/default-pages/oregon_trail/page.json +14 -12
  20. package/default-pages/solar_explorer/chat-history.json +1 -0
  21. package/default-pages/solar_explorer/page.html +1929 -1951
  22. package/default-pages/solar_explorer/page.json +14 -12
  23. package/default-pages/solar_tutorial/chat-history.json +1 -0
  24. package/default-pages/solar_tutorial/page.html +464 -478
  25. package/default-pages/solar_tutorial/page.json +12 -10
  26. package/default-pages/us_map/chat-history.json +1 -0
  27. package/default-pages/us_map/page.html +170 -193
  28. package/default-pages/us_map/page.json +14 -12
  29. package/default-pages/us_map/page.light.png +0 -0
  30. package/default-pages/us_map_1850/chat-history.json +1 -0
  31. package/default-pages/us_map_1850/page.html +302 -326
  32. package/default-pages/us_map_1850/page.json +14 -12
  33. package/default-pages/western_cities_1850/chat-history.json +1 -0
  34. package/default-pages/western_cities_1850/page.html +503 -527
  35. package/default-pages/western_cities_1850/page.json +14 -12
  36. package/default-themes/aurora-dawn.v3.css +15 -14
  37. package/default-themes/aurora-dusk.v3.css +26 -26
  38. package/default-themes/cosmos-dawn.v3.css +15 -14
  39. package/default-themes/cosmos-dusk.v3.css +26 -26
  40. package/default-themes/elemental-dawn.v3.css +200 -0
  41. package/default-themes/nebula-dawn.v3.css +15 -14
  42. package/default-themes/nebula-dusk.v3.css +24 -24
  43. package/default-themes/solar-flare-dawn.v3.css +15 -14
  44. package/default-themes/solar-flare-dusk.v3.css +26 -26
  45. package/dist/builders/anthropic.d.ts +26 -2
  46. package/dist/builders/anthropic.d.ts.map +1 -1
  47. package/dist/builders/anthropic.js +132 -31
  48. package/dist/builders/anthropic.js.map +1 -1
  49. package/dist/builders/claudecode.d.ts +13 -0
  50. package/dist/builders/claudecode.d.ts.map +1 -0
  51. package/dist/builders/claudecode.js +253 -0
  52. package/dist/builders/claudecode.js.map +1 -0
  53. package/dist/builders/index.d.ts +2 -1
  54. package/dist/builders/index.d.ts.map +1 -1
  55. package/dist/builders/index.js +8 -1
  56. package/dist/builders/index.js.map +1 -1
  57. package/dist/builders/openai.js +2 -1
  58. package/dist/builders/openai.js.map +1 -1
  59. package/dist/builders/types.d.ts +31 -7
  60. package/dist/builders/types.d.ts.map +1 -1
  61. package/dist/builders/types.js +60 -28
  62. package/dist/builders/types.js.map +1 -1
  63. package/dist/connectors/types.d.ts +8 -0
  64. package/dist/connectors/types.d.ts.map +1 -1
  65. package/dist/init.d.ts.map +1 -1
  66. package/dist/init.js +13 -6
  67. package/dist/init.js.map +1 -1
  68. package/dist/migrations.d.ts.map +1 -1
  69. package/dist/migrations.js +161 -14
  70. package/dist/migrations.js.map +1 -1
  71. package/dist/models/anthropic.d.ts +1 -0
  72. package/dist/models/anthropic.d.ts.map +1 -1
  73. package/dist/models/anthropic.js +129 -29
  74. package/dist/models/anthropic.js.map +1 -1
  75. package/dist/models/chainOfThought.d.ts.map +1 -1
  76. package/dist/models/chainOfThought.js +32 -19
  77. package/dist/models/chainOfThought.js.map +1 -1
  78. package/dist/models/index.d.ts +2 -2
  79. package/dist/models/index.d.ts.map +1 -1
  80. package/dist/models/index.js +2 -1
  81. package/dist/models/index.js.map +1 -1
  82. package/dist/models/providers.d.ts +1 -0
  83. package/dist/models/providers.d.ts.map +1 -1
  84. package/dist/models/providers.js +12 -4
  85. package/dist/models/providers.js.map +1 -1
  86. package/dist/models/types.d.ts +15 -1
  87. package/dist/models/types.d.ts.map +1 -1
  88. package/dist/models/types.js.map +1 -1
  89. package/dist/pages.d.ts +57 -8
  90. package/dist/pages.d.ts.map +1 -1
  91. package/dist/pages.js +258 -45
  92. package/dist/pages.js.map +1 -1
  93. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  94. package/dist/service/createCompletePrompt.js +5 -0
  95. package/dist/service/createCompletePrompt.js.map +1 -1
  96. package/dist/service/mediaCache.d.ts +36 -0
  97. package/dist/service/mediaCache.d.ts.map +1 -0
  98. package/dist/service/mediaCache.js +182 -0
  99. package/dist/service/mediaCache.js.map +1 -0
  100. package/dist/service/pageValidator.d.ts +25 -0
  101. package/dist/service/pageValidator.d.ts.map +1 -0
  102. package/dist/service/pageValidator.js +315 -0
  103. package/dist/service/pageValidator.js.map +1 -0
  104. package/dist/service/server.d.ts.map +1 -1
  105. package/dist/service/server.js +4 -0
  106. package/dist/service/server.js.map +1 -1
  107. package/dist/service/sharedTableSchema.d.ts +73 -0
  108. package/dist/service/sharedTableSchema.d.ts.map +1 -0
  109. package/dist/service/sharedTableSchema.js +206 -0
  110. package/dist/service/sharedTableSchema.js.map +1 -0
  111. package/dist/service/transformPage.d.ts +49 -11
  112. package/dist/service/transformPage.d.ts.map +1 -1
  113. package/dist/service/transformPage.js +354 -241
  114. package/dist/service/transformPage.js.map +1 -1
  115. package/dist/service/useApiRoutes.d.ts.map +1 -1
  116. package/dist/service/useApiRoutes.js +288 -34
  117. package/dist/service/useApiRoutes.js.map +1 -1
  118. package/dist/service/useConnectorRoutes.d.ts.map +1 -1
  119. package/dist/service/useConnectorRoutes.js +170 -32
  120. package/dist/service/useConnectorRoutes.js.map +1 -1
  121. package/dist/service/useDataRoutes.d.ts.map +1 -1
  122. package/dist/service/useDataRoutes.js +59 -2
  123. package/dist/service/useDataRoutes.js.map +1 -1
  124. package/dist/service/useExtractRoutes.d.ts +4 -0
  125. package/dist/service/useExtractRoutes.d.ts.map +1 -0
  126. package/dist/service/useExtractRoutes.js +304 -0
  127. package/dist/service/useExtractRoutes.js.map +1 -0
  128. package/dist/service/usePageRoutes.d.ts +17 -0
  129. package/dist/service/usePageRoutes.d.ts.map +1 -1
  130. package/dist/service/usePageRoutes.js +1385 -483
  131. package/dist/service/usePageRoutes.js.map +1 -1
  132. package/dist/service/useSharedDataRoutes.d.ts.map +1 -1
  133. package/dist/service/useSharedDataRoutes.js +54 -2
  134. package/dist/service/useSharedDataRoutes.js.map +1 -1
  135. package/dist/settings.d.ts +27 -0
  136. package/dist/settings.d.ts.map +1 -1
  137. package/dist/settings.js +40 -1
  138. package/dist/settings.js.map +1 -1
  139. package/dist/themes.d.ts +0 -5
  140. package/dist/themes.d.ts.map +1 -1
  141. package/dist/themes.js +3 -95
  142. package/dist/themes.js.map +1 -1
  143. package/migration-rules/v2-to-v3.md +277 -119
  144. package/package.json +5 -1
  145. package/{default-pages/application → required-pages/_shell}/page.html +56 -42
  146. package/required-pages/_shell/page.json +14 -0
  147. package/required-pages/_starters/page.html +534 -0
  148. package/required-pages/_starters/page.json +12 -0
  149. package/required-pages/builder/page.html +353 -43
  150. package/required-pages/builder/page.json +12 -10
  151. package/required-pages/pages/page.html +697 -924
  152. package/required-pages/pages/page.json +12 -10
  153. package/required-pages/settings/page.html +1879 -1753
  154. package/required-pages/settings/page.json +12 -10
  155. package/required-pages/synthos_apis/page.html +834 -845
  156. package/required-pages/synthos_apis/page.json +12 -10
  157. package/required-pages/synthos_scripts/page.html +74 -88
  158. package/required-pages/synthos_scripts/page.json +12 -10
  159. package/scripts/append-instructions.py +90 -0
  160. package/scripts/audit-instructions.py +76 -0
  161. package/scripts/cleanup-shell-markup.mjs +112 -0
  162. package/service-connectors/buffer/connector.json +46 -0
  163. package/service-connectors/canva/connector.json +67 -0
  164. package/service-connectors/elevenlabs/connector.json +1 -1
  165. package/src/builders/anthropic.ts +155 -30
  166. package/src/builders/claudecode.ts +310 -0
  167. package/src/builders/index.ts +7 -1
  168. package/src/builders/openai.ts +2 -1
  169. package/src/builders/types.ts +93 -32
  170. package/src/connectors/types.ts +8 -0
  171. package/src/init.ts +13 -7
  172. package/src/migrations.ts +187 -16
  173. package/src/models/anthropic.ts +140 -30
  174. package/src/models/chainOfThought.ts +33 -18
  175. package/src/models/index.ts +2 -2
  176. package/src/models/providers.ts +12 -3
  177. package/src/models/types.ts +21 -1
  178. package/src/pages.ts +271 -35
  179. package/src/service/createCompletePrompt.ts +6 -0
  180. package/src/service/mediaCache.ts +206 -0
  181. package/src/service/pageValidator.ts +337 -0
  182. package/src/service/server.ts +4 -0
  183. package/src/service/sharedTableSchema.ts +236 -0
  184. package/src/service/transformPage.ts +370 -260
  185. package/src/service/useApiRoutes.ts +282 -32
  186. package/src/service/useConnectorRoutes.ts +189 -34
  187. package/src/service/useDataRoutes.ts +198 -116
  188. package/src/service/useExtractRoutes.ts +331 -0
  189. package/src/service/usePageRoutes.ts +1411 -394
  190. package/src/service/useSharedDataRoutes.ts +184 -109
  191. package/src/settings.ts +65 -0
  192. package/src/themes.ts +78 -180
  193. package/starters/blank_starter/chat-history.json +1 -0
  194. package/starters/blank_starter/page.dark.png +0 -0
  195. package/starters/blank_starter/page.html +47 -0
  196. package/starters/blank_starter/page.json +13 -0
  197. package/starters/blank_starter/page.light.png +0 -0
  198. package/starters/calculator_starter/chat-history.json +1 -0
  199. package/starters/calculator_starter/page.dark.png +0 -0
  200. package/starters/calculator_starter/page.html +232 -0
  201. package/starters/calculator_starter/page.json +13 -0
  202. package/starters/calculator_starter/page.light.png +0 -0
  203. package/starters/calendar_starter/chat-history.json +1 -0
  204. package/starters/calendar_starter/page.dark.png +0 -0
  205. package/starters/calendar_starter/page.html +495 -0
  206. package/starters/calendar_starter/page.json +13 -0
  207. package/starters/calendar_starter/page.light.png +0 -0
  208. package/starters/chat_starter/chat-history.json +1 -0
  209. package/starters/chat_starter/page.dark.png +0 -0
  210. package/starters/chat_starter/page.html +351 -0
  211. package/starters/chat_starter/page.json +13 -0
  212. package/starters/chat_starter/page.light.png +0 -0
  213. package/starters/checklist_starter/chat-history.json +1 -0
  214. package/starters/checklist_starter/page.dark.png +0 -0
  215. package/starters/checklist_starter/page.html +437 -0
  216. package/starters/checklist_starter/page.json +13 -0
  217. package/starters/checklist_starter/page.light.png +0 -0
  218. package/starters/dashboard_starter/chat-history.json +1 -0
  219. package/starters/dashboard_starter/page.dark.png +0 -0
  220. package/starters/dashboard_starter/page.html +195 -0
  221. package/starters/dashboard_starter/page.json +13 -0
  222. package/starters/dashboard_starter/page.light.png +0 -0
  223. package/starters/form_starter/chat-history.json +1 -0
  224. package/starters/form_starter/page.dark.png +0 -0
  225. package/starters/form_starter/page.html +313 -0
  226. package/starters/form_starter/page.json +13 -0
  227. package/starters/form_starter/page.light.png +0 -0
  228. package/starters/gallery_starter/chat-history.json +1 -0
  229. package/starters/gallery_starter/page.dark.png +0 -0
  230. package/starters/gallery_starter/page.html +418 -0
  231. package/starters/gallery_starter/page.json +13 -0
  232. package/starters/gallery_starter/page.light.png +0 -0
  233. package/starters/generator_starter/chat-history.json +1 -0
  234. package/starters/generator_starter/page.dark.png +0 -0
  235. package/starters/generator_starter/page.html +261 -0
  236. package/starters/generator_starter/page.json +13 -0
  237. package/starters/generator_starter/page.light.png +0 -0
  238. package/starters/index.html +538 -0
  239. package/starters/kanban_starter/chat-history.json +1 -0
  240. package/starters/kanban_starter/page.dark.png +0 -0
  241. package/starters/kanban_starter/page.html +432 -0
  242. package/starters/kanban_starter/page.json +13 -0
  243. package/starters/kanban_starter/page.light.png +0 -0
  244. package/starters/presentation_builder/chat-history.json +1 -0
  245. package/starters/presentation_builder/page.dark.png +0 -0
  246. package/starters/presentation_builder/page.html +970 -0
  247. package/starters/presentation_builder/page.json +15 -0
  248. package/starters/presentation_builder/page.light.png +0 -0
  249. package/starters/presentation_builder/presentation_voice/voice_config.json +9 -0
  250. package/starters/pulse_starter/chat-history.json +1 -0
  251. package/starters/pulse_starter/page.dark.png +0 -0
  252. package/starters/pulse_starter/page.html +698 -0
  253. package/starters/pulse_starter/page.json +13 -0
  254. package/starters/pulse_starter/page.light.png +0 -0
  255. package/starters/quiz_starter/chat-history.json +1 -0
  256. package/starters/quiz_starter/page.dark.png +0 -0
  257. package/starters/quiz_starter/page.html +292 -0
  258. package/starters/quiz_starter/page.json +13 -0
  259. package/starters/quiz_starter/page.light.png +0 -0
  260. package/starters/reference_starter/chat-history.json +1 -0
  261. package/starters/reference_starter/page.dark.png +0 -0
  262. package/starters/reference_starter/page.html +250 -0
  263. package/starters/reference_starter/page.json +13 -0
  264. package/starters/reference_starter/page.light.png +0 -0
  265. package/starters/retro_game_starter/chat-history.json +1 -0
  266. package/starters/retro_game_starter/page.dark.png +0 -0
  267. package/{default-pages → starters}/retro_game_starter/page.html +1281 -1308
  268. package/starters/retro_game_starter/page.json +15 -0
  269. package/starters/retro_game_starter/page.light.png +0 -0
  270. package/starters/roster_starter/chat-history.json +1 -0
  271. package/starters/roster_starter/page.dark.png +0 -0
  272. package/starters/roster_starter/page.html +600 -0
  273. package/starters/roster_starter/page.json +13 -0
  274. package/starters/roster_starter/page.light.png +0 -0
  275. package/starters/server.js +182 -0
  276. package/starters/start.cmd +1 -0
  277. package/starters/timeline_starter/chat-history.json +1 -0
  278. package/starters/timeline_starter/page.dark.png +0 -0
  279. package/starters/timeline_starter/page.html +446 -0
  280. package/starters/timeline_starter/page.json +13 -0
  281. package/starters/timeline_starter/page.light.png +0 -0
  282. package/starters/tutorial_starter/chat-history.json +1 -0
  283. package/starters/tutorial_starter/page.dark.png +0 -0
  284. package/starters/tutorial_starter/page.html +283 -0
  285. package/starters/tutorial_starter/page.json +13 -0
  286. package/starters/tutorial_starter/page.light.png +0 -0
  287. package/static-files/agent.v3.js +122 -0
  288. package/static-files/connector.v3.js +48 -0
  289. package/static-files/extract.v3.js +188 -0
  290. package/static-files/helpers.v3.js +50 -6
  291. package/static-files/page-bridge.js +114 -0
  292. package/static-files/page.v3.js +1292 -1290
  293. package/static-files/script.v3.js +32 -0
  294. package/static-files/server.v3.js +89 -0
  295. package/static-files/shell-bridge.v3.js +174 -0
  296. package/static-files/shell-modals.v3.js +521 -0
  297. package/static-files/{shell.css → shell.v3.css} +271 -22
  298. package/static-files/shell.v3.js +1865 -0
  299. package/static-files/storage.v3.js +176 -0
  300. package/tests/anthropic.spec.ts +42 -7
  301. package/tests/builders.spec.ts +72 -4
  302. package/tests/pageValidator.spec.ts +548 -0
  303. package/tests/profiles.spec.ts +122 -0
  304. package/tests/providers.spec.ts +1 -1
  305. package/tests/sharedTableSchema.spec.ts +242 -0
  306. package/tests/transformPage.spec.ts +62 -81
  307. package/default-pages/application/page.json +0 -10
  308. package/default-pages/retro_game_starter/page.json +0 -12
  309. package/default-pages/sidebar_page/page.html +0 -51
  310. package/default-pages/sidebar_page/page.json +0 -10
  311. package/default-pages/two-panel_page/page.html +0 -68
  312. package/default-pages/two-panel_page/page.json +0 -10
@@ -0,0 +1,313 @@
1
+ <!DOCTYPE html><html lang="en"><head>
2
+ <meta charset="UTF-8">
3
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
4
+ <title>SynthOS - Form Starter</title>
5
+ <script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
6
+ <link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
7
+ <style>
8
+ .form-app {
9
+ max-width: 720px;
10
+ margin: 0 auto;
11
+ padding: 24px;
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: 20px;
15
+ }
16
+ .form-header h1 {
17
+ margin: 0 0 4px;
18
+ font-size: 24px;
19
+ font-weight: 700;
20
+ color: var(--bodyText, #333333);
21
+ }
22
+ .form-header p {
23
+ margin: 0;
24
+ color: var(--bodySubtext, #605e5c);
25
+ font-size: 14px;
26
+ }
27
+ .progress-wrap {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 6px;
31
+ }
32
+ .progress-meta {
33
+ display: flex;
34
+ justify-content: space-between;
35
+ font-size: 12px;
36
+ color: var(--bodySubtext, #605e5c);
37
+ }
38
+ .progress-bar {
39
+ height: 6px;
40
+ background: var(--bodyDivider, #edebe9);
41
+ border-radius: 3px;
42
+ overflow: hidden;
43
+ }
44
+ .progress-fill {
45
+ height: 100%;
46
+ background: var(--themePrimary, #0078d4);
47
+ transition: width 0.2s ease;
48
+ }
49
+ .form-section {
50
+ background: var(--defaultStateBackground, #faf9f8);
51
+ border: 1px solid var(--bodyDivider, #edebe9);
52
+ border-radius: 10px;
53
+ padding: 20px;
54
+ }
55
+ .step-title {
56
+ font-size: 18px;
57
+ font-weight: 600;
58
+ color: var(--bodyText, #333333);
59
+ margin: 0 0 4px;
60
+ }
61
+ .step-hint {
62
+ font-size: 13px;
63
+ color: var(--bodySubtext, #605e5c);
64
+ margin: 0 0 16px;
65
+ }
66
+ .form-group { margin-bottom: 14px; }
67
+ .form-label {
68
+ display: block;
69
+ font-size: 12px;
70
+ color: var(--bodySubtext, #605e5c);
71
+ margin-bottom: 4px;
72
+ }
73
+ .form-input,
74
+ .form-textarea,
75
+ .form-select {
76
+ width: 100%;
77
+ padding: 8px 10px;
78
+ border: 1px solid var(--inputBorder, #d2d0ce);
79
+ border-radius: 4px;
80
+ background: var(--bodyBackground, #ffffff);
81
+ color: var(--bodyText, #333333);
82
+ font: inherit;
83
+ box-sizing: border-box;
84
+ }
85
+ .form-textarea { min-height: 90px; resize: vertical; }
86
+ .form-input:focus,
87
+ .form-textarea:focus,
88
+ .form-select:focus {
89
+ outline: 2px solid var(--themePrimary, #0078d4);
90
+ outline-offset: -2px;
91
+ }
92
+ .radio-row {
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: 8px;
96
+ }
97
+ .radio-row label {
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 8px;
101
+ font-size: 14px;
102
+ color: var(--bodyText, #333333);
103
+ }
104
+ .nav-row {
105
+ display: flex;
106
+ justify-content: space-between;
107
+ margin-top: 20px;
108
+ }
109
+ .review-row {
110
+ display: flex;
111
+ justify-content: space-between;
112
+ padding: 8px 0;
113
+ border-top: 1px solid var(--bodyDivider, #edebe9);
114
+ }
115
+ .review-row:first-child { border-top: none; }
116
+ .review-row .lbl { color: var(--bodySubtext, #605e5c); font-size: 12px; }
117
+ .review-row .val { color: var(--bodyText, #333333); font-weight: 600; max-width: 60%; text-align: right; }
118
+ .done-card {
119
+ text-align: center;
120
+ padding: 32px;
121
+ }
122
+ .done-card .icon {
123
+ font-size: 40px;
124
+ margin-bottom: 8px;
125
+ }
126
+ .done-card h2 {
127
+ margin: 0 0 4px;
128
+ color: var(--bodyText, #333333);
129
+ }
130
+ .done-card p {
131
+ margin: 0;
132
+ color: var(--bodySubtext, #605e5c);
133
+ }
134
+ </style>
135
+ </head>
136
+ <body>
137
+ <div class="viewer-panel" id="viewerPanel">
138
+ <div class="form-app">
139
+ <div class="form-header">
140
+ <h1>[Form Title]</h1>
141
+ <p>[One-line purpose — e.g. "Quick onboarding to get you set up."]</p>
142
+ </div>
143
+
144
+ <div class="progress-wrap">
145
+ <div class="progress-meta">
146
+ <span id="stepLabel">Step 1 of 3</span>
147
+ <span id="percentLabel">33%</span>
148
+ </div>
149
+ <div class="progress-bar"><div class="progress-fill" id="progressFill" style="width: 33%;"></div></div>
150
+ </div>
151
+
152
+ <div class="form-section" id="stepContainer">
153
+ <!-- Steps rendered by JS -->
154
+ </div>
155
+
156
+ <div class="nav-row">
157
+ <button class="flm-button" id="backBtn" data-icon="ChevronLeft">Back</button>
158
+ <button class="flm-button flm-button--primary" id="nextBtn" data-icon="ChevronRight">Next</button>
159
+ </div>
160
+ </div>
161
+ </div>
162
+
163
+ <div id="instructions" style="display: none;" data-locked="true">Form / Wizard archetype (Form starter). Multi-step input collection: progress bar at top, step content in the middle, nav buttons at the bottom. Final step shows a read-only review of every answer with a Submit button. Persist completed submissions via synthos.shared.data.save("&lt;table&gt;", { answers, submittedAt }). Replace the steps array with the user's domain (questions, fields, types). Each step entry: { title, hint, fields: [{ id, label, type: 'text'|'textarea'|'select'|'radio', options? }] }. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
164
+ <div id="thoughts" style="display: none;" data-locked="true"></div>
165
+
166
+ <script>
167
+ (function () {
168
+ var STEPS = [
169
+ {
170
+ title: 'Step 1 — Basics',
171
+ hint: 'Tell us a bit about yourself.',
172
+ fields: [
173
+ { id: 'name', label: 'Full name', type: 'text' },
174
+ { id: 'email', label: 'Email', type: 'text' }
175
+ ]
176
+ },
177
+ {
178
+ title: 'Step 2 — Preferences',
179
+ hint: 'Choose what fits you best.',
180
+ fields: [
181
+ { id: 'role', label: 'Primary role', type: 'select', options: ['Builder', 'Reader', 'Reviewer'] },
182
+ { id: 'frequency', label: 'How often?', type: 'radio', options: ['Daily', 'Weekly', 'Monthly'] }
183
+ ]
184
+ },
185
+ {
186
+ title: 'Step 3 — Notes',
187
+ hint: 'Anything else we should know?',
188
+ fields: [
189
+ { id: 'notes', label: 'Additional notes', type: 'textarea' }
190
+ ]
191
+ }
192
+ ];
193
+
194
+ var answers = {};
195
+ var stepIdx = 0;
196
+ var done = false;
197
+
198
+ var stepContainer = document.getElementById('stepContainer');
199
+ var stepLabel = document.getElementById('stepLabel');
200
+ var percentLabel = document.getElementById('percentLabel');
201
+ var progressFill = document.getElementById('progressFill');
202
+ var backBtn = document.getElementById('backBtn');
203
+ var nextBtn = document.getElementById('nextBtn');
204
+
205
+ function captureStep(idx) {
206
+ var step = STEPS[idx];
207
+ step.fields.forEach(function (f) {
208
+ if (f.type === 'radio') {
209
+ var checked = stepContainer.querySelector('input[name="' + f.id + '"]:checked');
210
+ answers[f.id] = checked ? checked.value : '';
211
+ } else {
212
+ var el = document.getElementById('field_' + f.id);
213
+ if (el) answers[f.id] = el.value;
214
+ }
215
+ });
216
+ }
217
+
218
+ function renderStep() {
219
+ if (done) return renderDone();
220
+ var step = STEPS[stepIdx];
221
+ var html = '<div class="step-title">' + step.title + '</div>';
222
+ html += '<div class="step-hint">' + step.hint + '</div>';
223
+ step.fields.forEach(function (f) {
224
+ var v = answers[f.id] || '';
225
+ html += '<div class="form-group"><label class="form-label" for="field_' + f.id + '">' + f.label + '</label>';
226
+ if (f.type === 'textarea') {
227
+ html += '<textarea id="field_' + f.id + '" class="form-textarea">' + escapeHtml(v) + '</textarea>';
228
+ } else if (f.type === 'select') {
229
+ html += '<select id="field_' + f.id + '" class="form-select">';
230
+ f.options.forEach(function (o) {
231
+ html += '<option value="' + escapeAttr(o) + '"' + (v === o ? ' selected' : '') + '>' + escapeHtml(o) + '</option>';
232
+ });
233
+ html += '</select>';
234
+ } else if (f.type === 'radio') {
235
+ html += '<div class="radio-row">';
236
+ f.options.forEach(function (o) {
237
+ html += '<label><input type="radio" name="' + f.id + '" value="' + escapeAttr(o) + '"' + (v === o ? ' checked' : '') + '>' + escapeHtml(o) + '</label>';
238
+ });
239
+ html += '</div>';
240
+ } else {
241
+ html += '<input id="field_' + f.id + '" class="form-input" type="text" value="' + escapeAttr(v) + '">';
242
+ }
243
+ html += '</div>';
244
+ });
245
+ if (stepIdx === STEPS.length - 1) {
246
+ html += '<div class="step-hint" style="margin-top:16px;font-weight:600;">Review your answers below before submitting:</div>';
247
+ html += '<div id="reviewList" style="margin-top:8px;"></div>';
248
+ }
249
+ stepContainer.innerHTML = html;
250
+ if (stepIdx === STEPS.length - 1) renderReview();
251
+
252
+ var pct = Math.round(((stepIdx + 1) / STEPS.length) * 100);
253
+ stepLabel.textContent = 'Step ' + (stepIdx + 1) + ' of ' + STEPS.length;
254
+ percentLabel.textContent = pct + '%';
255
+ progressFill.style.width = pct + '%';
256
+ backBtn.disabled = stepIdx === 0;
257
+ backBtn.style.opacity = stepIdx === 0 ? '0.4' : '1';
258
+ nextBtn.textContent = stepIdx === STEPS.length - 1 ? 'Submit' : 'Next';
259
+ nextBtn.setAttribute('data-icon', stepIdx === STEPS.length - 1 ? 'CheckMark' : 'ChevronRight');
260
+ }
261
+
262
+ function renderReview() {
263
+ var rl = document.getElementById('reviewList');
264
+ if (!rl) return;
265
+ var html = '';
266
+ STEPS.forEach(function (s) {
267
+ s.fields.forEach(function (f) {
268
+ var v = answers[f.id] || '(blank)';
269
+ html += '<div class="review-row"><span class="lbl">' + escapeHtml(f.label) + '</span><span class="val">' + escapeHtml(v) + '</span></div>';
270
+ });
271
+ });
272
+ rl.innerHTML = html;
273
+ }
274
+
275
+ function renderDone() {
276
+ stepContainer.innerHTML = '<div class="done-card"><div class="icon">✓</div><h2>Submitted</h2><p>Thanks — your answers were captured.</p></div>';
277
+ stepLabel.textContent = 'Done';
278
+ percentLabel.textContent = '100%';
279
+ progressFill.style.width = '100%';
280
+ backBtn.style.display = 'none';
281
+ nextBtn.textContent = 'Start over';
282
+ nextBtn.setAttribute('data-icon', 'Refresh');
283
+ }
284
+
285
+ backBtn.addEventListener('click', function () {
286
+ captureStep(stepIdx);
287
+ if (stepIdx > 0) { stepIdx--; renderStep(); }
288
+ });
289
+ nextBtn.addEventListener('click', function () {
290
+ if (done) {
291
+ done = false; stepIdx = 0; answers = {};
292
+ backBtn.style.display = '';
293
+ renderStep();
294
+ return;
295
+ }
296
+ captureStep(stepIdx);
297
+ if (stepIdx === STEPS.length - 1) {
298
+ // synthos.shared.data.save('form_submissions', { answers: answers, submittedAt: new Date().toISOString() });
299
+ done = true;
300
+ renderStep();
301
+ } else {
302
+ stepIdx++;
303
+ renderStep();
304
+ }
305
+ });
306
+
307
+ function escapeHtml(s) { return String(s).replace(/[&<>"']/g, function (c) { return ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' })[c]; }); }
308
+ function escapeAttr(s) { return escapeHtml(s); }
309
+
310
+ renderStep();
311
+ })();
312
+ </script>
313
+ </body></html>
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "Form Wizard",
3
+ "description": "Collect input across multiple steps for surveys, applications, onboarding flows, or intake forms.",
4
+ "categories": [
5
+ "_Starters"
6
+ ],
7
+ "pinned": false,
8
+ "showInAll": false,
9
+ "pageVersion": 3,
10
+ "mode": "unlocked",
11
+ "greeting": "Welcome to the Form starter — a multi-step input collection scaffold. Tell me what you want to collect (e.g. onboarding answers, application details, survey responses) and I'll wire the steps, fields, validation, and review screen.",
12
+ "firstRunGreeting": ""
13
+ }
@@ -0,0 +1 @@
1
+ [{"role":"assistant","content":"Welcome to the Gallery starter — an image-first responsive card grid with lightbox preview. Tell me what you'd like to showcase (e.g. photo album, product showcase, design portfolio, moodboard, recipe collection, travel album) and I'll wire the cards, categories, and lightbox."}]