@jxsuite/studio 10.2.0 → 10.4.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 (272) hide show
  1. package/dist/chunks/{2020-bx702wqa.js → 2020-906vx2dq.js} +3 -3
  2. package/dist/chunks/adapter-hnvad61x.js +4 -0
  3. package/dist/chunks/add-new-flow-v0pm96mr.js +4 -0
  4. package/dist/chunks/cf-account-picker-xb8vvt2h.js +4 -0
  5. package/dist/chunks/cf-settings-mkbcz4z2.js +4 -0
  6. package/dist/chunks/components-w5zqwva1.js +4 -0
  7. package/dist/chunks/content-source-g38w0d3f.js +4 -0
  8. package/dist/chunks/convert-to-repeater-r8sfxjjm.js +4 -0
  9. package/dist/chunks/editor-wvf5e6j9.js +4 -0
  10. package/dist/chunks/entry-commands-t13dyw3c.js +4 -0
  11. package/dist/chunks/extension-sections-vjzw46xb.js +4 -0
  12. package/dist/chunks/file-ops-1sghzgcr.js +4 -0
  13. package/dist/chunks/files-zrqtgt41.js +4 -0
  14. package/dist/chunks/format-host-9gy76erh.js +4 -0
  15. package/dist/chunks/fs-events-45rhg3me.js +4 -0
  16. package/dist/chunks/grid-open-t4fq6bbm.js +4 -0
  17. package/dist/chunks/{grid-view-tghcwrrt.js → grid-view-2f03wcgw.js} +16 -16
  18. package/dist/chunks/icons-gb967qc8.js +4 -0
  19. package/dist/chunks/iframe-host-9aq8ze3q.js +4 -0
  20. package/dist/chunks/image-bake-4afr4y6a.js +4 -0
  21. package/dist/chunks/image-editor-x7t8jbjn.js +4 -0
  22. package/dist/chunks/index-f9qr7kzh.js +4 -0
  23. package/dist/chunks/{index-vr006kbt.js → index-yjrfeks8.js} +3 -3
  24. package/dist/chunks/{javascript-z1g3s9fd.js → javascript-hy2mws8v.js} +3 -3
  25. package/dist/chunks/{jsonMode-7szwg8c4.js → jsonMode-vj30te2h.js} +6 -6
  26. package/dist/chunks/jx-validate-r4ax11e3.js +4 -0
  27. package/dist/chunks/layers-m49nmwvx.js +4 -0
  28. package/dist/chunks/layers-panel-zr92pwdp.js +4 -0
  29. package/dist/chunks/lit-html-k2mb9k0r.js +4 -0
  30. package/dist/chunks/media-library-j74rt0w4.js +4 -0
  31. package/dist/chunks/media-open-mypr0k6b.js +4 -0
  32. package/dist/chunks/media-picker-pemtbsjv.js +4 -0
  33. package/dist/chunks/{monaco-binding-v42w9c1v.js → monaco-binding-a51py33c.js} +3 -3
  34. package/dist/chunks/monaco-buffer-pa0g6ax7.js +4 -0
  35. package/dist/chunks/{monaco-setup-7bffxd6v.js → monaco-setup-0hw9f835.js} +3 -3
  36. package/dist/chunks/notify-bwehrp7q.js +4 -0
  37. package/dist/chunks/parse-hee7ne9b.js +4 -0
  38. package/dist/chunks/platform-kv0k65cy.js +4 -0
  39. package/dist/chunks/publish-panel-vg1n880b.js +4 -0
  40. package/dist/chunks/publish-quick-4fwngwrw.js +4 -0
  41. package/dist/chunks/publish-workspace-jv4w2bx2.js +4 -0
  42. package/dist/chunks/quick-search-nh29rt8a.js +4 -0
  43. package/dist/chunks/references-vqyr5s9x.js +4 -0
  44. package/dist/chunks/right-panel-3ws9f2w0.js +4 -0
  45. package/dist/chunks/source-control-h3hcs5gy.js +4 -0
  46. package/dist/chunks/{studio-j3d2fjqz.js → studio-0939t1q1.js} +4 -4
  47. package/dist/chunks/studio-0gvvqj3h.js +5 -0
  48. package/dist/chunks/studio-0khd8xtx.js +4 -0
  49. package/dist/chunks/{studio-9b7177jq.js → studio-0x6f3nk9.js} +4 -4
  50. package/dist/chunks/studio-1410q5dw.js +5 -0
  51. package/dist/chunks/studio-1ctnw3xv.js +5 -0
  52. package/dist/chunks/studio-1ks5d9y4.js +5 -0
  53. package/dist/chunks/{studio-awxwjawq.js → studio-1y9mab9m.js} +4 -4
  54. package/dist/chunks/studio-2e4hry72.js +6 -0
  55. package/dist/chunks/studio-2kpxm0eh.js +7 -0
  56. package/dist/chunks/studio-2pk7kc7z.js +5 -0
  57. package/dist/chunks/studio-2x972v58.js +5 -0
  58. package/dist/chunks/studio-2zz4qbv9.js +5 -0
  59. package/dist/chunks/{studio-bvs9kpst.js → studio-3na1r48j.js} +8 -8
  60. package/dist/chunks/studio-3pz4t5a2.js +5 -0
  61. package/dist/chunks/studio-3qr08sxq.js +4 -0
  62. package/dist/chunks/{studio-75kcdbsk.js → studio-45mj4jqe.js} +4 -4
  63. package/dist/chunks/studio-4bgvvzhv.js +5 -0
  64. package/dist/chunks/studio-4f7thq0p.js +5 -0
  65. package/dist/chunks/studio-4fnb5648.js +5 -0
  66. package/dist/chunks/studio-4zd6an2b.js +5 -0
  67. package/dist/chunks/{studio-9rbe2xpw.js → studio-5tet77de.js} +3 -3
  68. package/dist/chunks/studio-61rg2cz5.js +5 -0
  69. package/dist/chunks/{studio-ybnwymxw.js → studio-7rrdbvex.js} +4 -4
  70. package/dist/chunks/{studio-sxdb9h3q.js → studio-90zkgne5.js} +7 -7
  71. package/dist/chunks/studio-9c6cbq2c.js +4 -0
  72. package/dist/chunks/studio-9dq7rwc7.js +5 -0
  73. package/dist/chunks/studio-9gr7xs9r.js +6 -0
  74. package/dist/chunks/studio-a88ej93p.js +7 -0
  75. package/dist/chunks/{studio-er5f383a.js → studio-abh9kfdh.js} +4 -4
  76. package/dist/chunks/studio-acer0g8w.js +5 -0
  77. package/dist/chunks/{studio-qh8berdz.js → studio-amaz545p.js} +4 -4
  78. package/dist/chunks/studio-az3wvyh2.js +5 -0
  79. package/dist/chunks/studio-bg8pzprg.js +5 -0
  80. package/dist/chunks/{studio-399a25za.js → studio-bnc50f9h.js} +4 -4
  81. package/dist/chunks/studio-brh8d2pr.js +5 -0
  82. package/dist/chunks/{studio-646nn2ys.js → studio-c2fa783p.js} +5 -5
  83. package/dist/chunks/studio-cfnn70h1.js +5 -0
  84. package/dist/chunks/{studio-rzqaz21g.js → studio-cqxj4fcy.js} +4 -4
  85. package/dist/chunks/studio-cw11h078.js +5 -0
  86. package/dist/chunks/studio-daksw8kh.js +5 -0
  87. package/dist/chunks/studio-dn56z7sn.js +5 -0
  88. package/dist/chunks/studio-egnjpyde.js +9 -0
  89. package/dist/chunks/studio-ejrypvmq.js +5 -0
  90. package/dist/chunks/studio-eqcddvc2.js +928 -0
  91. package/dist/chunks/studio-evq47j2z.js +5 -0
  92. package/dist/chunks/{studio-r7pf0rkv.js → studio-frc16j8v.js} +7 -7
  93. package/dist/chunks/studio-g0hxtcga.js +5 -0
  94. package/dist/chunks/{studio-th7z3fg7.js → studio-g9brbewz.js} +4 -4
  95. package/dist/chunks/studio-gnazwtv3.js +5 -0
  96. package/dist/chunks/studio-hfqpfmpk.js +5 -0
  97. package/dist/chunks/studio-hh394phe.js +5 -0
  98. package/dist/chunks/{studio-pjtntksy.js → studio-j0zf5x2x.js} +4 -4
  99. package/dist/chunks/studio-j5fcp6gj.js +5 -0
  100. package/dist/chunks/studio-jd1qb1st.js +7 -0
  101. package/dist/chunks/studio-jma2q8r9.js +5 -0
  102. package/dist/chunks/studio-k0xzrse2.js +64 -0
  103. package/dist/chunks/studio-k1xqrgm5.js +5 -0
  104. package/dist/chunks/studio-k2evngrj.js +7 -0
  105. package/dist/chunks/studio-k3we3kqb.js +5 -0
  106. package/dist/chunks/studio-knsjyx7n.js +5 -0
  107. package/dist/chunks/studio-mrjtnm62.js +5 -0
  108. package/dist/chunks/{studio-sevbc3xv.js → studio-n9qba0gx.js} +4 -4
  109. package/dist/chunks/{studio-ea74s8c1.js → studio-nvcn2ykc.js} +4 -4
  110. package/dist/chunks/studio-nwf0c32p.js +5 -0
  111. package/dist/chunks/studio-nzemfbkk.js +14 -0
  112. package/dist/chunks/{studio-43y04qck.js → studio-pj216fmn.js} +4 -4
  113. package/dist/chunks/{studio-4g8yb6jn.js → studio-pm17wdc4.js} +4 -4
  114. package/dist/chunks/studio-pwctzka3.js +16 -0
  115. package/dist/chunks/{studio-71m92v9s.js → studio-q80fg1d6.js} +7 -7
  116. package/dist/chunks/studio-q9hx2qp0.js +5 -0
  117. package/dist/chunks/studio-qrzmfaf6.js +5 -0
  118. package/dist/chunks/{studio-86r8hp7r.js → studio-r6mx7vm5.js} +5 -5
  119. package/dist/chunks/studio-rr00ex23.js +7 -0
  120. package/dist/chunks/{studio-4jhw38b2.js → studio-s24mhq0z.js} +4 -4
  121. package/dist/chunks/studio-sce30r7b.js +4 -0
  122. package/dist/chunks/studio-swedpd82.js +5 -0
  123. package/dist/chunks/studio-tmfcn347.js +6 -0
  124. package/dist/chunks/studio-tpxcryf2.js +5 -0
  125. package/dist/chunks/{studio-wc6za3zs.js → studio-v5wktj6f.js} +4 -4
  126. package/dist/chunks/studio-v7a7yb5w.js +9 -0
  127. package/dist/chunks/{studio-kg1abnz0.js → studio-vpevkfxw.js} +4 -4
  128. package/dist/chunks/{studio-881z1xrx.js → studio-wmjmsw0p.js} +4 -4
  129. package/dist/chunks/studio-wqfaqw4m.js +5 -0
  130. package/dist/chunks/{studio-hhp4x8xf.js → studio-xpx91fby.js} +5 -5
  131. package/dist/chunks/studio-xva3hzkv.js +5 -0
  132. package/dist/chunks/{studio-6hzdjfv0.js → studio-xx3r3sb0.js} +4 -4
  133. package/dist/chunks/{studio-cg1bfyhf.js → studio-z3fztxrp.js} +8 -8
  134. package/dist/chunks/studio-z9453ypn.js +6 -0
  135. package/dist/chunks/{tsMode-f54j66ym.js → tsMode-jg1dtphj.js} +7 -7
  136. package/dist/chunks/workspace-6ztqcrsh.js +4 -0
  137. package/dist/chunks/workspace-home-rse9h8a0.js +4 -0
  138. package/dist/chunks/{ws-client-e8kj684q.js → ws-client-arz2qsy9.js} +3 -3
  139. package/dist/iframe-entry.js +13 -13
  140. package/dist/manifest.json +83 -78
  141. package/dist/studio.js +84 -84
  142. package/package.json +11 -11
  143. package/src/browse/library-pane.ts +44 -29
  144. package/src/browse/library-preview.ts +6 -2
  145. package/src/canvas/asset-refs.ts +13 -4
  146. package/src/canvas/asset-resolve.ts +54 -11
  147. package/src/canvas/canvas-render.ts +25 -0
  148. package/src/canvas/iframe-entry.ts +5 -1
  149. package/src/canvas/iframe-host.ts +16 -6
  150. package/src/canvas/iframe-protocol.ts +9 -1
  151. package/src/commands/context.ts +5 -0
  152. package/src/commands/live-context.ts +5 -2
  153. package/src/editor/shortcuts.ts +3 -0
  154. package/src/files/asset-versions.ts +108 -2
  155. package/src/files/file-ops.ts +11 -1
  156. package/src/files/files.ts +111 -48
  157. package/src/files/media-paths.ts +12 -4
  158. package/src/files/media-upload.ts +195 -21
  159. package/src/files/new-file-name.ts +39 -1
  160. package/src/media/image-bake.ts +164 -0
  161. package/src/media/image-editor.ts +846 -0
  162. package/src/media/image-format.ts +262 -0
  163. package/src/media/image-recipe.ts +651 -0
  164. package/src/media/media-commands.ts +65 -1
  165. package/src/media/media-library-model.ts +1 -1
  166. package/src/media/media-library.ts +175 -15
  167. package/src/media/media-open.ts +156 -3
  168. package/src/media/media-pane.ts +8 -4
  169. package/src/panels/pane-context.ts +6 -1
  170. package/src/panels/tab-strip.ts +12 -3
  171. package/src/studio.ts +13 -2
  172. package/src/surfaces/image-editor.json +1390 -0
  173. package/src/surfaces/image-editor.ts +272 -0
  174. package/src/surfaces/inspector-dock.json +3 -3
  175. package/src/surfaces/media-library.json +129 -1
  176. package/src/surfaces/media-library.ts +17 -2
  177. package/src/types.ts +2 -1
  178. package/src/workspace/tab-workspace.ts +2 -1
  179. package/src/workspace/workspace-switch.ts +3 -1
  180. package/src/workspace/workspace.ts +22 -1
  181. package/dist/chunks/adapter-pp011m5x.js +0 -4
  182. package/dist/chunks/add-new-flow-ecqmzz76.js +0 -4
  183. package/dist/chunks/cf-account-picker-c07znkqt.js +0 -4
  184. package/dist/chunks/cf-settings-0v2bmqy0.js +0 -4
  185. package/dist/chunks/components-yn0dn2pq.js +0 -4
  186. package/dist/chunks/content-source-g0j41yy6.js +0 -4
  187. package/dist/chunks/convert-to-repeater-sbjk7tgn.js +0 -4
  188. package/dist/chunks/editor-xz02jeh1.js +0 -4
  189. package/dist/chunks/entry-commands-kmt02crp.js +0 -4
  190. package/dist/chunks/extension-sections-0rprf12d.js +0 -4
  191. package/dist/chunks/file-ops-mexj5qed.js +0 -4
  192. package/dist/chunks/files-b2tcppdd.js +0 -4
  193. package/dist/chunks/format-host-btsevv0c.js +0 -4
  194. package/dist/chunks/fs-events-r0apejva.js +0 -4
  195. package/dist/chunks/grid-open-n2a8xkht.js +0 -4
  196. package/dist/chunks/icons-853n6qt3.js +0 -4
  197. package/dist/chunks/iframe-host-gx0ypyh3.js +0 -4
  198. package/dist/chunks/index-bs4k9tr6.js +0 -4
  199. package/dist/chunks/jx-validate-ymf10teh.js +0 -4
  200. package/dist/chunks/layers-p9nfya38.js +0 -4
  201. package/dist/chunks/layers-panel-tt1hzhhf.js +0 -4
  202. package/dist/chunks/lit-html-x18n2sfz.js +0 -4
  203. package/dist/chunks/media-library-0n45gv8r.js +0 -4
  204. package/dist/chunks/media-picker-s09at95z.js +0 -4
  205. package/dist/chunks/monaco-buffer-een2ea0v.js +0 -4
  206. package/dist/chunks/notify-qwb8radt.js +0 -4
  207. package/dist/chunks/parse-v77xtwv7.js +0 -4
  208. package/dist/chunks/platform-8jnez0wr.js +0 -4
  209. package/dist/chunks/publish-panel-aysnj611.js +0 -4
  210. package/dist/chunks/publish-quick-kpbqs9mz.js +0 -4
  211. package/dist/chunks/publish-workspace-nd0a8q99.js +0 -4
  212. package/dist/chunks/quick-search-vg0jkhk2.js +0 -4
  213. package/dist/chunks/references-a7v6a0e2.js +0 -4
  214. package/dist/chunks/right-panel-cvk1vxx5.js +0 -4
  215. package/dist/chunks/source-control-fsqzc6he.js +0 -4
  216. package/dist/chunks/studio-05jfwbmf.js +0 -5
  217. package/dist/chunks/studio-0q5jwddh.js +0 -9
  218. package/dist/chunks/studio-0w2dr0q8.js +0 -5
  219. package/dist/chunks/studio-1tzpds97.js +0 -9
  220. package/dist/chunks/studio-216b27sv.js +0 -4
  221. package/dist/chunks/studio-2ejhqns4.js +0 -5
  222. package/dist/chunks/studio-2r90cts3.js +0 -16
  223. package/dist/chunks/studio-399xknkb.js +0 -6
  224. package/dist/chunks/studio-4ncmwqw5.js +0 -5
  225. package/dist/chunks/studio-5atwjgkj.js +0 -7
  226. package/dist/chunks/studio-5frqk7c0.js +0 -5
  227. package/dist/chunks/studio-6cwj6xrx.js +0 -5
  228. package/dist/chunks/studio-78pywnp2.js +0 -6
  229. package/dist/chunks/studio-886t6ztg.js +0 -5
  230. package/dist/chunks/studio-8wnvtr4z.js +0 -5
  231. package/dist/chunks/studio-8z66jk4z.js +0 -5
  232. package/dist/chunks/studio-b2qpt0xy.js +0 -14
  233. package/dist/chunks/studio-c71806xz.js +0 -7
  234. package/dist/chunks/studio-cbwks69x.js +0 -928
  235. package/dist/chunks/studio-cg710sk9.js +0 -5
  236. package/dist/chunks/studio-cw0wb9qk.js +0 -7
  237. package/dist/chunks/studio-cyheys7k.js +0 -5
  238. package/dist/chunks/studio-ea5m9kg5.js +0 -5
  239. package/dist/chunks/studio-efdxjwyp.js +0 -64
  240. package/dist/chunks/studio-egmw2837.js +0 -5
  241. package/dist/chunks/studio-f746039f.js +0 -5
  242. package/dist/chunks/studio-fmdymd9v.js +0 -5
  243. package/dist/chunks/studio-gcm12z00.js +0 -6
  244. package/dist/chunks/studio-gj98m8gy.js +0 -7
  245. package/dist/chunks/studio-hasbgjah.js +0 -5
  246. package/dist/chunks/studio-hz5n7x27.js +0 -5
  247. package/dist/chunks/studio-jeraxdgv.js +0 -7
  248. package/dist/chunks/studio-jvgek9xt.js +0 -5
  249. package/dist/chunks/studio-jws1a87n.js +0 -5
  250. package/dist/chunks/studio-k2sz13zg.js +0 -5
  251. package/dist/chunks/studio-k3m4jkdk.js +0 -5
  252. package/dist/chunks/studio-kg5ya5r2.js +0 -5
  253. package/dist/chunks/studio-khwbgrtg.js +0 -5
  254. package/dist/chunks/studio-mx6wzh25.js +0 -5
  255. package/dist/chunks/studio-mxs3ar9t.js +0 -5
  256. package/dist/chunks/studio-nm4szey4.js +0 -5
  257. package/dist/chunks/studio-nqxqf8p2.js +0 -4
  258. package/dist/chunks/studio-qn7z4krm.js +0 -5
  259. package/dist/chunks/studio-qyed0ah6.js +0 -5
  260. package/dist/chunks/studio-r4bcdwhq.js +0 -5
  261. package/dist/chunks/studio-rtfnhrdg.js +0 -5
  262. package/dist/chunks/studio-s5tzw84t.js +0 -5
  263. package/dist/chunks/studio-t51y8v1d.js +0 -5
  264. package/dist/chunks/studio-t98vq4r6.js +0 -5
  265. package/dist/chunks/studio-tsxpqvh0.js +0 -6
  266. package/dist/chunks/studio-v1yascv2.js +0 -5
  267. package/dist/chunks/studio-wxq6v5sv.js +0 -5
  268. package/dist/chunks/studio-y60sts62.js +0 -4
  269. package/dist/chunks/studio-zndrqawb.js +0 -5
  270. package/dist/chunks/studio-zwaxn5s2.js +0 -5
  271. package/dist/chunks/workspace-home-x1787wpv.js +0 -4
  272. package/dist/chunks/workspace-zpe1np43.js +0 -4
@@ -0,0 +1,7 @@
1
+ import{p,ye}from"./studio-4fnb5648.js";import{Cs}from"./studio-frc16j8v.js";import{X}from"./studio-9c6cbq2c.js";import{w}from"./studio-sce30r7b.js";import{nt,Fn}from"./studio-tpxcryf2.js";import{Wt,ln,go,mv}from"./studio-knsjyx7n.js";import{qs}from"./studio-v7a7yb5w.js";import{zt}from"./studio-daksw8kh.js";import{us}from"./studio-4zd6an2b.js";import{yf}from"./studio-1ks5d9y4.js";import{Wm,Ax,nr}from"./studio-61rg2cz5.js";import{yr,ih,hC,NA,qb,hi,ax,PA,Ql,gC,sh,jA,Ap}from"./studio-xva3hzkv.js";import{Ab,Ob}from"./studio-hfqpfmpk.js";import{AS,Mw,Tm,Pw,OS,_i}from"./studio-a88ej93p.js";import{Sp,wS,sT,kb,aT,Cw,kw,lN,cT,_m,Ew,uN,dT,Eb,hN,pN,fN,mN,gN,uT,bN}from"./studio-z3fztxrp.js";import{iN,yw,ww,_p}from"./studio-z9453ypn.js";import{Vl}from"./studio-1ctnw3xv.js";import{PS}from"./studio-g0hxtcga.js";import{Sa}from"./studio-qrzmfaf6.js";import{Rp}from"./studio-cfnn70h1.js";import{C,wn}from"./studio-4f7thq0p.js";import{Ln,E,R}from"./studio-9dq7rwc7.js";import{me,te,g}from"./studio-3qr08sxq.js";import{n,Q,_,v}from"./studio-k3we3kqb.js";import{ce}from"./studio-0939t1q1.js";function ae(e){return{contentType:null,draft:!1,layout:void 0,path:e}}function ue(e,t,a){let{contentType:r,layout:o}=gC(t,a),i=a?.[Cs]===!0||t?.[Cs]===!0;return{contentType:r,draft:i,layout:o,path:e}}async function Ie(e){try{let t=await p().readFile(e);if(e.endsWith(".json")){let o=JSON.parse(t);return _(o)&&!Array.isArray(o)?ue(e,o,null):ae(e)}let{parseSourceForPath:a}=await (ce("1sghzgcr"),import("./file-ops-1sghzgcr.js")),r=await a(e,t);return ue(e,r.document,r.frontmatter)}catch{return ae(e)}}var Ve=300,q=null,V=null,re=0,ne=new Set;function fe(e){let t=e.join(`
2
+ `);if(q?.key===t)return q.pages;if(!ye())return new Map(e.map((a)=>[a,ae(a)]));if(V?.key!==t){let a=re,r=Promise.all(e.slice(0,Ve).map((o)=>Ie(o))).then((o)=>{if(a!==re||V?.read!==r)return;V=null,q={key:t,pages:new Map(o.map((i)=>[i.path,i]))};for(let i of ne)i()});V={key:t,read:r}}return null}function cb(){re+=1,q=null,V=null}function ge(e){return ne.add(e),()=>{ne.delete(e)}}function lw(e){return e?"true":"false"}function ED(e){return e.trim().toLowerCase()}function db(e,...t){return e===""||t.some((a)=>a.toLowerCase().includes(e))}function Id(e){let t=e.replaceAll(/[-_]+/g," ").trim();return t===""?e:t.charAt(0).toUpperCase()+t.slice(1)}function ie(e){let t=Id(e);if(/ies$/i.test(t))return`${t.slice(0,-3)}y`;if(/[^s]s$/i.test(t))return t.slice(0,-1);return t}function oe(e){let t=e.slice(e.lastIndexOf("/")+1),a=t.lastIndexOf(".");return a>0?t.slice(0,a):t}function Y(e,t,a){let r=go(t,a);return r===null?e:`${e} (${r})`}function U(e,t,a=null){if(go(t,a)!==null){let c=mv(t,a);return Y(U(yr(c),c),t,a)}if(e.urlPattern==="/")return"Home";let r=e.urlPattern.split("/").filter((c)=>c!==""),o=(c)=>c==="*"||c.startsWith(":"),i=r.at(-1)??oe(t);if(!o(i))return Id(i);let l=r.findLast((c)=>!o(c));return Id(l??oe(t).replaceAll(/[[\].]/g,""))}function TD(e,t,a,r={}){let o=r.i18n??null,i=e.flatMap((u)=>ih(u.path,r.extensions)?[{fact:u,route:yr(u.path)}]:[]).toSorted((u,m)=>hC(u.route,m.route)||u.fact.path.localeCompare(m.fact.path)),l=[],c=(u,m,f,S)=>({detail:m.urlPattern,key:u.path,kind:f,label:S,path:u.path,selected:lw(u.path===a)}),d=new Map;for(let u of i){let m=u.fact.contentType;if(m!==null&&t.has(m))d.set(m,[...d.get(m)??[],u])}let s=new Set;for(let{fact:u,route:m}of i){let f=u.contentType,S=f===null?void 0:d.get(f);if(f===null||S===void 0){l.push(c(u,m,"page",U(m,u.path,o)));continue}if(s.has(f))continue;s.add(f),l.push({detail:ze(t.get(f)??null),key:`collection:${f}`,kind:"collection",label:Id(f),path:"",selected:"false"});let H=`${ie(f)} page`;for(let O of S){let P=Y(H,O.fact.path,o);l.push(c(O.fact,O.route,"entry-page",P))}}return l}function ze(e){if(e===null)return"";return`${e} ${e===1?"entry":"entries"}`}function LD(e,t){if(t==="")return[...e];let a=[],r=null,o=!1;for(let i of e){if(i.kind==="collection"){if(r=i,o=db(t,i.label),o)a.push(i);continue}if(i.kind==="page")r=null;if(i.kind==="entry-page"&&o||db(t,i.label,i.detail,i.path)){if(r&&!o)a.push(r),o=!0;a.push(i)}}return a}function EE(e,t,a,r=null){return e.filter((o)=>o.endsWith(".json")).toSorted((o,i)=>o.localeCompare(i)).flatMap((o)=>{let i=Id(oe(o));if(!db(a,i,o))return[];return[{detail:o===r?"default layout":"",key:o,label:i,path:o,selected:lw(o===t)}]})}var Be='img:not([src]), img[src=""] { visibility: hidden; }',he=new WeakMap;function _e(e){let t=he.get(e);if(t)return t;let a=e.defaultView?.CSSStyleSheet;if(!Q(a))return null;let r=new a;return r.replaceSync(Be),he.set(e,r),r}function cw(e,t){let a=e.shadowRoot??e.attachShadow({mode:"open"}),r=_e(e.ownerDocument);a.adoptedStyleSheets=[...iN(),...e.ownerDocument.adoptedStyleSheets,...r?[r]:[]],a.replaceChildren(t)}function dw(e){return e.shadowRoot?.firstElementChild??null}function z(e,t){if(e===void 0||e.trim()==="")return[];if(!t)return[e];return e.split(",").map((a)=>a.trim()).filter((a)=>a!=="")}var We=12;function we(e,t,a){let r=e.find((o)=>t.has(o.name));if(r)return{...r,order:t.get(r.name)};for(let o of e){if(o.measure)continue;let i=a.flatMap((c)=>z(c?.fields?.[o.name],o.list)),l=new Set(i).size;if(l>=2&&l<i.length&&l<=We)return{...o,order:[]}}return null}function N(e){return(t)=>e.get(t.path)}var ve=N(new Map),de={board:{itemWidth:0,rowHeight:0,windowed:!1},calendar:{itemWidth:0,rowHeight:0,windowed:!1},cards:{itemWidth:200,rowHeight:194,windowed:!0},table:{itemWidth:0,rowHeight:32,windowed:!0}},He=60,le=25;function xe(e,t){let a=de[e];if(a.itemWidth<=0||t<=0)return 1;return Math.max(1,Math.floor(t/a.itemWidth))}function Ge(e){if(e===void 0||!Number.isFinite(e))return"";if(e<1024)return`${e} B`;let t=["KB","MB","GB"],a=e/1024,r=0;while(a>=1024&&r<t.length-1)a/=1024,r+=1;return`${a<10?a.toFixed(1):Math.round(a)} ${t[r]}`}function qe(e){return e?Rp(new Date(e)):""}function Ye(e,t,a){switch(t){case"date":return a?.date??"";case"status":return a?.status??"";case"template":return a?.template??"";case"title":return a?.title??e.name;case"locale":return e.locale?Wt(e.locale):"";case"modified":return qe(e.modified);case"name":return e.name;case"path":return e.record?.source??e.path;case"size":return Ge(e.size);case"type":return e.type;case"url":return e.collection===hi?yr(e.path).urlPattern:"";default:{let r=mN(t);return r===null?"":a?.fields?.[r]??""}}}function $e(e,t,a,r){let o=yf(e.ext),i=r?.thumb??"";return{art:o||i!==""?"image":a&&e.collection!==null&&!e.record?"doc":"glyph",cells:t.map((l)=>({field:l.field,text:Ye(e,l.field,r)})),meta:e.type,name:r?.title??e.name,path:e.path,src:o?nr(e.path):i}}function se(e,t){return{art:"glyph",cells:[],meta:e.type,name:t?.title??e.name,path:e.path,src:""}}function Se(e,t=ve){let{days:a,undated:r}=pN(e,(c)=>t(c)?.date||dT(c)),o=a.slice(0,He),i=a.length-o.length,l=o.map((c)=>({count:"",files:c.files.map((d)=>se(d,t(d))),id:c.date,note:"",noteState:"hidden",title:c.date,undated:"false"}));if(r.length>0)l.push({count:"",files:r.slice(0,le).map((c)=>se(c,t(c))),id:"__undated",note:`${r.length} file${r.length===1?"":"s"} with no dated name and no modification time.`,noteState:"shown",title:"No date",undated:"true"});return{groups:l,truncated:i>0?`${i} older ${i===1?"day is":"days are"} not shown — filter, or switch to Table.`:""}}var be=["Draft","Published"];function Ue(e,t){let a=new Map;for(let o of e){let i=t(o)?.status||"No status",l=a.get(i);if(l)l.push(o);else a.set(i,[o])}let r=(o)=>{let i=be.indexOf(o);return i===-1?be.length:i};return[...a.entries()].map(([o,i])=>({files:i,group:o})).toSorted((o,i)=>r(o.group)-r(i.group)||o.group.localeCompare(i.group))}function Je(e,t,a){let r=`No ${a.title.toLowerCase()}`,o=new Map;for(let l of e){let c=z(t(l)?.fields?.[a.name],a.list);for(let d of c.length===0?[r]:new Set(c)){let s=o.get(d);if(s)s.push(l);else o.set(d,[l])}}let i=(l)=>{if(l===r)return Number.MAX_SAFE_INTEGER;let c=a.order.indexOf(l);return c===-1?a.order.length:c};return[...o.entries()].map(([l,c])=>({files:c,group:l})).toSorted((l,c)=>i(l.group)-i(c.group)||l.group.localeCompare(c.group))}function Le(e,t=ve,a=null){return(e.some((i)=>(t(i)?.status??"")!=="")?Ue(e,t):a?Je(e,t,a):fN(e)).map((i)=>{let l=i.files.length-le;return{count:String(i.files.length),files:i.files.slice(0,le).map((c)=>se(c,t(c))),id:i.group,note:l>0?`${l} more — switch to Table to see them.`:"",noteState:l>0?"shown":"hidden",title:i.group,undated:"false"}})}var Fe={$schema:"https://jxsuite.com/schema/v1",$id:"StudioLibraryPane",$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.",tagName:"div",attributes:{part:"library","data-jx-region":"${state.region}"},style:{$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.",display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"hidden",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",'& [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"]':{$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.",display:"contents"},'& [part="head"]':{$description:"The collection's title over its toolbar: the Content-Collection and Content-Pages boards' heading row. It does not scroll with the list.",display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",padding:"var(--jx-space-4) var(--jx-space-5) var(--jx-space-3)",background:"var(--bg-panel)",borderBottom:"1px solid var(--border)",flexShrink:"0"},'& [part="heading"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-1)"},'& [part="title"]':{margin:"0",fontSize:"var(--jx-text-lg)",fontWeight:"600",color:"var(--fg)"},'& [part="subtitle"]':{margin:"0",fontSize:"var(--jx-text-md)",color:"var(--fg-dim)"},'& [part="subtitle"]:empty':{$description:"Only Pages carries a line under its title; a collection's own line is the header bar below the toolbar.",display:"none"},'& [part="toolbar"]':{$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.",display:"flex",alignItems:"center",gap:"var(--jx-space-3)",padding:"0",flexShrink:"0",flexWrap:"wrap"},'& [part="search"]':{width:"220px"},'& [part="locale"]':{$description:"Narrow on purpose: it holds one language name, and the toolbar wraps before it grows.",width:"160px"},'& [part="filter"]':{$description:"Narrow like the language facet: it holds one value of one field.",width:"160px"},'& [part="spacer"]':{flex:"1"},'& [part="layouts"]':{flexShrink:"0"},'& [part="banner"]':{$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.",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--jx-space-4)",padding:"var(--jx-space-3) var(--jx-space-5)",background:"color-mix(in srgb, var(--warning) 18%, var(--bg-panel))",borderBottom:"1px solid var(--border)",color:"var(--fg)",fontSize:"var(--jx-text-md)"},'& [part="body"]':{flex:"1",minHeight:"0",overflow:"auto",position:"relative"},'& [part="empty"]':{padding:"48px var(--jx-space-6)",textAlign:"center",color:"var(--fg-dim)",display:"flex",flexDirection:"column",alignItems:"center",gap:"var(--jx-space-3)"},'& [part="empty"] p':{margin:"0"},'& [part="empty-detail"]':{fontSize:"var(--jx-text-md)",color:"var(--fg-dim)"},'& [part="truncated"]':{$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”.",margin:"var(--jx-space-3) 0 0",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)"},'& [part="grid"]':{$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.",display:"grid",gap:"var(--jx-space-4)",padding:"var(--jx-space-4) var(--jx-space-5)",alignItems:"start"},'& [part="grid"][data-layout="cards"]':{gridTemplateColumns:"repeat(auto-fill, minmax(188px, 1fr))"},'& [part="card"], & [part="tile"]':{cursor:"pointer",overflow:"hidden",border:"1px solid var(--border)",borderRadius:"var(--radius)",background:"var(--bg-panel)"},'& [part="card"]:hover, & [part="tile"]:hover':{borderColor:"var(--accent)"},'& [part="card-art"], & [part="tile-art"]':{aspectRatio:"4 / 3",display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden",background:"var(--bg-input)",pointerEvents:"none"},'& [part="file-glyph"]':{"--jx-icon-size":"32px",color:"var(--fg-dim)"},'& [part="doc-preview"]':{$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.",width:"100%",height:"100%",zoom:"0.4",overflow:"hidden"},'& [part="thumb"]':{maxWidth:"100%",maxHeight:"100%",objectFit:"contain"},'& [part="card-label"], & [part="tile-label"]':{padding:"6px var(--jx-space-3) 0",fontSize:"var(--jx-text-md)",color:"var(--fg)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},'& [part="card-meta"]':{padding:"0 var(--jx-space-3) 6px",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)"},'& [part="table"]':{$description:"A windowed list rather than a table component: the rows have to be sliceable, and every table widget wants the whole set.",display:"flex",flexDirection:"column",minWidth:"min-content",padding:"0 var(--jx-space-5) var(--jx-space-5)"},'& [part="table-head"], & [part="table-row"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-3)",height:"32px",borderBottom:"1px solid var(--border)"},'& [part="table-head"]':{position:"sticky",top:"0",zIndex:"1",background:"var(--bg-panel)",fontWeight:"600",fontSize:"var(--jx-text-md)"},'& [part="table-row"]':{cursor:"pointer"},'& [part="table-row"]:hover':{background:"var(--hover-bg)"},'& [part="cell"]':{$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.",flex:"1",minWidth:"80px",contain:"inline-size",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"var(--jx-text-md)"},'& [part="cell"][data-field="name"], & [part="cell"][data-field="title"]':{$description:"What a row is called keeps a readable width however many field columns stand beside it.",flex:"3",minWidth:"220px",fontWeight:"500"},'& [part="cell"][data-field="path"]':{flex:"2",color:"var(--fg-dim)",fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-sm)"},'& [part="cell"][data-field="size"], & [part="cell"][data-field="modified"]':{flex:"0 0 96px"},'& [part="cell"][data-field="locale"]':{$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.",flex:"0 0 90px",color:"var(--fg-dim)"},'& [part="calendar"]':{padding:"var(--jx-space-4) var(--jx-space-5)"},'& [part="day"]':{marginBottom:"var(--jx-space-5)"},'& [part="day-date"]':{margin:"0 0 var(--jx-space-2)",fontSize:"var(--jx-text-md)",fontWeight:"600",color:"var(--fg)"},'& [part="day"][data-undated="true"] [part="day-date"]':{$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.",color:"var(--fg-dim)"},'& [part="note"]':{margin:"0 0 var(--jx-space-2)",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)"},'& [part="board"]':{display:"flex",gap:"var(--jx-space-4)",padding:"var(--jx-space-4) var(--jx-space-5)",alignItems:"flex-start",overflowX:"auto"},'& [part="column"]':{flex:"0 0 220px",border:"1px solid var(--border)",borderRadius:"var(--radius)",padding:"var(--jx-space-3)",background:"var(--bg-panel)"},'& [part="column-title"]':{margin:"0 0 6px",fontSize:"var(--jx-text-md)",fontWeight:"600",display:"flex",justifyContent:"space-between"},'& [part="count"]':{color:"var(--fg-dim)",fontWeight:"400"},'& [part="list"]':{listStyle:"none",margin:"0",padding:"0"},'& [part="list-item"]':{padding:"3px var(--jx-space-2)",borderRadius:"var(--radius)",cursor:"pointer",fontSize:"var(--jx-text-md)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},'& [part="list-item"]:hover':{background:"var(--hover-bg)"},'& [part="page-line"]':{$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.",display:"flex",alignItems:"center",flexWrap:"wrap",gap:"var(--jx-space-2)",padding:"var(--jx-space-2) var(--jx-space-5)",background:"var(--bg-panel)",borderBottom:"1px solid var(--border)",fontSize:"var(--jx-text-md)",color:"var(--fg-dim)",flexShrink:"0"},'& [part="page-pattern"]':{fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-sm)",color:"var(--fg)"},'& [part="design-page"], & [part="add-page"]':{marginLeft:"auto"},'& [part="card"]:focus-visible, & [part="table-row"]:focus-visible, & [part="list-item"]:focus-visible':{$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.",outline:"var(--jx-focus-ring)",outlineOffset:"-2px"}},children:[{tagName:"div",attributes:{part:"head"},children:[{tagName:"div",attributes:{part:"heading"},children:[{tagName:"h2",attributes:{part:"title"},textContent:"${state.title}"},{tagName:"p",attributes:{part:"subtitle"},textContent:"${state.subtitle}"}]},{tagName:"div",attributes:{part:"toolbar"},children:[{tagName:"jx-action-group",attributes:{part:"layouts"},$props:{selects:"single",compact:!0,label:"View"},children:[{$prototype:"Array",items:{$ref:"#/state/layouts"},key:{$ref:"$map/item/key"},map:{tagName:"jx-action-button",attributes:{part:"layout","data-layout":"${$map.item.key}"},$props:{size:"sm",hint:"${$map.item.label}",checked:{$ref:"$map/item/checked"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setLayout"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}}]},{tagName:"jx-textfield",attributes:{part:"search"},$props:{label:"${state.searchLabel}",placeholder:"${state.searchLabel}…",size:"sm",value:{$ref:"#/state/query"},type:"search"},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/search"},value:[{$ref:"event#/target/value"}]}]}},{tagName:"div",attributes:{part:"locale-slot",role:"none"},$switch:{$ref:"#/state/localeState"},cases:{shown:{tagName:"jx-select",attributes:{part:"locale"},$props:{label:"Language",size:"sm",options:{$ref:"#/state/localeOptions"},value:{$ref:"#/state/localeValue"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setLocale"},value:[{$ref:"event#/target/value"}]}],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."}}}},{tagName:"div",attributes:{part:"filter-slot",role:"none"},$switch:{$ref:"#/state/filterState"},cases:{shown:{$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.",tagName:"jx-select",attributes:{part:"filter"},$props:{label:"Filter",size:"sm",options:{$ref:"#/state/filterOptions"},value:{$ref:"#/state/filterValue"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setFilter"},value:[{$ref:"event#/target/value"}]}]}}}},{tagName:"span",attributes:{part:"spacer"}},{tagName:"div",attributes:{part:"grid-slot",role:"none"},$switch:{$ref:"#/state/fieldsState"},cases:{shown:{tagName:"jx-action-button",attributes:{part:"edit-grid"},$props:{size:"sm",icon:"rows",hint:"Edit every entry of this collection in a grid"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openGrid"},value:[]}],description:"The collection's grid (`collection.editInGrid { name }`): the one visible door to it, since the palette cannot prompt for a free-text name."},children:[{tagName:"span",textContent:"Edit in grid"}]}}},{tagName:"div",attributes:{part:"fields-slot",role:"none"},$switch:{$ref:"#/state/fieldsState"},cases:{shown:{tagName:"jx-action-button",attributes:{part:"fields"},$props:{size:"sm",icon:"sliders-horizontal",hint:"Edit this collection's fields in Project Settings",haspopup:"dialog"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openFields"},value:[]}],description:'Project Settings › Content types, on this collection (`settings.open { section: "content", entry }`).'},children:[{tagName:"span",textContent:"Fields"}]}}},{tagName:"div",attributes:{part:"new-slot",role:"none"},$switch:{$ref:"#/state/newState"},cases:{shown:{tagName:"jx-button",attributes:{part:"new"},$props:{size:"sm",variant:"accent"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openNew"},value:[]}],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."},children:[{tagName:"span",textContent:"${state.newLabel}"}]}}}]}]},{$description:"The header line: where this collection's entries are published, derived from the page whose `$paths.contentType` names it. Pages draw nothing here.",tagName:"div",attributes:{part:"page-slot",role:"none"},$switch:{$ref:"#/state/page/state"},cases:{loading:{tagName:"div",attributes:{part:"page-line"},children:[{tagName:"span",attributes:{part:"page-text"},textContent:"${state.page.text}"}]},page:{tagName:"div",attributes:{part:"page-line","data-state":"page"},children:[{tagName:"span",attributes:{part:"page-text"},textContent:"${state.page.text}"},{tagName:"code",attributes:{part:"page-pattern"},textContent:"${state.page.pattern}"},{tagName:"span",attributes:{part:"page-template"},textContent:"${state.page.template}"},{tagName:"jx-action-button",attributes:{part:"design-page"},$props:{size:"sm",quiet:!0},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/designPage"},value:[]}],description:"Opening the page is activating it, which enters Design (studio.md §22.1)."},children:[{tagName:"span",textContent:"${state.page.designLabel}"}]}]},none:{tagName:"div",attributes:{part:"page-line","data-state":"none"},children:[{tagName:"span",attributes:{part:"page-text"},textContent:"${state.page.text}"},{tagName:"jx-action-button",attributes:{part:"add-page"},$props:{size:"sm",quiet:!0},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/addPage"},value:[]}],description:"Writes the collection's page exactly as Add new's own-page option does."},children:[{tagName:"span",textContent:"Add one"}]}]}}},{tagName:"div",attributes:{part:"banner-slot",role:"none"},$switch:{$ref:"#/state/bannerState"},cases:{shown:{tagName:"div",attributes:{part:"banner",role:"status"},children:[{tagName:"span",textContent:"${state.bannerText}"},{tagName:"jx-button",attributes:{part:"retry"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/retry"}}]},children:[{tagName:"span",textContent:"Retry"}]}]}}},{tagName:"div",attributes:{part:"body"},onscroll:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/scrolled"}}],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."},children:[{tagName:"div",attributes:{part:"view-slot",role:"none"},$switch:{$ref:"#/state/view"},cases:{loading:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",textContent:"Scanning the project…"}]},incomplete:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",textContent:"Nothing to show, and the scan did not finish."},{tagName:"p",attributes:{part:"empty-detail"},textContent:"${state.emptyDetail}"},{tagName:"jx-button",attributes:{part:"retry"},$props:{size:"sm",variant:"primary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/retry"}}]},children:[{tagName:"span",textContent:"Retry"}]}]},empty:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",textContent:"${state.emptyMessage}"},{tagName:"p",attributes:{part:"empty-detail"},textContent:"${state.emptyDetail}"}]},nomatch:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",children:[{tagName:"span",textContent:"${state.emptyMessage}"},{tagName:"span",attributes:{part:"empty-detail"},textContent:" ${state.emptyDetail}"}]},{tagName:"jx-button",attributes:{part:"reset"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/reset"}}],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."},children:[{tagName:"span",textContent:"Clear filters"}]}]},cards:{tagName:"div",attributes:{part:"grid","data-layout":"cards",style:"${state.pad}"},children:[{$prototype:"Array",items:{$ref:"#/state/rows"},key:{$ref:"$map/item/path"},map:{tagName:"div",attributes:{part:"card","data-path":"${$map.item.path}",tabindex:"0",role:"button"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]," ":[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]}}]},oncontextmenu:{$prototype:"Function",body:[{preventDefault:!0},{stopPropagation:!0},{operator:"call",target:{$ref:"#/state/contextMenu"},value:[{$ref:"$map/item/path"},{$ref:"event#/clientX"},{$ref:"event#/clientY"}]}]},children:[{tagName:"div",attributes:{part:"card-art"},children:[{tagName:"div",attributes:{part:"art-slot",role:"none"},$switch:{$ref:"$map/item/art"},cases:{image:{tagName:"img",attributes:{part:"thumb",loading:"lazy",src:"${$map.item.src}",alt:""}},doc:{tagName:"div",attributes:{part:"doc-preview","data-path":"${$map.item.path}",inert:""}},glyph:{tagName:"jx-icon",attributes:{part:"file-glyph"},$props:{name:"file-text"}}}}]},{tagName:"div",attributes:{part:"card-label",title:"${$map.item.path}"},textContent:"${$map.item.name}"},{tagName:"div",attributes:{part:"card-meta"},textContent:"${$map.item.meta}"}]}}]},table:{tagName:"div",attributes:{part:"table",role:"table","aria-label":"${state.title}"},children:[{tagName:"div",attributes:{part:"table-head",role:"row"},children:[{$prototype:"Array",items:{$ref:"#/state/columns"},key:{$ref:"$map/item/field"},map:{tagName:"div",attributes:{part:"cell",role:"columnheader","data-field":"${$map.item.field}"},textContent:"${$map.item.title}"}}]},{tagName:"div",attributes:{part:"pad",style:"${state.padTop}"}},{$prototype:"Array",items:{$ref:"#/state/rows"},key:{$ref:"$map/item/path"},map:{tagName:"div",attributes:{part:"table-row",role:"row","data-path":"${$map.item.path}",tabindex:"0"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]," ":[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]}}]},oncontextmenu:{$prototype:"Function",body:[{preventDefault:!0},{stopPropagation:!0},{operator:"call",target:{$ref:"#/state/contextMenu"},value:[{$ref:"$map/item/path"},{$ref:"event#/clientX"},{$ref:"event#/clientY"}]}]},children:[{$prototype:"Array",items:{$ref:"$map/item/cells"},key:{$ref:"$map/item/field"},map:{tagName:"div",attributes:{part:"cell",role:"cell","data-field":"${$map.item.field}"},textContent:"${$map.item.text}"}}]}},{tagName:"div",attributes:{part:"pad",style:"${state.padBottom}"}}]},calendar:{tagName:"div",attributes:{part:"calendar"},children:[{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/id"},map:{tagName:"section",attributes:{part:"day","data-undated":"${$map.item.undated}"},children:[{tagName:"h3",attributes:{part:"day-date"},textContent:"${$map.item.title}"},{tagName:"div",attributes:{part:"note-slot",role:"none"},$switch:{$ref:"$map/item/noteState"},cases:{shown:{tagName:"p",attributes:{part:"note"},textContent:"${$map.item.note}"}}},{tagName:"ul",attributes:{part:"list"},children:[{$prototype:"Array",items:{$ref:"$map/item/files"},key:{$ref:"$map/item/path"},map:{tagName:"li",attributes:{part:"list-item","data-path":"${$map.item.path}",title:"${$map.item.path}",tabindex:"0"},textContent:"${$map.item.name}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]," ":[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]}}]},oncontextmenu:{$prototype:"Function",body:[{preventDefault:!0},{stopPropagation:!0},{operator:"call",target:{$ref:"#/state/contextMenu"},value:[{$ref:"$map/item/path"},{$ref:"event#/clientX"},{$ref:"event#/clientY"}]}]}}}]}]}},{tagName:"div",attributes:{part:"truncated-slot",role:"none"},$switch:{$ref:"#/state/truncatedState"},cases:{shown:{tagName:"p",attributes:{part:"truncated"},textContent:"${state.truncated}"}}}]},board:{tagName:"div",attributes:{part:"board"},children:[{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/id"},map:{tagName:"section",attributes:{part:"column"},children:[{tagName:"h3",attributes:{part:"column-title"},children:[{tagName:"span",textContent:"${$map.item.title}"},{tagName:"span",attributes:{part:"count"},textContent:"${$map.item.count}"}]},{tagName:"ul",attributes:{part:"list"},children:[{$prototype:"Array",items:{$ref:"$map/item/files"},key:{$ref:"$map/item/path"},map:{tagName:"li",attributes:{part:"list-item","data-path":"${$map.item.path}",title:"${$map.item.path}",tabindex:"0"},textContent:"${$map.item.name}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]," ":[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/openFile"},value:[{$ref:"$map/item/path"}]}]}}]},oncontextmenu:{$prototype:"Function",body:[{preventDefault:!0},{stopPropagation:!0},{operator:"call",target:{$ref:"#/state/contextMenu"},value:[{$ref:"$map/item/path"},{$ref:"event#/clientX"},{$ref:"event#/clientY"}]}]}}}]},{tagName:"div",attributes:{part:"note-slot",role:"none"},$switch:{$ref:"$map/item/noteState"},cases:{shown:{tagName:"p",attributes:{part:"truncated"},textContent:"${$map.item.note}"}}}]}}]}}}]}]};E("library-pane",Fe);function Ce(e,t){e.region=t.region,e.view=t.view,e.title=t.title,e.subtitle=t.subtitle,e.searchLabel=t.searchLabel,e.newLabel=t.newLabel,e.newState=t.newState,e.fieldsState=t.fieldsState,e.page=t.page,e.layouts=t.layouts,e.filterState=t.filterState,e.filterOptions=t.filterOptions,e.filterValue=t.filterValue,e.localeState=t.localeState,e.localeOptions=t.localeOptions,e.localeValue=t.localeValue,e.query=t.query,e.bannerState=t.bannerState,e.bannerText=t.bannerText,e.emptyMessage=t.emptyMessage,e.emptyDetail=t.emptyDetail,e.pad=t.pad,e.padTop=t.padTop,e.padBottom=t.padBottom,e.rows=t.rows,e.columns=t.columns,e.groups=t.groups,e.truncated=t.truncated,e.truncatedState=t.truncatedState}function Xe(e){let t=n(e)?void 0:e.attributes?.part;return n(t)?t:""}function Qe(e){let t=e?.$map,a=v(t)?t.item:void 0,r=v(a)?a.path:void 0;return n(r)?r:""}function ke(e,t,a){e.replaceChildren();let r=new AbortController;NA(e,r.signal);let o=g({addPage:a.addPage,bannerState:"hidden",bannerText:"",columns:[],contextMenu:a.contextMenu,designPage:a.designPage,emptyDetail:"",emptyMessage:"",fieldsState:"hidden",groups:[],layouts:[],filterOptions:[],filterState:"hidden",filterValue:"",localeOptions:[],localeState:"hidden",localeValue:"",newLabel:"",newState:"hidden",openFields:a.openFields,openGrid:a.openGrid,openFile:a.openFile,openNew:a.openNew,pad:"",padBottom:"",padTop:"",previewSlot:a.previewSlot,query:"",region:"",reset:a.reset,retry:a.retry,page:{designLabel:"",pattern:"",state:"hidden",template:"",text:""},rows:[],scrolled:a.scrolled,scroller:a.scroller,search:a.search,searchLabel:"",setLayout:a.setLayout,setFilter:a.setFilter,setLocale:a.setLocale,subtitle:"",title:"",truncated:"",truncatedState:"hidden",view:"loading"});Ce(o,t);let i=null,l=!1,c=R("library-pane",o,e,{onNodeCreated:(d,s,u,m)=>{let f=Xe(u);if(f===""||!(d instanceof HTMLElement))return;if(f==="body"){a.scroller(d);return}if(f==="doc-preview"){let S=Qe(m);if(S)a.previewSlot(d,S)}}}).then((d)=>{let s=d.root;if(l)return d.dispose(),s;return i=d,s});return{attached:()=>{if(l)return!1;let d=i?.root;return d===void 0?!0:d instanceof HTMLElement&&e.contains(d)},dispose(){l=!0,r.abort(),i?.dispose(),i=null},ready:c,update:(d)=>Ce(o,d)}}var Ze="table",y=g({collection:hi,loading:!1,revision:0,views:{}});function il(e=Fu()){let t=y.views[e];if(t)return t;let a={filter:"",layout:Ze,locale:"",query:""};return y.views[e]=a,y.views[e]??a}function T(){return Ql(y.collection)??{fileBacked:!1,item:"page",key:hi,kind:"pages",title:"Pages"}}function Fu(){return T().key}var j=null,A=!1;function k(){if(j?.stale()===!0){j=null,A=!1;for(let e of M.values())e.cache.clear()}return j??=bN(),j}function x(){y.revision+=1}function $D(e){y.collection=e,il(e),x(),wn("leftPanel")}function TE(e,t=Fu()){il(t).layout=e,x()}function G_(e,t=Fu()){il(t).query=e,x()}function et(e,t=Fu()){il(t).filter=e,x()}function K_(e,t=Fu()){il(t).locale=e,x()}function Rd(){j=null,A=!1;for(let e of M.values())e.cache.clear();x()}function LE(){let e=k();if(!A&&!y.loading)I();if(!e.scanned())return null;let t=new Map;for(let a of e.files())if(a.collection!==null)t.set(a.collection,(t.get(a.collection)??0)+1);return t}var tt=600,Pe="content.scan",L="Content";async function I(){let e=k();A=!0,y.loading=!0,x();let t={handle:null},a=setTimeout(()=>{t.handle=qs({source:L,status:"Reading the project's directories…",title:"Scan project files"})},tt);try{await e.rows();let r=e.failures();if(r.length>0){let o=r.map((l)=>`${l.dir} — ${l.error}`).join(`
3
+ `),i=`Could not read ${r.length} project ${r.length===1?"directory":"directories"} — this list is incomplete.`;w.error(i,{action:"content.refresh",detail:o,key:Pe,path:r[0].dir,source:L,tier:"problem"}),t.handle?.setStatus(i)}t.handle?.done(`${e.files().length} file(s)`)}catch(r){if(t.handle)t.handle.fail("Could not scan the project's files.");else w.error("Could not scan the project's files.",{action:"content.refresh",detail:X(r),key:Pe,source:L,tier:"problem"})}finally{clearTimeout(a),y.loading=!1,x(),wn("leftPanel")}}async function $E(){j=null,A=!1;for(let e of M.values())e.cache.clear();await I()}var M=new Map;function W(e){return M.get(e)??null}function IE(e,t){let a=W(e);return a!==null&&a.tabId===t.id&&a.wrap.isConnected&&a.surface.attached()}function RE(e){let t=M.get(e);if(!t)return;if(t.settleTimer!==null)clearTimeout(t.settleTimer),t.settleTimer=null;t.unlisten(),t.observer.destroy(),t.cache.clear(),t.slots.clear(),t.pendingPaths.clear(),t.scope.stop(),t.surface.dispose(),M.delete(e)}function at(e,t,a){let r=de[t],o=e?.scroller??null;if(!r.windowed||!o)return{end:a,padBottom:0,padTop:0,start:0,totalRows:a};return PS({columns:xe(t,o.clientWidth),count:a,rowHeight:r.rowHeight,scrollTop:o.scrollTop,viewportHeight:o.clientHeight})}async function rt(e,t){e.pendingPaths.add(t);try{let a=await ww(t,e.cache);if(!a||W(e.paneId)!==e)return;let r=e.slots.get(t);if(r?.isConnected&&!dw(r))cw(r,a)}finally{e.pendingPaths.delete(t)}}function je(e,t,a){let r=e.cache.get(a);if(dw(t))return;if(r){cw(t,r);return}if(e.pendingPaths.has(a))return;e.pending.set(t,a),e.observer.observe(t)}function ot(e,t,a){e.slots.set(a,t),je(e,t,a)}function it(e){if(e.settleTimer!==null)return;e.settleTimer=setTimeout(()=>{if(e.settleTimer=null,W(e.paneId)!==e)return;e.observer.releaseDetached();let t=uN.has(il().layout);for(let[a,r]of e.slots){if(!r.isConnected){e.slots.delete(a);continue}if(t)je(e,r,a)}},0)}function Re(e){if(e.record)lN(e.record.source,e.record.row);else if(e.collection===null||e.collection===hi)_i(e.path);else Vl(e.path)}var B=null;function lt(){B?.close(),B=null}function Me(e){return k().files().find((t)=>t.path===e)??null}function st(e,t,a){let r=Me(e);if(!r||r.record)return;lt();let o=(i,l,c,d={})=>({destructive:!1,disabled:!1,dividerAbove:!1,id:i,run:c,title:l,...d});B=zt({label:"File actions",onClosed:(i)=>{if(B===i)B=null},origin:{x:t,y:a},region:"content",rows:[o("open","Open",()=>{Re(r)}),o("rename","Rename…",()=>{ct(r)},{dividerAbove:!0}),...p().readFileBytes!==void 0?[o("duplicate","Duplicate",()=>{dt(r)})]:[],o("delete","Delete",()=>{pt(r)},{destructive:!0,dividerAbove:!0})]})}async function ct(e){let t=e.path.replaceAll("\\","/"),a=await OS(t,L);if(a===null)return;let r=await Ob(e.path),o={confirmLabel:"Rename",select:"stem",validate:(d)=>Wm(t,d,a),value:e.name};if(r!==void 0)o.message=r;let i=await Fn("Rename",o);if(!i||i===e.name)return;let l=Tm(t),c=l==="."?i:`${l}/${i}`;try{let d=await Pw(t,c);Rd(),await I(),Mw(AS(i,d),d,c)}catch(d){w.error(`Could not rename ${e.name}.`,{detail:X(d),path:e.path,source:L})}}async function dt(e){if(await Ax(e.path.replaceAll("\\","/"),{document:!0,source:L})!==null)Rd(),await I()}async function pt(e){if(!await Ab(e))return;try{await p().deleteFile(e.path),us(),Rd(),await I(),w.success(`Deleted ${e.name}`)}catch(a){w.error(`Could not delete ${e.name}.`,{detail:X(a),path:e.path,source:L})}}function Ne(e,t){if(e.layout===!1)return"with no template";let a=e.layout??t;return a?`using ${qb(a)}`:"with no template"}function ut(e,t,a,r=[]){let o={designLabel:"",pattern:"",state:"hidden",template:"",text:""};if(e.kind==="pages")return o;if(t===void 0)return{...o,state:"loading",text:"Finding where these entries are published…"};if(t===null)return{...o,state:"none",text:"Entries have no page of their own"};let i=Eb(),l=(d)=>{let s=d===null?-1:i.indexOf(d);return s===-1?i.length:s},c=r.filter((d)=>d.locale!==null).toSorted((d,s)=>l(d.locale)-l(s.locale));if(c.length>1){let d=new Set(c.map((s)=>Ne(s,a)));return{designLabel:`Design the ${e.item} page`,pattern:c.map((s)=>`${s.pattern} (${s.locale})`).join(", "),state:"page",template:d.size===1?[...d][0]:"using a template per language",text:`Each ${e.item} has a page in each language at`}}return{designLabel:`Design the ${e.item} page`,pattern:t.pattern,state:"page",template:Ne(t,a),text:`Each ${e.item} has a page at`}}function mt(e){let t=sh(e,il(e).locale);if(t)_i(t.path)}async function ft(e){let{addCollectionPage:t}=await (ce("v0pm96mr"),import("./add-new-flow-v0pm96mr.js"));await t(e)}function gt(e,t,a){return{checked:a?"true":"false",key:e,label:t}}function ht(e,t){let a=`${t.locale===""?"":` in ${Wt(t.locale)}`}${t.filter===""?"":` filtered to ${t.filter}`}`,r=t.query.trim();return`No ${e.kind==="pages"?"pages":e.title.toLowerCase()} match${r?` “${r}”`:""}${a}.`}function yt(e,t,a,r){if(a>0)return t;if(y.loading||!e.scanned())return"loading";if(e.failures().length>0)return"incomplete";return r===0?"empty":"nomatch"}function J_(e){return k().files().filter((t)=>t.collection===e).map((t)=>t.path)}function bt(e,t){if(e.kind==="pages")return k().scanned()?wt(t==="table"):N(new Map);if(e.fileBacked){let o=Ee(e.key),i=k().files().filter((l)=>l.collection===e.key&&l.record);return N(new Map(i.map((l)=>{let{fields:c}=l.record,d=wS(o,c),s=d===null?"":kb(c[d]??""),u=aT(l.record.source,c,o);return[l.path,{date:s,fields:c,status:"",thumb:u,title:l.name}]})))}if(!k().scanned())return N(new Map);let a=Cw(e.key,J_(e.key)),r=new Map((a??[]).map((o)=>[o.path,{date:o.date,fields:o.fields,status:o.status,thumb:o.thumb,title:o.title}]));return N(r)}function wt(e){let t=J_(hi),a=e?fe(t):null,r=new Set(Object.keys(C?.projectConfig?.content??{})),o=Ae(),{i18n:i}=ln(C?.projectConfig??{}),l=[...a?.values()??[]].some((d)=>d.draft),c=new Map(t.map((d)=>{let s=a?.get(d),u=s?.contentType??null,m=s===void 0?void 0:s.layout??o??!1;return[d,{date:"",status:s===void 0||!l?"":s.draft?"Draft":"Published",template:m===void 0?"":m===!1?"None":qb(m),title:u!==null&&r.has(u)?Y(`${ie(u)} page`,d,i):U(yr(d),d,i)}]}));return N(c)}function vt(e){return e.map((t)=>({file:t,route:yr(t.path)})).toSorted((t,a)=>hC(t.route,a.route)||t.file.path.localeCompare(a.file.path)).map(({file:t})=>t)}function Ee(e){return Sa(e)?.schema??PA(e)}function xt(e){let t=new Set,a=Sp(e),r=sT(e);for(let o of[a,r])if(o!==null)t.add(o);return t}function $t(e){let t=new Map;for(let[a,r]of Object.entries(e?.properties??{}))if(Array.isArray(r.enum))t.set(a,r.enum.filter((o)=>n(o)));return t}function St(e,t){let a=[...new Set(e.flatMap((i)=>i?.status?[i.status]:[]))];if(a.length>0)return{matches:(i,l)=>(i?.status??"")===l,title:"Status",values:a.toSorted((i,l)=>i==="Draft"?-1:l==="Draft"?1:i.localeCompare(l))};if(!t)return null;let r=new Set(e.flatMap((i)=>z(i?.fields?.[t.name],t.list))),o=t.order.length>0?[...t.order,...[...r].filter((i)=>!t.order.includes(i)).toSorted()]:[...r].toSorted((i,l)=>i.localeCompare(l));return{matches:(i,l)=>z(i?.fields?.[t.name],t.list).includes(l),title:t.title,values:o}}function Te(e,t){let a=k(),r=T(),o=il(r.key),{layout:i}=o,l=cT(a.files(),{collection:r.key,query:""}),c=bt(r,i),d=l.map((h)=>c(h)),s=r.kind==="collection"?Ee(r.key):null,u=gN(s,xt(s)),m=we(u,$t(s),d),f=r.kind==="collection"?St(d,m):null,S=f!==null&&f.values.includes(o.filter)?o.filter:"",H=cT(a.files(),{collection:r.key,locale:o.locale,query:o.query}),O=f===null||S===""?H:H.filter((h)=>f.matches(c(h),S)),P=r.kind==="pages"?vt(O):O,J=l.length,b=yt(a,i,P.length,J),D=at(e,i,P.length),Oe=P.slice(D.start,D.end),F=a.failures(),K=hN(l),pe=uT(r.key,{date:sT(s)!==null||d.some((h)=>(h?.date??"")!==""),fields:u,locale:K.length>1,status:d.some((h)=>(h?.status??"")!=="")}),De=b==="cards",Z=b==="calendar"?Se(P,c):{groups:[],truncated:""},G=r.kind==="pages",ee=G?"pages":r.title.toLowerCase();return{bannerState:F.length>0?"shown":"hidden",bannerText:F.length===0?"":`This list is incomplete — ${F.length} ${F.length===1?"directory":"directories"} could not be read (${F[0].dir}${F.length>1?", …":""}).`,columns:b==="table"?pe.map((h)=>({field:h.field,title:h.title})):[],emptyDetail:b==="incomplete"?`${F.length} ${F.length===1?"directory":"directories"} could not be read, so this is not the same as an empty collection.`:b==="nomatch"?`${J} ${J===1?r.item:ee} in all.`:b==="empty"?`New ${r.item} adds the first one.`:"",emptyMessage:b==="nomatch"?ht(r,o):b==="empty"?`No ${ee} yet.`:"",fieldsState:r.kind==="collection"?"shown":"hidden",groups:b==="board"?Le(P,c,m):Z.groups,layouts:_m.map((h)=>gt(h,Ew[h],i===h)),localeOptions:[{label:"All languages",value:"all"},...K.map((h)=>({label:Wt(h),value:h}))],filterOptions:f===null?[]:[{label:`Any ${f.title.toLowerCase()}`,value:"all"},...f.values.map((h)=>({label:h,value:h}))],filterState:f!==null&&f.values.length>1?"shown":"hidden",filterValue:S===""?"all":S,localeState:K.length<2?"hidden":"shown",localeValue:o.locale===""?"all":o.locale,newLabel:`New ${r.item}`,newState:r.fileBacked?"hidden":"shown",pad:`padding-top:calc(var(--jx-space-4) + ${D.padTop}px);padding-bottom:calc(var(--jx-space-4) + ${D.padBottom}px)`,padBottom:`height:${D.padBottom}px`,padTop:`height:${D.padTop}px`,page:ut(r,G?null:sh(r.key,o.locale),Ae(),G||o.locale!==""?[]:jA(r.key)??[]),query:o.query,region:Ln(t,"content"),rows:b==="cards"||b==="table"?Oe.map((h)=>$e(h,b==="table"?pe:[],De,c(h))):[],searchLabel:`Search ${ee}`,subtitle:G?"Every URL on your site.":"",title:r.title,truncated:Z.truncated,truncatedState:Z.truncated===""?"hidden":"shown",view:b}}function Ae(){return C?.projectConfig?.defaults?.layout??null}function ID(e,t){let{paneId:a,wrap:r}=e;if(IE(a,t))return;RE(a);let o=null,i=_p((s)=>{let u=o;if(!u)return;let m=u.pending.get(s);if(m!==void 0)u.pending.delete(s),rt(u,m)}),l=()=>{if(o!==null&&W(a)===o)o.surface.update(Te(o,a)),it(o)},c=ke(r,Te(null,a),{addPage:()=>{ft(T().key)},contextMenu:(s,u,m)=>st(s,u,m),designPage:()=>{mt(T().key)},openFields:()=>{nt("settings.open",{entry:T().key,section:"content"},L)},openGrid:()=>{let s=T(),u=s.fileBacked?ax(s.key):null;if(u){_i(u);return}nt("collection.editInGrid",{name:s.key},L)},openFile:(s)=>{Re(Me(s)??{collection:Fu(),path:s})},openNew:()=>{let s=T(),{locale:u}=il(s.key),m=s.kind==="pages"?{kind:"page"}:{collection:s.key,kind:"entry"};if(u!=="")m.locale=u;nt("file.new",m,L)},previewSlot:(s,u)=>{if(o)ot(o,s,u)},reset:()=>{G_(""),K_("")},retry:()=>{$E()},scrolled:()=>x(),scroller:(s)=>{if(o)o.scroller=s},search:(s)=>G_(s),setLayout:(s)=>TE(s),setFilter:(s)=>et(s==="all"?"":s),setLocale:(s)=>K_(s==="all"?"":s)}),d=me();o={cache:yw(),observer:i,paneId:a,pending:new WeakMap,pendingPaths:new Set,scope:d,scroller:null,settleTimer:null,slots:new Map,surface:c,tabId:t.id,unlisten:(()=>{let s=Ap(()=>x()),u=kw(()=>x()),m=ge(()=>x());return()=>{s(),u(),m()}})(),wrap:r},M.set(a,o),d.run(()=>{te(()=>{if(W(a)!==o)return;y.revision,y.collection,y.loading;let s=il(Fu());if(s.layout,s.query,s.locale,l(),!A&&!y.loading)I()})})}function RD(){y.collection=hi,y.views={},y.loading=!1,j=null,A=!1,x()}
4
+ export{cb,lw,ED,db,Id,TD,LD,EE,cw,dw,il,Fu,$D,TE,G_,K_,Rd,LE,$E,IE,RE,J_,ID,RD};
5
+
6
+ //# debugId=070A13E7BCCF0D1F64756E2164756E21
7
+ //# sourceMappingURL=studio-2kpxm0eh.js.map
@@ -0,0 +1,5 @@
1
+ import{X}from"./studio-9c6cbq2c.js";import{ae}from"./studio-wqfaqw4m.js";import{p,ye}from"./studio-4fnb5648.js";import{nt}from"./studio-tpxcryf2.js";import{Hm,no,Bm,jC,mO,Cx,u}from"./studio-pwctzka3.js";import{Zl,IL,Ri,jd,DL,NL}from"./studio-rr00ex23.js";import{as,Hc,TL}from"./studio-v7a7yb5w.js";import{ks,KS,Pb,Us,iL,oL,rL,sL,aL,lL,cL,dL,uL,hL,pL,fL,Yw,mL,gL}from"./studio-mrjtnm62.js";import{Vb}from"./studio-xva3hzkv.js";import{pb,hw,hm,jD,pm,X_,HD,fb,zD,pw}from"./studio-xx3r3sb0.js";import{C}from"./studio-4f7thq0p.js";import{Ln,E,R}from"./studio-9dq7rwc7.js";import{me,te,g}from"./studio-3qr08sxq.js";import{n,v}from"./studio-k3we3kqb.js";var Y={$schema:"https://jxsuite.com/schema/v1",$id:"StudioSettingsDeploy",$description:"Publish › Hosting's build adapter (studio.md §22.8), which was Project Settings › Deploy: one row over `build.adapter`, and the sentence a failed write leaves behind. It draws no heading of its own: Hosting's \"How it is built\" section heads it, and a second title inside that card would name the same thing twice. The adapter (`surfaces/settings-deploy.ts`) hands in the chosen adapter, the enumeration it is chosen from and whatever the last write had to say; the document draws them and hands the change straight back. Nothing here reads `project.json`: a section that re-read the config while drawing would be a second opinion about a file one module already owns.",tagName:"section",attributes:{part:"deploy"},style:{$description:"What is NOT in this block is most of the conversion. Four borrowed rules had nothing to transcribe: `.settings-field-label` and `.settings-field-desc` drew a row's label and the sentence under it, and `jx-field` draws both — with the label actually NAMING the control, which the bare `<label class=…>` beside the picker never did; `.settings-field` added a 20px bottom margin to separate one row from the next, and this section has one row, so the margin separated it from the end of the section; and `.settings-section` was never defined by any stylesheet at all, which is why it sits in `check-styles.ts`'s allow-list rather than in a rule.",display:"block",fontFamily:"var(--jx-font-sans)",color:"var(--fg)",'& [part="section-error"]':{$description:'A write that failed, said under the section title rather than pinned to the picker: settings save on change, so a silent rejection would read as "my edit just vanished", and what failed was the whole file rather than the value. Its size read `--spectrum-font-size-75` with a 12px fallback, which resolved only inside `<sp-theme>` — a document is mounted in the settings pane, where that name is not in scope and the fallback is all it would ever have taken — so the size is the kit\'s scale and the colour is the studio layer\'s. It is `section-error` rather than `error` because the adapter picker is a `jx-select`, which draws a permanent `[part="error"]` of its own in this same light-DOM tree: a rule on that name would give the picker\'s own refusal sentence this 16px margin too.',margin:"0 0 16px",fontSize:"var(--jx-text-md)",color:"var(--danger)"},'& [part="adapter"]':{$description:"How wide the picker may grow. A control offering five short words does not want the width of a 900px pane, and 320px is the one thing `.settings-build-adapter` said that the kit does not — the same measure the two pickers in Locales take.",maxWidth:"320px"}},children:[{tagName:"div",attributes:{part:"section-error-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasError"},cases:{true:{tagName:"p",attributes:{part:"section-error",role:"alert"},textContent:"${state.error}"}}},{tagName:"jx-field",attributes:{part:"row","data-field":"adapter"},$props:{span:!0,label:"Build adapter",description:"What the site is built for. Static writes plain files; the others emit a server entry for that runtime."},children:[{tagName:"jx-select",attributes:{part:"adapter"},$props:{size:"sm",options:{$ref:"#/state/adapters"},value:{$ref:"#/state/adapter"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setAdapter"},value:[{$ref:"event#/target/value"}]}]}}]}]};E("settings-deploy",Y);function Q(t,e){if(e.adapter!==void 0)t.adapter=e.adapter;if(e.adapters!==void 0)t.adapters=e.adapters;if(e.error!==void 0)t.error=e.error,t.hasError=e.error!==""}function Z(t,e,a){let r=g({adapter:"",adapters:[],error:"",hasError:!1,setAdapter:a.setAdapter});Q(r,e),t.replaceChildren();let i=null,l=!1;return R("settings-deploy",r,t).then((o)=>{if(l){o.dispose();return}i=o}),{connected:()=>!l&&(i===null?t.childNodes.length===0:i.root.parentNode===t),dispose(){l=!0,i?.dispose(),i=null},update:(o)=>Q(r,o)}}var tt={$schema:"https://jxsuite.com/schema/v1",$id:"StudioSettingsRawJson",$description:"Project Settings › Raw JSON: `project.json` as it is written, and the way through to editing it as text. The adapter (`surfaces/settings-rawjson.ts`) hands in the serialisation the save chokepoint itself produced, so what is drawn is what a save writes rather than a second pretty-printer that would disagree with the file by an indent. The button opens the SAME tab in the Code editor — one document, three editors (`studio.md` §9.3) — so switching to the text and back keeps one undo stack instead of forking two.",tagName:"section",attributes:{part:"rawjson"},style:{$description:"Two of the rules this section borrowed are gone rather than moved. `.settings-field-desc` styled the sentence under the title, and it is kept here because there is no `jx-field` in this section to draw it — a `<pre>` is not a control and wrapping one in a row would give the file a label it does not need. `.settings-edit-as-code` set `align-self: flex-start` on the button, which did nothing: its parent carried `.settings-section`, a class no stylesheet defines, so there was no flex container for the declaration to be about — and `jx-button` is `inline-flex`, so it already sits at the left of a block.",display:"block",fontFamily:"var(--jx-font-sans)",color:"var(--fg)",'& [part="title"]':{margin:"0 0 16px",fontSize:"16px",fontWeight:"600",color:"var(--fg)"},'& [part="intro"]':{$description:"The sentence under the title. Its size read `--spectrum-font-size-75` with a 12px fallback, a name that resolves only inside `<sp-theme>`; a document is mounted in the settings pane, so the fallback is all it could ever have taken and the size is the kit's scale now.",margin:"0 0 6px",fontSize:"var(--jx-text-md)",color:"var(--fg-dim)"},'& [part="file"]':{$description:"The file's name, said in the prose as the file it is. It borrowed a bare `<code>` element and whatever the page happened to give one; a document's styling is its own, so the face is stated here.",fontFamily:"var(--font-mono)"},'& [part="json"]':{$description:'`project.json` as it is saved. It scrolls in its own box: a 250-line file must not push the "Edit as code" action off the bottom of the section. Its background read `var(--bg-dim, var(--bg))` and `--bg-dim` is declared nowhere in the token layer, so the fallback is what has always painted it — written as what it resolves to rather than as a name that never resolved.',margin:"0 0 12px",padding:"12px",maxHeight:"420px",overflow:"auto",border:"1px solid var(--border)",borderRadius:"var(--radius)",background:"var(--bg)",fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-md)",color:"var(--fg)",whiteSpace:"pre"}},children:[{tagName:"h3",attributes:{part:"title"},textContent:"Raw JSON"},{tagName:"p",attributes:{part:"intro"},children:["The whole of ",{tagName:"code",attributes:{part:"file"},textContent:"project.json"},", as it is saved. Editing it as code opens the same document in the Code editor — one undo stack, one dirty flag."]},{tagName:"pre",attributes:{part:"json"},textContent:"${state.json}"},{tagName:"jx-button",attributes:{part:"edit"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editAsCode"}}]},children:[{tagName:"span",textContent:"Edit as code"}]}]};E("settings-rawjson",tt);function et(t,e){if(e.json!==void 0)t.json=e.json}function at(t,e,a){let r=g({editAsCode:a.editAsCode,json:""});et(r,e),t.replaceChildren();let i=null,l=!1;return R("settings-rawjson",r,t).then((o)=>{if(l){o.dispose();return}i=o}),{connected:()=>!l&&(i===null?t.childNodes.length===0:i.root.parentNode===t),dispose(){l=!0,i?.dispose(),i=null},update:(o)=>et(r,o)}}var I=new WeakMap;function W(){return C?.projectConfig??{}}var kt=[{label:"Static",value:"static"},{label:"Bun",value:"bun"},{label:"Node",value:"node"},{label:"Cloudflare Workers",value:"cloudflare-workers"},{label:"Cloudflare Pages",value:"cloudflare-pages"}],N=new WeakMap;function rt(t){return{adapter:W().build?.adapter||"static",adapters:kt.map((e)=>({label:e.label,value:e.value})),error:I.get(t)??""}}async function St(t,e){try{await no(e),I.delete(t)}catch(a){I.set(t,`Could not save project.json — ${X(a)}`)}D(t)}var it=new WeakMap;function Ct(t){let e=it.get(t);if(!e)e={setAdapter:(a)=>{N.get(t)?.update({adapter:a}),St(t,{build:{...W().build,adapter:a}})}},it.set(t,e);return e}function D(t){let e=N.get(t);if(e?.connected()){e.update(rt(t));return}e?.dispose(),N.set(t,Z(t,rt(t),Ct(t)))}function B(t){N.get(t)?.dispose(),N.delete(t)}var st=new WeakMap;function ot(){return{json:Hm(W())}}function MD(t,e){let a=st.get(t);if(a?.connected()){a.update(ot());return}a?.dispose(),st.set(t,at(t,ot(),{editAsCode:e.editAsCode}))}var lt={$schema:"https://jxsuite.com/schema/v1",$id:"StudioPublishWorkspace",$description:"The Publish workspace's home (studio.md §22.8): four sub-tabs over one body. Review changes is the change list grouped the way the site is organised (Pages, each content collection, Components, Layouts, Styles, Media, Other), each file's checkbox including it in the next publish (staging it), its Before and after opening the comparison (§21), then the checks, the destination, the summary and the one primary button. Deploys is the live site, any deploy running now with its steps, the history the host returns and the branch previews. Branches is the branch list with switch and create. Hosting is where the project is saved, where the site is hosted, the build adapter (an island: the Deploy section that moved here from Project Settings) and the address, with the deploy checklist under them. `publish/publish-workspace.ts` keeps every decision and hands this document strings and booleans; nothing here knows what a status letter means, which destination a host allows or what a deployment's stage is called.",tagName:"div",attributes:{part:"publish","data-jx-region":"${state.region}","data-tab":"${state.tab}","aria-labelledby":"${state.titleId}",role:"region"},style:{$description:"Fills the pane's stage by its own geometry, as the Media home does: the stage is `position: relative`, so the workspace takes the whole of it and scrolls its own body. The status colours are the theme's semantic tokens, so a check, a badge and a deployment's state follow light and dark without a hex anywhere.",position:"absolute",inset:"0",display:"flex",flexDirection:"column",boxSizing:"border-box",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",background:"var(--bg)",'& [part="head"]':{display:"flex",alignItems:"baseline",flexWrap:"wrap",gap:"var(--jx-space-3)",padding:"var(--jx-space-4) var(--jx-space-5) 0"},'& [part="heading"]':{margin:"0",fontSize:"var(--jx-text-lg)",fontWeight:"600"},'& [part="headline"]':{color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"},'& [part="tabs"]':{padding:"0 var(--jx-space-5)",flexShrink:"0"},'& [part="body"]':{flex:"1",minHeight:"0",overflowY:"auto",padding:"var(--jx-space-4) var(--jx-space-5) var(--jx-space-6)",containerType:"inline-size",containerName:"publish-body"},'& [part="review"]':{$description:"Two columns as the board draws them, the changes on the left and the publish card on the right; below 760px of pane the card drops under the list rather than squeezing it.",display:"grid",gridTemplateColumns:"minmax(0, 1fr) minmax(260px, 340px)",gap:"var(--jx-space-5)",alignItems:"start"},"@container publish-body (max-width: 760px)":{'& [part="review"]':{gridTemplateColumns:"minmax(0, 1fr)"}},'& [part="changes-column"], & [part="publish-column"], & [part="deploys"], & [part="branches"], & [part="hosting"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-5)",minWidth:"0"},'& [part="deploys"], & [part="branches"], & [part="hosting"]':{maxWidth:"760px"},"& section":{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",minWidth:"0"},'& [part="section-head"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-3)"},'& [part="section-heading"]':{margin:"0",fontSize:"var(--jx-text-sm)",fontWeight:"600",color:"var(--fg-dim)",textTransform:"uppercase",letterSpacing:"0.04em"},'& [part="publish-column"] > section':{padding:"var(--jx-space-4)",border:"1px solid var(--border)",borderRadius:"var(--jx-radius-md)",background:"var(--bg-panel)"},'& [part="sync-bar"]':{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-3)",paddingBottom:"var(--jx-space-3)",borderBottom:"1px solid var(--border)"},'& [part="sync-text"]':{display:"flex",flex:"1 1 auto",flexDirection:"column",minWidth:"0"},'& [part="sync-label"]':{fontWeight:"600"},'& [part="sync-time"], & [part="included"], & [part="file-dir"], & [part="history-meta"], & [part="choice-note"], & [part="live-summary"], & [part="hosting-summary"], & [part="branch-sync"], & [part="branch-summary"], & [part="deployment-when"]':{color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"},'& [part="changes-bar"]':{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--jx-space-3)"},'& [part="groups"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)"},'& [part="group-name"]':{fontSize:"var(--jx-text-xs)",color:"var(--fg-dim)",fontFamily:"var(--font-mono)"},'& [part="file-row"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",padding:"2px var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)"},'& [part="file-row"]:hover, & [part="file-row"]:focus-within':{background:"var(--hover-bg)"},'& [part="file-text"]':{display:"flex",flex:"1",alignItems:"baseline",gap:"var(--jx-space-2)",minWidth:"0",overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"},'& [part="file-dir"]':{overflow:"hidden",textOverflow:"ellipsis"},'& [part="badge"]':{$description:"One letter and a colour, which is why the checkbox and the row's buttons carry the status in words as well.",flex:"none",width:"16px",color:"var(--signal)",fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-xs)",fontWeight:"700",textAlign:"center"},'& [part="badge"][data-status="A"], & [part="badge"][data-status="U"]':{color:"var(--success)"},'& [part="badge"][data-status="D"]':{color:"var(--danger)"},'& [part="badge"][data-status="R"]':{color:"var(--tag)"},'& [part="empty-message"], & [part="status"], & [part="live-none"]':{margin:"0",color:"var(--fg-dim)",lineHeight:"1.5"},'& [part="empty"]':{display:"flex",flexDirection:"column",alignItems:"center",gap:"var(--jx-space-3)",padding:"var(--jx-space-6)",textAlign:"center"},'& [part="empty"] > [part="empty-message"]':{maxWidth:"48ch"},'& [part="empty-actions"], & [part="command-row"], & [part="publish-actions"]':{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-2)"},'& [part="history-list"], & [part="check-list"], & [part="deployment-list"], & [part="branch-list"], & [part="checklist-steps"], & [part="activity-steps"]':{margin:"0",padding:"0",listStyle:"none",display:"flex",flexDirection:"column",gap:"var(--jx-space-1)"},'& [part="history-entry"]':{display:"flex",flexWrap:"wrap",gap:"var(--jx-space-2)",alignItems:"baseline"},'& [part="history-hash"]':{fontFamily:"var(--font-mono)",fontSize:"var(--jx-text-xs)",color:"var(--fg-dim)"},'& [part="history-message"]':{flex:"1",minWidth:"0"},'& [part="checklist-step"], & [part="activity-step"]':{display:"flex",alignItems:"baseline",gap:"var(--jx-space-2)"},'& [part="check"]':{$description:"Centred, not baseline-aligned: the row can hold a small kit button, and a small kit control is layout-contained, so it has no baseline to align on.",display:"flex",alignItems:"center",gap:"var(--jx-space-2)"},'& [part="check-text"]':{flex:"1",minWidth:"0",lineHeight:"1.4"},'& [part="check-icon"], & [part="step-icon"]':{$description:"A kit icon for a check or a checklist link, sized by the kit's own property so it stays square; the activity feed's steps still draw a one-character glyph, which `minWidth` keeps on the same column.",flex:"none",minWidth:"1em",textAlign:"center","--jx-icon-size":"1em",color:"var(--fg-dim)"},'& [part="checklist-step"] > [part="step-icon"]':{$description:"A baseline-aligned row places a kit icon's bottom edge on the text baseline, which draws it high; the negative end margin lowers it onto the line's middle.",marginBlockEnd:"-0.15em"},'& [data-state="done"] > [part="check-icon"], & [data-state="done"] > [part="step-icon"]':{color:"var(--success)"},'& [data-state="failed"] > [part="check-icon"], & [data-state="failed"] > [part="step-icon"]':{color:"var(--danger)"},'& [data-state="todo"] > [part="check-icon"]':{color:"var(--warning)"},'& [part="destinations"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)"},'& [part="destination-card"] > [part="control"]':{$description:"A destination is a card with a name and a sentence saying what it does, inside one radio, as Add new's choice cards are: the reader hears one name and sees both lines.",width:"100%",height:"auto",flexDirection:"column",alignItems:"flex-start",textAlign:"start",padding:"var(--jx-space-2) var(--jx-space-3)",gap:"2px",whiteSpace:"normal"},'& [part="choice-name"]':{display:"block",fontWeight:"600"},'& [part="choice-note"]':{display:"block"},'& [part="refusal"], & [part="blocker"]':{margin:"0",fontSize:"var(--jx-text-sm)",color:"var(--fg-dim)"},'& [part="review-line"], & [part="live-site"]':{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-2)",margin:"0"},'& [part="live-url"]':{fontWeight:"600",wordBreak:"break-all"},'& [part="live-summary"], & [part="hosting-summary"], & [part="host-name"], & [part="branch-note"]':{margin:"0",lineHeight:"1.5"},'& [part="host-name"]':{fontWeight:"600"},'& [part="activity"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",padding:"var(--jx-space-3)",border:"1px solid var(--border)",borderRadius:"var(--jx-radius-md)"},'& [part="activity-head"]':{display:"flex",justifyContent:"space-between",gap:"var(--jx-space-3)"},'& [part="activity-title"]':{fontWeight:"600"},'& [part="activity-status"]':{color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"},'& [part="deployment"]':{display:"grid",gridTemplateColumns:"minmax(64px, auto) minmax(0, 1fr) auto auto",alignItems:"center",gap:"var(--jx-space-3)",padding:"var(--jx-space-1) 0",borderBottom:"1px solid var(--border)"},'& [part="deployment-label"]':{minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="deployment-status"]':{fontSize:"var(--jx-text-sm)"},'& [part="deployment-status"][data-status="success"]':{color:"var(--success)"},'& [part="deployment-status"][data-status="failure"]':{color:"var(--danger)"},'& [part="branch"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",padding:"var(--jx-space-1) var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)","--jx-icon-size":"16px"},'& [part="branch"]:hover':{background:"var(--hover-bg)"},'& [part="branch-icon"]':{color:"var(--fg-dim)"},'& [part="branch-name"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",fontFamily:"var(--font-mono)"},'& [part="current"]':{display:"inline-flex",gap:"var(--jx-space-2)",alignItems:"baseline"},'& [part="current-tag"]':{padding:"0 6px",borderRadius:"var(--jx-radius-sm)",background:"var(--hover-bg)",fontSize:"var(--jx-text-xs)"},'& [part="hosting"] > section':{padding:"var(--jx-space-4)",border:"1px solid var(--border)",borderRadius:"var(--jx-radius-md)"},'& [part="busy"]':{margin:"0",padding:"var(--jx-space-2) var(--jx-space-5)",color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"},'& [part="failure"]':{$description:"`failure`, not `error`: a kit text field keeps a permanent live region named `error`, and a rule on that name would reach the summary field's (surface-part-names.test.ts).",margin:"0",padding:"var(--jx-space-2) var(--jx-space-5)",color:"var(--danger)",borderTop:"1px solid var(--border)",fontSize:"var(--jx-text-sm)"}},children:[{tagName:"header",attributes:{part:"head"},children:[{tagName:"h2",attributes:{part:"heading",id:"${state.titleId}"},textContent:"Publish"},{tagName:"span",attributes:{part:"headline"},textContent:"${state.headline}"}]},{tagName:"jx-tabs",attributes:{part:"tabs",selected:"${state.tab}"},$props:{label:"Publish views"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/selectTab"},value:[{$ref:"event#/detail"}]}]},children:[{$prototype:"Array",items:{$ref:"#/state/tabs"},key:{$ref:"$map/item/value"},map:{tagName:"jx-tab",attributes:{part:"tab",value:"${$map.item.value}",label:"${$map.item.label}",panel:"${state.panelId}","data-tab":"${$map.item.value}"}}}]},{tagName:"div",attributes:{part:"body",id:"${state.panelId}",role:"tabpanel","data-tab":"${state.tab}","aria-label":"${state.tabTitle}"},children:[{tagName:"div",attributes:{part:"tab-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/tab"},cases:{review:{tagName:"div",attributes:{part:"review-slot-mood",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/mood"},cases:{"no-project":{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",attributes:{part:"empty-message"},textContent:"Open a project to publish it. Publishing reviews your saved changes and sends them to your site."},{tagName:"div",attributes:{part:"clone-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/canClone"},cases:{true:{tagName:"jx-button",attributes:{part:"clone"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/clone"},value:[]}]},children:[{tagName:"jx-icon",$props:{name:"download-simple"}},{tagName:"span",textContent:"Clone Git Repository"}]}}}]},loading:{tagName:"p",attributes:{part:"status"},textContent:"Loading…"},"no-repo":{tagName:"div",attributes:{part:"empty"},children:[{tagName:"p",attributes:{part:"empty-message"},textContent:"This project is not tracked by git yet. Publishing starts with a repository, which keeps every version you publish."},{tagName:"div",attributes:{part:"empty-actions"},children:[{tagName:"jx-button",attributes:{part:"init"},$props:{size:"sm",variant:"accent",disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/initRepository"},value:[]}]},children:[{tagName:"jx-icon",$props:{name:"plus"}},{tagName:"span",textContent:"Initialize Repository"}]}]}]},repo:{tagName:"div",attributes:{part:"review"},children:[{tagName:"div",attributes:{part:"changes-column"},children:[{tagName:"div",attributes:{part:"sync-bar"},children:[{tagName:"jx-action-button",attributes:{part:"refresh"},$props:{icon:"arrows-clockwise",size:"sm",quiet:!0,label:"Refresh",hint:"Refresh source control",disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/refresh"},value:[]}]}},{tagName:"div",attributes:{part:"sync-text"},children:[{tagName:"span",attributes:{part:"sync-label"},textContent:"${state.syncLabel}"},{tagName:"span",attributes:{part:"updated-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasLastUpdated"},cases:{true:{tagName:"span",attributes:{part:"sync-time"},textContent:"${state.lastUpdated}"}}}]},{tagName:"div",attributes:{part:"remote-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/remoteState"},cases:{remote:{tagName:"jx-action-group",attributes:{part:"sync-actions"},$props:{label:"Sync with the remote",compact:!1},children:[{tagName:"jx-action-button",attributes:{part:"fetch"},$props:{icon:"download-simple",size:"sm",quiet:!0,label:"Fetch",hint:"Fetch from the remote",disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/fetch"},value:[]}]}},{tagName:"jx-action-button",attributes:{part:"pull"},$props:{icon:"arrow-down",size:"sm",quiet:!0,label:{$ref:"#/state/pullLabel"},hint:{$ref:"#/state/pullLabel"},disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pull"},value:[]}]}},{tagName:"jx-action-button",attributes:{part:"push"},$props:{icon:"arrow-up",size:"sm",quiet:!0,label:{$ref:"#/state/pushLabel"},hint:{$ref:"#/state/pushLabel"},disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/push"},value:[]}]}}]},local:{tagName:"jx-button",attributes:{part:"create-repository"},$props:{size:"sm",disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/createRepository"},value:[]}]},children:[{tagName:"jx-icon",$props:{name:"share-network"}},{tagName:"span",textContent:"Create GitHub repository"}]}}}]},{tagName:"section",attributes:{part:"changes"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Changes"},{tagName:"div",attributes:{part:"changes-bar"},children:[{tagName:"span",attributes:{part:"included"},textContent:"${state.includedLabel}"},{tagName:"div",attributes:{part:"include-all-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/filesState"},cases:{listed:{tagName:"jx-checkbox",attributes:{part:"include-all"},$props:{checked:{$ref:"#/state/allIncluded"},indeterminate:{$ref:"#/state/someIncluded"},size:"sm"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/includeAll"},value:[{$ref:"event#/target/checked"}]}]},children:[{tagName:"span",textContent:"Include all"}]}}}]},{tagName:"div",attributes:{part:"groups-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/filesState"},cases:{listed:{tagName:"div",attributes:{part:"groups"},children:[{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/key"},map:{tagName:"div",attributes:{part:"group"},children:[{tagName:"div",attributes:{part:"group-name"},textContent:"${$map.item.name}"},{$prototype:"Array",items:{$ref:"$map/item/files"},key:{$ref:"$map/item/key"},map:{tagName:"div",attributes:{part:"file-row","data-path":"${$map.item.path}","data-included":"${$map.item.included}"},children:[{tagName:"jx-checkbox",attributes:{part:"include","data-path":"${$map.item.path}"},$props:{checked:{$ref:"$map/item/included"},label:{$ref:"$map/item/includeLabel"},size:"sm"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/include"},value:[{$ref:"$map/item/path"},{$ref:"event#/target/checked"}]}]}},{tagName:"span",attributes:{part:"file-text"},children:[{tagName:"span",attributes:{part:"file-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"dir-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasDir"},cases:{true:{tagName:"span",attributes:{part:"file-dir"},textContent:"${$map.item.dir}"}}}]},{tagName:"span",attributes:{part:"badge","data-status":"${$map.item.status}",title:"${$map.item.statusWord}"},textContent:"${$map.item.status}"},{tagName:"jx-action-button",attributes:{part:"compare","data-path":"${$map.item.path}"},$props:{icon:"columns",size:"sm",quiet:!0,label:{$ref:"$map/item/compareLabel"},hint:"Before and after"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/compare"},value:[{$ref:"$map/item/path"}]}]}},{tagName:"jx-action-button",attributes:{part:"discard","data-path":"${$map.item.path}"},$props:{icon:"arrow-u-up-left",size:"sm",quiet:!0,label:{$ref:"$map/item/discardLabel"},hint:{$ref:"$map/item/discardHint"},disabled:{$ref:"$map/item/cannotDiscard"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/discard"},value:[{$ref:"$map/item/path"}]}]}}]}}]}}]},empty:{tagName:"p",attributes:{part:"empty-message"},textContent:"Nothing to publish. Files you edit and save show up here, ready to review."}}}]},{tagName:"section",attributes:{part:"history"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Recent commits"},{tagName:"div",attributes:{part:"history-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/commitsState"},cases:{listed:{tagName:"ul",attributes:{part:"history-list"},children:[{$prototype:"Array",items:{$ref:"#/state/commits"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"history-entry"},children:[{tagName:"span",attributes:{part:"history-hash"},textContent:"${$map.item.hash}"},{tagName:"span",attributes:{part:"history-message"},textContent:"${$map.item.message}"},{tagName:"span",attributes:{part:"history-meta"},textContent:"${$map.item.meta}"}]}}]},empty:{tagName:"p",attributes:{part:"empty-message"},textContent:"No commits yet. Each change set you publish becomes a version you can come back to."}}}]}]},{tagName:"div",attributes:{part:"publish-column"},children:[{tagName:"section",attributes:{part:"checks"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Checks"},{tagName:"ul",attributes:{part:"check-list"},children:[{$prototype:"Array",items:{$ref:"#/state/checks"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"check","data-check":"${$map.item.key}","data-state":"${$map.item.state}"},children:[{tagName:"jx-icon",attributes:{part:"check-icon"},$props:{name:{$ref:"$map/item/icon"},label:{$ref:"$map/item/iconLabel"}}},{tagName:"span",attributes:{part:"check-text"},textContent:"${$map.item.text}"},{tagName:"span",attributes:{part:"check-action-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/hasAction"},cases:{true:{tagName:"jx-button",attributes:{part:"check-action",title:"${$map.item.actionTitle}","data-check":"${$map.item.key}"},$props:{size:"sm",disabled:{$ref:"$map/item/actionDisabled"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/runCheck"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"span",textContent:"${$map.item.actionLabel}"}]}}}]}}]}]},{tagName:"section",attributes:{part:"destination","data-jx-region":"${state.commitRegion}","aria-labelledby":"${state.destinationId}"},children:[{tagName:"h3",attributes:{part:"section-heading",id:"${state.destinationId}"},textContent:"Where should these changes go?"},{tagName:"jx-action-group",attributes:{part:"destinations"},$props:{selects:"single",label:"Destination",compact:!1,orientation:"vertical"},children:[{$prototype:"Array",items:{$ref:"#/state/destinations"},key:{$ref:"$map/item/value"},map:{tagName:"jx-action-button",attributes:{part:"destination-card","data-destination":"${$map.item.value}"},$props:{label:{$ref:"$map/item/label"},checked:{$ref:"$map/item/checked"},disabled:{$ref:"$map/item/disabled"},hint:{$ref:"$map/item/reason"},quiet:!1},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/pickDestination"},value:[{$ref:"$map/item/value"}]}]},children:[{tagName:"span",attributes:{part:"choice-name"},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"choice-note"},textContent:"${$map.item.note}"}]}}]},{tagName:"div",attributes:{part:"refusal-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasRefusal"},cases:{true:{tagName:"p",attributes:{part:"refusal"},textContent:"${state.refusal}"}}},{tagName:"jx-field",attributes:{part:"summary-field"},$props:{label:"Summary",span:!0,description:"Saved with the change as its commit message."},children:[{tagName:"jx-textfield",attributes:{part:"summary"},$props:{multiline:!0,size:"sm",placeholder:"Describe what changed, e.g. Add a pricing page",value:{$ref:"#/state/summary"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editSummary"},value:[{$ref:"event#/target/value"}]}]}}]},{tagName:"div",attributes:{part:"publish-actions"},children:[{tagName:"jx-button",attributes:{part:"publish-button","data-destination":"${state.destination}"},$props:{variant:"accent",size:"md",disabled:{$ref:"#/state/primaryDisabled"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/publish"},value:[]}]},children:[{tagName:"span",textContent:"${state.primaryLabel}"}]},{tagName:"div",attributes:{part:"blocker-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasBlocker"},cases:{true:{tagName:"p",attributes:{part:"blocker"},textContent:"${state.blocker}"}}}]},{tagName:"div",attributes:{part:"review-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/reviewState"},cases:{opened:{tagName:"p",attributes:{part:"review-line"},children:[{tagName:"span",attributes:{part:"review-text"},textContent:"${state.reviewLine}"},{tagName:"jx-button",attributes:{part:"open-review"},$props:{size:"sm",quiet:!0},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openUrl"},value:[{$ref:"#/state/reviewUrl"}]}]},children:[{tagName:"span",textContent:"Open pull request"}]}]}}}]}]}]}}},deploys:{tagName:"div",attributes:{part:"deploys"},children:[{tagName:"section",attributes:{part:"live"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Live"},{tagName:"div",attributes:{part:"live-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasLiveUrl"},cases:{true:{tagName:"div",attributes:{part:"live-site"},children:[{tagName:"span",attributes:{part:"live-url"},textContent:"${state.liveUrl}"},{tagName:"jx-button",attributes:{part:"visit"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openUrl"},value:[{$ref:"#/state/liveUrl"}]}]},children:[{tagName:"jx-icon",$props:{name:"globe"}},{tagName:"span",textContent:"Visit site"}]}]},false:{tagName:"p",attributes:{part:"live-none"},textContent:"${state.liveNone}"}}},{tagName:"p",attributes:{part:"live-summary"},textContent:"${state.liveSummary}"},{tagName:"div",attributes:{part:"command-row"},children:[{$prototype:"Array",items:{$ref:"#/state/deployCommands"},key:{$ref:"$map/item/id"},map:{tagName:"jx-button",attributes:{part:"command","data-command":"${$map.item.id}",title:"${$map.item.title}"},$props:{size:"sm",disabled:{$ref:"$map/item/disabled"},quiet:!1},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/run"},value:[{$ref:"$map/item/id"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}}]}]},{tagName:"div",attributes:{part:"running-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/runningState"},cases:{running:{tagName:"section",attributes:{part:"running"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Publishing now"},{$prototype:"Array",items:{$ref:"#/state/running"},key:{$ref:"$map/item/id"},map:{tagName:"div",attributes:{part:"activity"},children:[{tagName:"div",attributes:{part:"activity-head"},children:[{tagName:"span",attributes:{part:"activity-title"},textContent:"${$map.item.title}"},{tagName:"span",attributes:{part:"activity-status"},textContent:"${$map.item.status}"}]},{tagName:"ol",attributes:{part:"activity-steps"},children:[{$prototype:"Array",items:{$ref:"$map/item/steps"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"activity-step","data-state":"${$map.item.state}"},children:[{tagName:"span",attributes:{part:"step-icon","aria-hidden":"true"},textContent:"${$map.item.icon}"},{tagName:"span",attributes:{part:"step-label"},textContent:"${$map.item.label}"}]}}]}]}}]}}},{tagName:"section",attributes:{part:"deploy-history"},children:[{tagName:"div",attributes:{part:"section-head"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"History"},{tagName:"jx-action-button",attributes:{part:"reload-deploys"},$props:{icon:"arrows-clockwise",size:"sm",quiet:!0,label:"Refresh deployments",hint:"Ask the host again",disabled:{$ref:"#/state/deploysBusy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/reloadDeployments"},value:[]}]}}]},{tagName:"div",attributes:{part:"deploys-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/deploysState"},cases:{listed:{tagName:"div",attributes:{part:"history-rows",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/historyState"},cases:{listed:{tagName:"ol",attributes:{part:"deployment-list"},children:[{$prototype:"Array",items:{$ref:"#/state/history"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"deployment","data-environment":"${$map.item.environment}"},children:[{tagName:"span",attributes:{part:"deployment-when"},textContent:"${$map.item.when}"},{tagName:"span",attributes:{part:"deployment-label"},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"deployment-status","data-status":"${$map.item.statusKey}",title:"${$map.item.statusDetail}"},textContent:"${$map.item.status}"},{tagName:"jx-action-button",attributes:{part:"open-deployment"},$props:{icon:"arrow-square-out",size:"sm",quiet:!0,label:{$ref:"$map/item/openLabel"},hint:{$ref:"$map/item/url"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openUrl"},value:[{$ref:"$map/item/url"}]}]}}]}}]},empty:{tagName:"p",attributes:{part:"empty-message"},textContent:"The host reports no deployments of this project yet."}}},loading:{tagName:"p",attributes:{part:"status"},textContent:"Asking the host for its deployments…"},note:{tagName:"p",attributes:{part:"empty-message"},textContent:"${state.deploysNote}"}}}]},{tagName:"section",attributes:{part:"previews"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Branch previews"},{tagName:"div",attributes:{part:"previews-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/previewsState"},cases:{listed:{tagName:"ol",attributes:{part:"deployment-list"},children:[{$prototype:"Array",items:{$ref:"#/state/previews"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"deployment","data-environment":"${$map.item.environment}"},children:[{tagName:"span",attributes:{part:"deployment-when"},textContent:"${$map.item.when}"},{tagName:"span",attributes:{part:"deployment-label"},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"deployment-status","data-status":"${$map.item.statusKey}",title:"${$map.item.statusDetail}"},textContent:"${$map.item.status}"},{tagName:"jx-action-button",attributes:{part:"open-deployment"},$props:{icon:"arrow-square-out",size:"sm",quiet:!0,label:{$ref:"$map/item/openLabel"},hint:{$ref:"$map/item/url"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openUrl"},value:[{$ref:"$map/item/url"}]}]}}]}}]},empty:{tagName:"p",attributes:{part:"empty-message"},textContent:"No previews. A branch pushed to the remote is deployed as a preview of its own, with its own address."}}}]}]},branches:{tagName:"div",attributes:{part:"branches"},children:[{tagName:"section",attributes:{part:"branch-list-section"},children:[{tagName:"div",attributes:{part:"section-head"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Branches"},{tagName:"jx-button",attributes:{part:"new-branch"},$props:{size:"sm",disabled:{$ref:"#/state/newBranchDisabled"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/newBranch"},value:[]}]},children:[{tagName:"jx-icon",$props:{name:"plus"}},{tagName:"span",textContent:"New branch"}]}]},{tagName:"p",attributes:{part:"branch-summary"},textContent:"${state.branchSummary}"},{tagName:"div",attributes:{part:"branch-note-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasBranchNote"},cases:{true:{tagName:"p",attributes:{part:"branch-note"},textContent:"${state.branchNote}"}}},{tagName:"div",attributes:{part:"branches-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/branchesState"},cases:{listed:{tagName:"ul",attributes:{part:"branch-list"},children:[{$prototype:"Array",items:{$ref:"#/state/branches"},key:{$ref:"$map/item/key"},map:{tagName:"li",attributes:{part:"branch","data-branch":"${$map.item.name}","data-current":"${$map.item.current}"},children:[{tagName:"jx-icon",attributes:{part:"branch-icon"},$props:{name:"git-branch"}},{tagName:"span",attributes:{part:"branch-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"branch-state",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/current"},cases:{true:{tagName:"span",attributes:{part:"current"},children:[{tagName:"span",attributes:{part:"current-tag"},textContent:"Current"},{tagName:"span",attributes:{part:"branch-sync"},textContent:"${$map.item.note}"}]},false:{tagName:"jx-button",attributes:{part:"switch","data-branch":"${$map.item.name}"},$props:{size:"sm",label:{$ref:"$map/item/switchName"},disabled:{$ref:"#/state/busy"}},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/checkout"},value:[{$ref:"$map/item/name"}]}]},children:[{tagName:"span",textContent:"${$map.item.switchLabel}"}]}}}]}}]},empty:{tagName:"p",attributes:{part:"empty-message"},textContent:"${state.branchesEmpty}"}}}]}]},hosting:{tagName:"div",attributes:{part:"hosting"},children:[{tagName:"section",attributes:{part:"source"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Where your project is saved"},{tagName:"p",attributes:{part:"hosting-summary"},textContent:"${state.sourceSummary}"},{tagName:"div",attributes:{part:"command-row"},children:[{$prototype:"Array",items:{$ref:"#/state/sourceCommands"},key:{$ref:"$map/item/id"},map:{tagName:"jx-button",attributes:{part:"command","data-command":"${$map.item.id}",title:"${$map.item.title}"},$props:{size:"sm",disabled:{$ref:"$map/item/disabled"},quiet:!1},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/run"},value:[{$ref:"$map/item/id"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}}]}]},{tagName:"section",attributes:{part:"host"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Where your site is hosted"},{tagName:"p",attributes:{part:"host-name"},textContent:"${state.hostTitle}"},{tagName:"p",attributes:{part:"hosting-summary"},textContent:"${state.hostSummary}"},{tagName:"div",attributes:{part:"command-row"},children:[{$prototype:"Array",items:{$ref:"#/state/hostCommands"},key:{$ref:"$map/item/id"},map:{tagName:"jx-button",attributes:{part:"command","data-command":"${$map.item.id}",title:"${$map.item.title}"},$props:{size:"sm",disabled:{$ref:"$map/item/disabled"},quiet:!1},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/run"},value:[{$ref:"$map/item/id"}]}]},children:[{tagName:"span",textContent:"${$map.item.label}"}]}}]}]},{tagName:"section",attributes:{part:"build"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"How it is built"},{tagName:"p",attributes:{part:"hosting-summary"},textContent:"The build adapter decides what the build produces: static files, or a server for sign-in and data routes."},{tagName:"div",$description:"The mount box for the Deploy section (`settings/project-sections.ts` `renderDeploySection`, `surfaces/settings-deploy.json`), which moved here from Project Settings (studio.md §17.1). The flow is handed this node by `onNodeCreated` and mounts the section into it; nothing in this document styles what lands here.",attributes:{part:"adapter-island",role:"none"}}]},{tagName:"section",attributes:{part:"address"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Your address"},{tagName:"div",attributes:{part:"domain-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/domainState"},cases:{set:{tagName:"div",attributes:{part:"live-site"},children:[{tagName:"span",attributes:{part:"live-url"},textContent:"${state.domain}"},{tagName:"jx-button",attributes:{part:"visit"},$props:{size:"sm"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openUrl"},value:[{$ref:"#/state/domain"}]}]},children:[{tagName:"jx-icon",$props:{name:"globe"}},{tagName:"span",textContent:"Visit site"}]}]}}},{tagName:"p",attributes:{part:"hosting-summary"},textContent:"${state.domainNote}"}]},{tagName:"section",attributes:{part:"checklist"},children:[{tagName:"h3",attributes:{part:"section-heading"},textContent:"Deploy checklist"},{tagName:"p",attributes:{part:"hosting-summary"},textContent:"${state.checklistSummary}"},{tagName:"ol",attributes:{part:"checklist-steps"},children:[{$prototype:"Array",items:{$ref:"#/state/checklistSteps"},key:{$ref:"$map/item/id"},map:{tagName:"li",attributes:{part:"checklist-step","data-step":"${$map.item.id}","data-state":"${$map.item.state}"},children:[{tagName:"jx-icon",attributes:{part:"step-icon"},$props:{name:{$ref:"$map/item/icon"},label:{$ref:"$map/item/iconLabel"}}},{tagName:"span",attributes:{part:"step-label"},textContent:"${$map.item.text}"}]}}]}]}]}}}]},{tagName:"div",attributes:{part:"busy-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/busy"},cases:{true:{tagName:"p",attributes:{part:"busy",role:"status"},textContent:"Working…"}}},{tagName:"div",attributes:{part:"failure-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasError"},cases:{true:{tagName:"p",attributes:{part:"failure",role:"alert"},textContent:"${state.error}"}}}]};E("publish-workspace",lt);function Pt(){return{allIncluded:!1,blocker:"",branchNote:"",branchSummary:"",branches:[],branchesEmpty:"",branchesState:"empty",busy:!1,canClone:!1,checklistSteps:[],checklistSummary:"",checks:[],commitRegion:"",commits:[],commitsState:"empty",deployCommands:[],deploysBusy:!1,deploysNote:"",deploysState:"note",destination:"live",destinationId:"",destinations:[],domain:"",domainNote:"",domainState:"none",error:"",filesState:"empty",groups:[],hasBlocker:!1,hasBranchNote:!1,hasError:!1,hasLastUpdated:!1,hasLiveUrl:!1,hasRefusal:!1,headline:"",history:[],historyState:"empty",hostCommands:[],hostSummary:"",hostTitle:"",includedLabel:"",lastUpdated:"",liveNone:"",liveSummary:"",liveUrl:"",mood:"loading",newBranchDisabled:!1,panelId:"",previews:[],previewsState:"empty",primaryDisabled:!0,primaryLabel:"",pullLabel:"Pull",pushLabel:"Push",refusal:"",region:"",remoteState:"local",reviewLine:"",reviewState:"none",reviewUrl:"",running:[],runningState:"none",someIncluded:!1,sourceCommands:[],sourceSummary:"",summary:"",syncLabel:"",tab:"review",tabTitle:"",tabs:[],titleId:""}}function Rt(t){let e=t?.$map,a=v(e)?e.item:void 0,r=v(a)?a.path:void 0;return n(r)?r:""}function Dt(t){let e=n(t)?void 0:t.attributes?.part;return n(e)?e:""}function pt(t,e,a){t.replaceChildren();let{adapterHost:r,compareHost:i,...l}=a,o=g({...Pt(),...l});Object.assign(o,e);let c=null,m=!1,f=R("publish-workspace",o,t,{onNodeCreated:(d,y,j,w)=>{if(m||!(d instanceof HTMLElement))return;let h=Dt(j);if(h==="adapter-island")r(d);else if(h==="compare")i(d,Rt(w))}}).then((d)=>{if(m)d.dispose();else c=d;return d.root});return{attached:()=>{if(m)return!1;let d=c?.root;return d===void 0?!0:d instanceof HTMLElement&&t.contains(d)},dispose(){m=!0,c?.dispose(),c=null},ready:f,update:(d)=>{Object.assign(o,d)}}}async function V(){let t=Ri();if(!t||!Zl()||u.publish.deploys.state==="loading")return;let e=u.publish.deploys,a=t.projectName,r=()=>u.publish.deploys!==e||Ri()?.projectName!==a;e.state="loading",e.project=a;try{let i=await IL(t);if(r()){dt(e);return}e.rows=i,e.error="",e.state="loaded",jd(i[0]??null)}catch(i){if(r()){dt(e);return}e.rows=[],e.error=X(i),e.state="failed"}}function dt(t){if(u.publish.deploys===t)t.state="idle"}function bt(){let t=DL(),{deploys:e}=u.publish;return e.state==="loaded"&&t!==null&&!e.rows.some((a)=>a.id===t.id)}function Lt(){return u.publish.deploys.state==="idle"||bt()}function PD(t){if(u.publish.tab=t,t==="review"&&u.git.logEntries===null&&u.git.status?.isRepo)KS();if(t==="deploys"&&(u.publish.deploys.state!=="loaded"||bt()))V()}var Tt=new Map([["done",{icon:"check",label:"Passed"}],["failed",{icon:"x",label:"Failed"}],["running",{icon:"spinner",label:"Running"}],["todo",{icon:"warning-circle",label:"To do"}],["unknown",{icon:"question",label:"Not checked yet"}]]);function ct(t){return Tt.get(t)??{icon:"question",label:"Not checked yet"}}function At(t){return`${t} ${t===1?"change":"changes"}`}function gt(){return u.git.status?.files??[]}function O(){let t=u.git.status?.remotes;return Array.isArray(t)&&t.length>0?t[0]??"":""}function z(){if(!C)return"no-project";let{error:t,loading:e,status:a}=u.git;if(!a&&!e&&!t)return"loading";return a&&!a.isRepo?"no-repo":"repo"}function F(){return u.git.branches?.current||u.git.status?.branch||""}function mt(){let{status:t}=u.git,e=t?.ahead?`${t.ahead} ahead`:"",a=t?.behind?`${t.behind} behind`:"";return e||a?[e,a].filter(Boolean).join(", "):"Up to date"}function Ht(t){if(t==="no-repo")return"Not tracked by git yet";if(t!=="repo")return"";let e=gt().length;return`${F()?`On ${F()}`:"On a branch with no name yet"} · ${e>0?`${At(e)} to publish`:"nothing to publish"}`}function It(t){return{files:t.files.map((e)=>({...e,compareLabel:`Before and after: ${e.label}`,discardHint:e.cannotDiscard?"A new file has no saved version to go back to":"Discard changes",discardLabel:`Discard changes to ${e.path}`,includeLabel:`Include ${e.path}`})),key:t.key,name:t.name}}function L(t){let e=ae();if(!e)return[];return t.flatMap((a)=>{let r=e.get(a);if(!r||!e.isVisible(a))return[];let i=e.disabledReason(a);return[{disabled:i!==void 0,id:a,label:r.title,title:i?`${r.title}: requires ${i}`:r.title}]})}function Wt(t){let e={actionDisabled:!1,actionLabel:"",actionTitle:"",hasAction:!1,icon:ct(t.state).icon,iconLabel:ct(t.state).label,key:t.key,state:t.state,text:t.text};if(t.key==="build"){if(t.state==="running"||!X_())return e;let r=t.state==="unknown"?"Check build":"Check again";return{...e,actionLabel:r,actionTitle:r,hasAction:!0}}let[a]=t.command?L([t.command]):[];return a?{...e,actionDisabled:a.disabled,actionLabel:a.label,actionTitle:a.title,hasAction:!0}:e}function Bt(t){let[e]=t.filter((a)=>a.environment==="production"&&ft(a)).toSorted((a,r)=>Date.parse(r.createdOn)-Date.parse(a.createdOn));return e?.id??""}function ft(t){return t.status==="success"&&t.stage==="deploy"}function zt(t,e){if(t.status==="failure")return"Failed";if(t.status==="canceled")return"Canceled";if(!ft(t))return"Building…";if(t.environment!=="production")return"Ready";return t.id===e?"Live":"Replaced"}function ut(t,e){let r=t.environment==="production"?`Production${t.branch?` · ${t.branch}`:""}`:t.branch||"Preview";return{environment:t.environment,key:t.id,label:r,openLabel:`Open ${r}`,status:zt(t,e),statusDetail:`${t.stage}: ${t.status}`,statusKey:t.status,url:t.url,when:Yw(t.createdOn)}}function Et(){if(!Zl())return{deploysNote:"This host cannot reach the Cloudflare API, so deployments are not listed here. Your host runs bunx jx build and serves dist/.",deploysState:"note"};if(!Ri())return{deploysNote:"Connect a host under Hosting, and every deployment it makes is listed here.",deploysState:"note"};if(u.publish.deploys.state==="failed")return{deploysNote:`The host did not answer: ${u.publish.deploys.error}`,deploysState:"note"};return{deploysNote:"",deploysState:u.publish.deploys.state==="loaded"?"listed":"loading"}}function Ft(){return u.publish.deploys.project===Ri()?.projectName?u.publish.deploys.rows:[]}function yt(){return Ri()?.productionUrl||C?.projectConfig?.url||""}function Mt(t){let e=Ri();if(e?.productionUrl)return"Cloudflare Pages serves it. A custom domain is added on the Cloudflare dashboard.";if(e)return"Cloudflare has not reported an address yet. A custom domain is added on the Cloudflare dashboard.";return t?"The Production URL in Project Settings › Overview. No host is connected yet; once one is, point this domain at it on the host's dashboard.":"Your site gets an address when a host is connected, or set its Production URL in Project Settings › Overview."}function Ut(t){if(!Ri())return yt()?"No host is connected, so Studio cannot say what is deployed there. Connect one under Hosting.":"";let e=t.find((o)=>o.environment==="production"),a=DL(),r=a&&(a.environment==="production"||!e)?a:void 0,[i]=[e,r].filter((o)=>o!==void 0).toSorted((o,c)=>Date.parse(c.createdOn)-Date.parse(o.createdOn));if(!i)return"No deployment has been observed yet.";let l=i.branch?` from ${i.branch}`:"";return`Last deployed ${Yw(i.createdOn)}${l} · ${i.stage}: ${i.status}`}function Vt(){let{status:t}=u.git;if(!C)return"";if(!t)return"Source control has not reported on this project yet.";if(!t.isRepo)return"Not tracked by git yet. A repository keeps every version you publish.";let e=F()||"an unnamed branch",a=O();if(Us())return`Saved on GitHub${a?` (${a})`:""}, on ${e}. Every commit lands there as it is made.`;return a?`Saved in git and pushed to ${a}, on ${e}.`:`Saved in git on this machine only, on ${e}. A host builds from a remote, so create the GitHub repository next.`}function Ot(){let{status:t}=u.git;if(!t)return["git.signInToGithub"];if(!t.isRepo)return["git.init","git.signInToGithub"];if(O()==="")return["git.createGithubRepository","git.signInToGithub"];return Us()?["git.signInToGithub"]:["git.push","git.signInToGithub"]}function Jt(){let t=Ri();if(t)return{hostSummary:`Every publish is pushed to the remote and built by Cloudflare Pages${t.productionUrl?` at ${t.productionUrl}`:""}.`,hostTitle:`Cloudflare Pages: ${t.projectName}`};if(ye()&&p().cfConnect)return{hostSummary:"Runs on Cloudflare with nothing to configure: connect it, and every publish builds and deploys.",hostTitle:"Jx Cloud, on Cloudflare"};if(Zl())return{hostSummary:"Connect a Cloudflare API token, and every publish builds and deploys on your own account.",hostTitle:"Your Cloudflare account"};return{hostSummary:"This host cannot reach Cloudflare. Choose a build adapter below; your host runs bunx jx build and serves dist/.",hostTitle:"Another host"}}function ht(t){let e=t.replaceAll(/[^\w-]/g,"-"),a=z(),{git:r}=u,i=gt(),l=i.filter((s)=>s.staged).length,{destination:o,tab:c}=u.publish,m=hm(o),f=a==="repo"?pm(m):"",d=o==="review"?pb():"",y=zD(),j=r.logEntries??[],w=Ri(),h=yt(),x=Ft(),J=x.filter((s)=>s.environment==="preview"),q=Bt(x),G=as.filter((s)=>s.source==="Publish"&&!Hc(s)),_=r.branches?.branches??[],A=r.branches?.current??"",P=Us(),H=O(),K=NL(),b=i.length;return{...Et(),...Jt(),allIncluded:b>0&&l===b,blocker:f,branchNote:P?"Each branch opens in its own session, so switching reloads Studio on that branch.":"",branchSummary:A?`On ${A}`:"",branches:_.map((s)=>({current:s===A,key:s,name:s,note:H?mt():"Local only",switchLabel:P?"Switch and reload":"Switch",switchName:P?`Switch to ${s} and reload`:`Switch to ${s}`})),branchesEmpty:a==="no-repo"?"This project is not tracked by git yet.":"No branches yet. The first commit makes one.",branchesState:_.length>0?"listed":"empty",busy:r.loading,canClone:Pb(),checklistSteps:K.steps,checklistSummary:K.summary,checks:a==="repo"?fb().map((s)=>Wt(s)):[],commitRegion:`${t}/commit`,commits:j.map((s)=>fL(s)),commitsState:j.length>0?"listed":"empty",deployCommands:L(w?["publish.deploy","publish.openDashboard"]:["publish.setUp"]),deploysBusy:u.publish.deploys.state==="loading",destination:m,destinationId:`${e}-destination`,destinations:hw(o),domain:h,domainNote:Mt(h),domainState:h?"set":"none",error:r.error??"",filesState:b>0?"listed":"empty",groups:pL(i).map((s)=>It(s)),hasBlocker:f!=="",hasBranchNote:P,hasError:Boolean(r.error),hasLastUpdated:Boolean(r.lastUpdated),hasLiveUrl:h!=="",hasRefusal:d!=="",headline:Ht(a),history:x.map((s)=>ut(s,q)),historyState:x.length>0?"listed":"empty",hostCommands:L(w?["publish.setUp","publish.openDashboard"]:["publish.setUp"]),includedLabel:b>0?`${l} of ${b} included`:"",lastUpdated:mL(r.lastUpdated),liveNone:w?"The host has not reported an address for this site yet.":"No host is connected. Connect one under Hosting, and every publish ships to it.",liveSummary:Ut(x),liveUrl:h,mood:a,newBranchDisabled:r.loading||a!=="repo",panelId:`${e}-body`,previews:J.map((s)=>ut(s,q)),previewsState:J.length>0?"listed":"empty",primaryDisabled:a!=="repo"||f!=="",primaryLabel:jD(m),pullLabel:r.status?.behind?`Pull (${r.status.behind} behind)`:"Pull",pushLabel:r.status?.ahead?`Push (${r.status.ahead} ahead)`:"Push",refusal:d,region:t,remoteState:H?"remote":"local",reviewLine:y?`Pull request #${y.number} is open for review.`:"",reviewState:y?"opened":"none",reviewUrl:y?.url??"",running:G.map((s)=>TL(s)),runningState:G.length>0?"running":"none",someIncluded:l>0&&l<b,sourceCommands:L(Ot()),sourceSummary:Vt(),summary:r.commitMessage,syncLabel:H?mt():"Local only (no remote)",tab:c,tabTitle:jC[c],tabs:Bm.map((s)=>({label:s==="review"&&b>0?`${jC[s]} (${b})`:jC[s],value:s})),titleId:`${e}-title`}}var k=new Map,M=new WeakMap;function $t(){return C?.projectConfig?.build?.adapter||"static"}function qt(t){let e=$t(),a=k.get(t);if(!a?.isConnected||M.get(a)===e)return;M.set(a,e),D(a)}function Gt(t){if(t==="build"){HD();return}let e=fb().find((a)=>a.key===t);if(e?.command)nt(e.command,void 0,"Publish")}function _t(t){return{adapterHost:(e)=>{let a=k.get(t);if(a&&a!==e)B(a);k.set(t,e),M.set(e,$t()),D(e)},checkout:(e)=>{hL(e)},clone:()=>{iL()},compare:(e)=>{U=e,oL(e)},compareHost:(e,a)=>{let r=T.get(t);if(!r)r=new Map,T.set(t,r);r.set(a,e)},createRepository:()=>{nt("git.createGithubRepository",void 0,"Publish")},discard:(e)=>{dL(e)},editSummary:(e)=>{u.git.commitMessage=e},fetch:()=>{rL()},include:(e,a)=>{aL(e,a)},includeAll:(e)=>{lL(e)},initRepository:()=>{nt("git.init",void 0,"Publish")},newBranch:()=>{uL()},openUrl:(e)=>{if(e)Vb(e)},pickDestination:(e)=>{if(Cx(e))u.publish.destination=e},publish:()=>{pw(hm(u.publish.destination))},pull:()=>{sL()},push:()=>{nt("git.push",void 0,"Publish")},refresh:()=>{ks()},reloadDeployments:()=>{V()},run:(e)=>{nt(e,void 0,"Publish")},runCheck:Gt,selectTab:(e)=>{if(mO(e))PD(e)}}}var S=new Map,T=new Map,U=null,vt=new Set;async function wt(t,e){await e.handle.ready;let a=U===null?void 0:T.get(t)?.get(U);if(a?.isConnected)(a.querySelector('[part="control"]')??a).focus()}function PE(t){let e=S.get(t);if(e?.wrap.isConnected&&e.handle.attached()){wt(t,e);return}vt.add(t)}function Y_(t,e){let a=S.get(t);return a!==void 0&&a.tabId===e.id&&a.wrap.isConnected&&a.handle.attached()}function Z_(t){let e=S.get(t);if(!e)return;e.scope.stop();let a=k.get(t);if(a)B(a);e.handle.dispose(),S.delete(t),k.delete(t),T.delete(t)}function FE(t,e){let{paneId:a,wrap:r}=t;if(Y_(a,e))return;if(Z_(a),ye()&&z()==="loading")ks();PD(u.publish.tab);let i=Ln(a,"publish"),l=pt(r,ht(i),_t(a)),o=me();o.run(()=>{te(()=>{let m=ht(i);if(m.mood==="repo")gL();if(l.update(m),qt(a),m.tab==="deploys"&&Lt())V()}),te(()=>{if(u.publish.tab==="review"&&z()==="repo")cL()})});let c={handle:l,scope:o,tabId:e.id,wrap:r};if(S.set(a,c),vt.delete(a))wt(a,c)}
2
+ export{MD,PD,PE,Y_,Z_,FE};
3
+
4
+ //# debugId=5CCF83F4F751EEE164756E2164756E21
5
+ //# sourceMappingURL=studio-2pk7kc7z.js.map
@@ -0,0 +1,5 @@
1
+ import{X}from"./studio-9c6cbq2c.js";import{p}from"./studio-4fnb5648.js";import{w}from"./studio-sce30r7b.js";import{ph,us,iI}from"./studio-4zd6an2b.js";import{Jt,Ut}from"./studio-nzemfbkk.js";import{sn,dt,Fn}from"./studio-tpxcryf2.js";import{m,h,eu}from"./studio-knsjyx7n.js";import{Kd}from"./studio-hh394phe.js";import{Jc,Ta,J$,RO,Y$,Nx,Ys,Ax,NO,AO,Ox,Mx,ov,nr,Vd,Yc,hh,fl,Px}from"./studio-61rg2cz5.js";import{oA,Qw,ex,Xu}from"./studio-3pz4t5a2.js";import{ET,Gu}from"./studio-4bgvvzhv.js";import{zt}from"./studio-daksw8kh.js";import{_L,SL,CL,kL,Zu,XS,QS,eC,tC}from"./studio-jma2q8r9.js";import{_p}from"./studio-z9453ypn.js";import{Ve,Ln,vt,E,R}from"./studio-9dq7rwc7.js";import{Me}from"./studio-0gvvqj3h.js";import{g}from"./studio-3qr08sxq.js";import{n,_}from"./studio-k3we3kqb.js";import{ce}from"./studio-0939t1q1.js";var H=[{key:"all",label:"All media"},{key:"image",label:"Images"},{key:"video",label:"Video"},{key:"audio",label:"Audio"},{key:"document",label:"Documents"},{key:"font",label:"Fonts"},{key:"unused",label:"Unused"}],lS=H.map((e)=>e.key);function re(e){return lS.some((t)=>t===e)}function T(e){return H.find((t)=>t.key===e)?.label??"All media"}var U=[{key:"newest",label:"Newest"},{key:"name",label:"Name"},{key:"size",label:"Size"}],Re=U.map((e)=>e.key);function ne(e){return Re.some((t)=>t===e)}function W(e,t,i){switch(t){case"all":return!0;case"unused":return i!==null&&i.has(e.file);default:return e.kind===t}}function A(e,t){let i=t.trim().toLowerCase();return i===""||e.name.toLowerCase().includes(i)}function q(e,t){return e.filter((a)=>W(a,t.filter,t.unused)&&A(a,t.query)).toSorted((a,r)=>Ae(t.sort,a,r)||a.file.localeCompare(r.file))}function Ae(e,t,i){switch(e){case"name":return t.name.localeCompare(i.name,void 0,{numeric:!0,sensitivity:"base"});case"size":return(i.bytes??-1)-(t.bytes??-1);default:return(i.modified??"").localeCompare(t.modified??"")}}function oe(e,t){let i={all:e.length,audio:0,document:0,font:0,image:0,unused:t===null?null:e.filter((a)=>t.has(a.file)).length,video:0};for(let a of e)i[a.kind]=(i[a.kind]??0)+1;return i}var Ie=132,ae=12;function le(e){return Math.max(1,Math.floor((e+ae)/(Ie+ae)))}function se(e,t,i,a,r=!1){if(a===0)return null;let o=Math.min(Math.max(e,0),a-1),l=o-o%i,c;switch(t){case"ArrowRight":{c=o+1;break}case"ArrowLeft":{c=o-1;break}case"ArrowDown":{c=o+i;break}case"ArrowUp":{c=o-i;break}case"Home":{c=r?0:l;break}case"End":{c=r?a-1:Math.min(l+i-1,a-1);break}default:return null}return c<0||c>=a?o:c}var de={$schema:"https://jxsuite.com/schema/v1",$id:"StudioMediaLibrary",$description:"The Media workspace's library (`specs/studio.md` §22.6): the project's media as filters, a grid and the selected file's detail. ONE document in two modes. In `manage` it is the Media home tab, with Replace, Open in viewer, Rename, Duplicate and Delete under the detail; in `pick` it is the full-size picker inside a `jx-dialog` (`media-pick-dialog.json`), and the dialog's own footer answers Cancel or Use <file>. `media/media-library.ts` keeps every decision (which files a filter keeps, the sort, what a count may claim, where an arrow lands, what Replace writes) and hands this document strings and discriminants. **Unused is drawn with no number until the usage sweep has settled**, and Missing alt text and tags are not drawn at all: each needs a store that does not exist, and a filter that cannot be answered is not shipped as one that always answers nothing.",tagName:"div",attributes:{part:"media-library","data-jx-region":"${state.region}","data-mode":"${state.mode}","data-drop":"${state.dropActive}"},style:{$description:"Three columns over the whole stage: the filters, the grid with its toolbar, and the selected file's detail. Fills the pane's stage by its own geometry, as the workspace home does: the stage is `position: relative` (`pane-grid.json`). In pick mode the same columns fill the dialog's body instead, so the root's box is the only thing that differs between the two modes.",position:"absolute",inset:"0",display:"grid",gridTemplateColumns:"200px minmax(0, 1fr) 300px",boxSizing:"border-box",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",background:"var(--bg)",'&[data-mode="pick"]':{$description:"Inside a dialog there is no stage to fill: the box is the dialog body's, at a height the dialog can scroll within.",position:"relative",inset:"auto",height:"min(70vh, 620px)",gridTemplateColumns:"150px minmax(0, 1fr) 210px"},'&[data-drop="true"]':{$description:"The drop affordance is a STATE the flow holds, not a class a handler adds and forgets to take off.",outline:"2px dashed var(--accent)",outlineOffset:"-4px"},'& [part="filters"]':{display:"flex",flexDirection:"column",gap:"2px",padding:"var(--jx-space-3) var(--jx-space-2)",borderRight:"1px solid var(--border)",background:"var(--bg-panel)",overflowY:"auto"},'& [part="filters-heading"]':{margin:"0",padding:"var(--jx-space-2) var(--jx-space-2) var(--jx-space-1)",fontSize:"var(--jx-text-xs)",fontWeight:"600",letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--fg-dim)"},'& [part="filter"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",height:"30px",padding:"0 var(--jx-space-2)",border:"none",borderRadius:"var(--radius)",background:"none",color:"var(--fg)",font:"inherit",textAlign:"left",cursor:"pointer"},'& [part="filter"]:hover':{background:"var(--hover-bg)"},'& [part="filter"][aria-pressed="true"]':{background:"color-mix(in srgb, var(--accent) 16%, transparent)",color:"var(--fg)",fontWeight:"600"},'& [part="filter"]:focus-visible':{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'& [part="filter-count"]':{marginLeft:"auto",fontSize:"var(--jx-text-xs)",color:"var(--fg-dim)",fontWeight:"400"},'& [part="main"]':{display:"flex",flexDirection:"column",minWidth:"0",minHeight:"0"},'& [part="toolbar"]':{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"var(--jx-space-3)",padding:"var(--jx-space-3) var(--jx-space-4)",borderBottom:"1px solid var(--border)"},'& [part="title"]':{margin:"0 auto 0 0",fontSize:"var(--jx-text-lg)",fontWeight:"600"},'& [part="search"]':{width:"220px"},'& [part="sort"]':{width:"130px"},'& [part="upload"], & [part="empty-upload"]':{$description:"A LABEL around the file picker, not a button that clicks a hidden one: the picker is the control, so it takes focus, Enter opens it and a screen reader announces a file upload. A plain element because a label forwards a click to the input it contains and a custom element between the two would break that.",position:"relative",display:"inline-flex",alignItems:"center",gap:"6px",height:"28px",padding:"0 var(--jx-space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius)",background:"var(--bg-panel)",color:"var(--fg)",font:"inherit",cursor:"pointer",":hover":{background:"var(--hover-bg)"},":has(:focus-visible)":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"}},'& [part="upload-input"], & [part="replace-input"]':{$description:"Out of the way but still FOCUSABLE: `display: none` would take the control out of the tab order, and the label around it draws the focus ring for it.",position:"absolute",width:"1px",height:"1px",opacity:"0",pointerEvents:"none"},'& [part="upload-glyph"]':{"--jx-icon-size":"16px"},'& [part="body"]':{flex:"1",minHeight:"0",overflowY:"auto",padding:"var(--jx-space-4)"},'& [part="grid"]':{$description:"auto-fill over a minimum tile width; `media/media-library-model.ts` `gridColumns` does the same arithmetic, so ArrowDown lands on the tile drawn under the current one. Keep the two numbers in step.",display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(132px, 1fr))",gap:"12px",alignContent:"start"},'& [part="tile"]':{display:"flex",flexDirection:"column",gap:"4px",padding:"4px",borderRadius:"var(--jx-radius-md, 6px)",border:"2px solid transparent",cursor:"pointer",minWidth:"0",outline:"none"},'& [part="tile"]:hover':{background:"var(--hover-bg)"},'& [part="tile"][aria-selected="true"]':{borderColor:"var(--accent)"},'& [part="tile"]:focus-visible':{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},'& [part="thumb"]':{display:"flex",alignItems:"center",justifyContent:"center",aspectRatio:"4 / 3",borderRadius:"var(--radius)",background:"var(--bg-input)",overflow:"hidden",color:"var(--fg-dim)","--jx-icon-size":"28px"},'& [part="thumb-img"]':{width:"100%",height:"100%",objectFit:"cover"},'& [part="tile-name"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"var(--jx-text-sm)"},'& [part="tile-caption"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontSize:"var(--jx-text-xs)",color:"var(--fg-dim)",minHeight:"1em"},'& [part="empty"]':{display:"flex",flexDirection:"column",alignItems:"center",gap:"var(--jx-space-3)",padding:"48px var(--jx-space-6)",textAlign:"center",color:"var(--fg-dim)","--jx-icon-size":"40px"},'& [part="empty-title"]':{margin:"0",fontSize:"var(--jx-text-lg)",fontWeight:"600",color:"var(--fg)"},'& [part="empty-detail"]':{margin:"0",maxWidth:"42ch",lineHeight:"1.5"},'& [part="detail"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",padding:"var(--jx-space-4)",borderLeft:"1px solid var(--border)",background:"var(--bg-panel)",overflowY:"auto",minWidth:"0"},'& [part="detail-hint"]':{margin:"auto 0",textAlign:"center",color:"var(--fg-dim)"},'& [part="detail-preview"]':{display:"flex",alignItems:"center",justifyContent:"center",minHeight:"140px",maxHeight:"220px",borderRadius:"var(--radius)",background:"var(--bg-input)",overflow:"hidden",color:"var(--fg-dim)","--jx-icon-size":"40px"},'& [part="preview-img"], & [part="preview-video"]':{maxWidth:"100%",maxHeight:"220px",objectFit:"contain"},'& [part="preview-audio"]':{width:"100%"},'& [part="preview-specimen"]':{$description:"The viewer's specimen at a side pane's size. The face arrives as the `@font-face` the flow writes under a family name generated from the path (`media/media-pane.ts` `specimenOf`); the element carries only that name, as a custom property, and the fallback stack is a rule, here.",display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",padding:"var(--jx-space-4)",maxWidth:"100%",color:"var(--fg)",fontFamily:"var(--jx-specimen-family, system-ui), system-ui, sans-serif"},'& [part="specimen-line"]':{margin:"0",lineHeight:"1.3",overflowWrap:"anywhere"},'& [part="specimen-line"][data-size="32"]':{fontSize:"32px"},'& [part="specimen-line"][data-size="14"]':{fontSize:"var(--jx-text-md)"},'& [part="detail-name"]':{margin:"0",fontSize:"var(--jx-text-md)",fontWeight:"600",overflowWrap:"anywhere"},'& [part="facts"]':{margin:"0",color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"},'& [part="group-title"]':{margin:"0",fontSize:"var(--jx-text-xs)",fontWeight:"600",color:"var(--fg-dim)"},'& [part="url"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0"},'& [part="url-value"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontFamily:"var(--jx-font-mono)",fontSize:"var(--jx-text-sm)"},'& [part="usage"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-1)"},'& [part="usage-headline"]':{margin:"0",fontSize:"var(--jx-text-sm)"},'& [part="usage-list"]':{margin:"0",padding:"0",listStyle:"none",display:"flex",flexDirection:"column",gap:"2px"},'& [part="usage-row"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)"},'& [part="usage-link"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",border:"none",background:"none",padding:"0",color:"var(--accent)",font:"inherit",fontSize:"var(--jx-text-sm)",textAlign:"left",cursor:"pointer",":hover":{textDecoration:"underline"},":focus-visible":{outline:"var(--jx-focus-ring)"}},'& [part="usage-count"]':{fontSize:"var(--jx-text-xs)",color:"var(--fg-dim)"},'& [part="actions"]':{display:"flex",flexWrap:"wrap",gap:"var(--jx-space-2)",marginTop:"var(--jx-space-2)"},'& [part="replace"]':{position:"relative",display:"inline-flex",alignItems:"center",height:"28px",padding:"0 var(--jx-space-3)",border:"1px solid var(--border)",borderRadius:"var(--radius)",background:"var(--bg)",color:"var(--fg)",font:"inherit",cursor:"pointer",":hover":{background:"var(--hover-bg)"},":has(:focus-visible)":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"}}},ondragover:{$prototype:"Function",body:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/dragOver"},value:[]}],description:"A file dropped ANYWHERE on the library uploads, to the destination the Upload label names before the drop: public/media/."},ondragleave:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/dragOut"},value:[]}]},ondrop:{$prototype:"Function",body:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/drop"},value:[{$ref:"event#/dataTransfer/files"}]}]},children:[{tagName:"nav",attributes:{part:"filters","aria-label":"Media filters"},children:[{tagName:"h2",attributes:{part:"filters-heading"},textContent:"Library"},{$prototype:"Array",items:{$ref:"#/state/filters"},key:{$ref:"$map/item/key"},map:{tagName:"button",attributes:{part:"filter",type:"button","aria-pressed":"${$map.item.pressed}","data-filter":"${$map.item.key}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setFilter"},value:[{$ref:"$map/item/key"}]}]},children:[{tagName:"span",attributes:{part:"filter-label"},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"filter-count"},textContent:"${$map.item.count}"}]}}]},{tagName:"section",attributes:{part:"main","aria-labelledby":"${state.titleId}"},children:[{tagName:"header",attributes:{part:"toolbar"},children:[{tagName:"h2",attributes:{part:"title",id:"${state.titleId}"},textContent:"${state.title}"},{tagName:"jx-textfield",attributes:{part:"search"},$props:{type:"search",size:"sm",label:"Search media",placeholder:"Search by name…",autocomplete:"off",value:{$ref:"#/state/query"}},oninput:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setQuery"},value:[{$ref:"event#/target/value"}]}]}},{tagName:"jx-select",attributes:{part:"sort"},$props:{label:"Sort",size:"sm",options:{$ref:"#/state/sortOptions"},value:{$ref:"#/state/sort"}},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/setSort"},value:[{$ref:"event#/target/value"}]}]}},{tagName:"label",attributes:{part:"upload",title:"${state.uploadHint}"},children:[{tagName:"input",attributes:{part:"upload-input",type:"file",multiple:!0,accept:"${state.uploadAccept}"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/upload"},value:[{$ref:"event#/target"}]}],description:"The picker itself, so the destination in the label's tooltip is visible BEFORE the files are chosen. The flow takes the element rather than the file list because a file input that is not cleared refuses the same file twice."}},{tagName:"jx-icon",attributes:{part:"upload-glyph","aria-hidden":"true"},$props:{name:"upload-simple"}},{tagName:"span",textContent:"Upload"}]}]},{tagName:"div",attributes:{part:"body"},children:[{tagName:"div",attributes:{part:"grid-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/gridState"},cases:{loading:{tagName:"p",attributes:{part:"empty",role:"status"},textContent:"Reading the project's media…"},counting:{tagName:"p",attributes:{part:"empty",role:"status"},textContent:"${state.countingLabel}"},empty:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"jx-icon",attributes:{part:"empty-glyph","aria-hidden":"true"},$props:{name:"image"}},{tagName:"p",attributes:{part:"empty-title"},textContent:"${state.emptyTitle}"},{tagName:"p",attributes:{part:"empty-detail"},textContent:"${state.emptyDetail}"},{tagName:"label",attributes:{part:"empty-upload",title:"${state.uploadHint}"},children:[{tagName:"input",attributes:{part:"upload-input",type:"file",multiple:!0,accept:"${state.uploadAccept}"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/upload"},value:[{$ref:"event#/target"}]}],description:"The picker itself, so the destination in the label's tooltip is visible BEFORE the files are chosen. The flow takes the element rather than the file list because a file input that is not cleared refuses the same file twice."}},{tagName:"jx-icon",attributes:{part:"upload-glyph","aria-hidden":"true"},$props:{name:"upload-simple"}},{tagName:"span",textContent:"Upload"}]}]},nomatch:{tagName:"div",attributes:{part:"empty"},children:[{tagName:"jx-icon",attributes:{part:"empty-glyph","aria-hidden":"true"},$props:{name:"image"}},{tagName:"p",attributes:{part:"empty-title"},textContent:"${state.emptyTitle}"},{tagName:"p",attributes:{part:"empty-detail"},textContent:"${state.emptyDetail}"},{tagName:"jx-button",attributes:{part:"reset"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/reset"},value:[]}]},children:[{tagName:"span",textContent:"Show all media"}]}]},listed:{tagName:"div",attributes:{part:"grid",role:"listbox","aria-labelledby":"${state.titleId}"},onkeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{ArrowRight:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],ArrowLeft:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],ArrowDown:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],ArrowUp:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],Home:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],End:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/key"},value:[{$ref:"event#/key"},{$ref:"event#/ctrlKey"}]}],Enter:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/activateSelected"},value:[]}]}}],description:"The grid pattern: arrows move one tile, Home and End to the ends of the row, Ctrl+Home and Ctrl+End to the ends of the grid, and Enter opens the selected file (in pick mode, uses it). The flow computes where the move lands; the tile that receives it takes focus, so the roving tabindex follows the selection."},children:[{$prototype:"Array",items:{$ref:"#/state/tiles"},key:{$ref:"$map/item/key"},map:{tagName:"div",attributes:{part:"tile",role:"option","aria-selected":"${$map.item.selected}",tabindex:"${$map.item.tabindex}","data-file":"${$map.item.file}",title:"${$map.item.name}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/select"},value:[{$ref:"$map/item/file"}]}]},onfocus:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/focusTile"},value:[{$ref:"$map/item/file"}]}],description:"Selection follows focus, the listbox pattern: a Tab onto the grid lands on the roving stop and selects it, so the first Enter opens (in pick mode, uses) the tile the focus ring is on rather than nothing."},ondblclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/activate"},value:[{$ref:"$map/item/file"}]}]},oncontextmenu:{$prototype:"Function",body:[{$switch:{$ref:"#/state/mode"},cases:{manage:[{preventDefault:!0},{operator:"call",target:{$ref:"#/state/contextMenu"},value:[{$ref:"$map/item/file"},{$ref:"event#/clientX"},{$ref:"event#/clientY"}]}]}}],description:"Manage mode only: the detail pane's actions at the pointer. Pick mode's dialog is modal, and a menu in the popover layer outside it would be inert, so its right-click is left to the platform."},children:[{tagName:"div",attributes:{part:"thumb"},children:[{tagName:"div",attributes:{part:"thumb-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"$map/item/thumbState"},cases:{image:{tagName:"img",attributes:{part:"thumb-img",src:"${$map.item.thumbSrc}",alt:"",draggable:"false"},onload:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/measure"},value:[{$ref:"$map/item/file"},{$ref:"event#/target/naturalWidth"},{$ref:"event#/target/naturalHeight"}]}]}},pending:{tagName:"span",attributes:{part:"thumb-pending","aria-hidden":"true"}},glyph:{tagName:"jx-icon",attributes:{part:"thumb-glyph","aria-hidden":"true"},$props:{name:{$ref:"$map/item/glyph"}}}},$description:"The thumbnail is asked for when the tile scrolls into view, not when the grid is built: `pending` until the flow's observer reports the tile, then the picture. A file the browser draws no picture of shows its kind's glyph."}]},{tagName:"span",attributes:{part:"tile-name"},textContent:"${$map.item.name}"},{tagName:"span",attributes:{part:"tile-caption"},textContent:"${$map.item.caption}"}]}}]}}}]}]},{tagName:"aside",attributes:{part:"detail","aria-label":"Details"},children:[{tagName:"div",attributes:{part:"detail-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/detailState"},cases:{none:{tagName:"p",attributes:{part:"detail-hint"},textContent:"${state.detailHint}"},shown:{tagName:"div",attributes:{part:"detail-body",role:"none"},style:{display:"contents"},children:[{tagName:"div",attributes:{part:"detail-preview"},children:[{tagName:"div",attributes:{part:"preview-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/previewKind"},cases:{image:{tagName:"img",attributes:{part:"preview-img",src:"${state.previewSrc}",alt:""},onload:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/measure"},value:[{$ref:"#/state/selectedFile"},{$ref:"event#/target/naturalWidth"},{$ref:"event#/target/naturalHeight"}]}]}},video:{tagName:"video",attributes:{part:"preview-video",src:"${state.previewSrc}",controls:!0}},audio:{tagName:"audio",attributes:{part:"preview-audio",src:"${state.previewSrc}",controls:!0}},font:{tagName:"div",attributes:{part:"preview-specimen",style:"${state.previewSpecimenFamily}"},children:[{tagName:"style",textContent:"${state.previewFontFace}"},{tagName:"p",attributes:{part:"specimen-line","data-size":"32"},textContent:"Aa"},{tagName:"p",attributes:{part:"specimen-line","data-size":"14"},textContent:"${state.previewSpecimen}"}]},glyph:{tagName:"jx-icon",attributes:{part:"preview-glyph","aria-hidden":"true"},$props:{name:{$ref:"#/state/previewGlyph"}}}}}]},{tagName:"h3",attributes:{part:"detail-name"},textContent:"${state.detailName}"},{tagName:"p",attributes:{part:"facts"},textContent:"${state.detailFacts}"},{tagName:"div",attributes:{part:"url-group"},children:[{tagName:"h4",attributes:{part:"group-title"},textContent:"Site URL"},{tagName:"div",attributes:{part:"url"},children:[{tagName:"code",attributes:{part:"url-value"},textContent:"${state.detailRef}"},{tagName:"jx-action-button",attributes:{part:"copy"},$props:{size:"sm",quiet:!0,hint:"Copy the site URL"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/copyRef"},value:[]}]},children:[{tagName:"span",textContent:"Copy"}]}]}]},{tagName:"div",attributes:{part:"usage-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/usageState"},cases:{shown:{tagName:"div",attributes:{part:"usage"},children:[{tagName:"h4",attributes:{part:"group-title"},textContent:"Used on"},{tagName:"p",attributes:{part:"usage-headline"},textContent:"${state.usageHeadline}"},{tagName:"div",attributes:{part:"usage-list-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/hasUsageFiles"},cases:{true:{tagName:"ul",attributes:{part:"usage-list"},children:[{$prototype:"Array",items:{$ref:"#/state/usageFiles"},key:{$ref:"$map/item/path"},map:{tagName:"li",attributes:{part:"usage-row","data-usage":"${$map.item.path}"},children:[{tagName:"button",attributes:{part:"usage-link",type:"button",title:"Open ${$map.item.path}"},textContent:"${$map.item.path}",onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openDocument"},value:[{$ref:"$map/item/path"}]}]}},{tagName:"span",attributes:{part:"usage-count"},textContent:"${$map.item.count}"}]}}]}}}]}},$description:'Hidden on a host with no reference index, which is a different fact from "nothing uses it": a confident zero is the one answer this pane must never invent.'},{tagName:"div",attributes:{part:"actions-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/mode"},cases:{manage:{tagName:"div",attributes:{part:"actions"},children:[{tagName:"label",attributes:{part:"replace",title:"Replace ${state.detailName} everywhere it is used"},children:[{tagName:"input",attributes:{part:"replace-input",type:"file",accept:"${state.replaceAccept}"},onchange:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/replace"},value:[{$ref:"event#/target"}]}],description:"Replace writes the chosen file over this one's path, so every reference keeps resolving and now shows the new bytes (studio.md §9.3). The element rather than the list, so the input can be cleared."}},{tagName:"span",textContent:"Replace"}]},{tagName:"jx-button",attributes:{part:"open-viewer"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/openViewer"},value:[]}]},children:[{tagName:"span",textContent:"Open in viewer"}]},{tagName:"div",attributes:{part:"edit-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/editable"},cases:{yes:{tagName:"jx-button",attributes:{part:"edit-image"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/editImage"},value:[]}],description:"Withheld, not disabled, for a file the editor cannot write: a refused format is not offered rather than offered and then refused (studio.md §9.5)."},children:[{tagName:"span",textContent:"Edit image"}]},no:{tagName:"span",attributes:{hidden:!0}}}},{tagName:"jx-button",attributes:{part:"rename"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/rename"},value:[]}]},children:[{tagName:"span",textContent:"Rename"}]},{tagName:"div",attributes:{part:"duplicate-slot",role:"none"},style:{display:"contents"},$switch:{$ref:"#/state/duplicable"},cases:{yes:{tagName:"jx-button",attributes:{part:"duplicate"},$props:{size:"sm",variant:"secondary"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/duplicate"},value:[]}],description:"Withheld, not disabled, on a backend that cannot read a file's raw bytes: a copy read as text would be a broken file (studio.md §9.3)."},children:[{tagName:"span",textContent:"Duplicate"}]},no:{tagName:"span",attributes:{hidden:!0}}}},{tagName:"jx-button",attributes:{part:"delete"},$props:{size:"sm",variant:"negative"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/remove"},value:[]}]},children:[{tagName:"span",textContent:"Delete"}]}]}},$description:"Manage mode's actions. Pick mode has none here: its answer is the dialog's own footer, Cancel and Use <file>."}]}}}]}]};E("media-library",de);function Oe(){return{countingLabel:"",detailFacts:"",detailHint:"",detailName:"",detailRef:"",detailState:"none",dropActive:"false",emptyDetail:"",emptyTitle:"",filters:[],gridState:"loading",mode:"manage",previewFontFace:"",previewGlyph:"",previewKind:"glyph",previewSpecimen:"",previewSpecimenFamily:"",previewSrc:"",query:"",region:"",replaceAccept:"",editable:"no",duplicable:"no",selectedFile:"",sort:"",sortOptions:[],tiles:[],title:"",titleId:"",uploadAccept:"",uploadHint:"",usageFiles:[],usageHeadline:"",usageState:"hidden"}}function pe(e,t){Object.assign(e,t),e.hasUsageFiles=t.usageFiles.length>0}function Ke(e){let t=n(e)?void 0:e.attributes?.part;return n(t)?t:""}function ze(e){let t=e?.$map,i=_(t)&&"item"in t?t.item:void 0;return _(i)&&"file"in i&&n(i.file)?i.file:null}function V(e,t,i,a){if(a.clear)e.replaceChildren();let{tileHost:r,gridHost:o,inputHost:l,...c}=i,d=g({...Oe(),...c,hasUsageFiles:!1});pe(d,t);let f=null,b=!1,M=R("media-library",d,e,{onNodeCreated:(u,s,F,Ee)=>{if(b||!(u instanceof HTMLElement))return;let C=Ke(F);if(C==="tile"){let ie=ze(Ee);if(ie!==null)r(u,ie)}else if(C==="grid")o(u);else if(u instanceof HTMLInputElement&&C==="upload-input")l(u,"upload");else if(u instanceof HTMLInputElement&&C==="replace-input")l(u,"replace")}}).then((u)=>{if(b)u.dispose();else f=u;return u.root});return{attached:()=>{if(b)return!1;let u=f?.root;return u===void 0?!0:u instanceof HTMLElement&&e.contains(u)},dispose(){b=!0,f?.dispose(),f=null},ready:M,update:(u)=>pe(d,u)}}var ue={$schema:"https://jxsuite.com/schema/v1",$id:"StudioMediaPickDialog",$description:"The full-size media picker (`specs/studio.md` §9.3): a `jx-dialog` whose body is the Media workspace's own library surface in pick mode, so the picker and the workspace are one surface at two sizes. The dialog owns modality, Escape, the backdrop and focus restoration, and its footer is the answer: Cancel, or Use <file>, disabled until a file is chosen. The body is an ISLAND: this document draws the slot and nothing in it, and `surfaces/media-pick-dialog.ts` mounts `media-library.json` there through `onNodeCreated`.",tagName:"jx-dialog",$props:{headline:{$ref:"#/state/headline"},confirmLabel:{$ref:"#/state/confirmLabel"},confirmDisabled:{$ref:"#/state/blocked"},cancelLabel:"Cancel",dismissible:!0,size:"xl"},attributes:{part:"media-pick"},onconfirm:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/confirm"},value:[]}]},oncancel:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},onclose:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/closed"},value:[]}]},children:[{tagName:"div",attributes:{part:"library-slot"},style:{$description:"The library's box in pick mode is its own (`media-library.json`, `data-mode=\"pick\"`); the slot only gives it the dialog body's width.",minWidth:"0"}}]};E("media-pick-dialog",ue);var B="media-picker";function Ue(e){let t=n(e)?void 0:e.attributes?.part;return n(t)?t:""}function fe(e){let t=document.createElement("div");t.style.pointerEvents="auto",t.setAttribute(Ve,vt("dialog",B)),e.layer.append(t);let i=!1,a=()=>{if(i)return;i=!0,e.closed()},r=()=>i,o=g({...e.view,closed:a,confirm:e.confirm}),l=null,c=R("media-pick-dialog",o,t,{onNodeCreated:(d,f,b)=>{if(!r()&&d instanceof HTMLElement&&Ue(b)==="library-slot")e.body(d)}}).then(async(d)=>{l=d;let f=d.root;if(r())return d.dispose(),f;if(await sn(f),!r())Jt(f);return f});return{close(){let d=l?.root;if(d instanceof HTMLElement)Ut(d);l?.dispose(),l=null,t.remove(),a()},host:t,ready:c,update(d){Object.assign(o,d)}}}var uF="media-home",ve={audio:"play",document:"file-text",font:"text-aa",image:"image",video:"play"},We={audio:"Audio",document:"Document",font:"Font",image:"Image",video:"Video"},y={filter:"all",query:"",sort:"newest",selected:null},D=null,S=null,O=0,K=0,P=!1,Y=0;function J(){S=null,P=!1,O=0,K=0,Y+=1}function qe(){return[...L].some((e)=>!e.disposed&&e.choice.filter==="unused")}async function Be(e){if(P||S!==null||!ph())return;let t=Y;P=!0,O=0,K=e.length;let i=new Set;for(let a of e){let r=await Xu(a.file);if(t!==Y)return;if(!qe()){J();return}if(r.status==="ready"&&r.result.files.length===0)i.add(a.file);O+=1,x()}S=i,P=!1,x()}var L=new Set,k=new Map,Q=new Set,j=null;function we(){if(j!==null)return;let e=()=>{J(),x()},t=ET(e),i=iI(e);j=()=>{t(),i()}}function Ge(){if(L.size===0&&j)j(),j=null}function v(e){if(!e.disposed){if(e.handle?.update(ee(e)),e.onSelect?.(),Ye(e),e.focusOwed)queueMicrotask(()=>He(e));xe(e)}}function Ye(e){let t=e.reveal,i=t===null?void 0:e.tiles.get(t);if(i?.isConnected){if(e.reveal=null,i.scrollIntoView({block:"nearest"}),e.revealFocus)e.revealFocus=!1,i.focus()}}function xe(e){if(e.sweepTimer!==null||e.disposed)return;e.sweepTimer=setTimeout(()=>{e.sweepTimer=null,e.observer.releaseDetached();for(let[t,i]of e.tiles)if(!i.isConnected)e.tiles.delete(t);for(let t of[e.inputs.upload,e.inputs.replace])for(let i of t)if(!i.isConnected)t.delete(i)},0)}function $e(e){return[...e].find((t)=>t.isConnected)??null}function x(){for(let e of L)v(e)}function Z(e){if(e.disposed=!0,e.sweepTimer!==null)clearTimeout(e.sweepTimer),e.sweepTimer=null;e.inputs.upload.clear(),e.inputs.replace.clear(),e.observer.destroy(),e.handle?.dispose(),e.handle=null,e.tiles.clear(),L.delete(e),Ge()}function ke(e){let t=Gu(),i=t===null?null:e.images?t.filter((r)=>r.isImage):t;return{files:(i??[]).map((r)=>{let o=Yc(r.file);return{bytes:o?.bytes??null,file:r.file,kind:r.kind,modified:o?.modified??null,name:r.name}}),listed:i}}function Je(e){return H.filter((t)=>(t.key!=="unused"||ph())&&(!e.images||t.key==="image"||t.key==="unused"))}function wb(e){let{filter:t,query:i,selected:a}=e.choice;if(a===null)return null;let r=Gu()?.find((l)=>l.file===a)??null;if(r===null||e.images&&!r.isImage)return null;let o={bytes:null,file:r.file,kind:r.kind,modified:null,name:r.name};return W(o,t,S)&&A(o,i)?r:null}function Qe(e,t){if(t===0)return{emptyDetail:`Upload files or drop them anywhere here. They are saved under ${e.uploadDir}/, and anything already under public/ or a collection's images/ folder is listed here too.`,emptyTitle:e.images?"No images yet":"No media yet"};let{filter:i,query:a}=e.choice;if(a.trim()!=="")return{emptyDetail:`Nothing in ${T(i)} matches it.`,emptyTitle:`No matches for “${a.trim()}”`};if(i==="unused")return{emptyDetail:"Every file is referenced by at least one document.",emptyTitle:"No unused media"};return{emptyDetail:`${t} ${t===1?"file":"files"} in the project, none of them ${T(i).toLowerCase()}.`,emptyTitle:`No ${T(i).toLowerCase()}`}}function ee(e){let{choice:t}=e,{files:i,listed:a}=ke(e),r=oe(i,S),o=Je(e);if(!o.some((s)=>s.key===t.filter))t.filter=o[0]?.key??"all";let l=q(i,{filter:t.filter,query:t.query,sort:t.sort,unused:S}),c=Gu();if(t.filter==="unused"&&c!==null)Be(c);let d="listed";if(a===null)d="loading";else if(t.filter==="unused"&&S===null)d="counting";else if(i.length===0||l.length===0)d=i.length===0?"empty":"nomatch";let f=wb(e),b=l.some((s)=>s.file===t.selected)?t.selected:l[0]?.file??null,M=l.map((s)=>{let F=s.kind==="image";return{caption:Px(Yc(s.file))||We[s.kind],file:s.file,glyph:ve[s.kind],key:s.file,name:s.name,selected:s.file===t.selected?"true":"false",tabindex:s.file===b?"0":"-1",thumbSrc:F&&e.visible.has(s.file)?nr(s.file):"",thumbState:F?e.visible.has(s.file)?"image":"pending":"glyph"}}),u=e.images&&t.filter==="image"?"Images":T(t.filter);return{countingLabel:K>0?`Counting references… ${O} of ${K}`:"Counting references…",dropActive:e.dropActive?"true":"false",filters:o.map((s)=>{let F=r[s.key];return{count:F===null?"":String(F),key:s.key,label:e.images&&s.key==="image"?"All images":s.label,pressed:s.key===t.filter?"true":"false"}}),gridState:d,mode:e.mode,query:t.query,region:e.region,sort:t.sort,sortOptions:U.map((s)=>({label:s.label,value:s.key})),tiles:M,title:u,titleId:`media-library-title-${e.region.replaceAll(/[^\w-]/g,"-")}`,uploadAccept:e.images?"image/*":Jc(),uploadHint:`Upload into ${e.uploadDir}/`,...Qe(e,i.length),...Xe(e,f)}}function Xe(e,t){if(t===null)return{detailFacts:"",detailHint:e.mode==="pick"?"Choose a file to use it.":"Select a file to see its details.",detailName:"",detailRef:"",detailState:"none",previewFontFace:"",previewGlyph:"",previewKind:"glyph",previewSpecimen:"",previewSpecimenFamily:"",previewSrc:"",replaceAccept:"",editable:"no",duplicable:"no",selectedFile:"",usageFiles:[],usageHeadline:"",usageState:"hidden"};let i=Yc(t.file),a=ex(t.file);if(!Vd(t.file))hh(t.file).then(x);if(a===null||a.status==="pending")Xu(t.file).then(x);let r=_L(t.file),o=r==="image"||r==="video"||r==="audio"||r==="font"?r:"glyph",l=o==="font"?CL(t.file):{fontFace:"",specimen:"",specimenFamily:""};return{detailFacts:SL(t.file,i),detailHint:"",detailName:t.name,detailRef:t.ref,detailState:"shown",previewFontFace:l.fontFace,previewGlyph:ve[t.kind],previewKind:o,previewSpecimen:l.specimen,previewSpecimenFamily:l.specimenFamily,previewSrc:o==="glyph"?"":nr(t.file),replaceAccept:NO(t.file),editable:XS(t.file)?"yes":"no",duplicable:QS()?"yes":"no",selectedFile:t.file,...kL(a)}}var me=null,ge=null;function Se(){return me??=(ce("zrqtgt41"),import("./files-zrqtgt41.js")),me}function Fe(){return ge??=(ce("1sghzgcr"),import("./file-ops-1sghzgcr.js")),ge}function te(e){try{e.showPicker()}catch{e.focus()}}function N(e,t){e.choice.selected=t,v(e)}async function he(e,t){let i=await Ys([...t],{dir:e.uploadDir,only:e.images?"image":"media"}),[a]=i;if(!a)return;if(e.choice.filter!=="all"&&e.choice.filter!==a.kind)e.choice.filter=e.images?"image":"all";e.choice.query="",e.reveal=a.path,N(e,a.path)}async function eN(e){let t=e.split("/").pop()??e,{confirmFileDelete:i}=await Fe();if(!await i({name:t,path:e}))return!1;let{markLocalMutation:a}=await (ce("45rhg3me"),import("./fs-events-45rhg3me.js"));try{a(e),await p().deleteFile(e)}catch(l){return w.error(`Could not delete ${t}.`,{detail:X(l),path:e,source:"Media"}),!1}if(Kd([e]),us(),m.tabs.has(e))eu(e);for(let l of L)if(l.choice.selected===e)l.choice.selected=null;if(y.selected===e)y.selected=null;let r=ov(e),o=await Ze(r,a);return await Nx(o?ov(r):r),w.success(`Deleted ${t}`),!0}async function Ze(e,t){if(!RO(e))return!1;let i=p();try{if((await i.listDirectory(e)).length>0)return!1;return t(e),await i.deleteFile(e),!0}catch{return!1}}async function tN(e){if(eC(e,"renamed"))return null;let t=Mx(e),i=ov(e),{commitRename:a,listRenameSiblings:r,notifyMoveOutcome:o,renameStatus:l}=await Se(),c=await r(e,"Media");if(c===null)return null;let{renamePromptMessage:d}=await Fe(),f=await d(e),b=await Fn("Rename",{confirmLabel:"Rename",select:"stem",validate:(s)=>AO(e,s,c),value:t,...f!==void 0&&{message:f}});if(!b||b===t)return null;let M=Y$(i,b),u=Yc(e);try{let s=await a(e,M);if(y.selected===e)Le(M);if(await Nx(i),u?.width!=null&&u.height!=null)fl(M,u.width,u.height);return o(l(b,s),s,M),M}catch(s){return w.error(`Could not rename ${t}.`,{detail:X(s),path:e,source:"Media"}),null}}async function nN(e){if(eC(e,"duplicated"))return null;let t=await Ax(e);if(t===null)return null;return Le(t.path),x(),t.path}function Le(e){if(y.selected=e,!A({name:Mx(e)},y.query))y.query="";for(let{mount:t}of k.values())t.reveal=e,t.revealFocus=!0}function Ne(e){return{activate:(t)=>{N(e,t),ye(e,t)},activateSelected:()=>{let{selected:t}=e.choice;if(t!==null)ye(e,t)},contextMenu:(t,i,a)=>et(e,t,i,a),copyRef:()=>{let t=wb(e);if(t)Te(t)},dragOut:()=>{if(e.dropActive)e.dropActive=!1,v(e)},dragOver:()=>{if(!e.dropActive)e.dropActive=!0,v(e)},drop:(t)=>{if(e.dropActive=!1,v(e),t?.length)he(e,t)},focusTile:(t)=>{if(e.choice.selected!==t)N(e,t)},gridHost:(t)=>{e.grid=t},inputHost:(t,i)=>{e.inputs[i].add(t),xe(e);let a=D;if(e.mode==="manage"&&a?.role===i&&(i==="upload"||a.file===e.choice.selected))D=null,te(t)},key:(t,i)=>tt(e,t,i),measure:(t,i,a)=>{if(fl(t,i,a))x();else if(!Vd(t))hh(t).then(x)},openDocument:(t)=>{Se().then(({openFileInTab:i})=>i(t))},openViewer:()=>{let{selected:t}=e.choice;if(t!==null)Zu(t)},editImage:()=>{let{selected:t}=e.choice;if(t!==null)tC(t)},remove:()=>{let{selected:t}=e.choice;if(t!==null)eN(t)},rename:()=>{let{selected:t}=e.choice;if(t!==null)tN(t)},duplicate:()=>{let{selected:t}=e.choice;if(t!==null)nN(t)},replace:(t)=>{let[i]=t.files??[];t.value="";let{selected:a}=e.choice;if(i&&a!==null&&oA(a))Ox(a,i).then((r)=>{if(r)Qw(a);x()})},reset:()=>{e.choice.filter=e.images?"image":"all",e.choice.query="",v(e)},select:(t)=>N(e,t),setFilter:(t)=>{if(re(t))e.choice.filter=t,v(e)},setQuery:(t)=>{e.choice.query=t,v(e)},setSort:(t)=>{if(ne(t))e.choice.sort=t,v(e)},tileHost:(t,i)=>{e.tiles.set(i,t),je.set(t,i),e.observer.observe(t)},upload:(t)=>{let i=[...t.files??[]];if(t.value="",i.length>0)he(e,i)}}}function Te(e){if("clipboard"in navigator)navigator.clipboard.writeText(e.ref)}var I=null;function et(e,t,i,a){N(e,t);let r=wb(e);if(!r)return;I?.close();let o=(l,c,d,f={})=>({destructive:!1,disabled:!1,dividerAbove:!1,id:l,run:d,title:c,...f});I=zt({label:`${r.name} actions`,onClosed:(l)=>{if(I===l)I=null},origin:{x:i,y:a},region:"media-tile",rows:[o("open","Open in Viewer",()=>Zu(t)),...XS(t)?[o("edit","Edit Image",()=>tC(t))]:[],o("copy-url","Copy Site URL",()=>Te(r)),o("rename","Rename…",()=>{tN(t)},{dividerAbove:!0}),...QS()?[o("duplicate","Duplicate",()=>{nN(t)})]:[],o("replace","Replace…",()=>BP(t)),o("delete","Delete",()=>{eN(t)},{destructive:!0,dividerAbove:!0})]})}function ye(e,t){if(e.mode==="pick"){let i=wb(e);if(i)e.onPick?.(i);return}Zu(t)}function tt(e,t,i){let{files:a}=ke(e),r=q(a,{filter:e.choice.filter,query:e.choice.query,sort:e.choice.sort,unused:S}),o=r.findIndex((f)=>f.file===e.choice.selected),l=e.grid?le(Me(e.grid).width):1,c=o===-1?r.length>0?0:null:se(o,t,l,r.length,i),d=c===null?void 0:r[c];if(!d)return;N(e,d.file),e.tiles.get(d.file)?.focus()}var je=new WeakMap;function De(e,t,i,a,r,o){let l={choice:t,disposed:!1,dropActive:!1,grid:null,handle:null,images:r,inputs:{replace:new Set,upload:new Set},mode:e,observer:_p((c)=>{let d=je.get(c);if(d!==void 0&&!l.visible.has(d))l.visible.add(d),it(l)}),onPick:null,onSelect:null,paneId:a,reveal:null,revealFocus:!1,focusOwed:!1,region:i,sweepTimer:null,tiles:new Map,uploadDir:o,visible:new Set};return l}var G=new Set;function it(e){if(G.has(e))return;G.add(e),queueMicrotask(()=>{G.delete(e),v(e)})}function cS(e,t){let i=k.get(e);return i!==void 0&&i.tabId===t.id&&i.wrap.isConnected&&i.mount.handle!==null&&i.mount.handle.attached()}function vw(e){let t=k.get(e);if(!t)return;Z(t.mount),k.delete(e)}function JE(e,t){let{paneId:i,wrap:a}=e;if(cS(i,t))return;vw(i);let r=De("manage",y,Ln(i,"media-library"),i,!1,Ta);if(L.add(r),we(),r.handle=V(a,ee(r),Ne(r),{clear:!0}),k.set(i,{mount:r,tabId:t.id,wrap:a}),Q.delete(i))Ce(r)}async function Ce(e){await e.handle?.ready,He(e,!0)}function He(e,t=e.focusOwed){if(!t||e.disposed)return;let{selected:i}=e.choice,a=(i===null?void 0:e.tiles.get(i))??[...e.tiles.values()].find((r)=>r.getAttribute("tabindex")==="0");if(a?.isConnected){e.focusOwed=!1,a.focus();return}e.focusOwed=!0}function YE(e){let t=k.get(e);if(t?.wrap.isConnected&&t.mount.handle?.attached()===!0){Ce(t.mount);return}Q.add(e)}function HP(e){if(e.filter!==void 0)y.filter=e.filter;if(e.query!==void 0)y.query=e.query;if(e.select!==void 0){if(y.selected=e.select,y.filter!=="all")y.filter="all";y.query=""}x()}function hF(){let e=[...k.values()].map((t)=>$e(t.mount.inputs.upload)).find((t)=>t!==null)??null;if(e){te(e);return}D={file:null,role:"upload"}}function BP(e){HP({select:e});let t=null;for(let i of k.values())if(i.mount.choice.selected===e)t??=$e(i.mount.inputs.replace);if(t){te(t);return}D={file:e,role:"replace"}}var z=null;function be(e){let t=wb(e);return{blocked:t===null,confirmLabel:t?`Use ${t.name}`:e.images?"Use image":"Use file",headline:e.images?"Choose an image":"Choose media"}}function dS(){let e=z;if(z=null,e)Z(e.mount),e.dialog.close()}function pF(e){dS();let t={filter:e.images?"image":"all",query:"",selected:null,sort:"newest"},i=De("pick",t,`${vt("dialog",B)}/library`,null,e.images,J$(h.value?.documentPath??null)),a=(o)=>{dS(),e.onPick(o.ref)};i.onPick=a,L.add(i),we();let r=fe({body:(o)=>{i.handle=V(o,ee(i),Ne(i),{clear:!1})},closed:()=>{if(z?.mount===i)dS();else Z(i)},confirm:()=>{let o=wb(i);if(o)a(o)},layer:dt("dialog"),view:be(i)});i.onSelect=()=>r.update(be(i)),z={dialog:r,mount:i}}function ZE(){dS();for(let e of k.keys())vw(e);y.filter="all",y.query="",y.selected=null,y.sort="newest",D=null,Q.clear(),J()}
2
+ export{lS,uF,wb,eN,tN,nN,cS,vw,JE,YE,HP,hF,BP,dS,pF,ZE};
3
+
4
+ //# debugId=676C28E656FDAB3164756E2164756E21
5
+ //# sourceMappingURL=studio-2x972v58.js.map
@@ -0,0 +1,5 @@
1
+ import{St,ti,Se,Fe,xh,m,Si,Ft}from"./studio-knsjyx7n.js";import{p}from"./studio-4fnb5648.js";import{jt,fn}from"./studio-q9hx2qp0.js";import{Zs,dt}from"./studio-tpxcryf2.js";import{Ls,Ud}from"./studio-bnc50f9h.js";import{Fd,WT,BS,UT,qT}from"./studio-frc16j8v.js";import{Nb,ss,Yl,Ww,Vw,Lp,Qo,$p}from"./studio-hfqpfmpk.js";import{C}from"./studio-4f7thq0p.js";import{E,R}from"./studio-9dq7rwc7.js";import{g}from"./studio-3qr08sxq.js";import{n,Y,Q,wf}from"./studio-k3we3kqb.js";var T={$schema:"https://jxsuite.com/schema/v1",$id:"StudioGridOpen",$description:"Every grid-able source a project has, grouped by where it comes from: the project's own pages and content collections first, then each connection's tables. It is the ISLAND of a confirm dialog rather than a dialog of its own — `ui/layers.ts`'s dialog owns the headline, the cancel button, modality and focus, and this document is only the list — because a second answer to \"what is a dialog\" is a defect (studio-ui-guidelines.md §12.5). Group headings are why it is not the kit menu: a menu row can carry a divider above it and cannot carry a name for the run it opens.",tagName:"div",attributes:{part:"sources"},style:{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",minWidth:"280px",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--fg)",'& [part="group-title"]':{margin:"0",fontSize:"var(--jx-text-xs)",fontWeight:"600",textTransform:"uppercase",letterSpacing:"0.04em",color:"var(--fg-dim)"},'& [part="rows"]':{display:"flex",flexDirection:"column",gap:"1px",marginTop:"var(--jx-space-1)"},'& [part="source"]':{textAlign:"left",background:"none",border:"none",color:"var(--fg)",font:"inherit",padding:"var(--jx-space-2) var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)",cursor:"pointer"},'& [part="source"]:hover':{background:"var(--bg-hover)"},'& [part="source"]:focus-visible':{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'& [part="group-empty"]':{margin:"0",padding:"var(--jx-space-2)",color:"var(--fg-dim)",fontSize:"var(--jx-text-sm)"}},children:[{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/key"},map:{$description:"One origin of grid-able sources. A connection with no tables says why it has none instead of drawing an empty box — an author who has not pushed a schema yet is exactly the reader who needs the sentence.",tagName:"section",attributes:{part:"group","data-group":"${$map.item.key}"},children:[{tagName:"h3",attributes:{part:"group-title"},textContent:"${$map.item.title}"},{tagName:"div",attributes:{part:"rows"},$switch:{$ref:"$map/item/state"},cases:{listed:{tagName:"div",attributes:{part:"rows-list",role:"none"},style:{display:"contents"},children:[{$prototype:"Array",items:{$ref:"$map/item/rows"},key:{$ref:"$map/item/id"},map:{tagName:"button",attributes:{part:"source",type:"button","data-source":"${$map.item.id}"},onclick:{$prototype:"Function",body:[{operator:"call",target:{$ref:"#/state/open"},value:[{$ref:"$map/item/id"}]}]},textContent:"${$map.item.label}"}}]},empty:{tagName:"p",attributes:{part:"group-empty"},textContent:"${$map.item.emptyMessage}"}}}]}}]};E("grid-open",T);function j(e,r,t){let o=g({groups:r,open:t}),i=null,s=!1,c=R("grid-open",o,e).then((y)=>{let a=y.root;if(s)return y.dispose(),a;return i=y,a});return{dispose(){s=!0,i?.dispose(),i=null},ready:c}}function x(){try{return p()}catch{return null}}function FS(){return Q(x()?.dataRows)}async function I(){let e=x();if(!Q(e?.dataConnections))return null;return e.dataConnections()}async function jN(e){let r=x();if(!Q(r?.dataConnectionTest))return{error:"Connection tests are not supported by this backend",ok:!1};try{return await r.dataConnectionTest(e)}catch(t){return{error:t instanceof Error?t.message:String(t),ok:!1}}}async function jT(e){let r=x();if(!Q(r?.dataPush))return{applied:!1,errors:["Schema push is not supported by this backend"],plan:[]};try{return await r.dataPush(e)}catch(t){return{applied:!1,errors:[t instanceof Error?t.message:String(t)],plan:[]}}}function k(e){let t=x()?.[e];if(t===void 0)throw Error(`The ${String(e)} surface is not supported by this backend`);return t}function v(e){return k("dataRows")(e)}function K(e){return k("dataInsertRow")(e)}function M(e){return k("dataUpdateRow")(e)}function O(e){return k("dataDeleteRow")(e)}function HN(e,r,t){let o=(c)=>c.replaceAll(/([a-z0-9])([A-Z])/g,"$1_$2").replaceAll(/[^A-Za-z0-9]+/g,"_").replaceAll(/^_+|_+$/g,"").toUpperCase(),s=[r??e,t.replace(/Env$/,"")].flatMap((c)=>{let y=o(c);return y?[y]:[]}).join("_")||"SECRET";return/^\d/.test(s)?`JX_${s}`:s}var H=["id","sku","slug","Slug"];function L(e){let r=new Set;return e.map((t,o)=>{let i=t.trim()===""?`column${o+1}`:t;if(r.has(i))i=`${i}__${o+1}`;return r.add(i),i})}function J(e,r){for(let t of H){let o=e.indexOf(t);if(o===-1)continue;let i=r.rows.map((s)=>s[o]??"");if(i.every((s)=>s!=="")&&new Set(i).size===i.length)return t}return null}function A(e,r){let t=Fd(e),o=L(t.headers),i=J(o,t),s=i?o.indexOf(i):-1,c=t.rows.map((d,u)=>s===-1?String(u):d[s]),y=new Map(c.map((d,u)=>[d,u])),a=xh(r,C?.projectConfig),l=a?.schema.properties??{},b=t.rows.slice(0,50).map((d)=>{let u={};for(let[S,G]of o.entries())u[G]=d[S]??"";return u}),f=new Map(Vw(b).map((d)=>[d.field,d])),w=new Map(Ww(a?.schema,{idField:i??void 0}).map((d)=>[d.field,d]));return{columns:o.map((d,u)=>{let G=(d in l?w.get(d):void 0)??f.get(d)??{editable:!0,field:d,kind:"string",title:t.headers[u]||d};return{...G,pk:d===i,title:t.headers[u]?.trim()||G.title}}),doc:t,fields:o,keys:c,keyToIndex:y,loadText:e}}function z(e,r){let t={},o=e.doc.rows[r]??[];for(let[i,s]of e.fields.entries()){let c=e.columns[i],y=o[i]??"";t[s]=c.kind==="string"||c.kind==="text"||c.kind==="readonly"?y:Lp(y,c)}return t}function F(e,r){let t=e.doc.rows.map((s)=>[...s]),o=(s)=>e.fields.indexOf(s);for(let s of r.cells){let c=e.keyToIndex.get(s.rowKey),y=o(s.field);if(c===void 0||y===-1)continue;t[c][y]=Qo(s.value)}for(let s of r.inserts){let c=e.fields.map((y)=>Qo(s.cells[y]??null));t.push(c)}let i=r.deletes.map((s)=>e.keyToIndex.get(s.rowKey)).filter((s)=>s!==void 0).toSorted((s,c)=>c-s);for(let s of i)t.splice(s,1);return{...e.doc,rows:t}}function _(e,r){return{cells:e.cells.map((t)=>({field:t.field,rowKey:t.rowKey,...r})),deletes:e.deletes.map((t)=>({rowKey:t.rowKey,...r})),inserts:e.inserts.map((t)=>({error:r.error,ok:r.ok,tempKey:t.tempKey}))}}function jS(e){let r=null,t=(o=!1)=>{if(!o&&r)return r;return r=p().readFile(e).then((i)=>A(i,e)),r};return{backingPaths:()=>new Map([[e,"*"]]),capabilities:{delete:!0,insert:!0,remotePaging:!1,remoteSort:!1},async columns(){return(await t()).columns},async commit(o){let i=await t(),s=p(),c=null;try{c=await s.readFile(e)}catch{c=null}if(c!==i.loadText&&!Ud(e))return _(o,{error:"File changed on disk — refresh to reload",ok:!1,stale:!0});let y=F(i,o),a=WT(y);return Ls(e),await s.writeFile(e,a),r=Promise.resolve(A(a,e)),_(o,{ok:!0})},id:e,label:e.split("/").pop()??e,async refresh(){await t(!0)},async rows(){let o=await t(),i=o.doc.rows.map((s,c)=>({cells:z(o,c),key:o.keys[c]}));return{rows:i,total:i.length}},async serializeForSource(o){let i=await t();return WT(F(i,o))}}}var U=50;function q(e){let r=e.toLowerCase();if(/(int|real|floa|doub|num|dec)/.test(r))return"number";if(r.includes("bool"))return"boolean";if(/(timestamp|datetime|date)/.test(r))return"date";return"string"}function Z(e){return!e.pk&&e.name!=="created_at"&&e.name!=="updated_at"}function W(e){if(e===void 0)return null;if(wf(e))return e;return JSON.stringify(e)}function N(e,r){let t=[],o="id",i=new Map,s=(a)=>{if(a.length>0)t=a,o=a.find((l)=>l.pk)?.name??"id"},c=(a)=>{let l={table:r};if(e)l.connection=e;if(l.limit=a?.limit??U,l.offset=a?.offset??0,a?.orderBy)l.dir=a.dir??"asc",l.orderBy=a.orderBy;return l},y=(a,l)=>{let b=a[o];if(n(b)||Y(b))return i.set(String(b),b),String(b);return`row-${l}`};return{capabilities:{delete:!0,insert:!0,remotePaging:!0,remoteSort:!0},async columns(){if(t.length===0){let a=await v(c({limit:1,offset:0}));s(a.columns)}return t.map((a)=>{let l=Z(a)?q(a.type):"readonly";return{editable:l!=="readonly",field:a.name,kind:l,pk:a.pk===!0,title:a.name,widthHint:a.pk?80:void 0}})},async commit(a){let l={cells:[],deletes:[],inserts:[]},b=new Map;for(let f of a.cells){let w=b.get(f.rowKey)??[];w.push({field:f.field,value:f.value}),b.set(f.rowKey,w)}for(let[f,w]of b){let h=i.get(f),d=(u,S)=>{for(let G of w)l.cells.push({error:S,field:G.field,ok:u,rowKey:f})};if(h===void 0){d(!1,"Row has no primary key — refresh the grid");continue}try{let u={};for(let G of w)u[G.field]=G.value;let S={pk:h,set:u,table:r};if(e)S.connection=e;await M(S),d(!0)}catch(u){d(!1,u instanceof Error?u.message:String(u))}}for(let f of a.inserts)try{let w={};for(let[G,P]of Object.entries(f.cells))if(P!==null)w[G]=P;let h={table:r,values:w};if(e)h.connection=e;let{row:d}=await K(h),u=d[o],S;if(n(u)||Y(u))S=String(u),i.set(S,u);l.inserts.push({newKey:S,ok:!0,tempKey:f.tempKey})}catch(w){l.inserts.push({error:w instanceof Error?w.message:String(w),ok:!1,tempKey:f.tempKey})}for(let f of a.deletes){let w=i.get(f.rowKey);if(w===void 0){l.deletes.push({error:"Row has no primary key — refresh the grid",ok:!1,rowKey:f.rowKey});continue}try{let h={pk:w,table:r};if(e)h.connection=e;await O(h),l.deletes.push({ok:!0,rowKey:f.rowKey})}catch(h){l.deletes.push({error:h instanceof Error?h.message:String(h),ok:!1,rowKey:f.rowKey})}}return l},id:ss({connection:e??"default",kind:"data",table:r}),label:r,async refresh(){t=[],i.clear()},async rows(a){let l=await v(c(a));return s(l.columns),{rows:l.rows.map((f,w)=>{let h=y(f,w),d={};for(let u of t)d[u.name]=W(f[u.name]);return{cells:d,key:h}}),total:l.total}}}}async function HT(e,r={}){let t=m.tabs.get(e);if(t)return Ft(e,{focus:r.focus!==!1}),t;try{await jt()}catch{}let o=jS(e),i=Si({capabilities:{modes:["grid","source"]},document:structuredClone(Nb),documentPath:e,id:e,sourceFormat:fn(e)?.name??null,...r.paneId!==void 0&&{paneId:r.paneId},...r.preview===!0&&{preview:!0},...r.focus===!1&&{focus:!1}});return $p(i,o).load(),i}function D(e){let r=Si({capabilities:{modes:["grid"]},document:structuredClone(Nb),documentPath:null,id:e.id});return $p(r,e).load(),r}function BN(e){let r=ss({kind:"collection",name:e}),t=m.tabs.get(r);if(t)return Ft(r),t;return D(UT(e))}function HS(){let e=ss({kind:"pages"}),r=m.tabs.get(e);if(r)return Ft(e),r;return D(qT())}function V(e,r){let t=ss({connection:e??"default",kind:"data",table:r}),o=m.tabs.get(t);if(o)return Ft(t),o;return D(N(e,r))}function X(e){let r=Yl(e);if(r?.kind==="pages")HS();else if(r?.kind==="collection")BN(r.name);else if(r?.kind==="data")V(r.connection,r.table)}function ee(e,r){return[{emptyMessage:"",key:"project",rows:[{id:ss({kind:"pages"}),label:"Pages"},...e.map(({name:t})=>({id:ss({kind:"collection",name:t}),label:`Collection: ${t}`}))],state:"listed",title:"Project"},...r.map((t)=>({emptyMessage:"No tables — push a schema first.",key:`data:${t.name}`,rows:t.tables.map((o)=>({id:ss({connection:t.name,kind:"data",table:o}),label:o})),state:t.tables.length===0?"empty":"listed",title:`Data · ${t.name}`}))]}async function BT(){let e=BS(),r=[];if(FS())r=(await I().catch(()=>null))?.connections??[];let t=null,o=Zs({cancelLabel:"Cancel",confirmLabel:"",headline:"Open Grid",island:(i)=>{t=j(i,ee(e,r),(s)=>{o.close(),X(s)})},layer:dt("dialog"),onCancel:()=>o.close(),onClosed:()=>{t?.dispose(),t=null},onConfirm:()=>{},region:"grid/open"});o.ready}function te(){return[{args:Se({name:Fe("The content collection's name, as project.json declares it.")}),category:"Project",id:"collection.editInGrid",level:"project",menus:["context/file","palette"],group:"5_data",requires:"a project that declares content collections",when:(e)=>e.project.open,run:(e,r)=>{let t=St("collection.editInGrid",r,"name"),o=BS().map((i)=>i.name);if(!o.includes(t))throw RangeError(`command "collection.editInGrid" argument "name": "${t}" is not a content `+"collection this project declares — it declares: "+`${o.length>0?o.join(", "):"none"}`);BN(t)},title:"Edit Collection in Grid"},{args:{additionalProperties:!1,properties:{connection:Fe('The connection name from project.json. Defaults to "default".'),table:Fe("The table to open.")},required:["table"],type:"object"},category:"Project",id:"data.openGrid",level:"project",menus:["palette"],group:"5_data",requires:"a platform that serves the data routes",when:(e)=>e.project.open,enablement:(e)=>e.capability.dataRows,run:(e,r)=>{let t=St("data.openGrid",r,"table");V(ti("data.openGrid",r,"connection"),t)},title:"Open Data Grid"}]}function zT(e){e.registerAll(te())}
2
+ export{FS,jN,jT,HN,jS,HT,BN,HS,BT,zT};
3
+
4
+ //# debugId=67AF438E9428C4A664756E2164756E21
5
+ //# sourceMappingURL=studio-2zz4qbv9.js.map