synthos 0.10.1 → 0.11.1

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 +285 -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 +1388 -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 +1888 -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 +283 -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 +1414 -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
@@ -183,6 +183,45 @@ body:not(.chat-collapsed) .shell-toolbar-btn#builderToggle {
183
183
  color: var(--themePrimary);
184
184
  }
185
185
 
186
+ /* User message body — preserves blank lines and wraps long lines. */
187
+ .chat-user-body {
188
+ white-space: pre-wrap;
189
+ word-wrap: break-word;
190
+ overflow-wrap: anywhere;
191
+ line-height: 1.5;
192
+ }
193
+
194
+ /* Clamp tall user messages until the "More" toggle is pressed. */
195
+ .chat-user-body--clamped {
196
+ max-height: calc(1.5em * 6);
197
+ overflow: hidden;
198
+ -webkit-mask-image: linear-gradient(to bottom, #000 75%, transparent 100%);
199
+ mask-image: linear-gradient(to bottom, #000 75%, transparent 100%);
200
+ }
201
+
202
+ .chat-user-body--clamped.chat-user-body--expanded {
203
+ max-height: none;
204
+ -webkit-mask-image: none;
205
+ mask-image: none;
206
+ }
207
+
208
+ .chat-more-toggle {
209
+ margin-top: 6px;
210
+ padding: 2px 8px;
211
+ background: transparent;
212
+ color: var(--themePrimary, #58a6ff);
213
+ border: 1px solid var(--themePrimary, #58a6ff);
214
+ border-radius: 4px;
215
+ font-size: 0.85em;
216
+ cursor: pointer;
217
+ font-family: inherit;
218
+ }
219
+
220
+ .chat-more-toggle:hover {
221
+ background: var(--themePrimary, #58a6ff);
222
+ color: var(--bodyBackground, #fff);
223
+ }
224
+
186
225
  .chat-message p code {
187
226
  background: var(--bodyBackgroundChecked);
188
227
  padding: 2px 6px;
@@ -192,6 +231,95 @@ body:not(.chat-collapsed) .shell-toolbar-btn#builderToggle {
192
231
  border: 1px solid var(--bodyDivider);
193
232
  }
194
233
 
234
+ /* --- Chat Markdown Styles ------------------------------------------------- */
235
+ .chat-message a {
236
+ color: var(--themePrimary, #58a6ff);
237
+ text-decoration: underline;
238
+ cursor: pointer;
239
+ }
240
+ .chat-message a:hover {
241
+ color: var(--themeDark, #388bfd);
242
+ }
243
+ /* Send links — button-like appearance */
244
+ .chat-message a[href^="send:"] {
245
+ display: inline-block;
246
+ padding: 2px 8px;
247
+ border: 1px solid var(--themePrimary, #58a6ff);
248
+ border-radius: 4px;
249
+ text-decoration: none;
250
+ font-size: 0.9em;
251
+ }
252
+ .chat-message a[href^="send:"]:hover {
253
+ background: var(--themePrimary, #58a6ff);
254
+ color: var(--bodyBackground, #fff);
255
+ }
256
+ /* Suggestion chips — aggregated at the bottom of a message */
257
+ .suggestion-chips {
258
+ display: flex;
259
+ flex-wrap: wrap;
260
+ gap: 6px;
261
+ margin-top: 10px;
262
+ }
263
+ .suggestion-chip {
264
+ padding: 5px 12px;
265
+ font-size: 12px;
266
+ border: 1px solid var(--bodyDivider);
267
+ border-radius: 16px;
268
+ background: var(--defaultStateBackground);
269
+ color: var(--bodySubtext);
270
+ cursor: pointer;
271
+ transition: all 0.2s;
272
+ line-height: 1.4;
273
+ font-family: inherit;
274
+ }
275
+ .suggestion-chip:hover {
276
+ border-color: var(--themePrimary);
277
+ color: var(--themePrimary);
278
+ background: var(--bodyBackgroundHovered);
279
+ }
280
+ .suggestion-chip:disabled {
281
+ opacity: 0.4;
282
+ cursor: default;
283
+ pointer-events: none;
284
+ }
285
+ /* While a chat request is in flight, visually disable every inline
286
+ * affordance inside the chat panel: suggestion chips, send: links
287
+ * ("Let me try to fix it"), undo / try again links, and the Reset /
288
+ * Clear-conversation link. The .chat-busy class is toggled on
289
+ * #chatMessages by setChatBusy() in shell.v3.js. */
290
+ .chat-busy .suggestion-chip,
291
+ .chat-busy .synthos-undo-link a,
292
+ .chat-busy .synthos-clear-action a,
293
+ .chat-busy a[href^="send:"] {
294
+ opacity: 0.4;
295
+ pointer-events: none;
296
+ cursor: not-allowed;
297
+ }
298
+ /* Markdown block elements inside chat messages */
299
+ .chat-message ul, .chat-message ol {
300
+ margin: 4px 0 4px 20px;
301
+ padding: 0;
302
+ }
303
+ .chat-message pre {
304
+ background: var(--bodyBackgroundChecked);
305
+ border: 1px solid var(--bodyDivider);
306
+ border-radius: 5px;
307
+ padding: 8px;
308
+ overflow-x: auto;
309
+ font-size: 0.9em;
310
+ }
311
+ .chat-message pre code {
312
+ background: none;
313
+ border: none;
314
+ padding: 0;
315
+ }
316
+ .chat-message blockquote {
317
+ border-left: 3px solid var(--themePrimary, #58a6ff);
318
+ margin: 4px 0;
319
+ padding: 2px 10px;
320
+ color: var(--bodySubtext);
321
+ }
322
+
195
323
  /* --- Chat Form ------------------------------------------------------------ */
196
324
  #chatForm {
197
325
  display: flex;
@@ -213,6 +341,8 @@ body:not(.chat-collapsed) .shell-toolbar-btn#builderToggle {
213
341
  background: transparent;
214
342
  resize: none;
215
343
  min-height: 48px;
344
+ max-height: 120px;
345
+ overflow-y: auto;
216
346
  outline: none;
217
347
  font-family: inherit;
218
348
  font-size: 14px;
@@ -229,16 +359,19 @@ body:not(.chat-collapsed) .shell-toolbar-btn#builderToggle {
229
359
  .viewer-panel {
230
360
  flex: 1;
231
361
  min-width: 0;
232
- padding: 20px;
362
+ padding: 0;
233
363
  background: var(--bodyBackground);
234
- display: flex;
235
- flex-direction: column;
236
- justify-content: center;
237
- align-items: center;
238
364
  position: relative;
239
365
  overflow: hidden;
240
366
  }
241
367
 
368
+ #viewerFrame {
369
+ width: 100%;
370
+ height: 100%;
371
+ border: none;
372
+ display: block;
373
+ }
374
+
242
375
  .viewer-panel.full-viewer {
243
376
  padding: 0;
244
377
  }
@@ -263,28 +396,145 @@ body:not(.chat-collapsed) .shell-toolbar-btn#builderToggle {
263
396
  /* --- Loading -------------------------------------------------------------- */
264
397
  .loading-overlay {
265
398
  display: none;
266
- position: fixed;
267
- top: 0;
268
- left: 0;
269
- width: 100%;
270
- height: 100%;
271
- background: var(--overlayBackground, rgba(0,0,0,0.5));
399
+ position: absolute;
400
+ top: 0; left: 0; right: 0; bottom: 0;
401
+ z-index: 1000;
402
+ flex-direction: column;
403
+ align-items: center;
272
404
  justify-content: center;
405
+ }
406
+
407
+ /* Masked inner layer: everything here fades at the corners so the page peeks
408
+ through. The progress bar is a sibling (outside the mask) so it stays 100%
409
+ opaque. JS applies the radial mask on show using LOADING_FADE_SIZE /
410
+ LOADING_FADE_SOFTNESS constants. */
411
+ .loading-overlay .loading-masked {
412
+ position: absolute;
413
+ top: 0; left: 0; right: 0; bottom: 0;
414
+ background: var(--bodyBackground, #fff);
415
+ display: flex;
416
+ flex-direction: column;
273
417
  align-items: center;
274
- z-index: 1000;
418
+ justify-content: center;
275
419
  }
276
420
 
277
- .spinner {
278
- width: 50px;
279
- height: 50px;
280
- border: 4px solid var(--themeTertiary, #71afe5);
281
- border-top-color: var(--themePrimary, #0078d4);
282
- border-radius: 50%;
283
- animation: shell-spin 1s linear infinite;
421
+ .loading-overlay .loading-bp-anim {
422
+ width: 80px; height: 72px;
423
+ margin-bottom: var(--spacingL1, 20px);
424
+ position: relative;
425
+ }
426
+ .loading-overlay .loading-bp-anim svg {
427
+ width: 80px; height: 72px; overflow: visible;
428
+ }
429
+ .loading-overlay .bp-line {
430
+ stroke: var(--themePrimary); stroke-width: 2;
431
+ fill: none; stroke-linecap: round; stroke-linejoin: round;
432
+ }
433
+ .loading-overlay .bp-fill-rect {
434
+ fill: var(--themePrimary); opacity: 0;
435
+ }
436
+ .loading-overlay .bp-frame {
437
+ stroke-dasharray: 280; stroke-dashoffset: 280;
438
+ animation: bp-draw 3s ease-in-out infinite;
439
+ }
440
+ .loading-overlay .bp-inner1 {
441
+ stroke-dasharray: 60; stroke-dashoffset: 60;
442
+ animation: bp-draw-short 3s ease-in-out infinite;
443
+ animation-delay: 0.6s;
444
+ }
445
+ .loading-overlay .bp-inner2 {
446
+ stroke-dasharray: 60; stroke-dashoffset: 60;
447
+ animation: bp-draw-short 3s ease-in-out infinite;
448
+ animation-delay: 0.9s;
449
+ }
450
+ .loading-overlay .bp-inner3 {
451
+ stroke-dasharray: 40; stroke-dashoffset: 40;
452
+ animation: bp-draw-short2 3s ease-in-out infinite;
453
+ animation-delay: 1.2s;
454
+ }
455
+ .loading-overlay .bp-inner4 {
456
+ stroke-dasharray: 30; stroke-dashoffset: 30;
457
+ animation: bp-draw-short3 3s ease-in-out infinite;
458
+ animation-delay: 1.0s;
459
+ }
460
+ .loading-overlay .bp-fill1 { animation: bp-fill 3s ease-in-out infinite; animation-delay: 1.5s; }
461
+ .loading-overlay .bp-fill2 { animation: bp-fill 3s ease-in-out infinite; animation-delay: 1.8s; }
462
+
463
+ @keyframes bp-draw {
464
+ 0% { stroke-dashoffset: 280; }
465
+ 40% { stroke-dashoffset: 0; }
466
+ 75% { stroke-dashoffset: 0; }
467
+ 100% { stroke-dashoffset: 280; }
468
+ }
469
+ @keyframes bp-draw-short {
470
+ 0% { stroke-dashoffset: 60; }
471
+ 30% { stroke-dashoffset: 0; }
472
+ 70% { stroke-dashoffset: 0; }
473
+ 100% { stroke-dashoffset: 60; }
474
+ }
475
+ @keyframes bp-draw-short2 {
476
+ 0% { stroke-dashoffset: 40; }
477
+ 30% { stroke-dashoffset: 0; }
478
+ 70% { stroke-dashoffset: 0; }
479
+ 100% { stroke-dashoffset: 40; }
480
+ }
481
+ @keyframes bp-draw-short3 {
482
+ 0% { stroke-dashoffset: 30; }
483
+ 30% { stroke-dashoffset: 0; }
484
+ 70% { stroke-dashoffset: 0; }
485
+ 100% { stroke-dashoffset: 30; }
486
+ }
487
+ @keyframes bp-fill {
488
+ 0% { opacity: 0; }
489
+ 25% { opacity: 0.6; }
490
+ 65% { opacity: 0.6; }
491
+ 100% { opacity: 0; }
492
+ }
493
+
494
+ .loading-overlay .loading-status {
495
+ font-size: var(--fontSizeXLarge, 20px);
496
+ font-weight: var(--fontWeightSemibold, 600);
497
+ color: var(--bodyText);
498
+ margin-bottom: var(--spacingS1, 8px);
284
499
  }
500
+ .loading-overlay .loading-substatus {
501
+ font-size: var(--fontSizeMedium, 14px);
502
+ color: var(--bodySubtext);
503
+ margin-bottom: var(--spacingL1, 20px);
504
+ min-height: 20px;
505
+ transition: opacity 0.3s ease;
506
+ }
507
+ .loading-overlay .loading-substatus.fade-out { opacity: 0; }
285
508
 
286
- @keyframes shell-spin {
287
- to { transform: rotate(360deg); }
509
+ .loading-overlay .loading-tip-area {
510
+ display: flex; align-items: center; gap: 10px;
511
+ color: var(--bodySubtext); font-size: var(--fontSizeMedium, 14px);
512
+ margin-top: var(--spacingM, 16px);
513
+ padding: 0 var(--spacingL1, 20px);
514
+ text-align: center;
515
+ }
516
+ .loading-overlay .loading-bulb { color: var(--yellow, #ffd400); font-size: 16px; }
517
+
518
+ /* Progress bar — sibling of .loading-masked, unmasked, always 100% opacity. */
519
+ .loading-overlay .loading-progress-bar {
520
+ position: absolute;
521
+ bottom: 0; left: 0; right: 0;
522
+ height: 4px;
523
+ background: var(--neutralLighter, #e1dfdd);
524
+ overflow: hidden;
525
+ opacity: 1;
526
+ z-index: 1;
527
+ }
528
+ .loading-overlay .loading-progress-fill {
529
+ height: 100%; width: 30%;
530
+ background: linear-gradient(90deg, var(--themePrimary), var(--themeTertiary));
531
+ border-radius: 0 2px 2px 0;
532
+ animation: shell-loading-indeterminate 1.8s ease-in-out infinite;
533
+ }
534
+ @keyframes shell-loading-indeterminate {
535
+ 0% { transform: translateX(-100%); width: 30%; }
536
+ 50% { width: 50%; }
537
+ 100% { transform: translateX(350%); width: 30%; }
288
538
  }
289
539
 
290
540
  /* --- Scrollbar ------------------------------------------------------------ */
@@ -687,7 +937,6 @@ body.chat-collapsed .chat-panel {
687
937
  }
688
938
 
689
939
  /* --- Shared page rules ---------------------------------------------------- */
690
- #loadingOverlay { position: absolute; }
691
940
  .chat-input:disabled { opacity: 0.5; cursor: not-allowed; }
692
941
 
693
942
  /* --- Attach Button -------------------------------------------------------- */