@jxsuite/studio 6.1.2 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  4. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  5. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  6. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  7. package/dist/chunks/{color-area-0fj8a4ga.js → color-area-6rbra5dy.js} +2 -2
  8. package/dist/chunks/{color-field-xch8kx2g.js → color-field-gy56c94g.js} +3 -3
  9. package/dist/chunks/color-m7r1vk54.js +4 -0
  10. package/dist/chunks/{color-slider-jxd8v350.js → color-slider-sqqdyf6c.js} +2 -2
  11. package/dist/chunks/{combobox-p0efwjke.js → combobox-72h32ejk.js} +3 -3
  12. package/dist/chunks/components-r22xca09.js +4 -0
  13. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  14. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  15. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  16. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  17. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  18. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  19. package/dist/chunks/files-rcn56qvm.js +4 -0
  20. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  21. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  22. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  23. package/dist/chunks/{grid-view-d2wq9ezg.js → grid-view-qg1b5eqx.js} +25 -25
  24. package/dist/chunks/{icons-pnfz478q.js → icons-63bjtbs7.js} +2 -2
  25. package/dist/chunks/{iframe-entry-jdcktez8.js → iframe-entry-2zggzajv.js} +4 -4
  26. package/dist/chunks/{iframe-entry-zap785cw.js → iframe-entry-76j8vwwx.js} +4 -4
  27. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  28. package/dist/chunks/{iframe-entry-x0ygf2yr.js → iframe-entry-pkgmcgp0.js} +4 -4
  29. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  30. package/dist/chunks/{index-zpjmzqfk.js → index-32eqzv1k.js} +3 -3
  31. package/dist/chunks/index-f0jn7nnp.js +4 -0
  32. package/dist/chunks/{javascript-m54mnwp6.js → javascript-pjp734q4.js} +3 -3
  33. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  34. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  35. package/dist/chunks/layers-bgyr11tr.js +4 -0
  36. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  37. package/dist/chunks/{listbox-e74qjyq6.js → listbox-c421cf8c.js} +2 -2
  38. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  39. package/dist/chunks/media-library-sq468wts.js +4 -0
  40. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  41. package/dist/chunks/{menu-n6yzswmy.js → menu-bdpzbfvs.js} +2 -2
  42. package/dist/chunks/{monaco-binding-7gx83x3r.js → monaco-binding-vq1hgnn0.js} +3 -3
  43. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  44. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  45. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  46. package/dist/chunks/parse-v77xtwv7.js +4 -0
  47. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  48. package/dist/chunks/popover-b89sfej7.js +4 -0
  49. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  50. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  51. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  52. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  53. package/dist/chunks/references-9547rg5s.js +4 -0
  54. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  55. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  56. package/dist/chunks/{split-n2gfpm5m.js → split-c9zfdgxf.js} +2 -2
  57. package/dist/chunks/studio-03ct6yfv.js +9 -0
  58. package/dist/chunks/studio-07rcfje3.js +5 -0
  59. package/dist/chunks/studio-3e54qh39.js +7 -0
  60. package/dist/chunks/studio-3exxhz5g.js +5 -0
  61. package/dist/chunks/studio-3q40e3rj.js +5 -0
  62. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  63. package/dist/chunks/studio-3qqjeep5.js +6 -0
  64. package/dist/chunks/studio-43sd2mam.js +4 -0
  65. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  66. package/dist/chunks/studio-58xg6j2q.js +9 -0
  67. package/dist/chunks/studio-5g0rprdt.js +7 -0
  68. package/dist/chunks/{studio-2j1cb95x.js → studio-6m380wp7.js} +4 -4
  69. package/dist/chunks/studio-80jyh1xh.js +4 -0
  70. package/dist/chunks/studio-83mk4bgg.js +9 -0
  71. package/dist/chunks/{studio-v0jzqdjm.js → studio-881z1xrx.js} +4 -4
  72. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  73. package/dist/chunks/{studio-d81xfh1g.js → studio-8tr6cfrc.js} +4 -4
  74. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  75. package/dist/chunks/studio-9tmebf0s.js +5 -0
  76. package/dist/chunks/studio-a2bvaptz.js +5 -0
  77. package/dist/chunks/studio-b7y5mr30.js +5 -0
  78. package/dist/chunks/studio-bavb31r0.js +5 -0
  79. package/dist/chunks/{studio-dgz8d0c1.js → studio-bbe4c90a.js} +4 -4
  80. package/dist/chunks/studio-c05wdnt3.js +5 -0
  81. package/dist/chunks/studio-ccv2svc6.js +5 -0
  82. package/dist/chunks/studio-d5grtb9e.js +16 -0
  83. package/dist/chunks/studio-df0baea9.js +5 -0
  84. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  85. package/dist/chunks/studio-e1g64q43.js +5 -0
  86. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  87. package/dist/chunks/studio-ed3xx40h.js +7 -0
  88. package/dist/chunks/studio-f14e1zdj.js +5 -0
  89. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  90. package/dist/chunks/studio-fyh0jc96.js +5 -0
  91. package/dist/chunks/studio-gcxk20n7.js +5 -0
  92. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  93. package/dist/chunks/{studio-90pq9km1.js → studio-jcnsdaep.js} +4 -4
  94. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  95. package/dist/chunks/{studio-0q988f9w.js → studio-k3xxbagr.js} +3 -3
  96. package/dist/chunks/{studio-5ve6bbep.js → studio-k7evxqh4.js} +4 -4
  97. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  98. package/dist/chunks/studio-m8g16bgz.js +5 -0
  99. package/dist/chunks/studio-mn0476ag.js +5 -0
  100. package/dist/chunks/studio-mx1smyq0.js +5 -0
  101. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  102. package/dist/chunks/{studio-485046te.js → studio-nh6d342n.js} +7 -7
  103. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  104. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  105. package/dist/chunks/{studio-1fxkaaea.js → studio-pbxa5fpc.js} +4 -4
  106. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  107. package/dist/chunks/studio-ph84avkf.js +5 -0
  108. package/dist/chunks/{studio-tq0rtfwj.js → studio-q0mvbaq6.js} +4 -4
  109. package/dist/chunks/studio-q0tccd43.js +5 -0
  110. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  111. package/dist/chunks/{studio-a3g98wjr.js → studio-qgh13jtz.js} +4 -4
  112. package/dist/chunks/studio-qmn1xc24.js +5 -0
  113. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  114. package/dist/chunks/studio-r5qy30vx.js +5 -0
  115. package/dist/chunks/studio-rj9eamf8.js +5 -0
  116. package/dist/chunks/studio-rptgsk96.js +5 -0
  117. package/dist/chunks/studio-rthyg42z.js +928 -0
  118. package/dist/chunks/studio-s19tp1xr.js +5 -0
  119. package/dist/chunks/studio-s32578pn.js +5 -0
  120. package/dist/chunks/studio-svb7yyve.js +5 -0
  121. package/dist/chunks/studio-syreb644.js +5 -0
  122. package/dist/chunks/studio-tf9jryb1.js +10 -0
  123. package/dist/chunks/studio-tfkznv39.js +5 -0
  124. package/dist/chunks/studio-tft6r105.js +5 -0
  125. package/dist/chunks/studio-txf2kysx.js +5 -0
  126. package/dist/chunks/studio-v8867ddv.js +12 -0
  127. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  128. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  129. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  130. package/dist/chunks/studio-wc649wss.js +5 -0
  131. package/dist/chunks/studio-wys23mxz.js +5 -0
  132. package/dist/chunks/studio-x1x167jh.js +5 -0
  133. package/dist/chunks/studio-x9hsze61.js +5 -0
  134. package/dist/chunks/studio-y0n7yxea.js +9 -0
  135. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  136. package/dist/chunks/studio-z97c48fk.js +5 -0
  137. package/dist/chunks/studio-zat62m0c.js +5 -0
  138. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  139. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  140. package/dist/chunks/toast-1gv0h53h.js +4 -0
  141. package/dist/chunks/{toast-host-ke5z4ng7.js → toast-host-1yg5ar8d.js} +3 -3
  142. package/dist/chunks/{tooltip-5v8ngwj2.js → tooltip-yypz28gq.js} +3 -3
  143. package/dist/chunks/{tree-mdq3v5cw.js → tree-9xa4hm7n.js} +2 -2
  144. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  145. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  146. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  147. package/dist/chunks/{ws-client-nze0k6mv.js → ws-client-bv552sfx.js} +3 -3
  148. package/dist/iframe-entry.js +20 -16
  149. package/dist/manifest.json +77 -63
  150. package/dist/studio.js +103 -104
  151. package/dist/workers/ts.worker.js +3 -3
  152. package/package.json +12 -11
  153. package/src/browse/component-examples.ts +272 -0
  154. package/src/browse/library-commands.ts +64 -104
  155. package/src/browse/library-layouts.ts +263 -49
  156. package/src/browse/library-model.ts +181 -133
  157. package/src/browse/library-pane.ts +738 -446
  158. package/src/browse/library-preview.ts +149 -19
  159. package/src/browse/library-source.ts +308 -41
  160. package/src/browse/preview-root.ts +78 -0
  161. package/src/browse/preview-style.ts +155 -0
  162. package/src/canvas/asset-refs.ts +16 -1
  163. package/src/canvas/canvas-live-render.ts +222 -30
  164. package/src/canvas/canvas-origin.ts +37 -12
  165. package/src/canvas/canvas-page-context.ts +112 -0
  166. package/src/canvas/canvas-render.ts +113 -107
  167. package/src/canvas/canvas-utils.ts +57 -12
  168. package/src/canvas/iframe-drop.ts +107 -0
  169. package/src/canvas/iframe-entry.ts +24 -12
  170. package/src/canvas/iframe-host.ts +134 -62
  171. package/src/canvas/iframe-keys.ts +11 -0
  172. package/src/canvas/iframe-patch.ts +8 -7
  173. package/src/canvas/iframe-protocol.ts +24 -5
  174. package/src/canvas/iframe-render.ts +48 -1
  175. package/src/canvas/iframe-subtree.ts +5 -2
  176. package/src/canvas/npm-modules.ts +22 -0
  177. package/src/canvas/preview-navigate.ts +16 -0
  178. package/src/canvas/repeater-sources.ts +200 -0
  179. package/src/canvas/stage-scrollbar.ts +5 -1
  180. package/src/canvas/surface-registry.ts +6 -0
  181. package/src/commands/app-commands.ts +16 -6
  182. package/src/commands/budget.ts +10 -8
  183. package/src/commands/context.ts +35 -10
  184. package/src/commands/defaults.ts +69 -45
  185. package/src/commands/keymap.ts +9 -0
  186. package/src/commands/levels.ts +11 -5
  187. package/src/commands/live-context.ts +2 -0
  188. package/src/commands/registry.ts +10 -1
  189. package/src/content/collection-match.ts +6 -5
  190. package/src/content/collection-pages.ts +412 -0
  191. package/src/content/content-collections.ts +270 -0
  192. package/src/content/entry-commands.ts +51 -60
  193. package/src/content/entry-editor.ts +111 -18
  194. package/src/content/entry-fields.ts +13 -1
  195. package/src/content/entry-inspector.ts +225 -0
  196. package/src/content/entry-model.ts +17 -3
  197. package/src/content/entry-open.ts +80 -0
  198. package/src/content/entry-summaries.ts +440 -0
  199. package/src/content/file-record-ids.ts +80 -0
  200. package/src/content/file-records.ts +125 -0
  201. package/src/content/page-summaries.ts +129 -0
  202. package/src/content/record-entry.ts +201 -0
  203. package/src/content/writing-banner.ts +177 -0
  204. package/src/create/add-new-commands.ts +185 -0
  205. package/src/create/add-new-flow.ts +1116 -0
  206. package/src/create/add-new.ts +1014 -0
  207. package/src/create/element-name.ts +121 -0
  208. package/src/editor/convert-to-component.ts +67 -43
  209. package/src/editor/file-drop-action.ts +9 -1
  210. package/src/editor/inline-edit-apply.ts +44 -0
  211. package/src/editor/inline-edit.ts +10 -0
  212. package/src/editor/insert-component.ts +91 -0
  213. package/src/editor/insert-zone-action.ts +13 -4
  214. package/src/editor/shortcuts.ts +44 -22
  215. package/src/editor/slash-menu.ts +51 -8
  216. package/src/files/components.ts +74 -10
  217. package/src/files/file-ops.ts +15 -5
  218. package/src/files/files.ts +164 -150
  219. package/src/files/fs-events.ts +18 -7
  220. package/src/files/media-meta.ts +95 -1
  221. package/src/files/media-types.ts +55 -0
  222. package/src/files/media-upload.ts +209 -52
  223. package/src/files/new-file-name.ts +156 -0
  224. package/src/files/serialize-document.ts +13 -3
  225. package/src/format/format-host.ts +15 -0
  226. package/src/github/github-auth.ts +2 -2
  227. package/src/github/github-publish.ts +4 -3
  228. package/src/grid/grid-controller.ts +5 -1
  229. package/src/grid/grid-open.ts +0 -27
  230. package/src/grid/grid-panel.ts +54 -2
  231. package/src/grid/grid-reveal.ts +34 -0
  232. package/src/grid/grid-source.ts +3 -25
  233. package/src/grid/grid-view.ts +31 -6
  234. package/src/grid/sources/content-source.ts +75 -7
  235. package/src/grid/tabulator-tables.d.ts +6 -0
  236. package/src/hosting/document.ts +2 -2
  237. package/src/i18n/i18n-commands.ts +2 -1
  238. package/src/media/media-commands.ts +181 -0
  239. package/src/media/media-library-model.ts +232 -0
  240. package/src/media/media-library.ts +1283 -0
  241. package/src/media/media-pane.ts +47 -19
  242. package/src/packages/pull-package-sync.ts +1 -1
  243. package/src/panels/activity-panel.ts +21 -5
  244. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  245. package/src/panels/block-action-bar.ts +11 -11
  246. package/src/panels/canvas-dnd-bridge.ts +5 -2
  247. package/src/panels/chat-panel.ts +6 -6
  248. package/src/panels/collections-panel.ts +306 -0
  249. package/src/panels/component-preview.ts +35 -13
  250. package/src/panels/data-explorer.ts +1 -1
  251. package/src/panels/data-grid.ts +4 -0
  252. package/src/panels/dnd.ts +17 -30
  253. package/src/panels/elements-panel.ts +9 -2
  254. package/src/panels/empty-state.ts +2 -2
  255. package/src/panels/formula-workspace.ts +2 -3
  256. package/src/panels/frontmatter-fields.ts +9 -9
  257. package/src/panels/git-diff-open.ts +9 -5
  258. package/src/panels/head-panel.ts +369 -103
  259. package/src/panels/i18n-panel.ts +11 -10
  260. package/src/panels/imports-panel.ts +2 -0
  261. package/src/panels/jump-bar.ts +27 -2
  262. package/src/panels/layers-panel.ts +36 -30
  263. package/src/panels/left-panel.ts +22 -8
  264. package/src/panels/navigator-panels.ts +23 -11
  265. package/src/panels/pane-context.ts +111 -29
  266. package/src/panels/pane-grid.ts +6 -6
  267. package/src/panels/panel-registry.ts +14 -9
  268. package/src/panels/properties-panel.ts +7 -3
  269. package/src/panels/right-panel.ts +199 -43
  270. package/src/panels/seo-modal.ts +41 -108
  271. package/src/panels/settings-menu.ts +52 -50
  272. package/src/panels/settings-pane.ts +268 -162
  273. package/src/panels/signals-panel.ts +3 -4
  274. package/src/panels/site-model.ts +367 -0
  275. package/src/panels/site-panel.ts +638 -0
  276. package/src/panels/style-panel.ts +37 -3
  277. package/src/panels/stylebook-doc.ts +142 -10
  278. package/src/panels/stylebook-layers-panel.ts +39 -80
  279. package/src/panels/stylebook-panel.ts +47 -10
  280. package/src/panels/styles-panel.ts +327 -0
  281. package/src/panels/tab-strip.ts +109 -25
  282. package/src/platform.ts +1 -1
  283. package/src/platforms/cloud.ts +28 -1
  284. package/src/platforms/default-platform.ts +4 -4
  285. package/src/platforms/devserver.ts +51 -25
  286. package/src/publish/deploy-checklist.ts +12 -7
  287. package/src/publish/pages-service.ts +38 -14
  288. package/src/publish/publish-changes.ts +491 -0
  289. package/src/publish/publish-commands.ts +83 -18
  290. package/src/publish/publish-ids.ts +49 -0
  291. package/src/publish/publish-quick.ts +148 -0
  292. package/src/publish/publish-workspace.ts +926 -0
  293. package/src/publish/source-control.ts +907 -0
  294. package/src/services/automation.ts +16 -20
  295. package/src/services/cf-settings.ts +4 -4
  296. package/src/services/connection.ts +2 -2
  297. package/src/services/directory-picker.ts +2 -2
  298. package/src/services/references.ts +0 -0
  299. package/src/services/render-critic.ts +21 -2
  300. package/src/services/settings/definitions.ts +25 -14
  301. package/src/settings/contributed-section.ts +49 -10
  302. package/src/settings/css-vars-editor.ts +93 -27
  303. package/src/settings/developer-panels.ts +43 -0
  304. package/src/settings/extension-sections.ts +20 -2
  305. package/src/settings/general-settings.ts +91 -21
  306. package/src/settings/preferences-dialog.ts +8 -1
  307. package/src/settings/project-sections.ts +27 -10
  308. package/src/settings/schema-field-ui.ts +3 -1
  309. package/src/settings/section-registry.ts +116 -11
  310. package/src/settings/settings-dialog.ts +192 -0
  311. package/src/settings/settings-document.ts +182 -162
  312. package/src/shell.ts +467 -431
  313. package/src/site-context.ts +64 -10
  314. package/src/state.ts +28 -9
  315. package/src/studio.ts +194 -41
  316. package/src/style/project-styles.ts +34 -0
  317. package/src/style/stylebook-specimens.ts +89 -0
  318. package/src/style/stylebook-target.ts +26 -0
  319. package/src/style/tag-inheritance.ts +105 -0
  320. package/src/style/variables-focus.ts +61 -0
  321. package/src/style/variables-view.ts +235 -0
  322. package/src/surfaces/add-new.json +1482 -0
  323. package/src/surfaces/add-new.ts +325 -0
  324. package/src/surfaces/ai-chat.ts +2 -2
  325. package/src/surfaces/boot-failure.json +4 -3
  326. package/src/surfaces/bottom-dock.json +1 -1
  327. package/src/surfaces/canvas-stage.json +30 -19
  328. package/src/surfaces/canvas-stage.ts +5 -5
  329. package/src/surfaces/collections-panel.json +615 -0
  330. package/src/surfaces/collections-panel.ts +168 -0
  331. package/src/surfaces/commandbar.json +241 -96
  332. package/src/surfaces/commandbar.ts +134 -99
  333. package/src/surfaces/empty-state.json +1 -1
  334. package/src/surfaces/entry-editor.json +136 -0
  335. package/src/surfaces/entry-editor.ts +21 -0
  336. package/src/surfaces/entry-inspector.json +371 -0
  337. package/src/surfaces/entry-inspector.ts +143 -0
  338. package/src/surfaces/inspector-dock.json +162 -14
  339. package/src/surfaces/inspector-dock.ts +46 -19
  340. package/src/surfaces/library-pane.json +670 -437
  341. package/src/surfaces/library-pane.ts +94 -59
  342. package/src/surfaces/media-browser.json +62 -6
  343. package/src/surfaces/media-browser.ts +15 -1
  344. package/src/surfaces/media-field.json +1 -1
  345. package/src/surfaces/media-library.json +1586 -0
  346. package/src/surfaces/media-library.ts +282 -0
  347. package/src/surfaces/media-pick-dialog.json +71 -0
  348. package/src/surfaces/media-pick-dialog.ts +132 -0
  349. package/src/surfaces/menu.ts +18 -0
  350. package/src/surfaces/pane-context.json +144 -77
  351. package/src/surfaces/pane-context.ts +24 -0
  352. package/src/surfaces/panel-deploy-checklist.json +12 -6
  353. package/src/surfaces/panel-deploy-checklist.ts +3 -1
  354. package/src/surfaces/panel-page.json +72 -2
  355. package/src/surfaces/panel-page.ts +38 -7
  356. package/src/surfaces/panel-signals.json +1 -1
  357. package/src/surfaces/panel-signals.ts +5 -5
  358. package/src/surfaces/panel-stylebook-layers.json +71 -204
  359. package/src/surfaces/panel-stylebook-layers.ts +0 -21
  360. package/src/surfaces/preferences.json +120 -48
  361. package/src/surfaces/preferences.ts +8 -0
  362. package/src/surfaces/publish-quick.json +428 -0
  363. package/src/surfaces/publish-quick.ts +165 -0
  364. package/src/surfaces/publish-workspace.json +2892 -0
  365. package/src/surfaces/publish-workspace.ts +391 -0
  366. package/src/surfaces/rail.json +1 -159
  367. package/src/surfaces/rail.ts +18 -75
  368. package/src/surfaces/schema-form.json +10 -2
  369. package/src/surfaces/schema-form.ts +2 -0
  370. package/src/surfaces/seo.json +1 -1
  371. package/src/surfaces/settings-contributed.json +5 -5
  372. package/src/surfaces/settings-contributed.ts +18 -2
  373. package/src/surfaces/settings-css-vars.json +44 -36
  374. package/src/surfaces/settings-css-vars.ts +77 -4
  375. package/src/surfaces/settings-deploy.json +2 -15
  376. package/src/surfaces/settings-deploy.ts +1 -1
  377. package/src/surfaces/settings-dialog.json +51 -0
  378. package/src/surfaces/settings-dialog.ts +169 -0
  379. package/src/surfaces/settings-overview.json +3 -3
  380. package/src/surfaces/settings-overview.ts +9 -2
  381. package/src/surfaces/settings-pane.json +269 -46
  382. package/src/surfaces/settings-pane.ts +85 -24
  383. package/src/surfaces/shell.json +2 -1
  384. package/src/surfaces/site-panel.json +1029 -0
  385. package/src/surfaces/site-panel.ts +233 -0
  386. package/src/surfaces/slash-menu.json +63 -21
  387. package/src/surfaces/slash-menu.ts +23 -0
  388. package/src/surfaces/statusbar.ts +39 -15
  389. package/src/surfaces/styles-panel.json +735 -0
  390. package/src/surfaces/styles-panel.ts +195 -0
  391. package/src/surfaces/styles-variables.json +149 -0
  392. package/src/surfaces/styles-variables.ts +145 -0
  393. package/src/surfaces/tab-strip.json +4 -4
  394. package/src/surfaces/welcome.ts +1 -1
  395. package/src/surfaces/writing-banner.json +94 -0
  396. package/src/surfaces/writing-banner.ts +80 -0
  397. package/src/tabs/bare-repeaters.ts +101 -0
  398. package/src/tabs/tab.ts +47 -7
  399. package/src/types.ts +21 -26
  400. package/src/ui/form-controls.ts +47 -8
  401. package/src/ui/layers.ts +13 -0
  402. package/src/ui/media-picker.ts +284 -40
  403. package/src/ui/regions.ts +7 -6
  404. package/src/ui/schema-form.ts +259 -27
  405. package/src/ui/virtual-window.ts +26 -1
  406. package/src/utils/base64.ts +3 -3
  407. package/src/utils/edit-display.ts +322 -67
  408. package/src/utils/local-day.ts +18 -0
  409. package/src/workspace/pane-derive.ts +4 -4
  410. package/src/workspace/session.ts +28 -7
  411. package/src/workspace/tab-workspace.ts +137 -0
  412. package/src/workspace/workspace-back.ts +189 -0
  413. package/src/workspace/workspace-home.ts +133 -0
  414. package/src/workspace/workspace-ids.ts +129 -0
  415. package/src/workspace/workspace-switch.ts +372 -0
  416. package/src/workspace/workspace.ts +125 -11
  417. package/styles/shell-frame.css +30 -7
  418. package/styles/shell-frame.json +15 -3
  419. package/dist/chunks/2020-f2gkpy8d.js +0 -4
  420. package/dist/chunks/adapter-4912g339.js +0 -4
  421. package/dist/chunks/cf-account-picker-wccaenh6.js +0 -4
  422. package/dist/chunks/cf-settings-br6105tr.js +0 -4
  423. package/dist/chunks/color-28ksk2qm.js +0 -4
  424. package/dist/chunks/components-db68vsn7.js +0 -4
  425. package/dist/chunks/content-source-1449qesq.js +0 -4
  426. package/dist/chunks/convert-to-repeater-5h457egj.js +0 -4
  427. package/dist/chunks/editor-x9jn86a7.js +0 -4
  428. package/dist/chunks/entry-commands-may24cpt.js +0 -4
  429. package/dist/chunks/extension-sections-pvr14vxr.js +0 -4
  430. package/dist/chunks/file-ops-x9v54pcj.js +0 -4
  431. package/dist/chunks/files-j3knqf0s.js +0 -4
  432. package/dist/chunks/format-host-tyre2trb.js +0 -4
  433. package/dist/chunks/fs-events-64ma9htc.js +0 -4
  434. package/dist/chunks/git-panel-84ps5dex.js +0 -4
  435. package/dist/chunks/iframe-entry-fvbk89gm.js +0 -5
  436. package/dist/chunks/iframe-host-ck6vejt5.js +0 -4
  437. package/dist/chunks/index-b8xw3vy9.js +0 -4
  438. package/dist/chunks/jsonMode-w15cmrcm.js +0 -13
  439. package/dist/chunks/jx-validate-at3zn8wa.js +0 -4
  440. package/dist/chunks/layers-h4xp1pss.js +0 -4
  441. package/dist/chunks/layers-panel-m5hw1d7g.js +0 -4
  442. package/dist/chunks/lit-html-8t8t3dnr.js +0 -4
  443. package/dist/chunks/media-picker-2cweexc5.js +0 -4
  444. package/dist/chunks/menu-ynw13y0s.js +0 -4
  445. package/dist/chunks/monaco-buffer-qzxn567r.js +0 -4
  446. package/dist/chunks/monaco-setup-gxf6656g.js +0 -4
  447. package/dist/chunks/notify-cj5zbrs2.js +0 -4
  448. package/dist/chunks/parse-b7ddhr8m.js +0 -4
  449. package/dist/chunks/platform-3dfws9js.js +0 -4
  450. package/dist/chunks/popover-jt2gxmzs.js +0 -4
  451. package/dist/chunks/publish-panel-1gvxbj21.js +0 -4
  452. package/dist/chunks/quick-search-0dajrwqg.js +0 -4
  453. package/dist/chunks/references-49qgt404.js +0 -4
  454. package/dist/chunks/right-panel-jm1bwe53.js +0 -4
  455. package/dist/chunks/section-registry-6kwc4fky.js +0 -4
  456. package/dist/chunks/studio-0rt52vpq.js +0 -5
  457. package/dist/chunks/studio-18vgbhs5.js +0 -5
  458. package/dist/chunks/studio-24mccdrj.js +0 -5
  459. package/dist/chunks/studio-2eh507zk.js +0 -9
  460. package/dist/chunks/studio-2hcbccfv.js +0 -5
  461. package/dist/chunks/studio-2jbs3rxv.js +0 -5
  462. package/dist/chunks/studio-4h8k4dw9.js +0 -5
  463. package/dist/chunks/studio-5f6n18kx.js +0 -5
  464. package/dist/chunks/studio-5gthpky6.js +0 -5
  465. package/dist/chunks/studio-6ep3js6b.js +0 -9
  466. package/dist/chunks/studio-6wkmf3wz.js +0 -9
  467. package/dist/chunks/studio-841rf3cg.js +0 -5
  468. package/dist/chunks/studio-8gmwgheg.js +0 -5
  469. package/dist/chunks/studio-8qm0ep50.js +0 -5
  470. package/dist/chunks/studio-924p1tm1.js +0 -6
  471. package/dist/chunks/studio-a3shpz9y.js +0 -5
  472. package/dist/chunks/studio-amsbaaar.js +0 -6
  473. package/dist/chunks/studio-at5spjbc.js +0 -7
  474. package/dist/chunks/studio-b2xv945e.js +0 -5
  475. package/dist/chunks/studio-bn5nkafw.js +0 -5
  476. package/dist/chunks/studio-bw6q5xjf.js +0 -9
  477. package/dist/chunks/studio-c7q0t9x1.js +0 -5
  478. package/dist/chunks/studio-camnhc96.js +0 -6
  479. package/dist/chunks/studio-cffqvnzd.js +0 -5
  480. package/dist/chunks/studio-efvfrsf8.js +0 -5
  481. package/dist/chunks/studio-er30bpcx.js +0 -5
  482. package/dist/chunks/studio-ezscgr64.js +0 -5
  483. package/dist/chunks/studio-ffrrncvz.js +0 -5
  484. package/dist/chunks/studio-fpphgn8y.js +0 -10
  485. package/dist/chunks/studio-j1kvhdjk.js +0 -4
  486. package/dist/chunks/studio-j430n16g.js +0 -7
  487. package/dist/chunks/studio-jjkg84nj.js +0 -5
  488. package/dist/chunks/studio-m0q32ars.js +0 -4
  489. package/dist/chunks/studio-m6bdst11.js +0 -5
  490. package/dist/chunks/studio-nv2cptd4.js +0 -64
  491. package/dist/chunks/studio-nwfrc98n.js +0 -5
  492. package/dist/chunks/studio-p1wgvp7r.js +0 -5
  493. package/dist/chunks/studio-pag2wncm.js +0 -5
  494. package/dist/chunks/studio-qvanvzfd.js +0 -5
  495. package/dist/chunks/studio-qwa64kt7.js +0 -5
  496. package/dist/chunks/studio-rk1zc4x3.js +0 -928
  497. package/dist/chunks/studio-se2r3ptc.js +0 -5
  498. package/dist/chunks/studio-sg2a0dh0.js +0 -5
  499. package/dist/chunks/studio-tjzjhe68.js +0 -5
  500. package/dist/chunks/studio-v2w7q8r1.js +0 -7
  501. package/dist/chunks/studio-v5vjq1h0.js +0 -4
  502. package/dist/chunks/studio-v8aga3vp.js +0 -14
  503. package/dist/chunks/studio-vfcdrfmv.js +0 -5
  504. package/dist/chunks/studio-vmfkgdjf.js +0 -5
  505. package/dist/chunks/studio-wt1816jj.js +0 -5
  506. package/dist/chunks/studio-wz73q5kq.js +0 -4
  507. package/dist/chunks/studio-y04qtxvp.js +0 -7
  508. package/dist/chunks/studio-y21g8zzg.js +0 -5
  509. package/dist/chunks/studio-y64hrt8p.js +0 -12
  510. package/dist/chunks/studio-ynn90f58.js +0 -16
  511. package/dist/chunks/studio-yxz682sx.js +0 -5
  512. package/dist/chunks/studio-zp7snvkq.js +0 -5
  513. package/dist/chunks/studio-zq4z6tm6.js +0 -5
  514. package/dist/chunks/toast-c9fn075p.js +0 -4
  515. package/dist/chunks/tsMode-sf49ee9x.js +0 -14
  516. package/dist/chunks/workspace-jtfahpee.js +0 -4
  517. package/src/panels/frontmatter-panel.ts +0 -711
  518. package/src/panels/git-panel.ts +0 -1108
  519. package/src/surfaces/doc-header.json +0 -776
  520. package/src/surfaces/doc-header.ts +0 -222
  521. package/src/surfaces/git-panel.json +0 -1880
  522. package/src/surfaces/git-panel.ts +0 -264
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioLibraryPane",
4
- "$description": "The Library: the pane that BROWSES a project's files, as a Jx document over the kit. The adapter (`browse/library-pane.ts`) keeps every decision — which files the scan found, which the filter kept, which of them the window renders, where an upload lands and what a row's context menu offers — and hands this document one projection: a discriminant naming which of nine things to draw, the toolbar's chips already marked, and rows that are already strings. Nothing here asks what a file is, how big the viewport is, or whether the scan finished. The nine cases of `view` are the four honest empty states the Manage view collapsed into “No files found” — a scan still running, a scan that could not finish, a project with no files, and a filter that matched nothing — followed by the five layouts, so “what is on screen” has exactly one source. A card's live preview is an ISLAND: the document renders `doc-preview` and nothing inside it, and the adapter fills it through `onNodeCreated` when the card comes into view.",
4
+ "$description": "The Content home (studio.md §22.5): one collection, browsed, as a Jx document over the kit. The adapter (`browse/library-pane.ts`) keeps every decision — which collection is shown, which of its files the filter kept, which of them the window renders, where the collection is published, and what a row's context menu offers — and hands this document one projection: a discriminant naming which of eight things to draw, the view switch already marked, a header line that is one of four states, and rows that are already strings. Nothing here asks what a file is, how big the viewport is, or whether the scan finished. The eight cases of `view` are the four honest empty states the Manage view collapsed into “No files found” — a scan still running, a scan that could not finish, a collection with nothing in it, and a filter that matched nothing — followed by the four views, so “what is on screen” has exactly one source. A card's live preview is an ISLAND: the document renders `doc-preview` and nothing inside it, and the adapter fills it through `onNodeCreated` when the card comes into view.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "library",
@@ -17,18 +17,46 @@
17
17
  "fontFamily": "var(--jx-font-sans)",
18
18
  "fontSize": "var(--jx-text-md)",
19
19
  "color": "var(--fg)",
20
- "& [part=\"banner-slot\"], & [part=\"locale-slot\"], & [part=\"view-slot\"], & [part=\"art-slot\"], & [part=\"note-slot\"], & [part=\"truncated-slot\"]": {
20
+ "& [part=\"banner-slot\"], & [part=\"locale-slot\"], & [part=\"filter-slot\"], & [part=\"fields-slot\"], & [part=\"new-slot\"], & [part=\"page-slot\"], & [part=\"view-slot\"], & [part=\"art-slot\"], & [part=\"note-slot\"], & [part=\"truncated-slot\"]": {
21
21
  "$description": "A `$switch` renders its own container, and none of these six is a box: each stands exactly where its case does, so the case's own rule is the only one that lays anything out.",
22
22
  "display": "contents"
23
23
  },
24
- "& [part=\"toolbar\"]": {
25
- "$description": "It wraps rather than scrolls: the categories, the language facet, the filter, the two verbs and the layout switch are all equally reachable, and a toolbar that hid half of them behind an overflow would put the Library's own state somewhere the reader has to go looking for it.",
24
+ "& [part=\"head\"]": {
25
+ "$description": "The collection's title over its toolbar: the Content-Collection and Content-Pages boards' heading row. It does not scroll with the list.",
26
26
  "display": "flex",
27
- "alignItems": "center",
28
- "gap": "var(--jx-space-4)",
29
- "padding": "var(--jx-space-3) var(--jx-space-5)",
27
+ "flexDirection": "column",
28
+ "gap": "var(--jx-space-3)",
29
+ "padding": "var(--jx-space-4) var(--jx-space-5) var(--jx-space-3)",
30
30
  "background": "var(--bg-panel)",
31
31
  "borderBottom": "1px solid var(--border)",
32
+ "flexShrink": "0"
33
+ },
34
+ "& [part=\"heading\"]": {
35
+ "display": "flex",
36
+ "flexDirection": "column",
37
+ "gap": "var(--jx-space-1)"
38
+ },
39
+ "& [part=\"title\"]": {
40
+ "margin": "0",
41
+ "fontSize": "var(--jx-text-lg)",
42
+ "fontWeight": "600",
43
+ "color": "var(--fg)"
44
+ },
45
+ "& [part=\"subtitle\"]": {
46
+ "margin": "0",
47
+ "fontSize": "var(--jx-text-md)",
48
+ "color": "var(--fg-dim)"
49
+ },
50
+ "& [part=\"subtitle\"]:empty": {
51
+ "$description": "Only Pages carries a line under its title; a collection's own line is the header bar below the toolbar.",
52
+ "display": "none"
53
+ },
54
+ "& [part=\"toolbar\"]": {
55
+ "$description": "It wraps rather than scrolls: the view switch, the search, the language facet, Fields and New are all equally reachable, and a toolbar that hid half of them behind an overflow would put the collection's own state somewhere the reader has to go looking for it.",
56
+ "display": "flex",
57
+ "alignItems": "center",
58
+ "gap": "var(--jx-space-3)",
59
+ "padding": "0",
32
60
  "flexShrink": "0",
33
61
  "flexWrap": "wrap"
34
62
  },
@@ -39,41 +67,15 @@
39
67
  "$description": "Narrow on purpose: it holds one language name, and the toolbar wraps before it grows.",
40
68
  "width": "160px"
41
69
  },
42
- "& [part=\"upload\"]": {
43
- "$description": "A LABEL around the file picker, not a button that clicks a hidden one. The picker is the control — it takes focus, Enter opens it, and a screen reader announces it as a file upload — so the button, the `.library-upload-input` class it looked for and the `querySelector` that found it all go together. Drawn as a plain element rather than a `jx-action-button` because a label is what forwards a click to the input it contains, and a custom element between the two would break the forwarding the whole arrangement rests on.",
44
- "display": "inline-flex",
45
- "alignItems": "center",
46
- "gap": "6px",
47
- "height": "24px",
48
- "padding": "0 var(--jx-space-3)",
49
- "borderRadius": "var(--radius)",
50
- "color": "var(--fg)",
51
- "font": "inherit",
52
- "cursor": "pointer",
53
- ":hover": {
54
- "background": "var(--hover-bg)"
55
- },
56
- ":has(:focus-visible)": {
57
- "outline": "var(--jx-focus-ring)",
58
- "outlineOffset": "2px"
59
- }
60
- },
61
- "& [part=\"upload-input\"]": {
62
- "$description": "Out of the way but still FOCUSABLE. `display: none` — what the class it replaces did — takes the control out of the tab order, which is why there had to be a button clicking it from the side; a one-pixel transparent box leaves the keyboard path intact and the label above draws the focus ring for it.",
63
- "position": "absolute",
64
- "width": "1px",
65
- "height": "1px",
66
- "opacity": "0",
67
- "pointerEvents": "none"
68
- },
69
- "& [part=\"upload-glyph\"]": {
70
- "--jx-icon-size": "16px"
70
+ "& [part=\"filter\"]": {
71
+ "$description": "Narrow like the language facet: it holds one value of one field.",
72
+ "width": "160px"
71
73
  },
72
74
  "& [part=\"spacer\"]": {
73
75
  "flex": "1"
74
76
  },
75
77
  "& [part=\"layouts\"]": {
76
- "marginLeft": "auto"
78
+ "flexShrink": "0"
77
79
  },
78
80
  "& [part=\"banner\"]": {
79
81
  "$description": "The banner an INCOMPLETE listing carries. The Problem in the dock is the durable record; this is the same fact on the surface it is about, because a reader looking at a short list needs to know it is short for a reason without going anywhere to find out.",
@@ -90,14 +92,9 @@
90
92
  "& [part=\"body\"]": {
91
93
  "flex": "1",
92
94
  "minHeight": "0",
93
- "overflowY": "auto",
95
+ "overflow": "auto",
94
96
  "position": "relative"
95
97
  },
96
- "& [part=\"body\"][data-drop=\"true\"]": {
97
- "$description": "The drop affordance is a STATE the adapter holds, not a class the handler adds and forgets to take off. It was the latter, and the two removals — dragleave and drop — were the only things standing between a cancelled drag and an outline that never went away.",
98
- "outline": "2px dashed var(--accent)",
99
- "outlineOffset": "-4px"
100
- },
101
98
  "& [part=\"empty\"]": {
102
99
  "padding": "48px var(--jx-space-6)",
103
100
  "textAlign": "center",
@@ -130,9 +127,6 @@
130
127
  "& [part=\"grid\"][data-layout=\"cards\"]": {
131
128
  "gridTemplateColumns": "repeat(auto-fill, minmax(188px, 1fr))"
132
129
  },
133
- "& [part=\"grid\"][data-layout=\"media\"]": {
134
- "gridTemplateColumns": "repeat(auto-fill, minmax(120px, 1fr))"
135
- },
136
130
  "& [part=\"card\"], & [part=\"tile\"]": {
137
131
  "cursor": "pointer",
138
132
  "overflow": "hidden",
@@ -157,17 +151,12 @@
157
151
  "color": "var(--fg-dim)"
158
152
  },
159
153
  "& [part=\"doc-preview\"]": {
160
- "$description": "The island. The document renders this box and nothing inside it; the adapter mounts a real runtime render of the file into it when the card comes into view, and the scale below is what makes a page-sized document readable as a thumbnail without rendering it at thumbnail size.",
154
+ "$description": "The island. The document renders this box and nothing inside it; the adapter mounts a real runtime render of the file into a shadow root of the island's own when the card comes into view (`mountPreview` in `browse/library-preview.ts`, which keeps the document's ids out of Studio's), and the zoom is what makes a page-sized document readable as a thumbnail without rendering it at thumbnail size: the render is laid out in a box two and a half times as wide and drawn at 0.4. It is `inert`, so a page's own links and buttons are neither focusable nor named inside the card.",
161
155
  "width": "100%",
162
156
  "height": "100%",
157
+ "zoom": "0.4",
163
158
  "overflow": "hidden"
164
159
  },
165
- "& [part=\"doc-preview\"] > *": {
166
- "transform": "scale(0.4)",
167
- "transformOrigin": "top left",
168
- "width": "250%",
169
- "height": "250%"
170
- },
171
160
  "& [part=\"thumb\"]": {
172
161
  "maxWidth": "100%",
173
162
  "maxHeight": "100%",
@@ -190,6 +179,7 @@
190
179
  "$description": "A windowed list rather than a table component: the rows have to be sliceable, and every table widget wants the whole set.",
191
180
  "display": "flex",
192
181
  "flexDirection": "column",
182
+ "minWidth": "min-content",
193
183
  "padding": "0 var(--jx-space-5) var(--jx-space-5)"
194
184
  },
195
185
  "& [part=\"table-head\"], & [part=\"table-row\"]": {
@@ -214,19 +204,23 @@
214
204
  "background": "var(--hover-bg)"
215
205
  },
216
206
  "& [part=\"cell\"]": {
207
+ "$description": "Every column keeps a floor: with a collection's six field columns beside the file facts, a cell that may shrink to nothing is a column of ellipses. When the floors outgrow the pane, the table scrolls sideways instead. Each cell's text is kept out of its intrinsic width (`contain: inline-size`), so the table's `min-content` is the sum of those floors rather than of every full title.",
217
208
  "flex": "1",
218
- "minWidth": "0",
209
+ "minWidth": "80px",
210
+ "contain": "inline-size",
219
211
  "overflow": "hidden",
220
212
  "textOverflow": "ellipsis",
221
213
  "whiteSpace": "nowrap",
222
214
  "fontSize": "var(--jx-text-md)"
223
215
  },
224
- "& [part=\"cell\"][data-field=\"name\"]": {
216
+ "& [part=\"cell\"][data-field=\"name\"], & [part=\"cell\"][data-field=\"title\"]": {
217
+ "$description": "What a row is called keeps a readable width however many field columns stand beside it.",
225
218
  "flex": "3",
219
+ "minWidth": "220px",
226
220
  "fontWeight": "500"
227
221
  },
228
222
  "& [part=\"cell\"][data-field=\"path\"]": {
229
- "flex": "3",
223
+ "flex": "2",
230
224
  "color": "var(--fg-dim)",
231
225
  "fontFamily": "var(--font-mono)",
232
226
  "fontSize": "var(--jx-text-sm)"
@@ -301,104 +295,148 @@
301
295
  },
302
296
  "& [part=\"list-item\"]:hover": {
303
297
  "background": "var(--hover-bg)"
298
+ },
299
+ "& [part=\"page-line\"]": {
300
+ "$description": "One line saying where the collection's entries are published, the Content-Collection board's bar under the toolbar. Its action is quiet: it opens another workspace, and it must not compete with New.",
301
+ "display": "flex",
302
+ "alignItems": "center",
303
+ "flexWrap": "wrap",
304
+ "gap": "var(--jx-space-2)",
305
+ "padding": "var(--jx-space-2) var(--jx-space-5)",
306
+ "background": "var(--bg-panel)",
307
+ "borderBottom": "1px solid var(--border)",
308
+ "fontSize": "var(--jx-text-md)",
309
+ "color": "var(--fg-dim)",
310
+ "flexShrink": "0"
311
+ },
312
+ "& [part=\"page-pattern\"]": {
313
+ "fontFamily": "var(--font-mono)",
314
+ "fontSize": "var(--jx-text-sm)",
315
+ "color": "var(--fg)"
316
+ },
317
+ "& [part=\"design-page\"], & [part=\"add-page\"]": {
318
+ "marginLeft": "auto"
319
+ },
320
+ "& [part=\"card\"]:focus-visible, & [part=\"table-row\"]:focus-visible, & [part=\"list-item\"]:focus-visible": {
321
+ "$description": "Rows and cards open on Enter or Space as well as a click, so the keyboard reaches an entry; the ring says which one it is on.",
322
+ "outline": "var(--jx-focus-ring)",
323
+ "outlineOffset": "-2px"
304
324
  }
305
325
  },
306
326
  "children": [
307
327
  {
308
328
  "tagName": "div",
309
329
  "attributes": {
310
- "part": "toolbar"
330
+ "part": "head"
311
331
  },
312
332
  "children": [
313
333
  {
314
- "tagName": "jx-action-group",
334
+ "tagName": "div",
315
335
  "attributes": {
316
- "part": "categories"
317
- },
318
- "$props": {
319
- "selects": "single",
320
- "compact": true,
321
- "label": "Category"
336
+ "part": "heading"
322
337
  },
323
338
  "children": [
324
339
  {
325
- "$prototype": "Array",
326
- "items": {
327
- "$ref": "#/state/categories"
340
+ "tagName": "h2",
341
+ "attributes": {
342
+ "part": "title"
328
343
  },
329
- "key": {
330
- "$ref": "$map/item/key"
344
+ "textContent": "${state.title}"
345
+ },
346
+ {
347
+ "tagName": "p",
348
+ "attributes": {
349
+ "part": "subtitle"
331
350
  },
332
- "map": {
333
- "tagName": "jx-action-button",
334
- "attributes": {
335
- "part": "category",
336
- "data-category": "${$map.item.key}"
337
- },
338
- "$props": {
339
- "size": "sm",
340
- "checked": {
341
- "$ref": "$map/item/checked"
342
- }
343
- },
344
- "onclick": {
345
- "$prototype": "Function",
346
- "body": [
347
- {
348
- "operator": "call",
349
- "target": {
350
- "$ref": "#/state/setCategory"
351
- },
352
- "value": [
353
- {
354
- "$ref": "$map/item/key"
355
- }
356
- ]
357
- }
358
- ]
359
- },
360
- "children": [
361
- {
362
- "tagName": "span",
363
- "textContent": "${$map.item.label}"
364
- }
365
- ]
366
- }
351
+ "textContent": "${state.subtitle}"
367
352
  }
368
353
  ]
369
354
  },
370
355
  {
371
356
  "tagName": "div",
372
357
  "attributes": {
373
- "part": "locale-slot",
374
- "role": "none"
375
- },
376
- "$switch": {
377
- "$ref": "#/state/localeState"
358
+ "part": "toolbar"
378
359
  },
379
- "cases": {
380
- "shown": {
381
- "tagName": "jx-select",
360
+ "children": [
361
+ {
362
+ "tagName": "jx-action-group",
363
+ "attributes": {
364
+ "part": "layouts"
365
+ },
366
+ "$props": {
367
+ "selects": "single",
368
+ "compact": true,
369
+ "label": "View"
370
+ },
371
+ "children": [
372
+ {
373
+ "$prototype": "Array",
374
+ "items": {
375
+ "$ref": "#/state/layouts"
376
+ },
377
+ "key": {
378
+ "$ref": "$map/item/key"
379
+ },
380
+ "map": {
381
+ "tagName": "jx-action-button",
382
+ "attributes": {
383
+ "part": "layout",
384
+ "data-layout": "${$map.item.key}"
385
+ },
386
+ "$props": {
387
+ "size": "sm",
388
+ "hint": "${$map.item.label}",
389
+ "checked": {
390
+ "$ref": "$map/item/checked"
391
+ }
392
+ },
393
+ "onclick": {
394
+ "$prototype": "Function",
395
+ "body": [
396
+ {
397
+ "operator": "call",
398
+ "target": {
399
+ "$ref": "#/state/setLayout"
400
+ },
401
+ "value": [
402
+ {
403
+ "$ref": "$map/item/key"
404
+ }
405
+ ]
406
+ }
407
+ ]
408
+ },
409
+ "children": [
410
+ {
411
+ "tagName": "span",
412
+ "textContent": "${$map.item.label}"
413
+ }
414
+ ]
415
+ }
416
+ }
417
+ ]
418
+ },
419
+ {
420
+ "tagName": "jx-textfield",
382
421
  "attributes": {
383
- "part": "locale"
422
+ "part": "search"
384
423
  },
385
424
  "$props": {
386
- "label": "Language",
425
+ "label": "${state.searchLabel}",
426
+ "placeholder": "${state.searchLabel}…",
387
427
  "size": "sm",
388
- "options": {
389
- "$ref": "#/state/localeOptions"
390
- },
391
428
  "value": {
392
- "$ref": "#/state/localeValue"
393
- }
429
+ "$ref": "#/state/query"
430
+ },
431
+ "type": "search"
394
432
  },
395
- "onchange": {
433
+ "oninput": {
396
434
  "$prototype": "Function",
397
435
  "body": [
398
436
  {
399
437
  "operator": "call",
400
438
  "target": {
401
- "$ref": "#/state/setLocale"
439
+ "$ref": "#/state/search"
402
440
  },
403
441
  "value": [
404
442
  {
@@ -406,189 +444,366 @@
406
444
  }
407
445
  ]
408
446
  }
409
- ],
410
- "description": "The facet's options come from ALL scanned files, never from the filtered ones: a picker whose choices collapse to the choice just made cannot be used to make another."
447
+ ]
411
448
  }
412
- }
413
- }
414
- },
415
- {
416
- "tagName": "jx-textfield",
417
- "attributes": {
418
- "part": "search"
419
- },
420
- "$props": {
421
- "label": "Filter files",
422
- "placeholder": "Filter files…",
423
- "size": "sm",
424
- "value": {
425
- "$ref": "#/state/query"
426
- }
427
- },
428
- "oninput": {
429
- "$prototype": "Function",
430
- "body": [
431
- {
432
- "operator": "call",
433
- "target": {
434
- "$ref": "#/state/search"
435
- },
436
- "value": [
437
- {
438
- "$ref": "event#/target/value"
449
+ },
450
+ {
451
+ "tagName": "div",
452
+ "attributes": {
453
+ "part": "locale-slot",
454
+ "role": "none"
455
+ },
456
+ "$switch": {
457
+ "$ref": "#/state/localeState"
458
+ },
459
+ "cases": {
460
+ "shown": {
461
+ "tagName": "jx-select",
462
+ "attributes": {
463
+ "part": "locale"
464
+ },
465
+ "$props": {
466
+ "label": "Language",
467
+ "size": "sm",
468
+ "options": {
469
+ "$ref": "#/state/localeOptions"
470
+ },
471
+ "value": {
472
+ "$ref": "#/state/localeValue"
473
+ }
474
+ },
475
+ "onchange": {
476
+ "$prototype": "Function",
477
+ "body": [
478
+ {
479
+ "operator": "call",
480
+ "target": {
481
+ "$ref": "#/state/setLocale"
482
+ },
483
+ "value": [
484
+ {
485
+ "$ref": "event#/target/value"
486
+ }
487
+ ]
488
+ }
489
+ ],
490
+ "description": "The facet's options come from ALL scanned files, never from the filtered ones: a picker whose choices collapse to the choice just made cannot be used to make another."
439
491
  }
440
- ]
492
+ }
441
493
  }
442
- ]
443
- }
444
- },
445
- {
446
- "tagName": "jx-action-button",
447
- "attributes": {
448
- "part": "new"
449
- },
450
- "$props": {
451
- "size": "sm",
452
- "icon": "plus",
453
- "haspopup": "menu"
454
- },
455
- "onclick": {
456
- "$prototype": "Function",
457
- "body": [
458
- {
459
- "operator": "call",
460
- "target": {
461
- "$ref": "#/state/openNewMenu"
462
- },
463
- "value": [
464
- {
465
- "$ref": "event#/currentTarget"
494
+ },
495
+ {
496
+ "tagName": "div",
497
+ "attributes": {
498
+ "part": "filter-slot",
499
+ "role": "none"
500
+ },
501
+ "$switch": {
502
+ "$ref": "#/state/filterState"
503
+ },
504
+ "cases": {
505
+ "shown": {
506
+ "$description": "The Filter: one value of what groups the entries, their status or the field the Board groups by, so it offers exactly the Board's columns.",
507
+ "tagName": "jx-select",
508
+ "attributes": {
509
+ "part": "filter"
510
+ },
511
+ "$props": {
512
+ "label": "Filter",
513
+ "size": "sm",
514
+ "options": {
515
+ "$ref": "#/state/filterOptions"
516
+ },
517
+ "value": {
518
+ "$ref": "#/state/filterValue"
519
+ }
520
+ },
521
+ "onchange": {
522
+ "$prototype": "Function",
523
+ "body": [
524
+ {
525
+ "operator": "call",
526
+ "target": {
527
+ "$ref": "#/state/setFilter"
528
+ },
529
+ "value": [
530
+ {
531
+ "$ref": "event#/target/value"
532
+ }
533
+ ]
534
+ }
535
+ ]
466
536
  }
467
- ]
537
+ }
538
+ }
539
+ },
540
+ {
541
+ "tagName": "span",
542
+ "attributes": {
543
+ "part": "spacer"
544
+ }
545
+ },
546
+ {
547
+ "tagName": "div",
548
+ "attributes": {
549
+ "part": "grid-slot",
550
+ "role": "none"
551
+ },
552
+ "$switch": {
553
+ "$ref": "#/state/fieldsState"
554
+ },
555
+ "cases": {
556
+ "shown": {
557
+ "tagName": "jx-action-button",
558
+ "attributes": {
559
+ "part": "edit-grid"
560
+ },
561
+ "$props": {
562
+ "size": "sm",
563
+ "icon": "rows",
564
+ "hint": "Edit every entry of this collection in a grid"
565
+ },
566
+ "onclick": {
567
+ "$prototype": "Function",
568
+ "body": [
569
+ {
570
+ "operator": "call",
571
+ "target": {
572
+ "$ref": "#/state/openGrid"
573
+ },
574
+ "value": []
575
+ }
576
+ ],
577
+ "description": "The collection's grid (`collection.editInGrid { name }`): the one visible door to it, since the palette cannot prompt for a free-text name."
578
+ },
579
+ "children": [
580
+ {
581
+ "tagName": "span",
582
+ "textContent": "Edit in grid"
583
+ }
584
+ ]
585
+ }
586
+ }
587
+ },
588
+ {
589
+ "tagName": "div",
590
+ "attributes": {
591
+ "part": "fields-slot",
592
+ "role": "none"
593
+ },
594
+ "$switch": {
595
+ "$ref": "#/state/fieldsState"
596
+ },
597
+ "cases": {
598
+ "shown": {
599
+ "tagName": "jx-action-button",
600
+ "attributes": {
601
+ "part": "fields"
602
+ },
603
+ "$props": {
604
+ "size": "sm",
605
+ "icon": "sliders-horizontal",
606
+ "hint": "Edit this collection's fields in Project Settings",
607
+ "haspopup": "dialog"
608
+ },
609
+ "onclick": {
610
+ "$prototype": "Function",
611
+ "body": [
612
+ {
613
+ "operator": "call",
614
+ "target": {
615
+ "$ref": "#/state/openFields"
616
+ },
617
+ "value": []
618
+ }
619
+ ],
620
+ "description": "Project Settings › Content types, on this collection (`settings.open { section: \"content\", entry }`)."
621
+ },
622
+ "children": [
623
+ {
624
+ "tagName": "span",
625
+ "textContent": "Fields"
626
+ }
627
+ ]
628
+ }
468
629
  }
469
- ],
470
- "description": "Creation is somebody else's flow: a page, layout or component is `files.ts`'s, a collection entry is `content/entry-commands.ts`'s. The menu only names which."
630
+ },
631
+ {
632
+ "tagName": "div",
633
+ "attributes": {
634
+ "part": "new-slot",
635
+ "role": "none"
636
+ },
637
+ "$switch": {
638
+ "$ref": "#/state/newState"
639
+ },
640
+ "cases": {
641
+ "shown": {
642
+ "tagName": "jx-button",
643
+ "attributes": {
644
+ "part": "new"
645
+ },
646
+ "$props": {
647
+ "size": "sm",
648
+ "variant": "accent"
649
+ },
650
+ "onclick": {
651
+ "$prototype": "Function",
652
+ "body": [
653
+ {
654
+ "operator": "call",
655
+ "target": {
656
+ "$ref": "#/state/openNew"
657
+ },
658
+ "value": []
659
+ }
660
+ ],
661
+ "description": "Creation is somebody else's flow: `file.new` opens Add new on this collection's kind, a page for Pages and an entry for a collection."
662
+ },
663
+ "children": [
664
+ {
665
+ "tagName": "span",
666
+ "textContent": "${state.newLabel}"
667
+ }
668
+ ]
669
+ }
670
+ }
671
+ }
672
+ ]
673
+ }
674
+ ]
675
+ },
676
+ {
677
+ "$description": "The header line: where this collection's entries are published, derived from the page whose `$paths.contentType` names it. Pages draw nothing here.",
678
+ "tagName": "div",
679
+ "attributes": {
680
+ "part": "page-slot",
681
+ "role": "none"
682
+ },
683
+ "$switch": {
684
+ "$ref": "#/state/page/state"
685
+ },
686
+ "cases": {
687
+ "loading": {
688
+ "tagName": "div",
689
+ "attributes": {
690
+ "part": "page-line"
471
691
  },
472
692
  "children": [
473
693
  {
474
694
  "tagName": "span",
475
- "textContent": "New"
695
+ "attributes": {
696
+ "part": "page-text"
697
+ },
698
+ "textContent": "${state.page.text}"
476
699
  }
477
700
  ]
478
701
  },
479
- {
480
- "tagName": "label",
702
+ "page": {
703
+ "tagName": "div",
481
704
  "attributes": {
482
- "part": "upload",
483
- "title": "${state.uploadHint}"
705
+ "part": "page-line",
706
+ "data-state": "page"
484
707
  },
485
708
  "children": [
486
709
  {
487
- "tagName": "input",
710
+ "tagName": "span",
711
+ "attributes": {
712
+ "part": "page-text"
713
+ },
714
+ "textContent": "${state.page.text}"
715
+ },
716
+ {
717
+ "tagName": "code",
718
+ "attributes": {
719
+ "part": "page-pattern"
720
+ },
721
+ "textContent": "${state.page.pattern}"
722
+ },
723
+ {
724
+ "tagName": "span",
725
+ "attributes": {
726
+ "part": "page-template"
727
+ },
728
+ "textContent": "${state.page.template}"
729
+ },
730
+ {
731
+ "tagName": "jx-action-button",
488
732
  "attributes": {
489
- "part": "upload-input",
490
- "type": "file",
491
- "multiple": true,
492
- "accept": "${state.uploadAccept}"
733
+ "part": "design-page"
734
+ },
735
+ "$props": {
736
+ "size": "sm",
737
+ "quiet": true
493
738
  },
494
- "onchange": {
739
+ "onclick": {
495
740
  "$prototype": "Function",
496
741
  "body": [
497
742
  {
498
743
  "operator": "call",
499
744
  "target": {
500
- "$ref": "#/state/upload"
745
+ "$ref": "#/state/designPage"
501
746
  },
502
- "value": [
503
- {
504
- "$ref": "event#/target"
505
- }
506
- ]
747
+ "value": []
507
748
  }
508
749
  ],
509
- "description": "The picker itself, so the destination in the label's tooltip is visible BEFORE the files are chosen. The adapter takes the element rather than the file list because a file input that is not cleared refuses the same file twice."
510
- }
511
- },
512
- {
513
- "tagName": "jx-icon",
514
- "attributes": {
515
- "part": "upload-glyph"
750
+ "description": "Opening the page is activating it, which enters Design (studio.md §22.1)."
516
751
  },
517
- "$props": {
518
- "name": "upload-simple"
519
- }
520
- },
521
- {
522
- "tagName": "span",
523
- "textContent": "Upload"
752
+ "children": [
753
+ {
754
+ "tagName": "span",
755
+ "textContent": "${state.page.designLabel}"
756
+ }
757
+ ]
524
758
  }
525
759
  ]
526
760
  },
527
- {
528
- "tagName": "span",
529
- "attributes": {
530
- "part": "spacer"
531
- }
532
- },
533
- {
534
- "tagName": "jx-action-group",
761
+ "none": {
762
+ "tagName": "div",
535
763
  "attributes": {
536
- "part": "layouts"
537
- },
538
- "$props": {
539
- "selects": "single",
540
- "compact": true,
541
- "label": "Layout"
764
+ "part": "page-line",
765
+ "data-state": "none"
542
766
  },
543
767
  "children": [
544
768
  {
545
- "$prototype": "Array",
546
- "items": {
547
- "$ref": "#/state/layouts"
769
+ "tagName": "span",
770
+ "attributes": {
771
+ "part": "page-text"
548
772
  },
549
- "key": {
550
- "$ref": "$map/item/key"
773
+ "textContent": "${state.page.text}"
774
+ },
775
+ {
776
+ "tagName": "jx-action-button",
777
+ "attributes": {
778
+ "part": "add-page"
551
779
  },
552
- "map": {
553
- "tagName": "jx-action-button",
554
- "attributes": {
555
- "part": "layout",
556
- "data-layout": "${$map.item.key}"
557
- },
558
- "$props": {
559
- "size": "sm",
560
- "hint": "${$map.item.label}",
561
- "checked": {
562
- "$ref": "$map/item/checked"
563
- }
564
- },
565
- "onclick": {
566
- "$prototype": "Function",
567
- "body": [
568
- {
569
- "operator": "call",
570
- "target": {
571
- "$ref": "#/state/setLayout"
572
- },
573
- "value": [
574
- {
575
- "$ref": "$map/item/key"
576
- }
577
- ]
578
- }
579
- ]
580
- },
581
- "children": [
780
+ "$props": {
781
+ "size": "sm",
782
+ "quiet": true
783
+ },
784
+ "onclick": {
785
+ "$prototype": "Function",
786
+ "body": [
582
787
  {
583
- "tagName": "span",
584
- "textContent": "${$map.item.label}"
788
+ "operator": "call",
789
+ "target": {
790
+ "$ref": "#/state/addPage"
791
+ },
792
+ "value": []
585
793
  }
586
- ]
587
- }
794
+ ],
795
+ "description": "Writes the collection's page exactly as Add new's own-page option does."
796
+ },
797
+ "children": [
798
+ {
799
+ "tagName": "span",
800
+ "textContent": "Add one"
801
+ }
802
+ ]
588
803
  }
589
804
  ]
590
805
  }
591
- ]
806
+ }
592
807
  },
593
808
  {
594
809
  "tagName": "div",
@@ -645,54 +860,7 @@
645
860
  {
646
861
  "tagName": "div",
647
862
  "attributes": {
648
- "part": "body",
649
- "data-jx-region": "${state.dropRegion}",
650
- "data-drop": "${state.dropActive}"
651
- },
652
- "ondragover": {
653
- "$prototype": "Function",
654
- "body": [
655
- {
656
- "preventDefault": true
657
- },
658
- {
659
- "operator": "call",
660
- "target": {
661
- "$ref": "#/state/dragOver"
662
- }
663
- }
664
- ],
665
- "description": "An upload has a NAMED destination, shown before the drop — the label's tooltip carries it — and asked for when the active category does not name one."
666
- },
667
- "ondragleave": {
668
- "$prototype": "Function",
669
- "body": [
670
- {
671
- "operator": "call",
672
- "target": {
673
- "$ref": "#/state/dragOut"
674
- }
675
- }
676
- ]
677
- },
678
- "ondrop": {
679
- "$prototype": "Function",
680
- "body": [
681
- {
682
- "preventDefault": true
683
- },
684
- {
685
- "operator": "call",
686
- "target": {
687
- "$ref": "#/state/drop"
688
- },
689
- "value": [
690
- {
691
- "$ref": "event#/dataTransfer/files"
692
- }
693
- ]
694
- }
695
- ]
863
+ "part": "body"
696
864
  },
697
865
  "onscroll": {
698
866
  "$prototype": "Function",
@@ -783,14 +951,14 @@
783
951
  "children": [
784
952
  {
785
953
  "tagName": "p",
786
- "textContent": "This project has no files yet."
954
+ "textContent": "${state.emptyMessage}"
787
955
  },
788
956
  {
789
957
  "tagName": "p",
790
958
  "attributes": {
791
959
  "part": "empty-detail"
792
960
  },
793
- "textContent": "Use New to create a page, layout, component or entry."
961
+ "textContent": "${state.emptyDetail}"
794
962
  }
795
963
  ]
796
964
  },
@@ -866,7 +1034,9 @@
866
1034
  "tagName": "div",
867
1035
  "attributes": {
868
1036
  "part": "card",
869
- "data-path": "${$map.item.path}"
1037
+ "data-path": "${$map.item.path}",
1038
+ "tabindex": "0",
1039
+ "role": "button"
870
1040
  },
871
1041
  "onclick": {
872
1042
  "$prototype": "Function",
@@ -884,6 +1054,50 @@
884
1054
  }
885
1055
  ]
886
1056
  },
1057
+ "onkeydown": {
1058
+ "$prototype": "Function",
1059
+ "body": [
1060
+ {
1061
+ "$switch": {
1062
+ "$ref": "event#/key"
1063
+ },
1064
+ "cases": {
1065
+ "Enter": [
1066
+ {
1067
+ "preventDefault": true
1068
+ },
1069
+ {
1070
+ "operator": "call",
1071
+ "target": {
1072
+ "$ref": "#/state/openFile"
1073
+ },
1074
+ "value": [
1075
+ {
1076
+ "$ref": "$map/item/path"
1077
+ }
1078
+ ]
1079
+ }
1080
+ ],
1081
+ " ": [
1082
+ {
1083
+ "preventDefault": true
1084
+ },
1085
+ {
1086
+ "operator": "call",
1087
+ "target": {
1088
+ "$ref": "#/state/openFile"
1089
+ },
1090
+ "value": [
1091
+ {
1092
+ "$ref": "$map/item/path"
1093
+ }
1094
+ ]
1095
+ }
1096
+ ]
1097
+ }
1098
+ }
1099
+ ]
1100
+ },
887
1101
  "oncontextmenu": {
888
1102
  "$prototype": "Function",
889
1103
  "body": [
@@ -942,7 +1156,8 @@
942
1156
  "tagName": "div",
943
1157
  "attributes": {
944
1158
  "part": "doc-preview",
945
- "data-path": "${$map.item.path}"
1159
+ "data-path": "${$map.item.path}",
1160
+ "inert": ""
946
1161
  }
947
1162
  },
948
1163
  "glyph": {
@@ -978,129 +1193,12 @@
978
1193
  }
979
1194
  ]
980
1195
  },
981
- "media": {
982
- "tagName": "div",
983
- "attributes": {
984
- "part": "grid",
985
- "data-layout": "media",
986
- "style": "${state.pad}"
987
- },
988
- "children": [
989
- {
990
- "$prototype": "Array",
991
- "items": {
992
- "$ref": "#/state/rows"
993
- },
994
- "key": {
995
- "$ref": "$map/item/path"
996
- },
997
- "map": {
998
- "tagName": "div",
999
- "attributes": {
1000
- "part": "tile",
1001
- "data-path": "${$map.item.path}",
1002
- "title": "${$map.item.path}"
1003
- },
1004
- "onclick": {
1005
- "$prototype": "Function",
1006
- "body": [
1007
- {
1008
- "operator": "call",
1009
- "target": {
1010
- "$ref": "#/state/openFile"
1011
- },
1012
- "value": [
1013
- {
1014
- "$ref": "$map/item/path"
1015
- }
1016
- ]
1017
- }
1018
- ]
1019
- },
1020
- "oncontextmenu": {
1021
- "$prototype": "Function",
1022
- "body": [
1023
- {
1024
- "preventDefault": true
1025
- },
1026
- {
1027
- "stopPropagation": true
1028
- },
1029
- {
1030
- "operator": "call",
1031
- "target": {
1032
- "$ref": "#/state/contextMenu"
1033
- },
1034
- "value": [
1035
- {
1036
- "$ref": "$map/item/path"
1037
- },
1038
- {
1039
- "$ref": "event#/clientX"
1040
- },
1041
- {
1042
- "$ref": "event#/clientY"
1043
- }
1044
- ]
1045
- }
1046
- ]
1047
- },
1048
- "children": [
1049
- {
1050
- "tagName": "div",
1051
- "attributes": {
1052
- "part": "tile-art"
1053
- },
1054
- "children": [
1055
- {
1056
- "tagName": "div",
1057
- "attributes": {
1058
- "part": "art-slot",
1059
- "role": "none"
1060
- },
1061
- "$switch": {
1062
- "$ref": "$map/item/art"
1063
- },
1064
- "cases": {
1065
- "image": {
1066
- "tagName": "img",
1067
- "attributes": {
1068
- "part": "thumb",
1069
- "loading": "lazy",
1070
- "src": "${$map.item.src}",
1071
- "alt": ""
1072
- }
1073
- },
1074
- "glyph": {
1075
- "tagName": "jx-icon",
1076
- "attributes": {
1077
- "part": "file-glyph"
1078
- },
1079
- "$props": {
1080
- "name": "file-text"
1081
- }
1082
- }
1083
- }
1084
- }
1085
- ]
1086
- },
1087
- {
1088
- "tagName": "div",
1089
- "attributes": {
1090
- "part": "tile-label"
1091
- },
1092
- "textContent": "${$map.item.name}"
1093
- }
1094
- ]
1095
- }
1096
- }
1097
- ]
1098
- },
1099
1196
  "table": {
1100
1197
  "tagName": "div",
1101
1198
  "attributes": {
1102
1199
  "part": "table",
1103
- "role": "table"
1200
+ "role": "table",
1201
+ "aria-label": "${state.title}"
1104
1202
  },
1105
1203
  "children": [
1106
1204
  {
@@ -1150,7 +1248,8 @@
1150
1248
  "attributes": {
1151
1249
  "part": "table-row",
1152
1250
  "role": "row",
1153
- "data-path": "${$map.item.path}"
1251
+ "data-path": "${$map.item.path}",
1252
+ "tabindex": "0"
1154
1253
  },
1155
1254
  "onclick": {
1156
1255
  "$prototype": "Function",
@@ -1168,6 +1267,50 @@
1168
1267
  }
1169
1268
  ]
1170
1269
  },
1270
+ "onkeydown": {
1271
+ "$prototype": "Function",
1272
+ "body": [
1273
+ {
1274
+ "$switch": {
1275
+ "$ref": "event#/key"
1276
+ },
1277
+ "cases": {
1278
+ "Enter": [
1279
+ {
1280
+ "preventDefault": true
1281
+ },
1282
+ {
1283
+ "operator": "call",
1284
+ "target": {
1285
+ "$ref": "#/state/openFile"
1286
+ },
1287
+ "value": [
1288
+ {
1289
+ "$ref": "$map/item/path"
1290
+ }
1291
+ ]
1292
+ }
1293
+ ],
1294
+ " ": [
1295
+ {
1296
+ "preventDefault": true
1297
+ },
1298
+ {
1299
+ "operator": "call",
1300
+ "target": {
1301
+ "$ref": "#/state/openFile"
1302
+ },
1303
+ "value": [
1304
+ {
1305
+ "$ref": "$map/item/path"
1306
+ }
1307
+ ]
1308
+ }
1309
+ ]
1310
+ }
1311
+ }
1312
+ ]
1313
+ },
1171
1314
  "oncontextmenu": {
1172
1315
  "$prototype": "Function",
1173
1316
  "body": [
@@ -1293,7 +1436,8 @@
1293
1436
  "attributes": {
1294
1437
  "part": "list-item",
1295
1438
  "data-path": "${$map.item.path}",
1296
- "title": "${$map.item.path}"
1439
+ "title": "${$map.item.path}",
1440
+ "tabindex": "0"
1297
1441
  },
1298
1442
  "textContent": "${$map.item.name}",
1299
1443
  "onclick": {
@@ -1312,6 +1456,50 @@
1312
1456
  }
1313
1457
  ]
1314
1458
  },
1459
+ "onkeydown": {
1460
+ "$prototype": "Function",
1461
+ "body": [
1462
+ {
1463
+ "$switch": {
1464
+ "$ref": "event#/key"
1465
+ },
1466
+ "cases": {
1467
+ "Enter": [
1468
+ {
1469
+ "preventDefault": true
1470
+ },
1471
+ {
1472
+ "operator": "call",
1473
+ "target": {
1474
+ "$ref": "#/state/openFile"
1475
+ },
1476
+ "value": [
1477
+ {
1478
+ "$ref": "$map/item/path"
1479
+ }
1480
+ ]
1481
+ }
1482
+ ],
1483
+ " ": [
1484
+ {
1485
+ "preventDefault": true
1486
+ },
1487
+ {
1488
+ "operator": "call",
1489
+ "target": {
1490
+ "$ref": "#/state/openFile"
1491
+ },
1492
+ "value": [
1493
+ {
1494
+ "$ref": "$map/item/path"
1495
+ }
1496
+ ]
1497
+ }
1498
+ ]
1499
+ }
1500
+ }
1501
+ ]
1502
+ },
1315
1503
  "oncontextmenu": {
1316
1504
  "$prototype": "Function",
1317
1505
  "body": [
@@ -1426,7 +1614,8 @@
1426
1614
  "attributes": {
1427
1615
  "part": "list-item",
1428
1616
  "data-path": "${$map.item.path}",
1429
- "title": "${$map.item.path}"
1617
+ "title": "${$map.item.path}",
1618
+ "tabindex": "0"
1430
1619
  },
1431
1620
  "textContent": "${$map.item.name}",
1432
1621
  "onclick": {
@@ -1445,6 +1634,50 @@
1445
1634
  }
1446
1635
  ]
1447
1636
  },
1637
+ "onkeydown": {
1638
+ "$prototype": "Function",
1639
+ "body": [
1640
+ {
1641
+ "$switch": {
1642
+ "$ref": "event#/key"
1643
+ },
1644
+ "cases": {
1645
+ "Enter": [
1646
+ {
1647
+ "preventDefault": true
1648
+ },
1649
+ {
1650
+ "operator": "call",
1651
+ "target": {
1652
+ "$ref": "#/state/openFile"
1653
+ },
1654
+ "value": [
1655
+ {
1656
+ "$ref": "$map/item/path"
1657
+ }
1658
+ ]
1659
+ }
1660
+ ],
1661
+ " ": [
1662
+ {
1663
+ "preventDefault": true
1664
+ },
1665
+ {
1666
+ "operator": "call",
1667
+ "target": {
1668
+ "$ref": "#/state/openFile"
1669
+ },
1670
+ "value": [
1671
+ {
1672
+ "$ref": "$map/item/path"
1673
+ }
1674
+ ]
1675
+ }
1676
+ ]
1677
+ }
1678
+ }
1679
+ ]
1680
+ },
1448
1681
  "oncontextmenu": {
1449
1682
  "$prototype": "Function",
1450
1683
  "body": [