@jxsuite/studio 2.0.0 → 2.1.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 (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +23711 -35185
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +34 -9
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +270 -262
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -120
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +75 -2
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +113 -0
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
  363. package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
  364. package/dist/chunks/files-02zn5y24.js +0 -50
  365. package/dist/chunks/files-02zn5y24.js.map +0 -9
  366. package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
  367. package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
  368. package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
  369. package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
  370. package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
  371. package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  381. package/dist/chunks/studio-568nx4t5.js +0 -469
  382. package/dist/chunks/studio-568nx4t5.js.map +0 -14
  383. package/dist/chunks/studio-9smfzqhc.js +0 -19
  384. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  385. package/dist/chunks/studio-asvf0j9e.js +0 -429
  386. package/dist/chunks/studio-asvf0j9e.js.map +0 -13
  387. package/dist/chunks/studio-d77qm3pk.js +0 -3427
  388. package/dist/chunks/studio-d77qm3pk.js.map +0 -26
  389. package/dist/chunks/studio-j6gqyjf4.js +0 -1854
  390. package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
  391. package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-rq0vxb19.js +0 -3744
  394. package/dist/chunks/studio-rq0vxb19.js.map +0 -22
  395. package/dist/chunks/studio-wd6ewdvd.js +0 -853
  396. package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
  397. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  398. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  399. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  400. package/dist/chunks/studio-ygzav7z5.js.map +0 -46
  401. package/dist/chunks/studio-zmy7241e.js +0 -399
  402. package/dist/chunks/studio-zmy7241e.js.map +0 -12
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -1,548 +0,0 @@
1
- /// <reference lib="dom" />
2
- /**
3
- * Tab bar — a persistent per-tab settings bar rendered between the tab strip and the edit content.
4
- * Standardizes Back/breadcrumb navigation, the view settings cluster (preview toggle, layout
5
- * visibility, dynamic route-param pickers — shown in the edit/design base modes), media feature
6
- * toggles, and mode actions (Code-mode Export) into a single bar shared by every edit mode.
7
- *
8
- * Follows the same module shape as tab-strip.ts: mount(host, ctx) → effectScope/effect → render().
9
- * The bar renders `nothing` (so `#tab-bar:empty` hides the row) only when no tab is active.
10
- */
11
-
12
- import { html, render as litRender, nothing } from "lit-html";
13
- import { projectState, updateUi } from "../store";
14
- import { effect, effectScope } from "../reactivity";
15
- import { activeTab } from "../workspace/workspace";
16
- import { applyTransform, fitToScreen, resetZoom, setEditZoom } from "../canvas/canvas-utils";
17
- import { getEffectiveLayoutPath, getEffectiveMedia } from "../site-context";
18
- import { isSchemeQuery } from "../utils/canvas-media";
19
- import { dynamicRouteParams, loadParamValues, pagePathsDef } from "../page-params";
20
- import { componentPropEntries, isComponentDoc } from "../component-props";
21
- import { mediaDisplayName } from "./shared";
22
- import type { ParamValues } from "../page-params";
23
- import type { Tab } from "../tabs/tab";
24
- import type { DocumentStackEntry, FormulaEditDef, FunctionEditDef, JsonValue } from "../types";
25
- import type { EffectScope } from "@vue/reactivity";
26
- import type { TemplateResult } from "lit-html";
27
-
28
- interface TabBarCtx {
29
- navigateBack: () => void;
30
- navigateToLevel: (level: number) => void;
31
- closeFunctionEditor: () => void;
32
- closeFormulaWorkspace: () => void;
33
- exportFile: () => void;
34
- getCanvasMode: () => string;
35
- parseMediaEntries: (media: Record<string, string> | null | undefined) => {
36
- sizeBreakpoints: {
37
- name: string;
38
- query: string;
39
- width: number;
40
- type: string;
41
- }[];
42
- featureQueries: { name: string; query: string }[];
43
- baseWidth: number;
44
- };
45
- }
46
-
47
- let _host: HTMLElement | null = null;
48
-
49
- let _ctx: TabBarCtx | null = null;
50
-
51
- let _scope: EffectScope | null = null;
52
-
53
- /**
54
- * Mount the tab bar into the given host element.
55
- *
56
- * @param {HTMLElement} host
57
- * @param {TabBarCtx} ctx
58
- */
59
- export function mount(host: HTMLElement, ctx: TabBarCtx) {
60
- _host = host;
61
- _ctx = ctx;
62
- _scope = effectScope();
63
- _scope.run(() => {
64
- effect(() => {
65
- const tab = activeTab.value;
66
- if (tab) {
67
- // Read reactive properties to establish tracking — mirrors the toolbar's subset
68
- void tab.doc.document;
69
- void tab.doc.document?.$layout;
70
- void tab.doc.mode;
71
- void tab.documentPath;
72
- void tab.session.documentStack.length;
73
- void tab.session.ui.canvasMode;
74
- void tab.session.ui.editZoom;
75
- void tab.session.ui.editingFormula;
76
- void tab.session.ui.editingFunction;
77
- void tab.session.ui.featureToggles;
78
- void tab.session.ui.preview;
79
- void tab.session.ui.previewColorScheme;
80
- void tab.session.ui.previewParams;
81
- void tab.session.ui.previewProps;
82
- void tab.session.ui.showLayout;
83
- void tab.session.ui.zoom;
84
- }
85
- render();
86
- });
87
- });
88
- }
89
-
90
- export function unmount() {
91
- _scope?.stop();
92
- _scope = null;
93
- _host = null;
94
- _ctx = null;
95
- }
96
-
97
- export function render() {
98
- if (!_host || !_ctx) {
99
- return;
100
- }
101
- try {
102
- litRender(tabBarTemplate(_ctx), _host);
103
- } catch (error) {
104
- console.error("tab-bar render error:", error);
105
- }
106
- }
107
-
108
- function tabBarTemplate(ctx: TabBarCtx): TemplateResult | typeof nothing {
109
- const tab = activeTab.value;
110
- if (!tab) {
111
- return nothing;
112
- }
113
-
114
- const S = {
115
- document: tab.doc.document,
116
- documentPath: tab.documentPath,
117
- documentStack: tab.session.documentStack,
118
- ui: tab.session.ui,
119
- };
120
- const canvasMode = ctx.getCanvasMode();
121
- const editing = S.ui.editingFunction as FunctionEditDef | null;
122
- const formulaEditing = S.ui.editingFormula as FormulaEditDef | null;
123
- // Any full-screen canvas takeover (function editor or formula workspace) suppresses the zoom
124
- // Widget, the view-settings cluster, and the Export action below.
125
- const takeover = Boolean(editing) || Boolean(formulaEditing);
126
- const hasStack = S.documentStack && S.documentStack.length > 0;
127
-
128
- // ── Left region: navigation context (function editor > formula workspace > document stack) ──
129
- let navTpl: TemplateResult | typeof nothing = nothing;
130
- if (editing) {
131
- const docName = S.documentPath?.split("/").pop() || S.document?.tagName || "document";
132
- const funcLabel = editing.type === "def" ? `ƒ ${editing.defName}` : `ƒ ${editing.eventKey}`;
133
- navTpl = html`
134
- <div class="breadcrumb">
135
- <sp-action-button size="s" title="Close editor" @click=${ctx.closeFunctionEditor}>
136
- <sp-icon-back slot="icon"></sp-icon-back>
137
- Back
138
- </sp-action-button>
139
- <span class="breadcrumb-item">${docName}</span>
140
- <span class="breadcrumb-sep"> › </span>
141
- <span class="breadcrumb-item current">${funcLabel}</span>
142
- </div>
143
- `;
144
- } else if (formulaEditing) {
145
- const docName = S.documentPath?.split("/").pop() || S.document?.tagName || "document";
146
- const formulaLabel =
147
- formulaEditing.type === "def"
148
- ? `fx ${formulaEditing.defName}`
149
- : `fx ${formulaEditing.eventKey}`;
150
- navTpl = html`
151
- <div class="breadcrumb">
152
- <sp-action-button
153
- size="s"
154
- title="Close formula workspace"
155
- @click=${ctx.closeFormulaWorkspace}
156
- >
157
- <sp-icon-back slot="icon"></sp-icon-back>
158
- Back
159
- </sp-action-button>
160
- <span class="breadcrumb-item">${docName}</span>
161
- <span class="breadcrumb-sep"> › </span>
162
- <span class="breadcrumb-item current">${formulaLabel}</span>
163
- </div>
164
- `;
165
- } else if (hasStack) {
166
- navTpl = html`
167
- <div class="breadcrumb">
168
- <sp-action-button size="s" title="Return to parent document" @click=${ctx.navigateBack}>
169
- <sp-icon-back slot="icon"></sp-icon-back>
170
- Back
171
- </sp-action-button>
172
- ${S.documentStack.map(
173
- (frame: DocumentStackEntry, i: number) => html`
174
- <span class="breadcrumb-item clickable" @click=${() => ctx.navigateToLevel(i)}
175
- >${frame.documentPath?.split("/").pop() || "untitled"}</span
176
- >
177
- <span class="breadcrumb-sep"> › </span>
178
- `,
179
- )}
180
- <span class="breadcrumb-item current">
181
- ${S.documentPath?.split("/").pop() || S.document?.tagName || "document"}
182
- </span>
183
- </div>
184
- `;
185
- }
186
-
187
- // ── Left region: zoom widget (every mode with a zoom concept) ──
188
- // Gates on the EFFECTIVE mode: edit drives the content-reflow `editZoom`, while design /
189
- // Stylebook / git-diff / preview all render on the panzoom surface and drive `ui.zoom` (with the
190
- // Panzoom-only fit-to-screen action).
191
- let zoomTpl: TemplateResult | typeof nothing = nothing;
192
- if (!takeover && canvasMode === "edit") {
193
- const editZoom = S.ui.editZoom ?? 1;
194
- zoomTpl = html`
195
- <sp-action-group compact size="s" class="tb-zoom">
196
- <sp-action-button
197
- size="s"
198
- title="Zoom out (Ctrl+-)"
199
- @click=${() => setEditZoom((tab.session.ui.editZoom ?? 1) / 1.2)}
200
- >
201
- −
202
- </sp-action-button>
203
- <sp-action-button
204
- size="s"
205
- class="tb-zoom-label"
206
- title="Reset to 100% (Ctrl+0)"
207
- @click=${() => setEditZoom(1)}
208
- >
209
- ${Math.round(editZoom * 100)}%
210
- </sp-action-button>
211
- <sp-action-button
212
- size="s"
213
- title="Zoom in (Ctrl+=)"
214
- @click=${() => setEditZoom((tab.session.ui.editZoom ?? 1) * 1.2)}
215
- >
216
- +
217
- </sp-action-button>
218
- </sp-action-group>
219
- `;
220
- } else if (
221
- !takeover &&
222
- (canvasMode === "design" ||
223
- canvasMode === "stylebook" ||
224
- canvasMode === "git-diff" ||
225
- canvasMode === "preview")
226
- ) {
227
- const zoom = S.ui.zoom ?? 1;
228
- const setPanZoom = (next: number) => {
229
- tab.session.ui.zoom = Math.min(5, Math.max(0.05, next));
230
- applyTransform();
231
- };
232
- zoomTpl = html`
233
- <sp-action-group compact size="s" class="tb-zoom">
234
- <sp-action-button
235
- size="s"
236
- title="Zoom out (Ctrl+-)"
237
- @click=${() => setPanZoom((tab.session.ui.zoom ?? 1) / 1.2)}
238
- >
239
- −
240
- </sp-action-button>
241
- <sp-action-button
242
- size="s"
243
- class="tb-zoom-label"
244
- title="Reset to 100% (Ctrl+0)"
245
- @click=${() => resetZoom()}
246
- >
247
- ${Math.round(zoom * 100)}%
248
- </sp-action-button>
249
- <sp-action-button
250
- size="s"
251
- title="Zoom in (Ctrl+=)"
252
- @click=${() => setPanZoom((tab.session.ui.zoom ?? 1) * 1.2)}
253
- >
254
- +
255
- </sp-action-button>
256
- <sp-action-button size="s" title="Fit to screen" @click=${() => fitToScreen()}>
257
- Fit
258
- </sp-action-button>
259
- </sp-action-group>
260
- `;
261
- }
262
-
263
- // ── Right region: view settings cluster (edit/design base modes only) ──
264
- // Gates on the BASE mode (not the effective mode): the cluster stays visible while the preview
265
- // Toggle is on so it can be toggled back off.
266
- const baseMode = S.ui.canvasMode;
267
- const isPage = Boolean(
268
- S.documentPath &&
269
- projectState?.isSiteProject &&
270
- (S.documentPath.startsWith("pages/") || S.documentPath.startsWith("./pages/")),
271
- );
272
- let settingsTpl: TemplateResult | typeof nothing = nothing;
273
- if (!takeover && (baseMode === "edit" || baseMode === "design")) {
274
- const canPreview = tab.capabilities.modes.includes("preview");
275
- const hasLayout = isPage && Boolean(getEffectiveLayoutPath(S.document?.$layout));
276
- // Pages get route-param pickers; component docs get test-prop fields (M6) — same slot.
277
- const pickersTpl = isPage ? paramPickersTpl(tab) : propFieldsTpl(tab);
278
- const previewTpl = canPreview
279
- ? html`
280
- <sp-action-button
281
- toggles
282
- size="s"
283
- title="Preview resolved values"
284
- ?selected=${Boolean(S.ui.preview)}
285
- @click=${() => updateUi("preview", !S.ui.preview)}
286
- >
287
- <sp-icon-preview slot="icon"></sp-icon-preview>
288
- Preview
289
- </sp-action-button>
290
- `
291
- : nothing;
292
- const layoutTpl = hasLayout
293
- ? html`
294
- <sp-action-button
295
- toggles
296
- size="s"
297
- title="Show layout elements"
298
- ?selected=${S.ui.showLayout !== false}
299
- @click=${() => updateUi("showLayout", S.ui.showLayout === false)}
300
- >
301
- Layout
302
- </sp-action-button>
303
- `
304
- : nothing;
305
- if (pickersTpl !== nothing || previewTpl !== nothing || layoutTpl !== nothing) {
306
- settingsTpl = html`
307
- ${pickersTpl}
308
- <sp-action-group compact size="s">${layoutTpl} ${previewTpl}</sp-action-group>
309
- `;
310
- }
311
- }
312
-
313
- // ── Right region: color-scheme preview (projects that declare a scheme query, spec §9.5) ──
314
- // One switch per tab: drives the canvas data-color-scheme attribute and (in the style
315
- // Sidebar) which scheme layer edits target. Ungated — works in every canvas mode.
316
- const { featureQueries } = ctx.parseMediaEntries(getEffectiveMedia(S.document?.$media));
317
- const schemeQueries = featureQueries.filter(({ query }) => isSchemeQuery(query));
318
- const plainQueries = featureQueries.filter(({ query }) => !isSchemeQuery(query));
319
- const scheme = S.ui.previewColorScheme ?? "auto";
320
- const schemeTpl =
321
- schemeQueries.length > 0
322
- ? html`
323
- <sp-action-group compact size="s" class="tb-scheme">
324
- ${(
325
- [
326
- ["auto", "Auto", "Follow the OS color scheme"],
327
- ["light", "Light", "Force the light scheme"],
328
- ["dark", "Dark", "Force the dark scheme"],
329
- ] as const
330
- ).map(
331
- ([value, label, title]) => html`
332
- <sp-action-button
333
- toggles
334
- size="s"
335
- title=${title}
336
- ?selected=${scheme === value}
337
- @click=${() => updateUi("previewColorScheme", value)}
338
- >
339
- ${label}
340
- </sp-action-button>
341
- `,
342
- )}
343
- </sp-action-group>
344
- `
345
- : nothing;
346
-
347
- // ── Right region: media feature toggles (non-scheme queries) ──
348
- const togglesTpl =
349
- plainQueries.length > 0
350
- ? html`
351
- <sp-action-group compact size="s">
352
- ${plainQueries.map(
353
- ({ name, query }: { name: string; query: string }) => html`
354
- <sp-action-button
355
- toggles
356
- size="s"
357
- title=${query}
358
- ?selected=${Boolean(S.ui.featureToggles[name])}
359
- @click=${() => {
360
- const newToggles = {
361
- ...S.ui.featureToggles,
362
- [name]: !S.ui.featureToggles[name],
363
- };
364
- updateUi("featureToggles", newToggles);
365
- }}
366
- >
367
- ${mediaDisplayName(name)}
368
- </sp-action-button>
369
- `,
370
- )}
371
- </sp-action-group>
372
- `
373
- : nothing;
374
-
375
- // ── Right region: mode actions (Code-mode Export) ──
376
- const exportTpl =
377
- !takeover && canvasMode === "source"
378
- ? html`
379
- <sp-action-button size="s" @click=${ctx.exportFile}>
380
- <sp-icon-export slot="icon"></sp-icon-export>
381
- Export
382
- </sp-action-button>
383
- `
384
- : nothing;
385
-
386
- return html`
387
- <div class="tab-bar">
388
- ${navTpl} ${zoomTpl}
389
- <div class="tb-spacer"></div>
390
- ${settingsTpl} ${schemeTpl} ${togglesTpl} ${exportTpl}
391
- </div>
392
- `;
393
- }
394
-
395
- // ── Dynamic route-param pickers ──────────────────────────────────────────────
396
- // Candidate values load asynchronously (ContentCollection resolution / data-file read); the module
397
- // Caches the last result per (documentPath, $paths) and re-renders when it lands — the same lazy
398
- // Fill pattern as head-panel's loadLayoutEntries. When values arrive, any param without a chosen
399
- // Value auto-selects the first candidate (matching the compiler, whose first expanded route is the
400
- // First path entry).
401
-
402
- let _paramValues: ParamValues | null = null;
403
-
404
- let _paramValuesKey: string | null = null;
405
-
406
- /**
407
- * @param {Tab} tab
408
- * @returns {ParamValues | null} — null while loading (or when the doc declares no params)
409
- */
410
- function paramValuesFor(tab: Tab): ParamValues | null {
411
- const pathsDef = pagePathsDef({
412
- document: tab.doc.document,
413
- frontmatter: tab.doc.content.frontmatter,
414
- });
415
- if (!pathsDef && dynamicRouteParams(tab.documentPath).length === 0) {
416
- return null;
417
- }
418
- const key = `${tab.documentPath ?? ""}::${JSON.stringify(pathsDef)}`;
419
- if (_paramValuesKey === key) {
420
- return _paramValues;
421
- }
422
- _paramValuesKey = key;
423
- _paramValues = null;
424
- void loadParamValues(tab.documentPath, pathsDef).then((values) => {
425
- if (_paramValuesKey !== key || activeTab.value !== tab) {
426
- return;
427
- }
428
- _paramValues = values;
429
- autoSelectParams(tab, values);
430
- render();
431
- });
432
- return _paramValues;
433
- }
434
-
435
- /**
436
- * @param {Tab} tab
437
- * @param {ParamValues} values
438
- */
439
- function autoSelectParams(tab: Tab, values: ParamValues) {
440
- const current = tab.session.ui.previewParams ?? {};
441
- const additions: Record<string, string> = {};
442
- for (const [name, list] of Object.entries(values)) {
443
- if (!current[name] && list.length > 0) {
444
- additions[name] = list[0]!;
445
- }
446
- }
447
- if (Object.keys(additions).length > 0) {
448
- updateUi("previewParams", { ...current, ...additions });
449
- }
450
- }
451
-
452
- /**
453
- * @param {Tab} tab
454
- * @returns {TemplateResult | typeof nothing}
455
- */
456
- function paramPickersTpl(tab: Tab): TemplateResult | typeof nothing {
457
- const values = paramValuesFor(tab);
458
- const names = new Set(dynamicRouteParams(tab.documentPath));
459
- for (const name of Object.keys(values ?? {})) {
460
- names.add(name);
461
- }
462
- if (names.size === 0) {
463
- return nothing;
464
- }
465
- const { previewParams } = tab.session.ui;
466
- return html`
467
- ${[...names].map(
468
- (name) => html`
469
- <sp-picker
470
- size="s"
471
- quiet
472
- class="tab-bar-param"
473
- label=${name}
474
- title=${`Preview value for [${name}]`}
475
- value=${previewParams?.[name] ?? ""}
476
- @change=${(e: Event) => {
477
- const { value } = e.target as HTMLInputElement;
478
- updateUi("previewParams", { ...tab.session.ui.previewParams, [name]: value });
479
- }}
480
- >
481
- ${(values?.[name] ?? []).map(
482
- (v: string) => html`<sp-menu-item value=${v}>${v}</sp-menu-item>`,
483
- )}
484
- </sp-picker>
485
- `,
486
- )}
487
- `;
488
- }
489
-
490
- // ── Component test-prop fields (M6) ──────────────────────────────────────────
491
- // The previewParams mirror for component docs: one small field per prop entry (the doc's
492
- // Plain-data state entries), committed on change so typing never re-renders the bar mid-edit. A
493
- // Value parses as JSON when it can (numbers, booleans, arrays) and falls back to the raw string;
494
- // Clearing a field removes the override so the prop returns to its authored default.
495
-
496
- /**
497
- * @param {string} raw
498
- * @returns {JsonValue}
499
- */
500
- function parsePropValue(raw: string): JsonValue {
501
- try {
502
- return JSON.parse(raw) as JsonValue;
503
- } catch {
504
- return raw;
505
- }
506
- }
507
-
508
- /**
509
- * @param {Tab} tab
510
- * @returns {TemplateResult | typeof nothing}
511
- */
512
- function propFieldsTpl(tab: Tab): TemplateResult | typeof nothing {
513
- const doc = tab.doc.document;
514
- if (!isComponentDoc(doc)) {
515
- return nothing;
516
- }
517
- const entries = componentPropEntries(doc);
518
- if (entries.length === 0) {
519
- return nothing;
520
- }
521
- const { previewProps } = tab.session.ui;
522
- const display = (v: JsonValue | undefined) =>
523
- v === undefined ? "" : typeof v === "string" ? v : JSON.stringify(v);
524
- return html`
525
- ${entries.map(
526
- ({ name }) => html`
527
- <sp-textfield
528
- size="s"
529
- quiet
530
- class="tab-bar-prop"
531
- placeholder=${name}
532
- title=${`Test value for ${name}`}
533
- .value=${display(previewProps?.[name])}
534
- @change=${(e: Event) => {
535
- const raw = (e.target as HTMLInputElement).value;
536
- const next = { ...tab.session.ui.previewProps };
537
- if (raw === "") {
538
- delete next[name];
539
- } else {
540
- next[name] = parsePropValue(raw);
541
- }
542
- updateUi("previewProps", Object.keys(next).length > 0 ? next : null);
543
- }}
544
- ></sp-textfield>
545
- `,
546
- )}
547
- `;
548
- }