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,495 @@
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 - Calendar 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
+ .cal-app {
12
+ display: flex;
13
+ flex-direction: column;
14
+ height: 100%;
15
+ min-height: 100%;
16
+ box-sizing: border-box;
17
+ }
18
+ .cal-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-wrap: wrap;
27
+ }
28
+ .cal-title {
29
+ margin: 0;
30
+ font-size: 20px;
31
+ font-weight: 700;
32
+ color: var(--bodyText, #333333);
33
+ }
34
+ .cal-actions {
35
+ display: flex;
36
+ gap: 8px;
37
+ align-items: center;
38
+ flex-wrap: wrap;
39
+ }
40
+ .view-toggle {
41
+ display: inline-flex;
42
+ border: 1px solid var(--inputBorder, #d2d0ce);
43
+ border-radius: 6px;
44
+ overflow: hidden;
45
+ }
46
+ .view-toggle button {
47
+ padding: 6px 12px;
48
+ background: var(--bodyBackground, #ffffff);
49
+ color: var(--bodyText, #333333);
50
+ border: none;
51
+ border-left: 1px solid var(--inputBorder, #d2d0ce);
52
+ font: inherit;
53
+ font-size: 13px;
54
+ cursor: pointer;
55
+ }
56
+ .view-toggle button:first-child { border-left: none; }
57
+ .view-toggle button.active {
58
+ background: var(--themePrimary, #0078d4);
59
+ color: #ffffff;
60
+ }
61
+ .nav-row {
62
+ display: inline-flex;
63
+ gap: 4px;
64
+ align-items: center;
65
+ }
66
+ .nav-row .month-label {
67
+ font-weight: 600;
68
+ color: var(--bodyText, #333333);
69
+ min-width: 160px;
70
+ text-align: center;
71
+ }
72
+ .cal-body {
73
+ flex: 1 1 auto;
74
+ min-height: 0;
75
+ overflow: auto;
76
+ background: var(--bodyBackground, #ffffff);
77
+ }
78
+ /* Month grid */
79
+ .month-grid {
80
+ display: grid;
81
+ grid-template-columns: repeat(7, 1fr);
82
+ grid-auto-rows: minmax(100px, 1fr);
83
+ height: 100%;
84
+ min-height: 100%;
85
+ }
86
+ .month-day-name {
87
+ padding: 8px 10px;
88
+ font-size: 11px;
89
+ font-weight: 600;
90
+ text-transform: uppercase;
91
+ letter-spacing: 0.04em;
92
+ color: var(--bodySubtext, #605e5c);
93
+ background: var(--defaultStateBackground, #faf9f8);
94
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
95
+ }
96
+ .month-day-cell {
97
+ border-right: 1px solid var(--bodyDivider, #edebe9);
98
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
99
+ padding: 4px 6px;
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: 4px;
103
+ cursor: pointer;
104
+ min-height: 100px;
105
+ overflow: hidden;
106
+ }
107
+ .month-day-cell:hover { background: var(--bodyBackgroundHovered, #f3f2f1); }
108
+ .month-day-cell.other-month { color: var(--bodySubtext, #605e5c); opacity: 0.5; }
109
+ .month-day-cell.today .day-num {
110
+ background: var(--themePrimary, #0078d4);
111
+ color: #ffffff;
112
+ border-radius: 50%;
113
+ display: inline-block;
114
+ width: 22px;
115
+ height: 22px;
116
+ line-height: 22px;
117
+ text-align: center;
118
+ }
119
+ .day-num {
120
+ font-size: 12px;
121
+ font-weight: 600;
122
+ color: var(--bodyText, #333333);
123
+ }
124
+ .event-pill {
125
+ font-size: 11px;
126
+ padding: 2px 6px;
127
+ border-radius: 3px;
128
+ color: #ffffff;
129
+ white-space: nowrap;
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ }
133
+ .event-pill.cat-blue { background: #1976D2; }
134
+ .event-pill.cat-green { background: #2e7d32; }
135
+ .event-pill.cat-orange { background: #ef6c00; }
136
+ .event-pill.cat-purple { background: #7B1FA2; }
137
+ .more-link {
138
+ font-size: 11px;
139
+ color: var(--themePrimary, #0078d4);
140
+ font-weight: 600;
141
+ }
142
+
143
+ /* Drawer */
144
+ .drawer-overlay {
145
+ display: none;
146
+ position: fixed;
147
+ inset: 0;
148
+ background: rgba(0,0,0,0.4);
149
+ z-index: 100;
150
+ justify-content: flex-end;
151
+ }
152
+ .drawer-overlay.open { display: flex; }
153
+ .drawer {
154
+ width: 420px;
155
+ max-width: 90vw;
156
+ background: var(--bodyBackground, #ffffff);
157
+ box-shadow: -2px 0 12px rgba(0,0,0,0.15);
158
+ display: flex;
159
+ flex-direction: column;
160
+ overflow: hidden;
161
+ }
162
+ .drawer-header {
163
+ padding: 16px 20px;
164
+ border-bottom: 1px solid var(--bodyDivider, #edebe9);
165
+ display: flex;
166
+ justify-content: space-between;
167
+ align-items: center;
168
+ }
169
+ .drawer-header h2 { margin: 0; font-size: 18px; color: var(--bodyText, #333333); }
170
+ .drawer-body { flex: 1; overflow-y: auto; padding: 20px; }
171
+ .drawer-footer {
172
+ padding: 14px 20px;
173
+ border-top: 1px solid var(--bodyDivider, #edebe9);
174
+ display: flex;
175
+ justify-content: space-between;
176
+ gap: 8px;
177
+ }
178
+ .form-group { margin-bottom: 14px; }
179
+ .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
180
+ .form-label { display: block; font-size: 12px; color: var(--bodySubtext, #605e5c); margin-bottom: 4px; }
181
+ .form-input, .form-textarea, .form-select {
182
+ width: 100%;
183
+ padding: 8px 10px;
184
+ border: 1px solid var(--inputBorder, #d2d0ce);
185
+ border-radius: 4px;
186
+ background: var(--bodyBackground, #ffffff);
187
+ color: var(--bodyText, #333333);
188
+ font: inherit;
189
+ box-sizing: border-box;
190
+ }
191
+ .form-textarea { min-height: 70px; resize: vertical; }
192
+ .close-btn {
193
+ background: transparent;
194
+ border: none;
195
+ font-size: 22px;
196
+ cursor: pointer;
197
+ color: var(--bodySubtext, #605e5c);
198
+ line-height: 1;
199
+ }
200
+ </style>
201
+ </head>
202
+ <body>
203
+ <div class="viewer-panel" id="viewerPanel" style="padding: 0;">
204
+ <div class="cal-app">
205
+ <div class="cal-header">
206
+ <h1 class="cal-title">[Calendar Title]</h1>
207
+ <div class="cal-actions">
208
+ <div class="nav-row">
209
+ <button class="flm-button" id="prevBtn" data-icon="ChevronLeft"></button>
210
+ <span class="month-label" id="monthLabel">—</span>
211
+ <button class="flm-button" id="nextBtn" data-icon="ChevronRight"></button>
212
+ <button class="flm-button" id="todayBtn">Today</button>
213
+ </div>
214
+ <div class="view-toggle" id="viewToggle">
215
+ <button class="active" data-view="month">Month</button>
216
+ <button data-view="week">Week</button>
217
+ <button data-view="day">Day</button>
218
+ </div>
219
+ <button class="flm-button flm-button--primary" id="addEventBtn" data-icon="Add">Add Event</button>
220
+ </div>
221
+ </div>
222
+ <div class="cal-body" id="calBody"></div>
223
+ </div>
224
+ </div>
225
+
226
+ <div class="drawer-overlay" id="drawerOverlay">
227
+ <div class="drawer">
228
+ <div class="drawer-header">
229
+ <h2 id="drawerTitle">Event</h2>
230
+ <button class="close-btn" id="drawerClose">×</button>
231
+ </div>
232
+ <div class="drawer-body">
233
+ <div class="form-group"><label class="form-label" for="evTitle">Title</label><input id="evTitle" class="form-input" type="text"></div>
234
+ <div class="form-row">
235
+ <div class="form-group"><label class="form-label" for="evDate">Date</label><input id="evDate" class="form-input" type="date"></div>
236
+ <div class="form-group"><label class="form-label" for="evCategory">Category</label>
237
+ <select id="evCategory" class="form-select">
238
+ <option value="blue">Blue</option>
239
+ <option value="green">Green</option>
240
+ <option value="orange">Orange</option>
241
+ <option value="purple">Purple</option>
242
+ </select>
243
+ </div>
244
+ </div>
245
+ <div class="form-row">
246
+ <div class="form-group"><label class="form-label" for="evStart">Start time</label><input id="evStart" class="form-input" type="time"></div>
247
+ <div class="form-group"><label class="form-label" for="evEnd">End time</label><input id="evEnd" class="form-input" type="time"></div>
248
+ </div>
249
+ <div class="form-group"><label class="form-label" for="evNotes">Notes</label><textarea id="evNotes" class="form-textarea"></textarea></div>
250
+ </div>
251
+ <div class="drawer-footer">
252
+ <button class="flm-button" id="deleteEventBtn" data-icon="Delete">Delete</button>
253
+ <div style="display: flex; gap: 8px;">
254
+ <button class="flm-button" id="cancelEventBtn">Cancel</button>
255
+ <button class="flm-button flm-button--primary" id="saveEventBtn" data-icon="Save">Save</button>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+
261
+ <div id="instructions" style="display: none;" data-locked="true">Calendar / Schedule archetype. Three views: month grid (current build), week (hour-axis × 7 cols), day (single hour-axis col). Events are objects: { id, title, date (YYYY-MM-DD), startTime, endTime, category, notes }. Click an empty cell to add; click an event pill to edit. Persist via synthos.shared.data.save("&lt;table&gt;", record) + .list() / .remove(). For week/day views with overlapping events, use the lane-packing pattern from WISDOM "calendar-lane-packing". Replace [Calendar Title] and category names to match the user's domain. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
262
+ <div id="thoughts" style="display: none;" data-locked="true"></div>
263
+
264
+ <script>
265
+ (function () {
266
+ var DAY_NAMES = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
267
+ var MONTH_NAMES = ['January','February','March','April','May','June','July','August','September','October','November','December'];
268
+
269
+ var view = 'month';
270
+ var cursor = new Date();
271
+ cursor.setDate(1);
272
+
273
+ var events = [
274
+ { id: 'e1', title: 'Team standup', date: ymd(new Date()), startTime: '09:00', endTime: '09:30', category: 'blue', notes: '' },
275
+ { id: 'e2', title: 'Design review', date: ymd(addDays(new Date(), 2)), startTime: '14:00', endTime: '15:00', category: 'purple', notes: '' },
276
+ { id: 'e3', title: 'Demo day', date: ymd(addDays(new Date(), 5)), startTime: '11:00', endTime: '12:00', category: 'green', notes: '' }
277
+ ];
278
+
279
+ var editingId = null;
280
+ var calBody = document.getElementById('calBody');
281
+ var monthLabel = document.getElementById('monthLabel');
282
+ var drawerOverlay = document.getElementById('drawerOverlay');
283
+ var evTitle = document.getElementById('evTitle');
284
+ var evDate = document.getElementById('evDate');
285
+ var evStart = document.getElementById('evStart');
286
+ var evEnd = document.getElementById('evEnd');
287
+ var evCategory = document.getElementById('evCategory');
288
+ var evNotes = document.getElementById('evNotes');
289
+ var drawerTitle = document.getElementById('drawerTitle');
290
+
291
+ function pad(n) { return n < 10 ? '0' + n : '' + n; }
292
+ function ymd(d) { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); }
293
+ function addDays(d, n) { var x = new Date(d); x.setDate(x.getDate() + n); return x; }
294
+ function escapeHtml(s) { return String(s).replace(/[&<>"']/g, function (c) { return ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' })[c]; }); }
295
+
296
+ function renderMonth() {
297
+ monthLabel.textContent = MONTH_NAMES[cursor.getMonth()] + ' ' + cursor.getFullYear();
298
+ var year = cursor.getFullYear();
299
+ var month = cursor.getMonth();
300
+ var first = new Date(year, month, 1);
301
+ var startOffset = first.getDay();
302
+ var gridStart = addDays(first, -startOffset);
303
+ var todayY = ymd(new Date());
304
+
305
+ var html = '';
306
+ DAY_NAMES.forEach(function (n) { html += '<div class="month-day-name">' + n + '</div>'; });
307
+ for (var i = 0; i < 42; i++) {
308
+ var d = addDays(gridStart, i);
309
+ var ymdStr = ymd(d);
310
+ var isToday = ymdStr === todayY;
311
+ var inMonth = d.getMonth() === month;
312
+ var dayEvents = events.filter(function (e) { return e.date === ymdStr; });
313
+ dayEvents.sort(function (a, b) { return (a.startTime || '').localeCompare(b.startTime || ''); });
314
+ var pillsHtml = dayEvents.slice(0, 3).map(function (e) {
315
+ return '<div class="event-pill cat-' + e.category + '" data-event="' + e.id + '">' +
316
+ (e.startTime ? e.startTime + ' ' : '') + escapeHtml(e.title) + '</div>';
317
+ }).join('');
318
+ if (dayEvents.length > 3) pillsHtml += '<div class="more-link">+' + (dayEvents.length - 3) + ' more</div>';
319
+ html += '<div class="month-day-cell' +
320
+ (inMonth ? '' : ' other-month') +
321
+ (isToday ? ' today' : '') +
322
+ '" data-date="' + ymdStr + '">' +
323
+ '<span class="day-num">' + d.getDate() + '</span>' +
324
+ pillsHtml +
325
+ '</div>';
326
+ }
327
+ calBody.innerHTML = '<div class="month-grid">' + html + '</div>';
328
+
329
+ calBody.querySelectorAll('.month-day-cell').forEach(function (cell) {
330
+ cell.addEventListener('click', function (e) {
331
+ var pill = e.target.closest('.event-pill');
332
+ if (pill) {
333
+ e.stopPropagation();
334
+ openDrawer(pill.getAttribute('data-event'), null);
335
+ return;
336
+ }
337
+ openDrawer(null, cell.getAttribute('data-date'));
338
+ });
339
+ });
340
+ }
341
+
342
+ function renderWeek() {
343
+ var year = cursor.getFullYear(), month = cursor.getMonth(), date = cursor.getDate();
344
+ var d = new Date(year, month, date);
345
+ var startOffset = d.getDay();
346
+ var weekStart = addDays(d, -startOffset);
347
+ monthLabel.textContent = 'Week of ' + MONTH_NAMES[weekStart.getMonth()].slice(0,3) + ' ' + weekStart.getDate() + ', ' + weekStart.getFullYear();
348
+ var todayY = ymd(new Date());
349
+ var html = '';
350
+ DAY_NAMES.forEach(function (n, i) {
351
+ var dd = addDays(weekStart, i);
352
+ html += '<div class="month-day-name">' + n + ' ' + dd.getDate() + '</div>';
353
+ });
354
+ for (var i = 0; i < 7; i++) {
355
+ var dd = addDays(weekStart, i);
356
+ var ymdStr = ymd(dd);
357
+ var isToday = ymdStr === todayY;
358
+ var dayEvents = events.filter(function (e) { return e.date === ymdStr; });
359
+ dayEvents.sort(function (a, b) { return (a.startTime || '').localeCompare(b.startTime || ''); });
360
+ var pillsHtml = dayEvents.map(function (e) {
361
+ return '<div class="event-pill cat-' + e.category + '" data-event="' + e.id + '">' +
362
+ (e.startTime ? e.startTime + ' ' : '') + escapeHtml(e.title) + '</div>';
363
+ }).join('');
364
+ html += '<div class="month-day-cell' + (isToday ? ' today' : '') + '" data-date="' + ymdStr + '" style="min-height: 300px;">' +
365
+ '<span class="day-num">' + dd.getDate() + '</span>' + pillsHtml + '</div>';
366
+ }
367
+ calBody.innerHTML = '<div class="month-grid" style="grid-auto-rows: auto 1fr;">' + html + '</div>';
368
+ calBody.querySelectorAll('.month-day-cell').forEach(function (cell) {
369
+ cell.addEventListener('click', function (e) {
370
+ var pill = e.target.closest('.event-pill');
371
+ if (pill) { e.stopPropagation(); openDrawer(pill.getAttribute('data-event'), null); return; }
372
+ openDrawer(null, cell.getAttribute('data-date'));
373
+ });
374
+ });
375
+ }
376
+
377
+ function renderDay() {
378
+ var d = new Date(cursor.getFullYear(), cursor.getMonth(), cursor.getDate());
379
+ monthLabel.textContent = MONTH_NAMES[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
380
+ var ymdStr = ymd(d);
381
+ var dayEvents = events.filter(function (e) { return e.date === ymdStr; });
382
+ dayEvents.sort(function (a, b) { return (a.startTime || '').localeCompare(b.startTime || ''); });
383
+ var pillsHtml = dayEvents.map(function (e) {
384
+ return '<div class="event-pill cat-' + e.category + '" data-event="' + e.id + '" style="font-size: 13px; padding: 6px 10px;">' +
385
+ (e.startTime ? e.startTime + (e.endTime ? '–' + e.endTime : '') + ' · ' : '') + escapeHtml(e.title) + '</div>';
386
+ }).join('');
387
+ if (!pillsHtml) pillsHtml = '<div style="color: var(--bodySubtext, #605e5c); font-size: 13px; padding: 16px;">No events scheduled. Click below to add one.</div>';
388
+ calBody.innerHTML = '<div style="padding: 24px; max-width: 600px; margin: 0 auto; display: flex; flex-direction: column; gap: 8px;">' +
389
+ '<div style="font-size: 12px; color: var(--bodySubtext, #605e5c); text-transform: uppercase; letter-spacing: 0.04em;">' + DAY_NAMES[d.getDay()] + '</div>' +
390
+ pillsHtml +
391
+ '<button class="flm-button" id="dayAddBtn" data-icon="Add" style="align-self: flex-start; margin-top: 12px;">Add event</button>' +
392
+ '</div>';
393
+ calBody.querySelectorAll('.event-pill').forEach(function (p) {
394
+ p.addEventListener('click', function () { openDrawer(p.getAttribute('data-event'), null); });
395
+ });
396
+ var addBtn = document.getElementById('dayAddBtn');
397
+ if (addBtn) addBtn.addEventListener('click', function () { openDrawer(null, ymdStr); });
398
+ }
399
+
400
+ function render() {
401
+ if (view === 'month') renderMonth();
402
+ else if (view === 'week') renderWeek();
403
+ else renderDay();
404
+ }
405
+
406
+ function openDrawer(id, presetDate) {
407
+ editingId = id;
408
+ if (id) {
409
+ var e = events.find(function (x) { return x.id === id; });
410
+ if (!e) return;
411
+ drawerTitle.textContent = 'Edit Event';
412
+ evTitle.value = e.title;
413
+ evDate.value = e.date;
414
+ evStart.value = e.startTime || '';
415
+ evEnd.value = e.endTime || '';
416
+ evCategory.value = e.category;
417
+ evNotes.value = e.notes || '';
418
+ } else {
419
+ drawerTitle.textContent = 'New Event';
420
+ evTitle.value = '';
421
+ evDate.value = presetDate || ymd(new Date());
422
+ evStart.value = '09:00';
423
+ evEnd.value = '10:00';
424
+ evCategory.value = 'blue';
425
+ evNotes.value = '';
426
+ }
427
+ document.getElementById('deleteEventBtn').style.visibility = id ? 'visible' : 'hidden';
428
+ drawerOverlay.classList.add('open');
429
+ }
430
+ function closeDrawer() { drawerOverlay.classList.remove('open'); editingId = null; }
431
+
432
+ // Nav
433
+ document.getElementById('prevBtn').addEventListener('click', function () {
434
+ if (view === 'month') cursor.setMonth(cursor.getMonth() - 1);
435
+ else if (view === 'week') cursor.setDate(cursor.getDate() - 7);
436
+ else cursor.setDate(cursor.getDate() - 1);
437
+ render();
438
+ });
439
+ document.getElementById('nextBtn').addEventListener('click', function () {
440
+ if (view === 'month') cursor.setMonth(cursor.getMonth() + 1);
441
+ else if (view === 'week') cursor.setDate(cursor.getDate() + 7);
442
+ else cursor.setDate(cursor.getDate() + 1);
443
+ render();
444
+ });
445
+ document.getElementById('todayBtn').addEventListener('click', function () {
446
+ cursor = new Date();
447
+ if (view === 'month') cursor.setDate(1);
448
+ render();
449
+ });
450
+ document.getElementById('viewToggle').addEventListener('click', function (e) {
451
+ var btn = e.target.closest('button[data-view]');
452
+ if (!btn) return;
453
+ document.querySelectorAll('#viewToggle button').forEach(function (b) { b.classList.toggle('active', b === btn); });
454
+ view = btn.getAttribute('data-view');
455
+ render();
456
+ });
457
+ document.getElementById('addEventBtn').addEventListener('click', function () { openDrawer(null, ymd(new Date())); });
458
+
459
+ // Drawer wiring
460
+ document.getElementById('drawerClose').addEventListener('click', closeDrawer);
461
+ document.getElementById('cancelEventBtn').addEventListener('click', closeDrawer);
462
+ drawerOverlay.addEventListener('click', function (e) { if (e.target === drawerOverlay) closeDrawer(); });
463
+ document.getElementById('saveEventBtn').addEventListener('click', function () {
464
+ var data = {
465
+ title: evTitle.value.trim() || 'Untitled',
466
+ date: evDate.value,
467
+ startTime: evStart.value,
468
+ endTime: evEnd.value,
469
+ category: evCategory.value,
470
+ notes: evNotes.value.trim()
471
+ };
472
+ if (editingId) {
473
+ var e = events.find(function (x) { return x.id === editingId; });
474
+ if (e) Object.assign(e, data);
475
+ } else {
476
+ data.id = 'e_' + Math.random().toString(36).slice(2, 9);
477
+ events.push(data);
478
+ }
479
+ // synthos.shared.data.save('calendar_events', data);
480
+ closeDrawer();
481
+ render();
482
+ });
483
+ document.getElementById('deleteEventBtn').addEventListener('click', function () {
484
+ if (!editingId) return;
485
+ events = events.filter(function (x) { return x.id !== editingId; });
486
+ // synthos.shared.data.remove('calendar_events', editingId);
487
+ closeDrawer();
488
+ render();
489
+ });
490
+
491
+ // synthos.shared.data.list('calendar_events').then(function (rows) { if (rows && rows.length) { events = rows; render(); } });
492
+ render();
493
+ })();
494
+ </script>
495
+ </body></html>
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "Calendar",
3
+ "description": "Plan and visualize date-anchored content like meetings, shifts, deadlines, or content schedules.",
4
+ "categories": [
5
+ "_Starters"
6
+ ],
7
+ "pinned": false,
8
+ "showInAll": false,
9
+ "pageVersion": 3,
10
+ "mode": "unlocked",
11
+ "greeting": "Welcome to the Calendar starter — a date-anchored scheduling scaffold. Tell me what you'll be scheduling (e.g. meetings, content posts, shifts, deadlines, meals) and I'll wire the views, event blocks, and edit drawer.",
12
+ "firstRunGreeting": ""
13
+ }
@@ -0,0 +1 @@
1
+ [{"role":"assistant","content":"Welcome to the Chat starter — a turn-based transcript scaffold. Tell me what kind of conversation you'd like to build (e.g. customer-support log, AI companion, role-play assistant, language tutor, interview prep) and I'll wire the bubbles, composer, and assistant call."}]