synthos 0.10.1 → 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 (311) 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 +150 -25
  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 +10 -1
  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 +70 -2
  302. package/tests/pageValidator.spec.ts +548 -0
  303. package/tests/profiles.spec.ts +122 -0
  304. package/tests/sharedTableSchema.spec.ts +242 -0
  305. package/tests/transformPage.spec.ts +62 -81
  306. package/default-pages/application/page.json +0 -10
  307. package/default-pages/retro_game_starter/page.json +0 -12
  308. package/default-pages/sidebar_page/page.html +0 -51
  309. package/default-pages/sidebar_page/page.json +0 -10
  310. package/default-pages/two-panel_page/page.html +0 -68
  311. package/default-pages/two-panel_page/page.json +0 -10
@@ -0,0 +1,437 @@
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 - Checklist 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
+ html, body { height: 100%; }
9
+ body { margin: 0; }
10
+ .viewer-panel { height: 100%; }
11
+ .cl-app {
12
+ display: flex;
13
+ flex-direction: column;
14
+ height: 100%;
15
+ min-height: 100%;
16
+ box-sizing: border-box;
17
+ }
18
+ .cl-header {
19
+ display: flex;
20
+ justify-content: space-between;
21
+ align-items: center;
22
+ padding: 14px 24px;
23
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
24
+ background: var(--defaultStateBackground, #faf9f8);
25
+ gap: 12px;
26
+ flex: 0 0 auto;
27
+ flex-wrap: wrap;
28
+ }
29
+ .cl-header h1 {
30
+ margin: 0;
31
+ font-size: 18px;
32
+ font-weight: 700;
33
+ color: var(--bodyText, #333333);
34
+ }
35
+ .count-badge {
36
+ margin-top: 4px;
37
+ font-size: 12px;
38
+ color: var(--bodySubtext, #605e5c);
39
+ }
40
+ .cl-controls {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 10px;
44
+ padding: 14px 24px;
45
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
46
+ background: var(--bodyBackground, #ffffff);
47
+ flex: 0 0 auto;
48
+ }
49
+ .quick-add {
50
+ display: flex;
51
+ gap: 8px;
52
+ align-items: center;
53
+ }
54
+ .quick-add input[type="text"] {
55
+ flex: 1 1 auto;
56
+ padding: 8px 12px;
57
+ border: 1px solid var(--inputBorder, #d2d0ce);
58
+ border-radius: 6px;
59
+ background: var(--bodyBackground, #ffffff);
60
+ color: var(--bodyText, #333333);
61
+ font: inherit;
62
+ font-size: 14px;
63
+ }
64
+ .quick-add input[type="text"]:focus {
65
+ outline: none;
66
+ border-color: var(--themePrimary, #0078d4);
67
+ }
68
+ .quick-add select {
69
+ padding: 8px 10px;
70
+ border: 1px solid var(--inputBorder, #d2d0ce);
71
+ border-radius: 6px;
72
+ background: var(--bodyBackground, #ffffff);
73
+ color: var(--bodyText, #333333);
74
+ font: inherit;
75
+ font-size: 13px;
76
+ }
77
+ .filter-row {
78
+ display: flex;
79
+ gap: 6px;
80
+ align-items: center;
81
+ flex-wrap: wrap;
82
+ }
83
+ .filter-chip {
84
+ padding: 4px 12px;
85
+ border: 1px solid var(--inputBorder, #d2d0ce);
86
+ border-radius: 14px;
87
+ background: var(--bodyBackground, #ffffff);
88
+ color: var(--bodyText, #333333);
89
+ font-size: 12px;
90
+ cursor: pointer;
91
+ }
92
+ .filter-chip:hover { background: var(--bodyBackgroundHovered, #f3f2f1); }
93
+ .filter-chip.active {
94
+ background: var(--themePrimary, #0078d4);
95
+ border-color: var(--themePrimary, #0078d4);
96
+ color: #ffffff;
97
+ }
98
+
99
+ .cl-list {
100
+ flex: 1 1 auto;
101
+ min-height: 0;
102
+ overflow-y: auto;
103
+ background: var(--bodyBackground, #ffffff);
104
+ }
105
+ .cl-empty {
106
+ text-align: center;
107
+ color: var(--bodySubtext, #605e5c);
108
+ padding: 48px 24px;
109
+ font-size: 13px;
110
+ }
111
+ .cl-row {
112
+ display: flex;
113
+ align-items: center;
114
+ gap: 12px;
115
+ padding: 10px 24px;
116
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
117
+ }
118
+ .cl-row:hover { background: var(--bodyBackgroundHovered, #f3f2f1); }
119
+ .cl-row .checkbox {
120
+ flex: 0 0 auto;
121
+ width: 18px;
122
+ height: 18px;
123
+ cursor: pointer;
124
+ accent-color: var(--themePrimary, #0078d4);
125
+ }
126
+ .cl-row .text {
127
+ flex: 1 1 auto;
128
+ font-size: 14px;
129
+ color: var(--bodyText, #333333);
130
+ cursor: text;
131
+ line-height: 1.4;
132
+ min-width: 0;
133
+ word-break: break-word;
134
+ }
135
+ .cl-row.done .text {
136
+ text-decoration: line-through;
137
+ color: var(--bodySubtext, #605e5c);
138
+ }
139
+ .cl-row .text-edit {
140
+ flex: 1 1 auto;
141
+ font: inherit;
142
+ font-size: 14px;
143
+ padding: 4px 6px;
144
+ border: 1px solid var(--themePrimary, #0078d4);
145
+ border-radius: 4px;
146
+ background: var(--bodyBackground, #ffffff);
147
+ color: var(--bodyText, #333333);
148
+ outline: none;
149
+ min-width: 0;
150
+ }
151
+ .priority-chip {
152
+ flex: 0 0 auto;
153
+ padding: 2px 8px;
154
+ border-radius: 10px;
155
+ font-size: 10px;
156
+ font-weight: 600;
157
+ text-transform: uppercase;
158
+ letter-spacing: 0.4px;
159
+ }
160
+ .priority-chip.low {
161
+ background: var(--bodyDivider, #edebe9);
162
+ color: var(--bodySubtext, #605e5c);
163
+ }
164
+ .priority-chip.medium {
165
+ background: #fff3e0;
166
+ color: #c65b00;
167
+ }
168
+ .priority-chip.high {
169
+ background: #fde7e9;
170
+ color: #a4262c;
171
+ }
172
+ .remove-btn {
173
+ flex: 0 0 auto;
174
+ background: transparent;
175
+ border: none;
176
+ font-size: 16px;
177
+ line-height: 1;
178
+ color: var(--bodySubtext, #605e5c);
179
+ cursor: pointer;
180
+ padding: 4px 6px;
181
+ border-radius: 4px;
182
+ }
183
+ .remove-btn:hover {
184
+ color: #a4262c;
185
+ background: var(--bodyBackgroundHovered, #f3f2f1);
186
+ }
187
+
188
+ .cl-footer {
189
+ flex: 0 0 auto;
190
+ display: flex;
191
+ justify-content: flex-end;
192
+ padding: 10px 24px;
193
+ border-top: 1px solid var(--bodyDivider, #edebe9);
194
+ background: var(--defaultStateBackground, #faf9f8);
195
+ }
196
+ </style>
197
+ </head>
198
+ <body>
199
+ <div class="viewer-panel" id="viewerPanel" style="padding: 0;">
200
+ <div class="cl-app">
201
+ <div class="cl-header">
202
+ <div>
203
+ <h1>[Checklist Title]</h1>
204
+ <div class="count-badge" id="countBadge">0 of 0 done</div>
205
+ </div>
206
+ </div>
207
+ <div class="cl-controls">
208
+ <div class="quick-add">
209
+ <input type="text" id="addInput" placeholder="[Add an item…]">
210
+ <select id="addPriority">
211
+ <option value="">No priority</option>
212
+ <option value="low">Low</option>
213
+ <option value="medium">Medium</option>
214
+ <option value="high">High</option>
215
+ </select>
216
+ <button class="flm-button flm-button--primary" id="addBtn" data-icon="Add">Add</button>
217
+ </div>
218
+ <div class="filter-row" id="filterRow">
219
+ <button class="filter-chip active" data-filter="all">All</button>
220
+ <button class="filter-chip" data-filter="active">Active</button>
221
+ <button class="filter-chip" data-filter="done">Done</button>
222
+ </div>
223
+ </div>
224
+ <div class="cl-list" id="list"></div>
225
+ <div class="cl-footer">
226
+ <button class="flm-button" id="clearDoneBtn" data-icon="Delete">Clear completed</button>
227
+ </div>
228
+ </div>
229
+ </div>
230
+
231
+ <div id="instructions" style="display: none;" data-locked="true">Checklist archetype (STARTERS.md §3.9). Flat list with done/not-done state — distinct from Kanban (no columns) and Roster (no schema). Quick-add row at the top accepts text + optional priority; Enter submits. Filter chips narrow the list to All/Active/Done. Click the row body to inline-edit text (Enter saves, Escape cancels). Remove × deletes the row. Persist items via synthos.shared.data.save("&lt;table&gt;", item) / .list("&lt;table&gt;") / .remove("&lt;table&gt;", id). Default fields: id, text, done, createdAt, completedAt, priority (low/medium/high, optional). Replace [Checklist Title] and the input placeholder with the user's domain. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
232
+ <div id="thoughts" style="display: none;" data-locked="true"></div>
233
+
234
+ <script>
235
+ (function () {
236
+ var items = [];
237
+ var filter = 'all';
238
+ var editingId = null;
239
+
240
+ var listEl = document.getElementById('list');
241
+ var countEl = document.getElementById('countBadge');
242
+ var addInput = document.getElementById('addInput');
243
+ var addPriority = document.getElementById('addPriority');
244
+ var addBtn = document.getElementById('addBtn');
245
+ var clearDoneBtn = document.getElementById('clearDoneBtn');
246
+ var filterRow = document.getElementById('filterRow');
247
+
248
+ function escapeHtml(s) {
249
+ return String(s).replace(/[&<>"']/g, function (c) {
250
+ return ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' })[c];
251
+ });
252
+ }
253
+
254
+ function uid() { return 'i_' + Math.random().toString(36).slice(2, 9); }
255
+
256
+ function visibleItems() {
257
+ if (filter === 'active') return items.filter(function (i) { return !i.done; });
258
+ if (filter === 'done') return items.filter(function (i) { return i.done; });
259
+ return items.slice();
260
+ }
261
+
262
+ function updateCount() {
263
+ var done = items.filter(function (i) { return i.done; }).length;
264
+ countEl.textContent = done + ' of ' + items.length + ' done';
265
+ }
266
+
267
+ function renderRow(item) {
268
+ var pChip = item.priority
269
+ ? '<span class="priority-chip ' + escapeHtml(item.priority) + '">' + escapeHtml(item.priority) + '</span>'
270
+ : '';
271
+ var textHtml = (editingId === item.id)
272
+ ? '<input class="text-edit" type="text" value="' + escapeHtml(item.text) + '">'
273
+ : '<div class="text">' + escapeHtml(item.text) + '</div>';
274
+ return '<div class="cl-row' + (item.done ? ' done' : '') + '" data-id="' + item.id + '">' +
275
+ '<input class="checkbox" type="checkbox"' + (item.done ? ' checked' : '') + '>' +
276
+ textHtml + pChip +
277
+ '<button class="remove-btn" title="Remove" aria-label="Remove">×</button>' +
278
+ '</div>';
279
+ }
280
+
281
+ function render() {
282
+ var rows = visibleItems();
283
+ if (!rows.length) {
284
+ listEl.innerHTML = '<div class="cl-empty">' +
285
+ (items.length ? 'Nothing matches this filter.' : 'No items yet — add one above.') +
286
+ '</div>';
287
+ } else {
288
+ listEl.innerHTML = rows.map(renderRow).join('');
289
+ }
290
+ updateCount();
291
+ if (editingId) {
292
+ var input = listEl.querySelector('.cl-row[data-id="' + editingId + '"] .text-edit');
293
+ if (input) {
294
+ input.focus();
295
+ input.setSelectionRange(input.value.length, input.value.length);
296
+ }
297
+ }
298
+ }
299
+
300
+ function addItem() {
301
+ var text = (addInput.value || '').trim();
302
+ if (!text) return;
303
+ var item = {
304
+ id: uid(),
305
+ text: text,
306
+ done: false,
307
+ priority: addPriority.value || '',
308
+ createdAt: new Date().toISOString(),
309
+ completedAt: null
310
+ };
311
+ items.push(item);
312
+ addInput.value = '';
313
+ addPriority.value = '';
314
+ addInput.focus();
315
+ // synthos.shared.data.save('checklist_items', item);
316
+ render();
317
+ }
318
+
319
+ function toggleDone(id, done) {
320
+ var item = items.find(function (x) { return x.id === id; });
321
+ if (!item) return;
322
+ item.done = done;
323
+ item.completedAt = done ? new Date().toISOString() : null;
324
+ // synthos.shared.data.save('checklist_items', item);
325
+ render();
326
+ }
327
+
328
+ function removeItem(id) {
329
+ items = items.filter(function (x) { return x.id !== id; });
330
+ if (editingId === id) editingId = null;
331
+ // synthos.shared.data.remove('checklist_items', id);
332
+ render();
333
+ }
334
+
335
+ function startEdit(id) {
336
+ editingId = id;
337
+ render();
338
+ }
339
+
340
+ function commitEdit(id, newText) {
341
+ var item = items.find(function (x) { return x.id === id; });
342
+ editingId = null;
343
+ if (!item) { render(); return; }
344
+ var trimmed = (newText || '').trim();
345
+ if (!trimmed) {
346
+ removeItem(id);
347
+ return;
348
+ }
349
+ item.text = trimmed;
350
+ // synthos.shared.data.save('checklist_items', item);
351
+ render();
352
+ }
353
+
354
+ function cancelEdit() {
355
+ editingId = null;
356
+ render();
357
+ }
358
+
359
+ // Quick-add events
360
+ addBtn.addEventListener('click', addItem);
361
+ addInput.addEventListener('keydown', function (e) {
362
+ if (e.key === 'Enter') { e.preventDefault(); addItem(); }
363
+ });
364
+
365
+ // Filter chips
366
+ filterRow.addEventListener('click', function (e) {
367
+ var chip = e.target.closest('.filter-chip');
368
+ if (!chip) return;
369
+ filterRow.querySelectorAll('.filter-chip').forEach(function (c) {
370
+ c.classList.toggle('active', c === chip);
371
+ });
372
+ filter = chip.getAttribute('data-filter');
373
+ render();
374
+ });
375
+
376
+ // Row delegation: checkbox toggle, remove, click-to-edit, edit commit
377
+ listEl.addEventListener('click', function (e) {
378
+ var row = e.target.closest('.cl-row');
379
+ if (!row) return;
380
+ var id = row.getAttribute('data-id');
381
+
382
+ if (e.target.classList.contains('checkbox')) {
383
+ toggleDone(id, e.target.checked);
384
+ return;
385
+ }
386
+ if (e.target.classList.contains('remove-btn')) {
387
+ removeItem(id);
388
+ return;
389
+ }
390
+ if (e.target.classList.contains('text')) {
391
+ startEdit(id);
392
+ }
393
+ });
394
+
395
+ listEl.addEventListener('keydown', function (e) {
396
+ if (!e.target.classList.contains('text-edit')) return;
397
+ var row = e.target.closest('.cl-row');
398
+ var id = row && row.getAttribute('data-id');
399
+ if (e.key === 'Enter') {
400
+ e.preventDefault();
401
+ commitEdit(id, e.target.value);
402
+ } else if (e.key === 'Escape') {
403
+ e.preventDefault();
404
+ cancelEdit();
405
+ }
406
+ });
407
+
408
+ listEl.addEventListener('focusout', function (e) {
409
+ if (!e.target.classList.contains('text-edit')) return;
410
+ var row = e.target.closest('.cl-row');
411
+ var id = row && row.getAttribute('data-id');
412
+ if (id) commitEdit(id, e.target.value);
413
+ });
414
+
415
+ clearDoneBtn.addEventListener('click', function () {
416
+ var doneIds = items.filter(function (i) { return i.done; }).map(function (i) { return i.id; });
417
+ if (!doneIds.length) return;
418
+ if (!confirm('Remove ' + doneIds.length + ' completed item' + (doneIds.length === 1 ? '' : 's') + '?')) return;
419
+ items = items.filter(function (i) { return !i.done; });
420
+ // doneIds.forEach(function (id) { synthos.shared.data.remove('checklist_items', id); });
421
+ render();
422
+ });
423
+
424
+ // Load persisted items (uncomment to enable):
425
+ // synthos.shared.data.list('checklist_items').then(function (rows) {
426
+ // if (rows && rows.length) {
427
+ // items = rows.slice().sort(function (a, b) {
428
+ // return (a.createdAt || '').localeCompare(b.createdAt || '');
429
+ // });
430
+ // render();
431
+ // }
432
+ // });
433
+
434
+ render();
435
+ })();
436
+ </script>
437
+ </body></html>
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "Checklist",
3
+ "description": "Track a flat list of items with done/not-done state for to-dos, packing lists, or daily tasks.",
4
+ "categories": [
5
+ "_Starters"
6
+ ],
7
+ "pinned": false,
8
+ "showInAll": false,
9
+ "pageVersion": 3,
10
+ "mode": "unlocked",
11
+ "greeting": "Welcome to the Checklist starter — a flat list with done/not-done state. Tell me what you'd like to track (e.g. grocery list, packing list, daily tasks, bug-bash list, onboarding checklist, study to-do) and I'll wire the items, filters, and any extra metadata you need.",
12
+ "firstRunGreeting": ""
13
+ }
@@ -0,0 +1 @@
1
+ [{"role":"assistant","content":"Welcome to the Dashboard starter — Archetype A from BLUEPRINT.md. Use this scaffold for insight pages with summary stats, primary nav tabs (≤5), and a card grid. Tell me what you'd like to track and I'll fill in the stats, tabs, and cards."}]
@@ -0,0 +1,195 @@
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 - Dashboard 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
+ .dash-app {
9
+ display: flex;
10
+ flex-direction: column;
11
+ height: 100%;
12
+ width: 100%;
13
+ overflow: hidden;
14
+ background: var(--bodyBackground, #ffffff);
15
+ }
16
+ .dash-header {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 16px;
20
+ padding: 16px 24px;
21
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
22
+ background: var(--defaultStateBackground, #faf9f8);
23
+ flex-shrink: 0;
24
+ }
25
+ .dash-header .header-titles {
26
+ display: flex;
27
+ flex-direction: column;
28
+ flex: 1;
29
+ min-width: 0;
30
+ }
31
+ .dash-stats {
32
+ display: flex;
33
+ gap: 12px;
34
+ padding: 12px 24px;
35
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
36
+ flex-wrap: wrap;
37
+ flex-shrink: 0;
38
+ background: var(--bodyBackground, #ffffff);
39
+ }
40
+ .stat-card {
41
+ flex: 1;
42
+ min-width: 140px;
43
+ padding: 12px 16px;
44
+ border: 1px solid var(--inputBorder, #d2d0ce);
45
+ border-radius: 4px;
46
+ background: var(--defaultStateBackground, #faf9f8);
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 2px;
50
+ }
51
+ .stat-card .stat-value {
52
+ font-size: 24px;
53
+ font-weight: 600;
54
+ color: var(--bodyText, #333333);
55
+ line-height: 1.2;
56
+ }
57
+ .stat-card .stat-label {
58
+ font-size: 12px;
59
+ color: var(--bodySubtext, #605e5c);
60
+ }
61
+ /* Canonical tabs — see BLUEPRINT.md §4.8. Do not vary. */
62
+ .dash-tabs {
63
+ display: flex;
64
+ gap: 0;
65
+ padding: 0 24px;
66
+ flex-shrink: 0;
67
+ align-items: flex-end;
68
+ overflow: visible;
69
+ position: relative;
70
+ border-bottom: 2px solid var(--bodyDivider, #edebe9);
71
+ background: var(--bodyBackground, #ffffff);
72
+ }
73
+ .dash-tab {
74
+ padding: 10px 20px;
75
+ border: 1px solid transparent;
76
+ border-bottom: none;
77
+ border-radius: 4px 4px 0 0;
78
+ background: transparent;
79
+ color: var(--bodySubtext, #605e5c);
80
+ font-size: 14px;
81
+ font-weight: 500;
82
+ cursor: pointer;
83
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
84
+ margin-bottom: -2px;
85
+ position: relative;
86
+ z-index: 1;
87
+ }
88
+ .dash-tab:hover {
89
+ background: var(--bodyBackgroundHovered, #f3f2f1);
90
+ color: var(--bodyText, #333333);
91
+ }
92
+ .dash-tab.active {
93
+ background: var(--bodyBackground, #ffffff);
94
+ border-color: var(--bodyDivider, #edebe9);
95
+ border-bottom: 2px solid var(--bodyBackground, #ffffff);
96
+ color: var(--themePrimary, #0078d4);
97
+ font-weight: 600;
98
+ z-index: 2;
99
+ }
100
+ .dash-body {
101
+ flex: 1;
102
+ overflow: auto;
103
+ padding: 20px 24px;
104
+ }
105
+ .dash-card-grid {
106
+ display: grid;
107
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
108
+ gap: 16px;
109
+ }
110
+ .dash-card {
111
+ background: var(--defaultStateBackground, #faf9f8);
112
+ border: 1px solid var(--bodyDivider, #edebe9);
113
+ border-radius: 8px;
114
+ padding: 16px;
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: 8px;
118
+ }
119
+ .dash-card .card-title {
120
+ font-size: 15px;
121
+ font-weight: 600;
122
+ color: var(--bodyText, #333333);
123
+ }
124
+ .dash-card .card-body {
125
+ font-size: 13px;
126
+ color: var(--bodySubtext, #605e5c);
127
+ line-height: 1.5;
128
+ }
129
+ </style>
130
+ </head>
131
+ <body>
132
+ <div class="viewer-panel" id="viewerPanel" style="padding: 0;">
133
+ <div class="dash-app">
134
+ <div class="dash-header">
135
+ <div class="header-titles">
136
+ <span class="flm-text flm-text--xLarge flm-text--bold flm-text--block">[Page Title]</span>
137
+ <span class="flm-text flm-text--small flm-text--secondary flm-text--block">[Subtitle / one-liner purpose]</span>
138
+ </div>
139
+ </div>
140
+
141
+ <div class="dash-stats" id="statsBar">
142
+ <div class="stat-card"><span class="stat-value">0</span><span class="stat-label">Metric A</span></div>
143
+ <div class="stat-card"><span class="stat-value">0</span><span class="stat-label">Metric B</span></div>
144
+ <div class="stat-card"><span class="stat-value">0</span><span class="stat-label">Metric C</span></div>
145
+ <div class="stat-card"><span class="stat-value">0</span><span class="stat-label">Metric D</span></div>
146
+ </div>
147
+
148
+ <div class="dash-tabs" id="tabs">
149
+ <button class="dash-tab active" data-tab="overview">Overview</button>
150
+ <button class="dash-tab" data-tab="details">Details</button>
151
+ </div>
152
+
153
+ <div class="dash-body" id="body">
154
+ <div class="dash-card-grid" id="cardGrid">
155
+ <div class="dash-card">
156
+ <div class="card-title">Card 1</div>
157
+ <div class="card-body">Replace this with your insight or recommendation.</div>
158
+ </div>
159
+ <div class="dash-card">
160
+ <div class="card-title">Card 2</div>
161
+ <div class="card-body">Cards stack two-up on wide viewports, single column on narrow.</div>
162
+ </div>
163
+ <div class="dash-card">
164
+ <div class="card-title">Card 3</div>
165
+ <div class="card-body">Ask the assistant to render real data from a shared table.</div>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+
172
+ <div id="instructions" style="display: none;" data-locked="true">Dashboard archetype (BLUEPRINT.md §4.2). Layout: header → summary stats strip → primary nav tabs (≤ 5) → card grid in body. Default user intent is to wire this to real data — ask which shared table to read, then render summary stats from aggregations and cards from rows. Tab CSS is canonical (BLUEPRINT §4.8) — do not invent borderless-underline or flm-pivot variants. Required: viewer-panel must keep style="padding: 0;". Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
173
+ <div id="thoughts" style="display: none;" data-locked="true"></div>
174
+
175
+ <script>
176
+ (function () {
177
+ var tabs = document.getElementById('tabs');
178
+ tabs.addEventListener('click', function (e) {
179
+ var btn = e.target.closest('.dash-tab');
180
+ if (!btn) return;
181
+ var name = btn.getAttribute('data-tab');
182
+ tabs.querySelectorAll('.dash-tab').forEach(function (b) {
183
+ b.classList.toggle('active', b === btn);
184
+ });
185
+ renderTab(name);
186
+ });
187
+
188
+ function renderTab(name) {
189
+ // Replace with per-tab rendering. The starter renders the same grid for both tabs.
190
+ var grid = document.getElementById('cardGrid');
191
+ grid.setAttribute('data-active-tab', name);
192
+ }
193
+ })();
194
+ </script>
195
+ </body></html>
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "Dashboard",
3
+ "description": "Build an insight page with summary stats, navigation tabs, and a card grid for tracking key metrics.",
4
+ "categories": [
5
+ "_Starters"
6
+ ],
7
+ "pinned": false,
8
+ "showInAll": false,
9
+ "pageVersion": 3,
10
+ "mode": "unlocked",
11
+ "greeting": "Welcome to the Dashboard starter — Archetype A from BLUEPRINT.md. Use this scaffold for insight pages with summary stats, primary nav tabs (≤5), and a card grid. Tell me what you'd like to track and I'll fill in the stats, tabs, and cards.",
12
+ "firstRunGreeting": ""
13
+ }
@@ -0,0 +1 @@
1
+ [{"role":"assistant","content":"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."}]