@jxsuite/studio 6.1.1 → 8.0.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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -1,16 +1,88 @@
1
1
  /** Style utilities — pure CSS helper functions used by the style panel. */
2
2
 
3
- import type { JxMutableNode } from "@jxsuite/schema/types";
3
+ import { isNumber, isString } from "@jxsuite/schema/guards";
4
+ import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
4
5
 
5
6
  import { activeTab } from "../workspace/workspace";
6
7
  import { getEffectiveStyle } from "../site-context";
7
8
  import cssMeta from "../../data/css-meta.json";
8
9
 
10
+ /** One `$show` condition: the row is offered while `prop` holds one of `values`, or any value. */
11
+ export interface CssShowCondition {
12
+ prop: string;
13
+ values: string[];
14
+ }
15
+
16
+ /** One Modern Font Stacks preset a `fontFamily` entry offers. */
17
+ export interface CssFontPreset {
18
+ title: string;
19
+ value: string;
20
+ }
21
+
22
+ /** Every kind of value a css-meta entry holds under any of its keys. */
23
+ type CssMetaValue =
24
+ | string
25
+ | number
26
+ | boolean
27
+ | string[]
28
+ | CssShowCondition[]
29
+ | CssFontPreset[]
30
+ | Record<string, string>;
31
+
32
+ /**
33
+ * What `css-meta.json` says about one CSS property: which section files it, where in that section,
34
+ * and which control edits it. Every entry in the file carries `$order`; the rest is per property.
35
+ *
36
+ * The index signature is what keeps an entry assignable to the open records `inferInputType()` and
37
+ * `propLabel()` read it through; it admits only the value kinds the file actually holds.
38
+ */
39
+ export interface CssMetaEntry {
40
+ $order: number;
41
+ $section?: string;
42
+ $label?: string;
43
+ $input?: string;
44
+ $buttonValues?: string[];
45
+ $icons?: Record<string, string>;
46
+ $keywords?: string[];
47
+ $longhands?: string[];
48
+ /** `true` on a shorthand row; the shorthand's own name on each of its longhands. */
49
+ $shorthand?: string | boolean;
50
+ $shorthandType?: string;
51
+ $show?: CssShowCondition[];
52
+ $span?: number;
53
+ $units?: string[];
54
+ enum?: string[];
55
+ examples?: string[];
56
+ presets?: CssFontPreset[];
57
+ format?: string;
58
+ type?: string;
59
+ minimum?: number;
60
+ maximum?: number;
61
+ [key: string]: CssMetaValue | undefined;
62
+ }
63
+
64
+ /** A shorthand's longhand, with its own css-meta entry. */
65
+ export interface CssLonghand {
66
+ name: string;
67
+ entry: CssMetaEntry;
68
+ }
69
+
70
+ /**
71
+ * Css-meta's property table, by property name. The JSON module's inferred type is checked against
72
+ * {@link CssMetaEntry} here, once, so a key the file stops carrying is a type error at this line.
73
+ */
74
+ export const cssDefs: Readonly<Record<string, CssMetaEntry>> = cssMeta.$defs;
75
+
9
76
  let cssInitialMap = new Map<string, string>();
10
77
 
11
78
  /** Initialise cssInitialMap from webdata — call once during bootstrap. */
12
79
  export function initCssData(webdata: { cssProps: string[][] }) {
13
- cssInitialMap = new Map(webdata.cssProps as [string, string][]);
80
+ cssInitialMap = new Map<string, string>();
81
+ for (const [name, initial] of webdata.cssProps) {
82
+ if (name !== undefined && initial !== undefined) {
83
+ cssInitialMap.set(name, initial);
84
+ }
85
+ }
14
86
  }
15
87
 
16
88
  /** Get the CSS initial-value map (populated by initCssData). */
@@ -18,31 +90,30 @@ export function getCssInitialMap() {
18
90
  return cssInitialMap;
19
91
  }
20
92
 
93
+ /**
94
+ * A declaration's value rather than a nested block (`:hover`, `@--md`) or a block list.
95
+ *
96
+ * Exactly the `typeof value !== "object"` test the Style tab has always made, so a `null` a JSON
97
+ * document might hold still counts as a block, never as a value.
98
+ */
99
+ export function isDeclarationValue(value: JxStyle[string]): value is string | number | undefined {
100
+ return typeof value !== "object";
101
+ }
102
+
21
103
  // ─── Condition helpers ──────────────────────────────────────────────────────
22
104
 
23
- /** @param {{ prop: string; values: string[] }} cond @param {Record<string, unknown>} styles */
24
- export function conditionPasses(
25
- cond: { prop: string; values: string[] },
26
- styles: Record<string, unknown>,
27
- ) {
28
- const val = (styles[cond.prop] ?? "") as string;
105
+ /** Whether one `$show` condition holds against the style being edited. */
106
+ export function conditionPasses(cond: CssShowCondition, styles: JxStyle) {
107
+ const val = styles[cond.prop] ?? "";
29
108
  if (cond.values.length === 0) {
30
109
  return val !== "" && val !== "initial";
31
110
  }
32
- return cond.values.includes(val);
111
+ return isString(val) && cond.values.includes(val);
33
112
  }
34
113
 
35
- /**
36
- * @param {{ $show?: { prop: string; values: string[] }[] }} entry @param {Record<string, unknown>}
37
- * styles
38
- */
39
- export function allConditionsPass(
40
- entry: { $show?: { prop: string; values: string[] }[] },
41
- styles: Record<string, unknown>,
42
- ) {
43
- return (entry.$show ?? []).every((/** @type {{ prop: string; values: string[] }} */ c) =>
44
- conditionPasses(c, styles),
45
- );
114
+ /** Whether every `$show` condition of an entry holds; an entry with none always passes. */
115
+ export function allConditionsPass(entry: Pick<CssMetaEntry, "$show">, styles: JxStyle) {
116
+ return (entry.$show ?? []).every((c) => conditionPasses(c, styles));
46
117
  }
47
118
 
48
119
  // ─── Auto-open sections ─────────────────────────────────────────────────────
@@ -64,11 +135,10 @@ export function autoOpenSections(node: JxMutableNode, currentSections: Record<st
64
135
  const style = node.style || {};
65
136
  const result = { ...currentSections };
66
137
  for (const prop of Object.keys(style)) {
67
- if (typeof style[prop] === "object") {
138
+ if (!isDeclarationValue(style[prop])) {
68
139
  continue;
69
140
  }
70
- const entry = (cssMeta.$defs as Record<string, Record<string, unknown>>)[prop];
71
- const section = (entry?.$section as string) ?? "other";
141
+ const section = cssDefs[prop]?.$section ?? "other";
72
142
  if (result[section] === undefined) {
73
143
  result[section] = true;
74
144
  }
@@ -78,31 +148,21 @@ export function autoOpenSections(node: JxMutableNode, currentSections: Record<st
78
148
 
79
149
  // ─── Shorthand expand/compress ──────────────────────────────────────────────
80
150
 
81
- /** Get longhands for a shorthand property from css-meta */
82
- export function getLonghands(shorthandProp: string) {
83
- const entry = (cssMeta.$defs as Record<string, Record<string, unknown>>)[shorthandProp];
84
- if (entry?.$longhands) {
85
- return (entry.$longhands as string[])
86
- .map((name: string) => ({
87
- entry: (cssMeta.$defs as Record<string, Record<string, unknown>>)[name] || {
88
- $order: 0,
89
- },
90
- name,
91
- }))
92
- .toSorted(
93
- (
94
- /** @type {{ entry: Record<string, unknown> }} */ a,
95
- /** @type {{ entry: Record<string, unknown> }} */ b,
96
- ) => (a.entry.$order as number) - (b.entry.$order as number),
97
- );
151
+ /** Get longhands for a shorthand property from css-meta, in their `$order`. */
152
+ export function getLonghands(shorthandProp: string): CssLonghand[] {
153
+ const listed = cssDefs[shorthandProp]?.$longhands;
154
+ if (listed) {
155
+ return listed
156
+ .map((name) => ({ entry: cssDefs[name] || { $order: 0 }, name }))
157
+ .toSorted((a, b) => a.entry.$order - b.entry.$order);
98
158
  }
99
- const result = [];
100
- for (const [name, e] of Object.entries(cssMeta.$defs) as [string, Record<string, unknown>][]) {
159
+ const result: CssLonghand[] = [];
160
+ for (const [name, e] of Object.entries(cssDefs)) {
101
161
  if (e.$shorthand === shorthandProp) {
102
162
  result.push({ entry: e, name });
103
163
  }
104
164
  }
105
- result.sort((a, b) => (a.entry.$order as number) - (b.entry.$order as number));
165
+ result.sort((a, b) => a.entry.$order - b.entry.$order);
106
166
  return result;
107
167
  }
108
168
 
@@ -232,7 +292,7 @@ export function getFontVars() {
232
292
  const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
233
293
  const vars = [];
234
294
  for (const [k, v] of Object.entries(style)) {
235
- if (k.startsWith("--font") && (typeof v === "string" || typeof v === "number")) {
295
+ if (k.startsWith("--font") && (isString(v) || isNumber(v))) {
236
296
  vars.push({ name: k, value: String(v) });
237
297
  }
238
298
  }
@@ -247,12 +307,15 @@ export function getFontVars() {
247
307
  * `face`, which is the channel every one of these rows ALSO carries, so a weight is shown in the
248
308
  * element's own typeface rather than in the panel's.
249
309
  */
250
- export const TYPO_PREVIEW_CHANNELS: Readonly<Record<string, string>> = {
251
- fontStyle: "slant",
252
- fontVariant: "variant",
253
- fontWeight: "weight",
254
- textDecoration: "decoration",
255
- textTransform: "transform",
256
- };
310
+ export const TYPO_PREVIEW_CHANNELS = new Map<string, TypoPreviewChannel>([
311
+ ["fontStyle", "slant"],
312
+ ["fontVariant", "variant"],
313
+ ["fontWeight", "weight"],
314
+ ["textDecoration", "decoration"],
315
+ ["textTransform", "transform"],
316
+ ]);
317
+
318
+ /** A `jx-option` drawing channel a typography row previews its value through (ui.md §5.3). */
319
+ export type TypoPreviewChannel = "decoration" | "slant" | "transform" | "variant" | "weight";
257
320
 
258
321
  export { default as cssMeta } from "../../data/css-meta.json";
@@ -21,7 +21,15 @@ import { isKeyframesAtRule } from "@jxsuite/runtime/css";
21
21
  import type { StylebookEntry } from "./stylebook-panel";
22
22
  import type { ComponentEntry } from "../files/components";
23
23
  import type { JxPath } from "../state";
24
- import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
24
+ import { isNonNullObject, isRef } from "@jxsuite/schema/guards";
25
+ import type { StylebookSpecimens } from "../style/stylebook-specimens";
26
+ import type {
27
+ JxDocument,
28
+ JxHeadEntry,
29
+ JxMutableNode,
30
+ JxStateDefinition,
31
+ JxStyle,
32
+ } from "@jxsuite/schema/types";
25
33
 
26
34
  export interface StylebookDocResult {
27
35
  /** The specimen document (plain JSON — safe to post over the bridge). */
@@ -44,8 +52,9 @@ function isTagPath(key: string): boolean {
44
52
  );
45
53
  }
46
54
 
47
- function isPlainObject(v: unknown): v is Record<string, unknown> {
48
- return v !== null && typeof v === "object" && !Array.isArray(v);
55
+ /** A nested style block (a rule or an at-rule body), as opposed to a scalar or a block list. */
56
+ function isStyleBlock(value: JxStyle[string]): value is JxStyle {
57
+ return isNonNullObject(value) && !Array.isArray(value);
49
58
  }
50
59
 
51
60
  /** The specimen-scoping selector prefix (see the module doc). */
@@ -58,12 +67,11 @@ const SPECIMEN_SCOPE = "& .element-card-preview";
58
67
  * `styleUpdate` fast path so an edit round-trips through the exact same transform.
59
68
  */
60
69
  export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
61
- const style = effectiveStyle as Record<string, unknown>;
62
- const out: Record<string, unknown> = {};
70
+ const out: JxStyle = {};
63
71
 
64
72
  /** Drop the base-width marker, which is not a query and would resolve to `@media --`. */
65
- const withoutBaseWidth = (rule: Record<string, unknown>): Record<string, unknown> => {
66
- const cleaned: Record<string, unknown> = {};
73
+ const withoutBaseWidth = (rule: JxStyle): JxStyle => {
74
+ const cleaned: JxStyle = {};
67
75
  for (const [k, v] of Object.entries(rule)) {
68
76
  if (k !== "@--") {
69
77
  cleaned[k] = v;
@@ -72,8 +80,8 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
72
80
  return cleaned;
73
81
  };
74
82
 
75
- for (const [k, v] of Object.entries(style)) {
76
- if (!isPlainObject(v)) {
83
+ for (const [k, v] of Object.entries(effectiveStyle)) {
84
+ if (!isStyleBlock(v)) {
77
85
  out[k] = v; // Flat scalars + -- custom props.
78
86
  continue;
79
87
  }
@@ -89,9 +97,9 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
89
97
  }
90
98
  if (k.startsWith("@")) {
91
99
  // Media block: re-key tag rules inside; non-tag keys (scalars/pseudo) apply to the root.
92
- const bucket: Record<string, unknown> = {};
100
+ const bucket: JxStyle = {};
93
101
  for (const [mk, mv] of Object.entries(v)) {
94
- if (isPlainObject(mv) && isTagPath(mk)) {
102
+ if (isStyleBlock(mv) && isTagPath(mk)) {
95
103
  bucket[`${SPECIMEN_SCOPE} ${mk}`] = withoutBaseWidth(mv);
96
104
  } else {
97
105
  bucket[mk] = mv;
@@ -107,34 +115,30 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
107
115
  out[k] = v;
108
116
  }
109
117
 
110
- return out as JxStyle;
118
+ return out;
111
119
  }
112
120
 
113
121
  /** Resolve a nested tag path ("table th") in a style object; null when absent. */
114
- function resolveNestedStyle(
115
- style: Record<string, unknown>,
116
- tagPath: string,
117
- ): Record<string, unknown> | null {
122
+ function resolveNestedStyle(style: JxStyle, tagPath: string): JxStyle | null {
118
123
  const parts = tagPath.split(" ");
119
- let obj: unknown = style;
124
+ let obj: JxStyle[string] = style;
120
125
  for (const part of parts) {
121
- if (!isPlainObject(obj)) {
126
+ if (!isStyleBlock(obj)) {
122
127
  return null;
123
128
  }
124
129
  obj = obj[part];
125
130
  }
126
- return isPlainObject(obj) ? obj : null;
131
+ return isStyleBlock(obj) ? obj : null;
127
132
  }
128
133
 
129
134
  /** Whether the effective style customizes `tagPath` (directly or under any `@media` block). */
130
135
  export function hasTagStyle(rootStyle: JxStyle, tagPath: string): boolean {
131
- const style = rootStyle as Record<string, unknown>;
132
- const direct = resolveNestedStyle(style, tagPath);
136
+ const direct = resolveNestedStyle(rootStyle, tagPath);
133
137
  if (direct && Object.keys(direct).length > 0) {
134
138
  return true;
135
139
  }
136
- for (const [key, val] of Object.entries(style)) {
137
- if (!key.startsWith("@") || !isPlainObject(val)) {
140
+ for (const [key, val] of Object.entries(rootStyle)) {
141
+ if (!key.startsWith("@") || !isStyleBlock(val)) {
138
142
  continue;
139
143
  }
140
144
  const nested = resolveNestedStyle(val, tagPath);
@@ -145,6 +149,101 @@ export function hasTagStyle(rootStyle: JxStyle, tagPath: string): boolean {
145
149
  return false;
146
150
  }
147
151
 
152
+ /** One catalogue tag as a list of element defaults draws it: the Styles panel's, and the Outline's. */
153
+ export interface CatalogueRow {
154
+ /** The catalogue entry the row stands for. */
155
+ entry: StylebookEntry;
156
+ tag: string;
157
+ /** The compound path (`ul li`): the row's key, and what selecting the row selects. */
158
+ path: string;
159
+ /** How deep in its specimen the tag sits: 0 for a section's own entries. */
160
+ depth: number;
161
+ /** Whether the selection's leaf is this tag ({@link selectionLeaf}). */
162
+ selected: boolean;
163
+ }
164
+
165
+ /**
166
+ * The leaf of a stylebook selection.
167
+ *
168
+ * A selection is a compound path (`"ul li"`) and the catalogue draws one row per TAG, so the row
169
+ * that is marked is the one whose tag is the path's last segment. That is what the tree has always
170
+ * done; it is written down here because "selected" meaning something other than "equal" is exactly
171
+ * the kind of thing a reader assumes is a bug.
172
+ */
173
+ export function selectionLeaf(selection: string | null): string | null {
174
+ if (!selection) {
175
+ return null;
176
+ }
177
+ return selection.split(" ").pop() ?? null;
178
+ }
179
+
180
+ /**
181
+ * Flatten catalogue entries and everything under them into rows, in document order.
182
+ *
183
+ * Children are deduplicated by tag: a `<ul>` specimen carries several `<li>`s and they are one row,
184
+ * because the row selects a TAG and there is one rule per tag path to write. The ONE walk both
185
+ * lists draw from, so the two cannot drift; what each says about a row (its dot, its label) is the
186
+ * caller's.
187
+ *
188
+ * @param entries A section's entries, or several sections' in order
189
+ * @param selection The stylebook selection (`shell.stylebook.selection`)
190
+ */
191
+ export function catalogueRows(
192
+ entries: readonly StylebookEntry[],
193
+ selection: string | null,
194
+ ): CatalogueRow[] {
195
+ const leaf = selectionLeaf(selection);
196
+ const out: CatalogueRow[] = [];
197
+ const walk = (entry: StylebookEntry, depth: number, parentPath: string): void => {
198
+ const path = parentPath ? `${parentPath} ${entry.tag}` : entry.tag;
199
+ out.push({ depth, entry, path, selected: entry.tag === leaf, tag: entry.tag });
200
+ const children = entry.children
201
+ ? [...new Map(entry.children.map((child) => [child.tag, child])).values()]
202
+ : [];
203
+ for (const child of children) {
204
+ walk(child, depth + 1, path);
205
+ }
206
+ };
207
+ for (const entry of entries) {
208
+ walk(entry, 0, "");
209
+ }
210
+ return out;
211
+ }
212
+
213
+ /**
214
+ * A card's specimen for a component drawn as the first row of a list
215
+ * (`style/stylebook-specimens.ts`): the list's repeater, reading its row from `rootState[key]` so
216
+ * two cards' lists cannot collide, and the rest of the page state the row was drawn in, the first
217
+ * card's value winning a shared name (`$page`, `$site`). Null when the sample is not a repeater
218
+ * over a state list.
219
+ */
220
+ export function sampleRowSpecimen(
221
+ sample: JxDocument,
222
+ key: string,
223
+ rootState: Record<string, JxStateDefinition>,
224
+ ): JxMutableNode | null {
225
+ const [list] = Array.isArray(sample.children) ? sample.children : [];
226
+ if (!isNonNullObject(list) || Array.isArray(list) || !isRef(list.items)) {
227
+ return null;
228
+ }
229
+ const { $ref } = list.items;
230
+ const listKey = $ref.startsWith("#/state/") ? $ref.slice("#/state/".length) : "";
231
+ const rows = sample.state?.[listKey];
232
+ if (!Array.isArray(rows)) {
233
+ return null;
234
+ }
235
+ rootState[key] = rows;
236
+ for (const [name, value] of Object.entries(sample.state ?? {})) {
237
+ if (name !== listKey && !(name in rootState)) {
238
+ rootState[name] = value;
239
+ }
240
+ }
241
+ /* SAFETY: `list` is the repeater object a page's `children` held; only its `items` is replaced,
242
+ with a ref of the same shape. */
243
+ const repeater = { ...list, items: { $ref: `#/state/${key}` } } as JxMutableNode;
244
+ return { children: [repeater], tagName: "div" };
245
+ }
246
+
148
247
  /** Options for {@link buildStylebookDoc}. */
149
248
  export interface BuildStylebookDocOpts {
150
249
  meta: { $sections: { label: string; elements: StylebookEntry[] }[] };
@@ -153,9 +252,16 @@ export interface BuildStylebookDocOpts {
153
252
  effectiveStyle: JxStyle;
154
253
  /** Merged $media map (getEffectiveMedia output) — becomes the doc's $media. */
155
254
  effectiveMedia: Record<string, string>;
255
+ /** Merged project+document `$head` (getEffectiveHead output) — becomes the doc's `$head`. */
256
+ effectiveHead?: JxHeadEntry[];
156
257
  filter: string;
157
258
  customizedOnly: boolean;
158
259
  projectRoot: string | null;
260
+ /**
261
+ * How each component card is drawn, by tag (`style/stylebook-specimens.ts`). A component with no
262
+ * entry is drawn bare, with its declared defaults as attributes.
263
+ */
264
+ specimens?: StylebookSpecimens;
159
265
  }
160
266
 
161
267
  /**
@@ -179,16 +285,21 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
179
285
  };
180
286
 
181
287
  const specimenNode = (entry: StylebookEntry): JxMutableNode => {
182
- const attributes: Record<string, string> = { ...entry.attributes };
288
+ const attributes = { ...entry.attributes };
183
289
  if (entry.style) {
184
290
  attributes.style = entry.style; // Inline CSS text — legacy `el.style.cssText` parity.
185
291
  }
186
- return {
187
- tagName: entry.tag,
188
- ...(entry.text ? { textContent: entry.text } : {}),
189
- ...(Object.keys(attributes).length > 0 ? { attributes } : {}),
190
- ...(entry.children ? { children: entry.children.map(specimenNode) } : {}),
191
- } as JxMutableNode;
292
+ const node: JxMutableNode = { tagName: entry.tag };
293
+ if (entry.text) {
294
+ node.textContent = entry.text;
295
+ }
296
+ if (Object.keys(attributes).length > 0) {
297
+ node.attributes = attributes;
298
+ }
299
+ if (entry.children) {
300
+ node.children = entry.children.map(specimenNode);
301
+ }
302
+ return node;
192
303
  };
193
304
 
194
305
  /** A card wrapping one specimen; registers card/preview/specimen paths under `tag`. */
@@ -217,19 +328,18 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
217
328
  { attributes: { class: "element-card-label" }, tagName: "div", textContent: label },
218
329
  ],
219
330
  tagName: "div",
220
- } as JxMutableNode;
331
+ };
221
332
  };
222
333
 
223
334
  const sections: JxMutableNode[] = [];
224
- const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode =>
225
- ({
226
- attributes: { class: "sb-section" },
227
- children: [
228
- { attributes: { class: "sb-label" }, tagName: "div", textContent: label },
229
- { attributes: { class: "sb-body" }, children: cards, tagName: "div" },
230
- ],
231
- tagName: "div",
232
- }) as JxMutableNode;
335
+ const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode => ({
336
+ attributes: { class: "sb-section" },
337
+ children: [
338
+ { attributes: { class: "sb-label" }, tagName: "div", textContent: label },
339
+ { attributes: { class: "sb-body" }, children: cards, tagName: "div" },
340
+ ],
341
+ tagName: "div",
342
+ });
233
343
 
234
344
  // Paths below mirror the assembled tree: root.children[si] = section; section.children[1] =
235
345
  // Sb-body; body.children[ci] = card. Sections are appended only when non-empty, so indices are
@@ -264,6 +374,8 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
264
374
 
265
375
  // Custom components from the registry — live custom elements registered via $elements.
266
376
  const $elements: (string | { $ref: string })[] = [];
377
+ // The data the sample-row cards read: each row's list, and the page context it was drawn in.
378
+ const rootState: Record<string, JxStateDefinition> = {};
267
379
  {
268
380
  let comps = opts.components;
269
381
  if (filter) {
@@ -287,24 +399,37 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
287
399
  "/",
288
400
  ),
289
401
  });
290
- const attributes: Record<string, string> = {};
291
- for (const p of comp.props ?? []) {
292
- if (p.default !== undefined && p.default !== "false" && p.default !== "''") {
293
- attributes[p.name] = String(p.default).replaceAll(/^'|'$/g, "");
402
+ const drawn = opts.specimens?.get(comp.tagName);
403
+ if (drawn?.kind === "props") {
404
+ const specimen: JxMutableNode = { $props: drawn.props, tagName: comp.tagName };
405
+ return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
406
+ }
407
+ if (drawn?.kind === "row") {
408
+ const row = sampleRowSpecimen(drawn.sample.doc, `stylebookRow${ci}`, rootState);
409
+ if (row) {
410
+ return cardNode(comp.tagName, `<${comp.tagName}>`, row, cardPath, null);
411
+ }
412
+ }
413
+ if (drawn?.kind !== "none") {
414
+ const attributes: Record<string, string> = {};
415
+ for (const p of comp.props ?? []) {
416
+ if (p.default !== undefined && p.default !== "false" && p.default !== "''") {
417
+ attributes[p.name] = String(p.default).replaceAll(/^'|'$/g, "");
418
+ }
294
419
  }
420
+ const specimen: JxMutableNode = { tagName: comp.tagName };
421
+ if (Object.keys(attributes).length > 0) {
422
+ specimen.attributes = attributes;
423
+ }
424
+ return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
295
425
  }
296
- const specimen = {
297
- tagName: comp.tagName,
298
- ...(Object.keys(attributes).length > 0 ? { attributes } : {}),
299
- } as JxMutableNode;
300
- return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
301
426
  }
302
427
  // Npm/format-class components can't be $ref-registered — placeholder box (legacy parity).
303
- const fallback = {
428
+ const fallback: JxMutableNode = {
304
429
  attributes: { class: "sb-fallback" },
305
430
  tagName: "div",
306
431
  textContent: `<${comp.tagName}>`,
307
- } as JxMutableNode;
432
+ };
308
433
  return cardNode(comp.tagName, `<${comp.tagName}>`, fallback, cardPath, null);
309
434
  });
310
435
  sections.push(sectionNode("Components", cards));
@@ -316,17 +441,27 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
316
441
  attributes: { class: "sb-empty" },
317
442
  tagName: "div",
318
443
  textContent: opts.customizedOnly ? "No customized elements" : "No matching elements",
319
- } as JxMutableNode);
444
+ });
320
445
  }
321
446
 
322
- const doc = {
323
- ...($elements.length > 0 ? { $elements } : {}),
324
- $media: opts.effectiveMedia,
325
- attributes: { class: "sb-root" },
326
- children: sections,
327
- style: transposeStylebookStyle(opts.effectiveStyle),
328
- tagName: "div",
329
- } as JxMutableNode;
447
+ // Assigned in this order so the posted document keeps its key order: `$elements` leads when present.
448
+ const doc: JxMutableNode = {};
449
+ if ($elements.length > 0) {
450
+ doc.$elements = $elements;
451
+ }
452
+ /* The project's `$head` too: its webfont links are what make `fontFamily: 'Barlow'` render as
453
+ Barlow, and a specimen sheet drawn in the system fallback shows styles the site never has. */
454
+ if (opts.effectiveHead && opts.effectiveHead.length > 0) {
455
+ doc.$head = opts.effectiveHead;
456
+ }
457
+ doc.$media = opts.effectiveMedia;
458
+ if (Object.keys(rootState).length > 0) {
459
+ doc.state = rootState;
460
+ }
461
+ doc.attributes = { class: "sb-root" };
462
+ doc.children = sections;
463
+ doc.style = transposeStylebookStyle(opts.effectiveStyle);
464
+ doc.tagName = "div";
330
465
 
331
466
  return { doc, pathToTag, tagToCardPath };
332
467
  }