@jxsuite/studio 4.1.0 → 5.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 (607) hide show
  1. package/README.md +1 -1
  2. package/data/elements-meta.json +5 -15
  3. package/data/html-meta.json +51 -6
  4. package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
  5. package/dist/chunks/action-group-sp6tna8v.js +118 -0
  6. package/dist/chunks/adapter-nj7tnjfn.js +13 -0
  7. package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
  8. package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
  9. package/dist/chunks/color-area-v17df7b8.js +154 -0
  10. package/dist/chunks/color-field-anwybnkn.js +208 -0
  11. package/dist/chunks/color-slider-44ez96fc.js +79 -0
  12. package/dist/chunks/color-xgg3kfw7.js +35 -0
  13. package/dist/chunks/combobox-5e7jev23.js +236 -0
  14. package/dist/chunks/components-2w1f35qs.js +18 -0
  15. package/dist/chunks/content-source-3wqeas45.js +46 -0
  16. package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
  17. package/dist/chunks/dialog-s890b918.js +85 -0
  18. package/dist/chunks/editor-3qhbg51x.js +35 -0
  19. package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
  20. package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
  21. package/dist/chunks/file-ops-3btj6st0.js +47 -0
  22. package/dist/chunks/files-ef8fgs3w.js +72 -0
  23. package/dist/chunks/format-host-3c33nwr8.js +40 -0
  24. package/dist/chunks/fs-events-13tj6sex.js +18 -0
  25. package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
  26. package/dist/chunks/icons-yy10wk9r.js +402 -0
  27. package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
  28. package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
  29. package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
  30. package/dist/chunks/iframe-host-jgesd924.js +115 -0
  31. package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
  32. package/dist/chunks/index-n4j7qxyr.js +109 -0
  33. package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
  34. package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
  35. package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
  36. package/dist/chunks/layers-1nq5evsh.js +29 -0
  37. package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
  38. package/dist/chunks/listbox-6v2ac08j.js +44 -0
  39. package/dist/chunks/lit-html-m244w9nh.js +17 -0
  40. package/dist/chunks/media-picker-2qbetq73.js +33 -0
  41. package/dist/chunks/menu-q99sy9rf.js +285 -0
  42. package/dist/chunks/menu-rf7n72mf.js +14 -0
  43. package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
  44. package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
  45. package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
  46. package/dist/chunks/notify-628t0anh.js +21 -0
  47. package/dist/chunks/number-field-5cndyft8.js +72 -0
  48. package/dist/chunks/parse-0zx14y15.js +10 -0
  49. package/dist/chunks/platform-ts9cg1a4.js +15 -0
  50. package/dist/chunks/popover-47z3ytva.js +25 -0
  51. package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
  52. package/dist/chunks/quick-search-srzz83k2.js +45 -0
  53. package/dist/chunks/references-n553f0e1.js +26 -0
  54. package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
  55. package/dist/chunks/section-registry-5pq32t0q.js +25 -0
  56. package/dist/chunks/select-2r16ez41.js +49 -0
  57. package/dist/chunks/split-g7nm1rgb.js +191 -0
  58. package/dist/chunks/studio-0hqbpbd0.js +62 -0
  59. package/dist/chunks/studio-18avnhjp.js +2430 -0
  60. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  61. package/dist/chunks/{studio-msd847zn.js → studio-25hkdrkw.js} +357 -86
  62. package/dist/chunks/studio-26d7myd1.js +258 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/studio-3gxv60tn.js +422 -0
  65. package/dist/chunks/{studio-fbf92ckf.js → studio-3hxkd92t.js} +275 -163
  66. package/dist/chunks/studio-4m0haseg.js +185 -0
  67. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  68. package/dist/chunks/{studio-1wagb550.js → studio-5523bpzt.js} +11 -11
  69. package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
  70. package/dist/chunks/studio-5jy81t3s.js +17463 -0
  71. package/dist/chunks/studio-5rt7sqa0.js +1168 -0
  72. package/dist/chunks/studio-5te5tqng.js +81 -0
  73. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  74. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  75. package/dist/chunks/studio-6xa21ej9.js +28 -0
  76. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  77. package/dist/chunks/{studio-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
  78. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  79. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  80. package/dist/chunks/studio-7xptrg0j.js +954 -0
  81. package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
  82. package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
  83. package/dist/chunks/studio-8qtrpzr3.js +839 -0
  84. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  85. package/dist/chunks/studio-9xxz1q69.js +1356 -0
  86. package/dist/chunks/studio-akbww0j5.js +13615 -0
  87. package/dist/chunks/{studio-x813zp48.js → studio-arfpe389.js} +30 -30
  88. package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
  89. package/dist/chunks/studio-cpvb2ed1.js +1171 -0
  90. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  91. package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
  92. package/dist/chunks/studio-d1ja2x9r.js +362 -0
  93. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  94. package/dist/chunks/{studio-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
  95. package/dist/chunks/studio-erdatzvp.js +1190 -0
  96. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  97. package/dist/chunks/studio-fabxk6r9.js +2811 -0
  98. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  99. package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  100. package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
  101. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  102. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  103. package/dist/chunks/studio-pm6hgy7r.js +4763 -0
  104. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  105. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  106. package/dist/chunks/studio-qahxvnan.js +111 -0
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-2b946z26.js → studio-rkstz940.js} +3658 -6134
  109. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  110. package/dist/chunks/studio-rpyah2ew.js +2805 -0
  111. package/dist/chunks/studio-rs76k67r.js +12 -0
  112. package/dist/chunks/{studio-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
  113. package/dist/chunks/{studio-6yw4y3my.js → studio-sgdc5pfc.js} +8 -8
  114. package/dist/chunks/studio-tb3ev01j.js +763 -0
  115. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/{studio-b55y6ewx.js → studio-x3rty6tr.js} +58 -58
  120. package/dist/chunks/studio-xsykpvsh.js +8448 -0
  121. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  122. package/dist/chunks/studio-yxa81f45.js +12 -0
  123. package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
  124. package/dist/chunks/tabs-wbp1cdws.js +156 -0
  125. package/dist/chunks/textfield-abk6qyee.js +73 -0
  126. package/dist/chunks/toast-780pvfbv.js +27 -0
  127. package/dist/chunks/toast-host-3sqv46sn.js +116 -0
  128. package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
  129. package/dist/chunks/tooltip-eptb614w.js +369 -0
  130. package/dist/chunks/tree-a73p0pqm.js +367 -0
  131. package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
  132. package/dist/chunks/workspace-wrew8zk4.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1780 -667
  135. package/dist/studio.js +52819 -36480
  136. package/dist/workers/editor.worker.js +1040 -1085
  137. package/dist/workers/json.worker.js +1946 -1991
  138. package/dist/workers/ts.worker.js +4960 -5005
  139. package/index.html +1 -0
  140. package/package.json +18 -52
  141. package/src/about/about-modal.ts +72 -123
  142. package/src/browse/library-commands.ts +20 -49
  143. package/src/browse/library-layouts.ts +87 -218
  144. package/src/browse/library-pane.ts +406 -438
  145. package/src/canvas/canvas-helpers.ts +0 -49
  146. package/src/canvas/canvas-live-render.ts +25 -2
  147. package/src/canvas/canvas-render.ts +666 -231
  148. package/src/canvas/canvas-surface.ts +0 -1
  149. package/src/canvas/canvas-utils.ts +310 -117
  150. package/src/canvas/dialog-path.ts +76 -0
  151. package/src/canvas/dialog-state.ts +67 -0
  152. package/src/canvas/diff-marks.ts +252 -0
  153. package/src/canvas/diff-toolbar.ts +349 -0
  154. package/src/canvas/diff-view.ts +123 -0
  155. package/src/canvas/edit-width-drag.ts +187 -0
  156. package/src/canvas/edit-width.ts +150 -0
  157. package/src/canvas/iframe-entry.ts +125 -8
  158. package/src/canvas/iframe-host.ts +271 -15
  159. package/src/canvas/iframe-interaction.ts +133 -13
  160. package/src/canvas/iframe-patch.ts +7 -1
  161. package/src/canvas/iframe-position.ts +5 -6
  162. package/src/canvas/iframe-protocol.ts +106 -5
  163. package/src/canvas/iframe-render.ts +373 -5
  164. package/src/canvas/iframe-slash.ts +2 -2
  165. package/src/canvas/iframe-subtree.ts +5 -8
  166. package/src/canvas/path-mapping.ts +25 -3
  167. package/src/canvas/popover-path.ts +106 -0
  168. package/src/canvas/popover-state.ts +155 -0
  169. package/src/canvas/surface-registry.ts +21 -10
  170. package/src/collab/presence-chips.ts +51 -73
  171. package/src/commands/app-commands.ts +10 -0
  172. package/src/commands/budget.ts +12 -0
  173. package/src/commands/command-args.ts +369 -6
  174. package/src/commands/defaults.ts +44 -14
  175. package/src/commands/live-context.ts +11 -5
  176. package/src/commands/reference.ts +12 -2
  177. package/src/commands/registry.ts +165 -8
  178. package/src/content/entry-commands.ts +16 -23
  179. package/src/content/entry-editor.ts +144 -101
  180. package/src/editor/canvas-slash-bridge.ts +2 -2
  181. package/src/editor/context-menu.ts +49 -200
  182. package/src/editor/convert-to-component.ts +42 -82
  183. package/src/editor/convert-to-repeater.ts +132 -173
  184. package/src/editor/inline-edit.ts +11 -0
  185. package/src/editor/shortcuts.ts +65 -26
  186. package/src/editor/slash-menu.ts +150 -157
  187. package/src/files/file-ops.ts +117 -11
  188. package/src/files/files.ts +943 -660
  189. package/src/files/json-layout.ts +474 -0
  190. package/src/files/serialize-document.ts +8 -1
  191. package/src/format/convert-file.ts +16 -10
  192. package/src/format/format-host.ts +50 -1
  193. package/src/github/github-auth.ts +71 -29
  194. package/src/github/github-publish.ts +57 -65
  195. package/src/grid/cell-editors.ts +46 -4
  196. package/src/grid/cell-popovers.ts +65 -62
  197. package/src/grid/grid-open.ts +86 -64
  198. package/src/grid/grid-panel.ts +390 -469
  199. package/src/grid/redirects-grid.ts +40 -44
  200. package/src/hosting/layout.ts +2 -0
  201. package/src/i18n/i18n-commands.ts +127 -62
  202. package/src/media/media-pane.ts +83 -133
  203. package/src/new-project/add-repo-modal.ts +125 -176
  204. package/src/new-project/import-tab.ts +181 -252
  205. package/src/new-project/location-fields.ts +93 -160
  206. package/src/new-project/new-project-modal.ts +376 -367
  207. package/src/packages/jxsuite-update.ts +76 -18
  208. package/src/panels/activity-panel.ts +137 -104
  209. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  210. package/src/panels/ai-chat/chat-view.ts +307 -472
  211. package/src/panels/ai-chat/composer.ts +175 -163
  212. package/src/panels/ai-chat/sessions-view.ts +31 -62
  213. package/src/panels/ai-panel.ts +210 -185
  214. package/src/panels/block-action-bar.ts +437 -643
  215. package/src/panels/bottom-dock.ts +112 -47
  216. package/src/panels/chat-panel.ts +19 -14
  217. package/src/panels/data-explorer.ts +141 -102
  218. package/src/panels/data-grid.ts +183 -150
  219. package/src/panels/dnd.ts +75 -20
  220. package/src/panels/editors.ts +26 -19
  221. package/src/panels/elements-panel.ts +243 -186
  222. package/src/panels/empty-state.ts +26 -42
  223. package/src/panels/events-panel.ts +950 -729
  224. package/src/panels/formula-workspace.ts +434 -207
  225. package/src/panels/frontmatter-fields.ts +185 -153
  226. package/src/panels/frontmatter-panel.ts +411 -187
  227. package/src/panels/git-diff-open.ts +148 -0
  228. package/src/panels/git-panel.ts +679 -605
  229. package/src/panels/head-panel.ts +617 -435
  230. package/src/panels/i18n-panel.ts +153 -133
  231. package/src/panels/imports-panel.ts +388 -414
  232. package/src/panels/jump-bar.ts +174 -147
  233. package/src/panels/layers-panel.ts +785 -671
  234. package/src/panels/left-panel.ts +166 -94
  235. package/src/panels/navigator-panels.ts +1 -1
  236. package/src/panels/pane-context.ts +529 -677
  237. package/src/panels/pane-grid.ts +265 -241
  238. package/src/panels/panel-registry.ts +15 -4
  239. package/src/panels/problems-panel.ts +177 -99
  240. package/src/panels/properties-panel.ts +1525 -966
  241. package/src/panels/provenance.ts +31 -113
  242. package/src/panels/quick-search.ts +217 -172
  243. package/src/panels/right-panel.ts +135 -169
  244. package/src/panels/seo-modal.ts +346 -167
  245. package/src/panels/settings-menu.ts +109 -646
  246. package/src/panels/settings-pane.ts +102 -86
  247. package/src/panels/signals-panel.ts +1318 -1172
  248. package/src/panels/statement-editor.ts +556 -428
  249. package/src/panels/style-panel.ts +1367 -630
  250. package/src/panels/style-utils.ts +36 -32
  251. package/src/panels/stylebook-doc.ts +30 -73
  252. package/src/panels/stylebook-layers-panel.ts +202 -109
  253. package/src/panels/stylebook-panel.ts +124 -88
  254. package/src/panels/tab-strip.ts +385 -287
  255. package/src/platforms/cloud.ts +106 -16
  256. package/src/platforms/devserver.ts +13 -0
  257. package/src/publish/deploy-checklist.ts +124 -78
  258. package/src/publish/publish-commands.ts +4 -12
  259. package/src/publish/publish-panel.ts +134 -328
  260. package/src/services/a11y-report.ts +100 -43
  261. package/src/services/ai-command-tools.ts +468 -0
  262. package/src/services/ai-session-store.ts +6 -0
  263. package/src/services/ai-system-prompt.ts +110 -18
  264. package/src/services/ai-tools.ts +28 -143
  265. package/src/services/ai-write-report.ts +174 -0
  266. package/src/services/document-assistant.ts +50 -2
  267. package/src/services/idle.ts +16 -14
  268. package/src/services/live-surfaces.ts +237 -0
  269. package/src/services/model-uri.ts +75 -0
  270. package/src/services/notify.ts +63 -6
  271. package/src/services/popover-report.ts +325 -0
  272. package/src/services/surface-registry.ts +56 -0
  273. package/src/services/tool-executor.ts +6 -0
  274. package/src/settings/contexts-section.ts +301 -299
  275. package/src/settings/contributed-section.ts +361 -222
  276. package/src/settings/css-vars-editor.ts +320 -325
  277. package/src/settings/defs-editor.ts +572 -535
  278. package/src/settings/dependencies-editor.ts +79 -107
  279. package/src/settings/extension-commands.ts +379 -0
  280. package/src/settings/extension-rows.ts +113 -0
  281. package/src/settings/extensions-section.ts +287 -0
  282. package/src/settings/general-settings.ts +130 -181
  283. package/src/settings/head-editor.ts +10 -305
  284. package/src/settings/locales-section.ts +146 -196
  285. package/src/settings/preferences-accounts.ts +1 -1
  286. package/src/settings/preferences-dialog.ts +350 -330
  287. package/src/settings/project-sections.ts +108 -181
  288. package/src/settings/schema-field-ui.ts +11 -399
  289. package/src/settings/section-registry.ts +8 -1
  290. package/src/settings/settings-document.ts +31 -29
  291. package/src/shell/tree.ts +42 -87
  292. package/src/shell.ts +48 -36
  293. package/src/studio.ts +90 -67
  294. package/src/style/token-ref.ts +0 -39
  295. package/src/surfaces/about.json +263 -0
  296. package/src/surfaces/about.ts +163 -0
  297. package/src/surfaces/add-repo.json +486 -0
  298. package/src/surfaces/add-repo.ts +236 -0
  299. package/src/surfaces/ai-chat.json +2185 -0
  300. package/src/surfaces/ai-chat.ts +549 -0
  301. package/src/surfaces/ai-credentials-form.json +332 -0
  302. package/src/surfaces/ai-credentials-form.ts +151 -0
  303. package/src/surfaces/ai-managed-connect.json +108 -0
  304. package/src/surfaces/ai-managed-connect.ts +123 -0
  305. package/src/surfaces/ai-model-picker.json +114 -0
  306. package/src/surfaces/ai-model-picker.ts +139 -0
  307. package/src/surfaces/block-action-bar.json +640 -0
  308. package/src/surfaces/block-action-bar.ts +368 -0
  309. package/src/surfaces/bottom-dock.json +154 -0
  310. package/src/surfaces/bottom-dock.ts +125 -0
  311. package/src/surfaces/canvas-stage.json +444 -0
  312. package/src/surfaces/canvas-stage.ts +253 -0
  313. package/src/surfaces/cf-account-picker.json +300 -0
  314. package/src/surfaces/cf-account-picker.ts +214 -0
  315. package/src/surfaces/commandbar.json +984 -0
  316. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
  317. package/src/surfaces/convert-repeater.json +309 -0
  318. package/src/surfaces/convert-repeater.ts +276 -0
  319. package/src/surfaces/data-actions.json +157 -0
  320. package/src/surfaces/data-actions.ts +115 -0
  321. package/src/surfaces/dialog.json +289 -0
  322. package/src/surfaces/dialog.ts +343 -0
  323. package/src/surfaces/diff-toolbar.json +266 -0
  324. package/src/surfaces/diff-toolbar.ts +139 -0
  325. package/src/surfaces/doc-header.json +739 -0
  326. package/src/surfaces/doc-header.ts +223 -0
  327. package/src/surfaces/empty-state.json +152 -0
  328. package/src/surfaces/empty-state.ts +173 -0
  329. package/src/surfaces/entry-editor.json +281 -0
  330. package/src/surfaces/entry-editor.ts +191 -0
  331. package/src/surfaces/expression-editor.json +977 -0
  332. package/src/surfaces/expression-editor.ts +266 -0
  333. package/src/surfaces/files-panel.json +592 -0
  334. package/src/surfaces/files-panel.ts +301 -0
  335. package/src/surfaces/formula-palette.json +364 -0
  336. package/src/surfaces/formula-palette.ts +340 -0
  337. package/src/surfaces/git-panel.json +1822 -0
  338. package/src/surfaces/git-panel.ts +272 -0
  339. package/src/surfaces/github-auth.json +112 -0
  340. package/src/surfaces/github-auth.ts +139 -0
  341. package/src/surfaces/github-publish.json +206 -0
  342. package/src/surfaces/github-publish.ts +169 -0
  343. package/src/surfaces/grid-cell.json +218 -0
  344. package/src/surfaces/grid-cell.ts +120 -0
  345. package/src/surfaces/grid-open.json +147 -0
  346. package/src/surfaces/grid-open.ts +87 -0
  347. package/src/surfaces/grid-panel.json +706 -0
  348. package/src/surfaces/grid-panel.ts +206 -0
  349. package/src/surfaces/grid-replace.json +179 -0
  350. package/src/surfaces/grid-replace.ts +89 -0
  351. package/src/surfaces/grid-views.json +446 -0
  352. package/src/surfaces/grid-views.ts +172 -0
  353. package/src/surfaces/inspector-dock.json +187 -0
  354. package/src/surfaces/inspector-dock.ts +161 -0
  355. package/src/surfaces/jump-bar.json +243 -0
  356. package/src/surfaces/jump-bar.ts +129 -0
  357. package/src/surfaces/jxsuite-update.json +146 -0
  358. package/src/surfaces/jxsuite-update.ts +149 -0
  359. package/src/surfaces/library-pane.json +1509 -0
  360. package/src/surfaces/library-pane.ts +363 -0
  361. package/src/surfaces/logic-panel.json +1949 -0
  362. package/src/surfaces/logic-panel.ts +369 -0
  363. package/src/surfaces/logic-workspace.json +685 -0
  364. package/src/surfaces/logic-workspace.ts +238 -0
  365. package/src/surfaces/media-browser.json +303 -0
  366. package/src/surfaces/media-browser.ts +145 -0
  367. package/src/surfaces/media-field.json +163 -0
  368. package/src/surfaces/media-field.ts +116 -0
  369. package/src/surfaces/media-pane.json +513 -0
  370. package/src/surfaces/media-pane.ts +197 -0
  371. package/src/surfaces/menu.json +232 -0
  372. package/src/surfaces/menu.ts +375 -0
  373. package/src/surfaces/navigator-dock.json +113 -0
  374. package/src/surfaces/navigator-dock.ts +130 -0
  375. package/src/surfaces/new-project.json +1654 -0
  376. package/src/surfaces/new-project.ts +411 -0
  377. package/src/surfaces/palette.json +535 -0
  378. package/src/surfaces/pane-context.json +1497 -0
  379. package/src/surfaces/pane-context.ts +513 -0
  380. package/src/surfaces/pane-grid.json +188 -0
  381. package/src/surfaces/pane-grid.ts +250 -0
  382. package/src/surfaces/panel-activity.json +563 -0
  383. package/src/surfaces/panel-activity.ts +187 -0
  384. package/src/surfaces/panel-data.json +141 -0
  385. package/src/surfaces/panel-data.ts +156 -0
  386. package/src/surfaces/panel-deploy-checklist.json +283 -0
  387. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  388. package/src/surfaces/panel-elements.json +367 -0
  389. package/src/surfaces/panel-elements.ts +175 -0
  390. package/src/surfaces/panel-i18n.json +569 -0
  391. package/src/surfaces/panel-i18n.ts +212 -0
  392. package/src/surfaces/panel-imports.json +780 -0
  393. package/src/surfaces/panel-imports.ts +209 -0
  394. package/src/surfaces/panel-outline.json +734 -0
  395. package/src/surfaces/panel-outline.ts +326 -0
  396. package/src/surfaces/panel-page.json +1017 -0
  397. package/src/surfaces/panel-page.ts +240 -0
  398. package/src/surfaces/panel-problems.json +497 -0
  399. package/src/surfaces/panel-problems.ts +157 -0
  400. package/src/surfaces/panel-signals.json +1973 -0
  401. package/src/surfaces/panel-signals.ts +436 -0
  402. package/src/surfaces/panel-stylebook-layers.json +317 -0
  403. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  404. package/src/surfaces/preferences.json +850 -0
  405. package/src/surfaces/preferences.ts +332 -0
  406. package/src/surfaces/progress-modal.json +110 -0
  407. package/src/surfaces/progress-modal.ts +150 -0
  408. package/src/surfaces/properties-panel.json +1578 -0
  409. package/src/surfaces/properties-panel.ts +337 -0
  410. package/src/surfaces/publish.json +945 -0
  411. package/src/surfaces/publish.ts +392 -0
  412. package/src/surfaces/push-plan.json +110 -0
  413. package/src/surfaces/push-plan.ts +87 -0
  414. package/src/surfaces/rail.json +255 -0
  415. package/src/surfaces/rail.ts +206 -0
  416. package/src/surfaces/reference-field.json +191 -0
  417. package/src/surfaces/reference-field.ts +168 -0
  418. package/src/surfaces/schema-builder.json +1011 -0
  419. package/src/surfaces/schema-builder.ts +181 -0
  420. package/src/surfaces/schema-form.json +1013 -0
  421. package/src/surfaces/schema-form.ts +287 -0
  422. package/src/surfaces/secret-field.json +60 -0
  423. package/src/surfaces/secret-field.ts +146 -0
  424. package/src/surfaces/seo.json +932 -0
  425. package/src/surfaces/seo.ts +334 -0
  426. package/src/surfaces/settings-contexts.json +538 -0
  427. package/src/surfaces/settings-contexts.ts +196 -0
  428. package/src/surfaces/settings-contributed.json +489 -0
  429. package/src/surfaces/settings-contributed.ts +199 -0
  430. package/src/surfaces/settings-css-vars.json +820 -0
  431. package/src/surfaces/settings-css-vars.ts +199 -0
  432. package/src/surfaces/settings-defs.json +1363 -0
  433. package/src/surfaces/settings-defs.ts +232 -0
  434. package/src/surfaces/settings-deploy.json +108 -0
  435. package/src/surfaces/settings-deploy.ts +135 -0
  436. package/src/surfaces/settings-extensions.json +486 -0
  437. package/src/surfaces/settings-extensions.ts +201 -0
  438. package/src/surfaces/settings-head.json +779 -0
  439. package/src/surfaces/settings-head.ts +397 -0
  440. package/src/surfaces/settings-locales.json +420 -0
  441. package/src/surfaces/settings-locales.ts +137 -0
  442. package/src/surfaces/settings-overview.json +423 -0
  443. package/src/surfaces/settings-overview.ts +218 -0
  444. package/src/surfaces/settings-packages.json +549 -0
  445. package/src/surfaces/settings-packages.ts +158 -0
  446. package/src/surfaces/settings-pane.json +147 -0
  447. package/src/surfaces/settings-pane.ts +150 -0
  448. package/src/surfaces/settings-rawjson.json +104 -0
  449. package/src/surfaces/settings-rawjson.ts +107 -0
  450. package/src/surfaces/shell.json +99 -0
  451. package/src/surfaces/shell.ts +30 -0
  452. package/src/surfaces/slash-menu.json +180 -0
  453. package/src/surfaces/slash-menu.ts +272 -0
  454. package/src/surfaces/statements.json +607 -0
  455. package/src/surfaces/statements.ts +238 -0
  456. package/src/surfaces/statusbar.json +94 -0
  457. package/src/{panels → surfaces}/statusbar.ts +163 -90
  458. package/src/surfaces/style-panel.json +1643 -0
  459. package/src/surfaces/style-panel.ts +338 -0
  460. package/src/surfaces/stylebook-chrome.json +122 -0
  461. package/src/surfaces/stylebook-chrome.ts +122 -0
  462. package/src/surfaces/tab-strip.json +448 -0
  463. package/src/surfaces/tab-strip.ts +200 -0
  464. package/src/surfaces/target-line.json +419 -0
  465. package/src/surfaces/target-line.ts +349 -0
  466. package/src/surfaces/toasts.json +189 -0
  467. package/src/surfaces/welcome.json +571 -0
  468. package/src/surfaces/welcome.ts +338 -0
  469. package/src/tabs/project-config.ts +71 -15
  470. package/src/tabs/tab.ts +52 -1
  471. package/src/types.ts +22 -0
  472. package/src/ui/ai-credentials-form.ts +104 -100
  473. package/src/ui/ai-managed-connect.ts +54 -36
  474. package/src/ui/ai-model-picker.ts +75 -47
  475. package/src/ui/cf-account-picker.ts +76 -141
  476. package/src/ui/color-selector.ts +80 -301
  477. package/src/ui/dynamic-slot.ts +43 -283
  478. package/src/ui/expression-editor.ts +797 -576
  479. package/src/ui/field-input.ts +8 -181
  480. package/src/ui/form-controls.ts +838 -366
  481. package/src/ui/formula-chips.ts +80 -85
  482. package/src/ui/kit.ts +33 -0
  483. package/src/ui/layers.ts +293 -593
  484. package/src/ui/media-picker.ts +203 -284
  485. package/src/ui/panel-resize.ts +251 -64
  486. package/src/ui/popover-surface.ts +153 -0
  487. package/src/ui/progress-modal.ts +22 -60
  488. package/src/ui/regions.ts +13 -7
  489. package/src/ui/schema-form.ts +906 -440
  490. package/src/ui/surface.ts +122 -0
  491. package/src/ui/unit-selector.ts +15 -131
  492. package/src/ui/value-source.ts +14 -0
  493. package/src/ui/virtual-window.ts +88 -9
  494. package/src/utils/canvas-media.ts +72 -0
  495. package/src/utils/edit-display.ts +7 -2
  496. package/src/utils/element-selectors.ts +69 -0
  497. package/src/utils/link-target.ts +2 -2
  498. package/src/utils/studio-utils.ts +0 -10
  499. package/src/view.ts +15 -0
  500. package/src/workspace/pane-derive.ts +36 -14
  501. package/src/workspace/workspace.ts +15 -6
  502. package/styles/canvas.css +72 -467
  503. package/styles/forced-colors.css +48 -82
  504. package/styles/forced-colors.json +41 -0
  505. package/styles/inspector.css +2 -1301
  506. package/styles/overlays.css +96 -2823
  507. package/styles/panels.css +6 -1423
  508. package/styles/shell-frame.css +272 -0
  509. package/styles/shell-frame.json +227 -0
  510. package/styles/shell.css +0 -1568
  511. package/styles/tokens.css +65 -136
  512. package/styles/tokens.json +84 -0
  513. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  514. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  515. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  516. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  517. package/dist/chunks/components-zmx10t62.js +0 -21
  518. package/dist/chunks/content-source-48xg86wj.js +0 -49
  519. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  520. package/dist/chunks/editor-cptq5jp1.js +0 -37
  521. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  522. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  523. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  524. package/dist/chunks/files-3kfkwhk4.js +0 -93
  525. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  526. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  527. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  528. package/dist/chunks/format-host-w16q81tf.js +0 -43
  529. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  530. package/dist/chunks/git-panel-532whr1y.js +0 -59
  531. package/dist/chunks/index-zqxmqxmh.js +0 -109
  532. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  533. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  534. package/dist/chunks/layers-q75tj2mf.js +0 -45
  535. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  536. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  537. package/dist/chunks/notify-yjm79n4s.js +0 -30
  538. package/dist/chunks/parse-24d0gay3.js +0 -19
  539. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  540. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  541. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  542. package/dist/chunks/references-3qx8fkyp.js +0 -29
  543. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  544. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  545. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  546. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  547. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  548. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  549. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  550. package/dist/chunks/studio-0a5qrh01.js +0 -3
  551. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  552. package/dist/chunks/studio-18j3bmcz.js +0 -14
  553. package/dist/chunks/studio-1ngbejft.js +0 -181
  554. package/dist/chunks/studio-4b5z1x43.js +0 -424
  555. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  556. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  557. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  558. package/dist/chunks/studio-5myknm0a.js +0 -1903
  559. package/dist/chunks/studio-7afd21nw.js +0 -67
  560. package/dist/chunks/studio-7nte2hj4.js +0 -613
  561. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  562. package/dist/chunks/studio-8q517dfr.js +0 -24
  563. package/dist/chunks/studio-950k0dx6.js +0 -6939
  564. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  565. package/dist/chunks/studio-a0tswy0w.js +0 -58
  566. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  567. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  568. package/dist/chunks/studio-d1ks410h.js +0 -175
  569. package/dist/chunks/studio-ef49pnzx.js +0 -387
  570. package/dist/chunks/studio-eqq1w638.js +0 -113
  571. package/dist/chunks/studio-ew0djmhg.js +0 -341
  572. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  573. package/dist/chunks/studio-h4rxscfc.js +0 -10
  574. package/dist/chunks/studio-jc994dnr.js +0 -1066
  575. package/dist/chunks/studio-kyh9avvv.js +0 -28
  576. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  577. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  578. package/dist/chunks/studio-n6j9t10q.js +0 -318
  579. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  580. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  581. package/dist/chunks/studio-qq6jym04.js +0 -53
  582. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  583. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  584. package/dist/chunks/studio-t7qb9db8.js +0 -665
  585. package/dist/chunks/studio-tmc5emrw.js +0 -8
  586. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  587. package/dist/chunks/studio-zczps70q.js +0 -378
  588. package/dist/chunks/studio-zqazsct2.js +0 -1823
  589. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  590. package/src/panels/activity-bar.ts +0 -251
  591. package/src/panels/panel-scheduler.ts +0 -219
  592. package/src/panels/style-inputs.ts +0 -237
  593. package/src/panels/target-line.ts +0 -274
  594. package/src/panels/welcome-screen.ts +0 -346
  595. package/src/ui/button-group.ts +0 -102
  596. package/src/ui/choice-field.ts +0 -72
  597. package/src/ui/field-row.ts +0 -249
  598. package/src/ui/formula-palette.ts +0 -213
  599. package/src/ui/icons.ts +0 -52
  600. package/src/ui/jx-theme.ts +0 -130
  601. package/src/ui/spectrum.ts +0 -340
  602. package/src/ui/value-selector.ts +0 -174
  603. package/src/ui/widgets.ts +0 -172
  604. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  605. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  606. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  607. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -0,0 +1,1509 @@
1
+ {
2
+ "$schema": "https://jxsuite.com/schema/v1",
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.",
5
+ "tagName": "div",
6
+ "attributes": {
7
+ "part": "library",
8
+ "data-jx-region": "${state.region}"
9
+ },
10
+ "style": {
11
+ "$description": "What the fifty-two `.library*` rules in `styles/overlays.css` said, keyed on `part` and re-pointed at the studio token layer. Every one of them was this surface's alone, so the block goes with the conversion rather than being copied. Three sets of names could not come with the declarations. Ten `var(--spectrum-font-size-50 | -75, …)` reads are the kit's `--jx-text-sm` and `--jx-text-md`, which are the same 11px and 12px: a `--spectrum-*` name is declared by `<sp-theme>` and by nothing else in this package, and `styles/spectrum.css` is deleted whole with the last Spectrum component, so a document that reads one is a document whose colours change when a component it does not use is removed. `--spectrum-gray-100` and `--spectrum-gray-200` are the studio's own `--bg-input` and `--hover-bg`; `--spectrum-blue-600` — the card's hover border and the drop outline — is `--accent`, which is what a Spectrum blue was standing in for; and `--spectrum-orange-100`, the incomplete-scan banner's ground, is mixed from `--warning` so the banner follows the chrome theme instead of being a dark-only hex. Nine names that were handles rather than styling stop being names at all: `.library-grid-cards`, `.library-grid-media`, `.library-day-undated`, `.library-drop-active`, `.library-upload-input` and the four `data-field` widths are `data-` attributes on a part here, because a part is the handle now.",
12
+ "display": "flex",
13
+ "flexDirection": "column",
14
+ "width": "100%",
15
+ "height": "100%",
16
+ "overflow": "hidden",
17
+ "fontFamily": "var(--jx-font-sans)",
18
+ "fontSize": "var(--jx-text-md)",
19
+ "color": "var(--fg)",
20
+ "& [part=\"banner-slot\"], & [part=\"locale-slot\"], & [part=\"view-slot\"], & [part=\"art-slot\"], & [part=\"note-slot\"], & [part=\"truncated-slot\"]": {
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
+ "display": "contents"
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.",
26
+ "display": "flex",
27
+ "alignItems": "center",
28
+ "gap": "var(--jx-space-4)",
29
+ "padding": "var(--jx-space-3) var(--jx-space-5)",
30
+ "background": "var(--bg-panel)",
31
+ "borderBottom": "1px solid var(--border)",
32
+ "flexShrink": "0",
33
+ "flexWrap": "wrap"
34
+ },
35
+ "& [part=\"search\"]": {
36
+ "width": "220px"
37
+ },
38
+ "& [part=\"locale\"]": {
39
+ "$description": "Narrow on purpose: it holds one language name, and the toolbar wraps before it grows.",
40
+ "width": "160px"
41
+ },
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"
71
+ },
72
+ "& [part=\"spacer\"]": {
73
+ "flex": "1"
74
+ },
75
+ "& [part=\"layouts\"]": {
76
+ "marginLeft": "auto"
77
+ },
78
+ "& [part=\"banner\"]": {
79
+ "$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.",
80
+ "display": "flex",
81
+ "alignItems": "center",
82
+ "justifyContent": "space-between",
83
+ "gap": "var(--jx-space-4)",
84
+ "padding": "var(--jx-space-3) var(--jx-space-5)",
85
+ "background": "color-mix(in srgb, var(--warning) 18%, var(--bg-panel))",
86
+ "borderBottom": "1px solid var(--border)",
87
+ "color": "var(--fg)",
88
+ "fontSize": "var(--jx-text-md)"
89
+ },
90
+ "& [part=\"body\"]": {
91
+ "flex": "1",
92
+ "minHeight": "0",
93
+ "overflowY": "auto",
94
+ "position": "relative"
95
+ },
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
+ "& [part=\"empty\"]": {
102
+ "padding": "48px var(--jx-space-6)",
103
+ "textAlign": "center",
104
+ "color": "var(--fg-dim)",
105
+ "display": "flex",
106
+ "flexDirection": "column",
107
+ "alignItems": "center",
108
+ "gap": "var(--jx-space-3)"
109
+ },
110
+ "& [part=\"empty\"] p": {
111
+ "margin": "0"
112
+ },
113
+ "& [part=\"empty-detail\"]": {
114
+ "fontSize": "var(--jx-text-md)",
115
+ "color": "var(--fg-dim)"
116
+ },
117
+ "& [part=\"truncated\"]": {
118
+ "$description": "What a capped layout did not draw, stated. A grouped list cannot window — a window over one either breaks the groups or needs variable-height measurement — so Calendar and Board cap instead, and a layout that truncated in silence would be the same class of lie as “No files found”.",
119
+ "margin": "var(--jx-space-3) 0 0",
120
+ "fontSize": "var(--jx-text-sm)",
121
+ "color": "var(--fg-dim)"
122
+ },
123
+ "& [part=\"grid\"]": {
124
+ "$description": "Cards and Media, the two windowed grids. The item sizes here are the ones `library-layouts.ts`'s LAYOUT_METRICS counts rows in; change one and change both.",
125
+ "display": "grid",
126
+ "gap": "var(--jx-space-4)",
127
+ "padding": "var(--jx-space-4) var(--jx-space-5)",
128
+ "alignItems": "start"
129
+ },
130
+ "& [part=\"grid\"][data-layout=\"cards\"]": {
131
+ "gridTemplateColumns": "repeat(auto-fill, minmax(188px, 1fr))"
132
+ },
133
+ "& [part=\"grid\"][data-layout=\"media\"]": {
134
+ "gridTemplateColumns": "repeat(auto-fill, minmax(120px, 1fr))"
135
+ },
136
+ "& [part=\"card\"], & [part=\"tile\"]": {
137
+ "cursor": "pointer",
138
+ "overflow": "hidden",
139
+ "border": "1px solid var(--border)",
140
+ "borderRadius": "var(--radius)",
141
+ "background": "var(--bg-panel)"
142
+ },
143
+ "& [part=\"card\"]:hover, & [part=\"tile\"]:hover": {
144
+ "borderColor": "var(--accent)"
145
+ },
146
+ "& [part=\"card-art\"], & [part=\"tile-art\"]": {
147
+ "aspectRatio": "4 / 3",
148
+ "display": "flex",
149
+ "alignItems": "center",
150
+ "justifyContent": "center",
151
+ "overflow": "hidden",
152
+ "background": "var(--bg-input)",
153
+ "pointerEvents": "none"
154
+ },
155
+ "& [part=\"file-glyph\"]": {
156
+ "--jx-icon-size": "32px",
157
+ "color": "var(--fg-dim)"
158
+ },
159
+ "& [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.",
161
+ "width": "100%",
162
+ "height": "100%",
163
+ "overflow": "hidden"
164
+ },
165
+ "& [part=\"doc-preview\"] > *": {
166
+ "transform": "scale(0.4)",
167
+ "transformOrigin": "top left",
168
+ "width": "250%",
169
+ "height": "250%"
170
+ },
171
+ "& [part=\"thumb\"]": {
172
+ "maxWidth": "100%",
173
+ "maxHeight": "100%",
174
+ "objectFit": "contain"
175
+ },
176
+ "& [part=\"card-label\"], & [part=\"tile-label\"]": {
177
+ "padding": "6px var(--jx-space-3) 0",
178
+ "fontSize": "var(--jx-text-md)",
179
+ "color": "var(--fg)",
180
+ "whiteSpace": "nowrap",
181
+ "overflow": "hidden",
182
+ "textOverflow": "ellipsis"
183
+ },
184
+ "& [part=\"card-meta\"]": {
185
+ "padding": "0 var(--jx-space-3) 6px",
186
+ "fontSize": "var(--jx-text-sm)",
187
+ "color": "var(--fg-dim)"
188
+ },
189
+ "& [part=\"table\"]": {
190
+ "$description": "A windowed list rather than a table component: the rows have to be sliceable, and every table widget wants the whole set.",
191
+ "display": "flex",
192
+ "flexDirection": "column",
193
+ "padding": "0 var(--jx-space-5) var(--jx-space-5)"
194
+ },
195
+ "& [part=\"table-head\"], & [part=\"table-row\"]": {
196
+ "display": "flex",
197
+ "alignItems": "center",
198
+ "gap": "var(--jx-space-3)",
199
+ "height": "32px",
200
+ "borderBottom": "1px solid var(--border)"
201
+ },
202
+ "& [part=\"table-head\"]": {
203
+ "position": "sticky",
204
+ "top": "0",
205
+ "zIndex": "1",
206
+ "background": "var(--bg-panel)",
207
+ "fontWeight": "600",
208
+ "fontSize": "var(--jx-text-md)"
209
+ },
210
+ "& [part=\"table-row\"]": {
211
+ "cursor": "pointer"
212
+ },
213
+ "& [part=\"table-row\"]:hover": {
214
+ "background": "var(--hover-bg)"
215
+ },
216
+ "& [part=\"cell\"]": {
217
+ "flex": "1",
218
+ "minWidth": "0",
219
+ "overflow": "hidden",
220
+ "textOverflow": "ellipsis",
221
+ "whiteSpace": "nowrap",
222
+ "fontSize": "var(--jx-text-md)"
223
+ },
224
+ "& [part=\"cell\"][data-field=\"name\"]": {
225
+ "flex": "3",
226
+ "fontWeight": "500"
227
+ },
228
+ "& [part=\"cell\"][data-field=\"path\"]": {
229
+ "flex": "3",
230
+ "color": "var(--fg-dim)",
231
+ "fontFamily": "var(--font-mono)",
232
+ "fontSize": "var(--jx-text-sm)"
233
+ },
234
+ "& [part=\"cell\"][data-field=\"size\"], & [part=\"cell\"][data-field=\"modified\"]": {
235
+ "flex": "0 0 96px"
236
+ },
237
+ "& [part=\"cell\"][data-field=\"locale\"]": {
238
+ "$description": "Fixed, like size and modified: a language name is short and never earns width from Name. Without this it inherits the `flex: 1` above and the Name column loses a quarter of itself in every multilingual project.",
239
+ "flex": "0 0 90px",
240
+ "color": "var(--fg-dim)"
241
+ },
242
+ "& [part=\"calendar\"]": {
243
+ "padding": "var(--jx-space-4) var(--jx-space-5)"
244
+ },
245
+ "& [part=\"day\"]": {
246
+ "marginBottom": "var(--jx-space-5)"
247
+ },
248
+ "& [part=\"day-date\"]": {
249
+ "margin": "0 0 var(--jx-space-2)",
250
+ "fontSize": "var(--jx-text-md)",
251
+ "fontWeight": "600",
252
+ "color": "var(--fg)"
253
+ },
254
+ "& [part=\"day\"][data-undated=\"true\"] [part=\"day-date\"]": {
255
+ "$description": "A file with no dated name and no modification time is set apart rather than parked on today. A calendar that invents dates is worse than one that says which files it could not place.",
256
+ "color": "var(--fg-dim)"
257
+ },
258
+ "& [part=\"note\"]": {
259
+ "margin": "0 0 var(--jx-space-2)",
260
+ "fontSize": "var(--jx-text-sm)",
261
+ "color": "var(--fg-dim)"
262
+ },
263
+ "& [part=\"board\"]": {
264
+ "display": "flex",
265
+ "gap": "var(--jx-space-4)",
266
+ "padding": "var(--jx-space-4) var(--jx-space-5)",
267
+ "alignItems": "flex-start",
268
+ "overflowX": "auto"
269
+ },
270
+ "& [part=\"column\"]": {
271
+ "flex": "0 0 220px",
272
+ "border": "1px solid var(--border)",
273
+ "borderRadius": "var(--radius)",
274
+ "padding": "var(--jx-space-3)",
275
+ "background": "var(--bg-panel)"
276
+ },
277
+ "& [part=\"column-title\"]": {
278
+ "margin": "0 0 6px",
279
+ "fontSize": "var(--jx-text-md)",
280
+ "fontWeight": "600",
281
+ "display": "flex",
282
+ "justifyContent": "space-between"
283
+ },
284
+ "& [part=\"count\"]": {
285
+ "color": "var(--fg-dim)",
286
+ "fontWeight": "400"
287
+ },
288
+ "& [part=\"list\"]": {
289
+ "listStyle": "none",
290
+ "margin": "0",
291
+ "padding": "0"
292
+ },
293
+ "& [part=\"list-item\"]": {
294
+ "padding": "3px var(--jx-space-2)",
295
+ "borderRadius": "var(--radius)",
296
+ "cursor": "pointer",
297
+ "fontSize": "var(--jx-text-md)",
298
+ "whiteSpace": "nowrap",
299
+ "overflow": "hidden",
300
+ "textOverflow": "ellipsis"
301
+ },
302
+ "& [part=\"list-item\"]:hover": {
303
+ "background": "var(--hover-bg)"
304
+ }
305
+ },
306
+ "children": [
307
+ {
308
+ "tagName": "div",
309
+ "attributes": {
310
+ "part": "toolbar"
311
+ },
312
+ "children": [
313
+ {
314
+ "tagName": "jx-action-group",
315
+ "attributes": {
316
+ "part": "categories"
317
+ },
318
+ "$props": {
319
+ "selects": "single",
320
+ "compact": true,
321
+ "label": "Category"
322
+ },
323
+ "children": [
324
+ {
325
+ "$prototype": "Array",
326
+ "items": {
327
+ "$ref": "#/state/categories"
328
+ },
329
+ "key": {
330
+ "$ref": "$map/item/key"
331
+ },
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
+ }
367
+ }
368
+ ]
369
+ },
370
+ {
371
+ "tagName": "div",
372
+ "attributes": {
373
+ "part": "locale-slot",
374
+ "role": "none"
375
+ },
376
+ "$switch": {
377
+ "$ref": "#/state/localeState"
378
+ },
379
+ "cases": {
380
+ "shown": {
381
+ "tagName": "jx-select",
382
+ "attributes": {
383
+ "part": "locale"
384
+ },
385
+ "$props": {
386
+ "label": "Language",
387
+ "size": "sm",
388
+ "options": {
389
+ "$ref": "#/state/localeOptions"
390
+ },
391
+ "value": {
392
+ "$ref": "#/state/localeValue"
393
+ }
394
+ },
395
+ "onchange": {
396
+ "$prototype": "Function",
397
+ "body": [
398
+ {
399
+ "operator": "call",
400
+ "target": {
401
+ "$ref": "#/state/setLocale"
402
+ },
403
+ "value": [
404
+ {
405
+ "$ref": "event#/target/value"
406
+ }
407
+ ]
408
+ }
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."
411
+ }
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"
439
+ }
440
+ ]
441
+ }
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"
466
+ }
467
+ ]
468
+ }
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."
471
+ },
472
+ "children": [
473
+ {
474
+ "tagName": "span",
475
+ "textContent": "New"
476
+ }
477
+ ]
478
+ },
479
+ {
480
+ "tagName": "label",
481
+ "attributes": {
482
+ "part": "upload",
483
+ "title": "${state.uploadHint}"
484
+ },
485
+ "children": [
486
+ {
487
+ "tagName": "input",
488
+ "attributes": {
489
+ "part": "upload-input",
490
+ "type": "file",
491
+ "multiple": true,
492
+ "accept": "${state.uploadAccept}"
493
+ },
494
+ "onchange": {
495
+ "$prototype": "Function",
496
+ "body": [
497
+ {
498
+ "operator": "call",
499
+ "target": {
500
+ "$ref": "#/state/upload"
501
+ },
502
+ "value": [
503
+ {
504
+ "$ref": "event#/target"
505
+ }
506
+ ]
507
+ }
508
+ ],
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"
516
+ },
517
+ "$props": {
518
+ "name": "upload-simple"
519
+ }
520
+ },
521
+ {
522
+ "tagName": "span",
523
+ "textContent": "Upload"
524
+ }
525
+ ]
526
+ },
527
+ {
528
+ "tagName": "span",
529
+ "attributes": {
530
+ "part": "spacer"
531
+ }
532
+ },
533
+ {
534
+ "tagName": "jx-action-group",
535
+ "attributes": {
536
+ "part": "layouts"
537
+ },
538
+ "$props": {
539
+ "selects": "single",
540
+ "compact": true,
541
+ "label": "Layout"
542
+ },
543
+ "children": [
544
+ {
545
+ "$prototype": "Array",
546
+ "items": {
547
+ "$ref": "#/state/layouts"
548
+ },
549
+ "key": {
550
+ "$ref": "$map/item/key"
551
+ },
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": [
582
+ {
583
+ "tagName": "span",
584
+ "textContent": "${$map.item.label}"
585
+ }
586
+ ]
587
+ }
588
+ }
589
+ ]
590
+ }
591
+ ]
592
+ },
593
+ {
594
+ "tagName": "div",
595
+ "attributes": {
596
+ "part": "banner-slot",
597
+ "role": "none"
598
+ },
599
+ "$switch": {
600
+ "$ref": "#/state/bannerState"
601
+ },
602
+ "cases": {
603
+ "shown": {
604
+ "tagName": "div",
605
+ "attributes": {
606
+ "part": "banner",
607
+ "role": "status"
608
+ },
609
+ "children": [
610
+ {
611
+ "tagName": "span",
612
+ "textContent": "${state.bannerText}"
613
+ },
614
+ {
615
+ "tagName": "jx-button",
616
+ "attributes": {
617
+ "part": "retry"
618
+ },
619
+ "$props": {
620
+ "size": "sm",
621
+ "variant": "secondary"
622
+ },
623
+ "onclick": {
624
+ "$prototype": "Function",
625
+ "body": [
626
+ {
627
+ "operator": "call",
628
+ "target": {
629
+ "$ref": "#/state/retry"
630
+ }
631
+ }
632
+ ]
633
+ },
634
+ "children": [
635
+ {
636
+ "tagName": "span",
637
+ "textContent": "Retry"
638
+ }
639
+ ]
640
+ }
641
+ ]
642
+ }
643
+ }
644
+ },
645
+ {
646
+ "tagName": "div",
647
+ "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
+ ]
696
+ },
697
+ "onscroll": {
698
+ "$prototype": "Function",
699
+ "body": [
700
+ {
701
+ "operator": "call",
702
+ "target": {
703
+ "$ref": "#/state/scrolled"
704
+ }
705
+ }
706
+ ],
707
+ "description": "The rendered item count is proportional to the VIEWPORT, not to the project: a scroll recomputes the window from the box the adapter measures here, and never re-reads the scan."
708
+ },
709
+ "children": [
710
+ {
711
+ "tagName": "div",
712
+ "attributes": {
713
+ "part": "view-slot",
714
+ "role": "none"
715
+ },
716
+ "$switch": {
717
+ "$ref": "#/state/view"
718
+ },
719
+ "cases": {
720
+ "loading": {
721
+ "tagName": "div",
722
+ "attributes": {
723
+ "part": "empty"
724
+ },
725
+ "children": [
726
+ {
727
+ "tagName": "p",
728
+ "textContent": "Scanning the project…"
729
+ }
730
+ ]
731
+ },
732
+ "incomplete": {
733
+ "tagName": "div",
734
+ "attributes": {
735
+ "part": "empty"
736
+ },
737
+ "children": [
738
+ {
739
+ "tagName": "p",
740
+ "textContent": "Nothing to show, and the scan did not finish."
741
+ },
742
+ {
743
+ "tagName": "p",
744
+ "attributes": {
745
+ "part": "empty-detail"
746
+ },
747
+ "textContent": "${state.emptyDetail}"
748
+ },
749
+ {
750
+ "tagName": "jx-button",
751
+ "attributes": {
752
+ "part": "retry"
753
+ },
754
+ "$props": {
755
+ "size": "sm",
756
+ "variant": "primary"
757
+ },
758
+ "onclick": {
759
+ "$prototype": "Function",
760
+ "body": [
761
+ {
762
+ "operator": "call",
763
+ "target": {
764
+ "$ref": "#/state/retry"
765
+ }
766
+ }
767
+ ]
768
+ },
769
+ "children": [
770
+ {
771
+ "tagName": "span",
772
+ "textContent": "Retry"
773
+ }
774
+ ]
775
+ }
776
+ ]
777
+ },
778
+ "empty": {
779
+ "tagName": "div",
780
+ "attributes": {
781
+ "part": "empty"
782
+ },
783
+ "children": [
784
+ {
785
+ "tagName": "p",
786
+ "textContent": "This project has no files yet."
787
+ },
788
+ {
789
+ "tagName": "p",
790
+ "attributes": {
791
+ "part": "empty-detail"
792
+ },
793
+ "textContent": "Use New to create a page, layout, component or entry."
794
+ }
795
+ ]
796
+ },
797
+ "nomatch": {
798
+ "tagName": "div",
799
+ "attributes": {
800
+ "part": "empty"
801
+ },
802
+ "children": [
803
+ {
804
+ "tagName": "p",
805
+ "children": [
806
+ {
807
+ "tagName": "span",
808
+ "textContent": "${state.emptyMessage}"
809
+ },
810
+ {
811
+ "tagName": "span",
812
+ "attributes": {
813
+ "part": "empty-detail"
814
+ },
815
+ "textContent": " ${state.emptyDetail}"
816
+ }
817
+ ]
818
+ },
819
+ {
820
+ "tagName": "jx-button",
821
+ "attributes": {
822
+ "part": "reset"
823
+ },
824
+ "$props": {
825
+ "size": "sm",
826
+ "variant": "secondary"
827
+ },
828
+ "onclick": {
829
+ "$prototype": "Function",
830
+ "body": [
831
+ {
832
+ "operator": "call",
833
+ "target": {
834
+ "$ref": "#/state/reset"
835
+ }
836
+ }
837
+ ],
838
+ "description": "Both facets in one clause and one button, so a reader who filtered twice is told about both rather than sent to clear one and find the list still empty."
839
+ },
840
+ "children": [
841
+ {
842
+ "tagName": "span",
843
+ "textContent": "Clear filters"
844
+ }
845
+ ]
846
+ }
847
+ ]
848
+ },
849
+ "cards": {
850
+ "tagName": "div",
851
+ "attributes": {
852
+ "part": "grid",
853
+ "data-layout": "cards",
854
+ "style": "${state.pad}"
855
+ },
856
+ "children": [
857
+ {
858
+ "$prototype": "Array",
859
+ "items": {
860
+ "$ref": "#/state/rows"
861
+ },
862
+ "key": {
863
+ "$ref": "$map/item/path"
864
+ },
865
+ "map": {
866
+ "tagName": "div",
867
+ "attributes": {
868
+ "part": "card",
869
+ "data-path": "${$map.item.path}"
870
+ },
871
+ "onclick": {
872
+ "$prototype": "Function",
873
+ "body": [
874
+ {
875
+ "operator": "call",
876
+ "target": {
877
+ "$ref": "#/state/openFile"
878
+ },
879
+ "value": [
880
+ {
881
+ "$ref": "$map/item/path"
882
+ }
883
+ ]
884
+ }
885
+ ]
886
+ },
887
+ "oncontextmenu": {
888
+ "$prototype": "Function",
889
+ "body": [
890
+ {
891
+ "preventDefault": true
892
+ },
893
+ {
894
+ "stopPropagation": true
895
+ },
896
+ {
897
+ "operator": "call",
898
+ "target": {
899
+ "$ref": "#/state/contextMenu"
900
+ },
901
+ "value": [
902
+ {
903
+ "$ref": "$map/item/path"
904
+ },
905
+ {
906
+ "$ref": "event#/clientX"
907
+ },
908
+ {
909
+ "$ref": "event#/clientY"
910
+ }
911
+ ]
912
+ }
913
+ ]
914
+ },
915
+ "children": [
916
+ {
917
+ "tagName": "div",
918
+ "attributes": {
919
+ "part": "card-art"
920
+ },
921
+ "children": [
922
+ {
923
+ "tagName": "div",
924
+ "attributes": {
925
+ "part": "art-slot",
926
+ "role": "none"
927
+ },
928
+ "$switch": {
929
+ "$ref": "$map/item/art"
930
+ },
931
+ "cases": {
932
+ "image": {
933
+ "tagName": "img",
934
+ "attributes": {
935
+ "part": "thumb",
936
+ "loading": "lazy",
937
+ "src": "${$map.item.src}",
938
+ "alt": ""
939
+ }
940
+ },
941
+ "doc": {
942
+ "tagName": "div",
943
+ "attributes": {
944
+ "part": "doc-preview",
945
+ "data-path": "${$map.item.path}"
946
+ }
947
+ },
948
+ "glyph": {
949
+ "tagName": "jx-icon",
950
+ "attributes": {
951
+ "part": "file-glyph"
952
+ },
953
+ "$props": {
954
+ "name": "file-text"
955
+ }
956
+ }
957
+ }
958
+ }
959
+ ]
960
+ },
961
+ {
962
+ "tagName": "div",
963
+ "attributes": {
964
+ "part": "card-label",
965
+ "title": "${$map.item.path}"
966
+ },
967
+ "textContent": "${$map.item.name}"
968
+ },
969
+ {
970
+ "tagName": "div",
971
+ "attributes": {
972
+ "part": "card-meta"
973
+ },
974
+ "textContent": "${$map.item.meta}"
975
+ }
976
+ ]
977
+ }
978
+ }
979
+ ]
980
+ },
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
+ "table": {
1100
+ "tagName": "div",
1101
+ "attributes": {
1102
+ "part": "table",
1103
+ "role": "table"
1104
+ },
1105
+ "children": [
1106
+ {
1107
+ "tagName": "div",
1108
+ "attributes": {
1109
+ "part": "table-head",
1110
+ "role": "row"
1111
+ },
1112
+ "children": [
1113
+ {
1114
+ "$prototype": "Array",
1115
+ "items": {
1116
+ "$ref": "#/state/columns"
1117
+ },
1118
+ "key": {
1119
+ "$ref": "$map/item/field"
1120
+ },
1121
+ "map": {
1122
+ "tagName": "div",
1123
+ "attributes": {
1124
+ "part": "cell",
1125
+ "role": "columnheader",
1126
+ "data-field": "${$map.item.field}"
1127
+ },
1128
+ "textContent": "${$map.item.title}"
1129
+ }
1130
+ }
1131
+ ]
1132
+ },
1133
+ {
1134
+ "tagName": "div",
1135
+ "attributes": {
1136
+ "part": "pad",
1137
+ "style": "${state.padTop}"
1138
+ }
1139
+ },
1140
+ {
1141
+ "$prototype": "Array",
1142
+ "items": {
1143
+ "$ref": "#/state/rows"
1144
+ },
1145
+ "key": {
1146
+ "$ref": "$map/item/path"
1147
+ },
1148
+ "map": {
1149
+ "tagName": "div",
1150
+ "attributes": {
1151
+ "part": "table-row",
1152
+ "role": "row",
1153
+ "data-path": "${$map.item.path}"
1154
+ },
1155
+ "onclick": {
1156
+ "$prototype": "Function",
1157
+ "body": [
1158
+ {
1159
+ "operator": "call",
1160
+ "target": {
1161
+ "$ref": "#/state/openFile"
1162
+ },
1163
+ "value": [
1164
+ {
1165
+ "$ref": "$map/item/path"
1166
+ }
1167
+ ]
1168
+ }
1169
+ ]
1170
+ },
1171
+ "oncontextmenu": {
1172
+ "$prototype": "Function",
1173
+ "body": [
1174
+ {
1175
+ "preventDefault": true
1176
+ },
1177
+ {
1178
+ "stopPropagation": true
1179
+ },
1180
+ {
1181
+ "operator": "call",
1182
+ "target": {
1183
+ "$ref": "#/state/contextMenu"
1184
+ },
1185
+ "value": [
1186
+ {
1187
+ "$ref": "$map/item/path"
1188
+ },
1189
+ {
1190
+ "$ref": "event#/clientX"
1191
+ },
1192
+ {
1193
+ "$ref": "event#/clientY"
1194
+ }
1195
+ ]
1196
+ }
1197
+ ]
1198
+ },
1199
+ "children": [
1200
+ {
1201
+ "$prototype": "Array",
1202
+ "items": {
1203
+ "$ref": "$map/item/cells"
1204
+ },
1205
+ "key": {
1206
+ "$ref": "$map/item/field"
1207
+ },
1208
+ "map": {
1209
+ "tagName": "div",
1210
+ "attributes": {
1211
+ "part": "cell",
1212
+ "role": "cell",
1213
+ "data-field": "${$map.item.field}"
1214
+ },
1215
+ "textContent": "${$map.item.text}"
1216
+ }
1217
+ }
1218
+ ]
1219
+ }
1220
+ },
1221
+ {
1222
+ "tagName": "div",
1223
+ "attributes": {
1224
+ "part": "pad",
1225
+ "style": "${state.padBottom}"
1226
+ }
1227
+ }
1228
+ ]
1229
+ },
1230
+ "calendar": {
1231
+ "tagName": "div",
1232
+ "attributes": {
1233
+ "part": "calendar"
1234
+ },
1235
+ "children": [
1236
+ {
1237
+ "$prototype": "Array",
1238
+ "items": {
1239
+ "$ref": "#/state/groups"
1240
+ },
1241
+ "key": {
1242
+ "$ref": "$map/item/id"
1243
+ },
1244
+ "map": {
1245
+ "tagName": "section",
1246
+ "attributes": {
1247
+ "part": "day",
1248
+ "data-undated": "${$map.item.undated}"
1249
+ },
1250
+ "children": [
1251
+ {
1252
+ "tagName": "h3",
1253
+ "attributes": {
1254
+ "part": "day-date"
1255
+ },
1256
+ "textContent": "${$map.item.title}"
1257
+ },
1258
+ {
1259
+ "tagName": "div",
1260
+ "attributes": {
1261
+ "part": "note-slot",
1262
+ "role": "none"
1263
+ },
1264
+ "$switch": {
1265
+ "$ref": "$map/item/noteState"
1266
+ },
1267
+ "cases": {
1268
+ "shown": {
1269
+ "tagName": "p",
1270
+ "attributes": {
1271
+ "part": "note"
1272
+ },
1273
+ "textContent": "${$map.item.note}"
1274
+ }
1275
+ }
1276
+ },
1277
+ {
1278
+ "tagName": "ul",
1279
+ "attributes": {
1280
+ "part": "list"
1281
+ },
1282
+ "children": [
1283
+ {
1284
+ "$prototype": "Array",
1285
+ "items": {
1286
+ "$ref": "$map/item/files"
1287
+ },
1288
+ "key": {
1289
+ "$ref": "$map/item/path"
1290
+ },
1291
+ "map": {
1292
+ "tagName": "li",
1293
+ "attributes": {
1294
+ "part": "list-item",
1295
+ "data-path": "${$map.item.path}",
1296
+ "title": "${$map.item.path}"
1297
+ },
1298
+ "textContent": "${$map.item.name}",
1299
+ "onclick": {
1300
+ "$prototype": "Function",
1301
+ "body": [
1302
+ {
1303
+ "operator": "call",
1304
+ "target": {
1305
+ "$ref": "#/state/openFile"
1306
+ },
1307
+ "value": [
1308
+ {
1309
+ "$ref": "$map/item/path"
1310
+ }
1311
+ ]
1312
+ }
1313
+ ]
1314
+ },
1315
+ "oncontextmenu": {
1316
+ "$prototype": "Function",
1317
+ "body": [
1318
+ {
1319
+ "preventDefault": true
1320
+ },
1321
+ {
1322
+ "stopPropagation": true
1323
+ },
1324
+ {
1325
+ "operator": "call",
1326
+ "target": {
1327
+ "$ref": "#/state/contextMenu"
1328
+ },
1329
+ "value": [
1330
+ {
1331
+ "$ref": "$map/item/path"
1332
+ },
1333
+ {
1334
+ "$ref": "event#/clientX"
1335
+ },
1336
+ {
1337
+ "$ref": "event#/clientY"
1338
+ }
1339
+ ]
1340
+ }
1341
+ ]
1342
+ }
1343
+ }
1344
+ }
1345
+ ]
1346
+ }
1347
+ ]
1348
+ }
1349
+ },
1350
+ {
1351
+ "tagName": "div",
1352
+ "attributes": {
1353
+ "part": "truncated-slot",
1354
+ "role": "none"
1355
+ },
1356
+ "$switch": {
1357
+ "$ref": "#/state/truncatedState"
1358
+ },
1359
+ "cases": {
1360
+ "shown": {
1361
+ "tagName": "p",
1362
+ "attributes": {
1363
+ "part": "truncated"
1364
+ },
1365
+ "textContent": "${state.truncated}"
1366
+ }
1367
+ }
1368
+ }
1369
+ ]
1370
+ },
1371
+ "board": {
1372
+ "tagName": "div",
1373
+ "attributes": {
1374
+ "part": "board"
1375
+ },
1376
+ "children": [
1377
+ {
1378
+ "$prototype": "Array",
1379
+ "items": {
1380
+ "$ref": "#/state/groups"
1381
+ },
1382
+ "key": {
1383
+ "$ref": "$map/item/id"
1384
+ },
1385
+ "map": {
1386
+ "tagName": "section",
1387
+ "attributes": {
1388
+ "part": "column"
1389
+ },
1390
+ "children": [
1391
+ {
1392
+ "tagName": "h3",
1393
+ "attributes": {
1394
+ "part": "column-title"
1395
+ },
1396
+ "children": [
1397
+ {
1398
+ "tagName": "span",
1399
+ "textContent": "${$map.item.title}"
1400
+ },
1401
+ {
1402
+ "tagName": "span",
1403
+ "attributes": {
1404
+ "part": "count"
1405
+ },
1406
+ "textContent": "${$map.item.count}"
1407
+ }
1408
+ ]
1409
+ },
1410
+ {
1411
+ "tagName": "ul",
1412
+ "attributes": {
1413
+ "part": "list"
1414
+ },
1415
+ "children": [
1416
+ {
1417
+ "$prototype": "Array",
1418
+ "items": {
1419
+ "$ref": "$map/item/files"
1420
+ },
1421
+ "key": {
1422
+ "$ref": "$map/item/path"
1423
+ },
1424
+ "map": {
1425
+ "tagName": "li",
1426
+ "attributes": {
1427
+ "part": "list-item",
1428
+ "data-path": "${$map.item.path}",
1429
+ "title": "${$map.item.path}"
1430
+ },
1431
+ "textContent": "${$map.item.name}",
1432
+ "onclick": {
1433
+ "$prototype": "Function",
1434
+ "body": [
1435
+ {
1436
+ "operator": "call",
1437
+ "target": {
1438
+ "$ref": "#/state/openFile"
1439
+ },
1440
+ "value": [
1441
+ {
1442
+ "$ref": "$map/item/path"
1443
+ }
1444
+ ]
1445
+ }
1446
+ ]
1447
+ },
1448
+ "oncontextmenu": {
1449
+ "$prototype": "Function",
1450
+ "body": [
1451
+ {
1452
+ "preventDefault": true
1453
+ },
1454
+ {
1455
+ "stopPropagation": true
1456
+ },
1457
+ {
1458
+ "operator": "call",
1459
+ "target": {
1460
+ "$ref": "#/state/contextMenu"
1461
+ },
1462
+ "value": [
1463
+ {
1464
+ "$ref": "$map/item/path"
1465
+ },
1466
+ {
1467
+ "$ref": "event#/clientX"
1468
+ },
1469
+ {
1470
+ "$ref": "event#/clientY"
1471
+ }
1472
+ ]
1473
+ }
1474
+ ]
1475
+ }
1476
+ }
1477
+ }
1478
+ ]
1479
+ },
1480
+ {
1481
+ "tagName": "div",
1482
+ "attributes": {
1483
+ "part": "note-slot",
1484
+ "role": "none"
1485
+ },
1486
+ "$switch": {
1487
+ "$ref": "$map/item/noteState"
1488
+ },
1489
+ "cases": {
1490
+ "shown": {
1491
+ "tagName": "p",
1492
+ "attributes": {
1493
+ "part": "truncated"
1494
+ },
1495
+ "textContent": "${$map.item.note}"
1496
+ }
1497
+ }
1498
+ }
1499
+ ]
1500
+ }
1501
+ }
1502
+ ]
1503
+ }
1504
+ }
1505
+ }
1506
+ ]
1507
+ }
1508
+ ]
1509
+ }