@jxsuite/studio 5.6.0 → 5.7.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 (173) hide show
  1. package/dist/chunks/{2020-zvax9fmb.js → 2020-cs2sb9t1.js} +3 -3
  2. package/dist/chunks/adapter-y5gdq19c.js +4 -0
  3. package/dist/chunks/{cf-account-picker-zfycs4k2.js → cf-account-picker-882a7ecm.js} +3 -3
  4. package/dist/chunks/cf-settings-20dznc3j.js +4 -0
  5. package/dist/chunks/components-q037dya7.js +4 -0
  6. package/dist/chunks/content-source-37x3vsap.js +4 -0
  7. package/dist/chunks/{convert-to-repeater-x19jr6c7.js → convert-to-repeater-grfep2w8.js} +3 -3
  8. package/dist/chunks/editor-j5sq149q.js +4 -0
  9. package/dist/chunks/entry-commands-c5h3nqck.js +4 -0
  10. package/dist/chunks/{extension-sections-y90sa0n4.js → extension-sections-dp8endhx.js} +3 -3
  11. package/dist/chunks/file-ops-937cvqk6.js +4 -0
  12. package/dist/chunks/files-tznwe1p1.js +4 -0
  13. package/dist/chunks/format-host-e2pjvd25.js +4 -0
  14. package/dist/chunks/fs-events-fv64ak3s.js +4 -0
  15. package/dist/chunks/git-panel-gb713ttc.js +4 -0
  16. package/dist/chunks/{grid-view-d9mybhn0.js → grid-view-5amhg604.js} +10 -10
  17. package/dist/chunks/iframe-host-t819mcg5.js +4 -0
  18. package/dist/chunks/{index-vnwy9d44.js → index-9ydfe04y.js} +3 -3
  19. package/dist/chunks/index-m0x5ztax.js +4 -0
  20. package/dist/chunks/{javascript-f0nrbdjb.js → javascript-d9pqgc2p.js} +2 -2
  21. package/dist/chunks/{jsonMode-nfa90dtf.js → jsonMode-800yvbem.js} +4 -4
  22. package/dist/chunks/jx-validate-zc9zp77s.js +4 -0
  23. package/dist/chunks/layers-4bsr82wz.js +4 -0
  24. package/dist/chunks/layers-panel-b6shnaax.js +4 -0
  25. package/dist/chunks/lit-html-cfn61dn7.js +4 -0
  26. package/dist/chunks/media-picker-ej0kdh1j.js +4 -0
  27. package/dist/chunks/menu-rtxf9chb.js +4 -0
  28. package/dist/chunks/{monaco-binding-antn79jf.js → monaco-binding-62dtmgbf.js} +3 -3
  29. package/dist/chunks/monaco-buffer-nn4dtx27.js +4 -0
  30. package/dist/chunks/{monaco-setup-k8s40vwg.js → monaco-setup-tj13ndtm.js} +3 -3
  31. package/dist/chunks/notify-ahs57a2z.js +4 -0
  32. package/dist/chunks/platform-v9xyfkbx.js +4 -0
  33. package/dist/chunks/publish-panel-bq36xcmj.js +4 -0
  34. package/dist/chunks/quick-search-zm00h9dh.js +4 -0
  35. package/dist/chunks/references-99ws0b0m.js +4 -0
  36. package/dist/chunks/right-panel-pq2f71q3.js +4 -0
  37. package/dist/chunks/section-registry-b2yzp9sw.js +4 -0
  38. package/dist/chunks/{studio-y17505ge.js → studio-01kbbqg3.js} +207 -207
  39. package/dist/chunks/{studio-gxna6yta.js → studio-01qza1n3.js} +4 -4
  40. package/dist/chunks/{studio-n2e133d6.js → studio-03wwfvyt.js} +4 -4
  41. package/dist/chunks/{studio-09n3fyy0.js → studio-0bbxhhce.js} +4 -4
  42. package/dist/chunks/{studio-dknr8m7b.js → studio-0k9mvpgj.js} +7 -7
  43. package/dist/chunks/{studio-s85vah66.js → studio-0scebvb9.js} +5 -5
  44. package/dist/chunks/studio-1a99w39s.js +5 -0
  45. package/dist/chunks/{studio-eegyf5vg.js → studio-1wvfxkyy.js} +4 -4
  46. package/dist/chunks/{studio-ft8pfpp0.js → studio-1x8x26k3.js} +4 -4
  47. package/dist/chunks/{studio-28pz4s1k.js → studio-222rqyyc.js} +4 -4
  48. package/dist/chunks/{studio-6exg5z4x.js → studio-4xppwncr.js} +3 -3
  49. package/dist/chunks/{studio-0c3fpdqj.js → studio-54g077x3.js} +5 -5
  50. package/dist/chunks/{studio-z47mm077.js → studio-56z7evx4.js} +6 -6
  51. package/dist/chunks/{studio-zkkdbbvd.js → studio-5e9zsamh.js} +6 -6
  52. package/dist/chunks/{studio-4yztve2t.js → studio-65fhspdd.js} +4 -4
  53. package/dist/chunks/{studio-b29h7g7s.js → studio-693nhyky.js} +4 -4
  54. package/dist/chunks/{studio-654fxcr0.js → studio-7pgy3xaf.js} +4 -4
  55. package/dist/chunks/{studio-k9pwvmz8.js → studio-888knnkc.js} +4 -4
  56. package/dist/chunks/{studio-b5rxwkj2.js → studio-9mqfamps.js} +4 -4
  57. package/dist/chunks/{studio-011em5cf.js → studio-a7xqhc3n.js} +4 -4
  58. package/dist/chunks/{studio-mf41717j.js → studio-aje966s9.js} +4 -4
  59. package/dist/chunks/studio-aqmph6k4.js +5 -0
  60. package/dist/chunks/studio-c6w3tq7t.js +5 -0
  61. package/dist/chunks/{studio-tzs6njnb.js → studio-c6zdm25z.js} +7 -7
  62. package/dist/chunks/{studio-1pxvgx1t.js → studio-c9d3pxf7.js} +4 -4
  63. package/dist/chunks/{studio-pvj970st.js → studio-ceb34dxj.js} +4 -4
  64. package/dist/chunks/studio-cvbkkfqb.js +5 -0
  65. package/dist/chunks/{studio-sadckcpp.js → studio-cxt150pj.js} +5 -5
  66. package/dist/chunks/{studio-891t1tv9.js → studio-dkn3x3hz.js} +4 -4
  67. package/dist/chunks/studio-e6re3rk1.js +5 -0
  68. package/dist/chunks/{studio-9n2j9nqk.js → studio-edbtvcd1.js} +4 -4
  69. package/dist/chunks/{studio-wr0pq67n.js → studio-eh0rac07.js} +4 -4
  70. package/dist/chunks/{studio-mm8x32gg.js → studio-evwgp1ym.js} +4 -4
  71. package/dist/chunks/{studio-9tkaykt5.js → studio-f195h2hq.js} +4 -4
  72. package/dist/chunks/{studio-0nm2skex.js → studio-fqq890ap.js} +3 -3
  73. package/dist/chunks/{studio-02y9cb4h.js → studio-frb0qbf7.js} +5 -5
  74. package/dist/chunks/{studio-je15p5v8.js → studio-gfn1kpxj.js} +5 -5
  75. package/dist/chunks/{studio-ymsjnvp9.js → studio-gh97gngt.js} +4 -4
  76. package/dist/chunks/{studio-zkvyd3ev.js → studio-gp02nqnw.js} +4 -4
  77. package/dist/chunks/{studio-5fc0728f.js → studio-hjbg8d5y.js} +7 -7
  78. package/dist/chunks/{studio-dtmdjmqb.js → studio-j6gnhvaa.js} +4 -4
  79. package/dist/chunks/{studio-d007j0z3.js → studio-mwxgyn9h.js} +6 -6
  80. package/dist/chunks/{studio-36s6qjgq.js → studio-n78gjfy8.js} +4 -4
  81. package/dist/chunks/studio-nbxqcgvf.js +5 -0
  82. package/dist/chunks/{studio-ks0ecgjx.js → studio-nt06yybj.js} +4 -4
  83. package/dist/chunks/{studio-ebt49j3c.js → studio-p7c1agz0.js} +5 -5
  84. package/dist/chunks/{studio-y164brht.js → studio-pwqfmt4p.js} +4 -4
  85. package/dist/chunks/{studio-6zyt56ek.js → studio-r3kaka4d.js} +4 -4
  86. package/dist/chunks/{studio-tj28pxa1.js → studio-semd1s8s.js} +4 -4
  87. package/dist/chunks/studio-skzanb0k.js +5 -0
  88. package/dist/chunks/{studio-z1vdxq0e.js → studio-spf2skgc.js} +4 -4
  89. package/dist/chunks/{studio-7w04zw8h.js → studio-st75kn99.js} +5 -5
  90. package/dist/chunks/{studio-dmymvk2j.js → studio-sxc0zvpt.js} +3 -3
  91. package/dist/chunks/studio-t1eedsyx.js +4 -0
  92. package/dist/chunks/{studio-153mwkyq.js → studio-tp642n5g.js} +4 -4
  93. package/dist/chunks/{studio-r7yeeqc4.js → studio-tw7rre6s.js} +4 -4
  94. package/dist/chunks/{studio-t0v47dpc.js → studio-tzegmy4w.js} +4 -4
  95. package/dist/chunks/studio-vavmwshr.js +5 -0
  96. package/dist/chunks/{studio-805fwp9k.js → studio-wma2c6g8.js} +4 -4
  97. package/dist/chunks/studio-x92tgnee.js +64 -0
  98. package/dist/chunks/studio-xk0z6msk.js +5 -0
  99. package/dist/chunks/{studio-njmg0e73.js → studio-xry7tk3z.js} +5 -5
  100. package/dist/chunks/{studio-sgzss898.js → studio-xta2vxp6.js} +7 -7
  101. package/dist/chunks/{studio-jsr14n1s.js → studio-xy3tv3az.js} +4 -4
  102. package/dist/chunks/{studio-6k1eswp9.js → studio-y7jehjrp.js} +4 -4
  103. package/dist/chunks/{studio-81twpmzj.js → studio-yr04mv2j.js} +4 -4
  104. package/dist/chunks/{studio-gj4j9e7k.js → studio-zd4kayn2.js} +4 -4
  105. package/dist/chunks/{studio-w8w9frjy.js → studio-zpnk016a.js} +12 -12
  106. package/dist/chunks/{tsMode-eq26t9gs.js → tsMode-k9s9fcag.js} +4 -4
  107. package/dist/chunks/workspace-b69mgm0e.js +4 -0
  108. package/dist/chunks/{ws-client-3gxqp06s.js → ws-client-0ja08haa.js} +3 -3
  109. package/dist/manifest.json +62 -62
  110. package/dist/studio.js +95 -95
  111. package/package.json +3 -3
  112. package/src/canvas/stage-scrollbar.ts +7 -7
  113. package/src/files/file-ops.ts +5 -8
  114. package/src/panels/jump-bar.ts +132 -158
  115. package/src/panels/pane-context.ts +8 -8
  116. package/src/panels/pane-grid.ts +18 -26
  117. package/src/panels/style-panel.ts +2 -2
  118. package/src/services/context-manager.ts +41 -70
  119. package/src/services/document-assistant.ts +12 -3
  120. package/src/services/harness/chat-reducer.ts +115 -0
  121. package/src/services/harness/turn-hooks.ts +50 -0
  122. package/src/services/tool-executor.ts +69 -288
  123. package/src/services/tool-outcomes.ts +12 -10
  124. package/src/studio.ts +2 -5
  125. package/src/surfaces/block-action-bar.json +6 -1
  126. package/src/surfaces/jump-bar.json +9 -12
  127. package/src/surfaces/jump-bar.ts +15 -16
  128. package/src/surfaces/pane-context.json +2 -2
  129. package/src/surfaces/pane-grid.json +8 -25
  130. package/src/surfaces/pane-grid.ts +7 -8
  131. package/src/surfaces/statusbar.json +71 -3
  132. package/src/surfaces/statusbar.ts +66 -139
  133. package/src/surfaces/style-panel.json +3 -3
  134. package/src/surfaces/style-panel.ts +11 -1
  135. package/dist/chunks/adapter-6zhjbpmd.js +0 -4
  136. package/dist/chunks/cf-settings-fpa485q3.js +0 -4
  137. package/dist/chunks/components-b0vh4sq8.js +0 -4
  138. package/dist/chunks/content-source-z5t0d0h9.js +0 -4
  139. package/dist/chunks/editor-7e23n4a8.js +0 -4
  140. package/dist/chunks/entry-commands-5cm6aba2.js +0 -4
  141. package/dist/chunks/file-ops-hv7gf757.js +0 -4
  142. package/dist/chunks/files-kb0epdxf.js +0 -4
  143. package/dist/chunks/format-host-eg1wy2bp.js +0 -4
  144. package/dist/chunks/fs-events-ky3vxfmh.js +0 -4
  145. package/dist/chunks/git-panel-yyg3bzp2.js +0 -4
  146. package/dist/chunks/iframe-host-9wdf0hes.js +0 -4
  147. package/dist/chunks/index-2tf0m2ne.js +0 -4
  148. package/dist/chunks/jx-validate-7w11db9v.js +0 -4
  149. package/dist/chunks/layers-7zasrpse.js +0 -4
  150. package/dist/chunks/layers-panel-9nzc4fdq.js +0 -4
  151. package/dist/chunks/lit-html-5qr7nbng.js +0 -4
  152. package/dist/chunks/media-picker-maevn9d4.js +0 -4
  153. package/dist/chunks/menu-wq6q0v3y.js +0 -4
  154. package/dist/chunks/monaco-buffer-9ry2rn5x.js +0 -4
  155. package/dist/chunks/notify-g91gjd6w.js +0 -4
  156. package/dist/chunks/platform-jdwjp2vt.js +0 -4
  157. package/dist/chunks/publish-panel-8yym447p.js +0 -4
  158. package/dist/chunks/quick-search-9bzm9kh3.js +0 -4
  159. package/dist/chunks/references-znssfqvq.js +0 -4
  160. package/dist/chunks/right-panel-czbzktm8.js +0 -4
  161. package/dist/chunks/section-registry-0rtq73qs.js +0 -4
  162. package/dist/chunks/studio-0mm38y62.js +0 -5
  163. package/dist/chunks/studio-27tc8q0h.js +0 -5
  164. package/dist/chunks/studio-7djymzt2.js +0 -5
  165. package/dist/chunks/studio-ant1zbp3.js +0 -5
  166. package/dist/chunks/studio-eb5sty2k.js +0 -5
  167. package/dist/chunks/studio-frv7vjhw.js +0 -5
  168. package/dist/chunks/studio-mb8jhtr4.js +0 -64
  169. package/dist/chunks/studio-nvykrgbj.js +0 -4
  170. package/dist/chunks/studio-nw4q9sdn.js +0 -5
  171. package/dist/chunks/studio-p6avneaq.js +0 -5
  172. package/dist/chunks/studio-vz7b43ng.js +0 -5
  173. package/dist/chunks/workspace-emt8454d.js +0 -4
@@ -1,14 +1,14 @@
1
- import{OI,MI}from"./studio-b29h7g7s.js";import{nt,Ot,Za,ba,Ov,RS,$S,DS,Ux,Ks,AS,ih,va,Mv,jd,Pp}from"./studio-p6avneaq.js";import{ge,Xa,Q,sh,ah,qx,v,Wm,Vm,re,Hd,Qa,el,Bd}from"./studio-0nm2skex.js";import{Di}from"./studio-09n3fyy0.js";var Ht={};Di(Ht,{SUBMENU_PLACEMENT:()=>Sa,clampIntoViewport:()=>ae,ensureCaret:()=>kS,focusRow:()=>Z,hideMenu:()=>oe,onMenuBeforeToggle:()=>cs,onMenuKeydown:()=>ds,onMenuPointerOver:()=>fs,onMenuToggle:()=>hs,openSubmenu:()=>At,parentRowOf:()=>U,rootMenuOf:()=>Ue,rowsOf:()=>W,showMenu:()=>Ta,submenuOf:()=>ie});var Et={};Di(Et,{anchorOf:()=>ye,clampIntoViewport:()=>ae,close:()=>Pd,measureAnchor:()=>ja,onBeforeToggle:()=>es,onToggle:()=>ts,onTransitionEnd:()=>ns,openAt:()=>zl,supportsAnchorPositioning:()=>te});function te(){let e=globalThis.CSS;return typeof e?.supports==="function"&&e.supports("position-area","block-end")}function ya(e){return e}var Be=new WeakMap;function ka(e){let t=e.currentTarget;return t instanceof HTMLElement?t:null}function ye(e){return Be.get(e)??null}function zl(e,t){let n=ya(e);if(typeof n.showPopover!=="function")return;if(!t){n.showPopover();return}Be.set(e,t);try{Yi(n,t)}catch(a){throw Be.delete(e),a}}function Yi(e,t){try{e.showPopover?.({source:t})}catch(n){if(!(n instanceof TypeError))throw n;e.showPopover?.()}}function Pd(e){let t=ya(e);if(typeof t.hidePopover==="function")t.hidePopover()}function Xi(e){let{id:t}=e;if(!t)return null;for(let n of e.ownerDocument.querySelectorAll("[popovertarget]"))if(n.getAttribute("popovertarget")===t)return n;return null}function $a(e,t){let{source:n}=t;if(n instanceof Element)return n;return ye(e)??Xi(e)}function ja(e,t,n=ye(t)){if(e.matchWidth!==!0||!n)return;let a=n.getBoundingClientRect();if(a.width>0)e.anchorWidth=Math.round(a.width)}function Qi(e,t){let n=()=>{if(typeof t.getAnimations==="function"&&t.getAnimations().length>0)return;e.settling=!1};if(typeof requestAnimationFrame==="function")requestAnimationFrame(n);else n()}function es(e,t){let n=ka(t);if(!n)return;let a=t.newState==="open",o=Number(e.floor??0);e.anchored=a&&o<=0&&$a(n,t)!==null}function ts(e,t){let n=ka(t);if(!n)return;let a=t.newState==="open";if(e.open=a,e.settling=!0,a){if(ja(e,n,$a(n,t)),!(e.anchored===!0&&te()))ae(e,n,{floor:Number(e.floor??0)})}else Be.delete(n);Qi(e,n)}function ns(e,t){if(t.target===t.currentTarget)e.settling=!1}function as(e){let t=Number.parseFloat(getComputedStyle(e).marginBlockStart);return Number.isFinite(t)&&t>0?t:0}function ae(e,t,n={}){let a=()=>{let o=t.getBoundingClientRect();if(o.width===0&&o.height===0)return;let r=4,i=n.floor&&n.floor>0?n.floor:window.innerHeight;if(o.right>window.innerWidth-r){let s=n.flipAgainst??null,d=s?Math.round(s.getBoundingClientRect().left)-o.width+2:-1;e.x=d>=r?d:Math.max(r,Math.round(window.innerWidth-o.width-r))}if(o.bottom>i)e.y=Math.max(r,Math.round(i-o.height-as(t)))};if(typeof requestAnimationFrame==="function")requestAnimationFrame(a);else a()}var qe="jx-menu-item",G="jx-menu",Sa="inline-end span-block-end";function Ke(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===G?t:null}function os(e,t){return t instanceof Element&&t.closest(G)===e}function W(e,t={}){let n=[...e.querySelectorAll(qe)].filter((a)=>a.closest(G)===e);return t.includeDisabled?n:n.filter((a)=>a.getAttribute("aria-disabled")!=="true")}function ie(e){for(let t of e.querySelectorAll(G))if(t.parentElement?.closest(qe)===e)return t;return null}function U(e){return e.parentElement?.closest(qe)??null}function Ue(e){let t=e;for(;;){let n=U(t),a=n?.closest(G);if(!n||!(a instanceof HTMLElement))return t;t=a}}function Ge(e){return e.open===!0}function Ta(e,t){if(!Ge(e))zl(e,t??null)}function oe(e){if(Ge(e)&&typeof e.hidePopover==="function")e.hidePopover()}function Z(e,t){if(e.length===0)return null;let n=(t%e.length+e.length)%e.length;for(let[o,r]of e.entries())r.tabIndex=o===n?0:-1;let a=e[n];return a.focus(),a}function rs(e,t){return e.findIndex((n)=>n===t||t instanceof Node&&n.contains(t))}function At(e,t={}){let n=ie(e);if(!n)return null;let a=e.getBoundingClientRect();if(n.x=Math.round(a.right)-2,n.y=Math.round(a.top)-4,e.expanded=!0,Ta(n,e),t.focus)Z(W(n),0);return n}function Mt(e,t=null){for(let n of W(e,{includeDisabled:!0})){if(n===t)continue;let a=ie(n);if(a)oe(a)}}function is(e){return e.querySelector('[part="label"]')?.textContent??e.textContent??""}function ss(e,t,n){let a=e.map((o)=>is(o).trim().toLowerCase());for(let o=1;o<=a.length;o++){let r=(t+o)%a.length;if(a[r].startsWith(n))return r}return-1}function ls(e){return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?e.key.toLowerCase():null}function ds(e,t){let n=Ke(t);if(!n||!os(n,t.target))return;let a=W(n),o=rs(a,t.target);switch(t.key){case"ArrowDown":{Z(a,o+1);break}case"ArrowUp":{Z(a,o===-1?-1:o-1);break}case"Home":{Z(a,0);break}case"End":{Z(a,-1);break}case"Enter":case" ":{a[o]?.click();break}case"ArrowRight":{let r=a[o];if(!r||!ie(r))return;Mt(n,r),At(r,{focus:!0});break}case"ArrowLeft":{let r=U(n);if(!r)return;oe(n),r.focus();break}case"Escape":{let r=U(n);oe(n),r?.focus();break}case"Tab":{oe(Ue(n));break}default:{let r=ls(t);if(r===null)return;let i=ss(a,o,r);if(i===-1)return;Z(a,i)}}t.preventDefault(),t.stopPropagation()}function cs(e,t){let n=Ke(t);if(!n)return;let a=t.newState==="open",o=String(e.placement??"")||(U(n)?Sa:"");e.area=o;let{source:r}=t,i=r instanceof Element?r:ye(n);e.anchored=a&&o!==""&&i!==null&&!us(n)}function hs(e,t){let n=Ke(t);if(!n)return;let a=t.newState==="open";e.open=a;let o=U(n);if(!a){if(Mt(n),o)o.expanded=!1;return}if(!(e.anchored===!0&&te()))ae(e,n,{flipAgainst:o?.closest(G)??null,floor:ps(n)});if(!n.contains(document.activeElement))Z(W(n),0)}function us(e){return Number(Ue(e).floor??0)>0}function ps(e){let t=Number(Ue(e).floor??0);return t>0?t:window.innerHeight}function kS(e){if(e.contains(document.activeElement))return;let t=e;for(;;){let a=W(t,{includeDisabled:!0}).map((o)=>ie(o)).find((o)=>o!==null&&Ge(o));if(!a)break;t=a}let n=U(t);if(W(t).length===0&&n){oe(t),n.focus();return}Z(W(t),0)}function fs(e,t){let n=Ke(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest(qe);if(!a||a.closest(G)!==n)return;let o=ie(a);if(Mt(n,a),o&&!Ge(o)&&a.getAttribute("aria-disabled")!=="true")At(a)}var ms=["auto","manual","hint"],Ea=new Set(["button","input"]),TS="auto";function Wl(e){return nt(e.attributes)?e.attributes:{}}function Gr(e,t){let n=Wl(e)[t];return typeof n==="string"?n:null}function ao(e){return typeof e.tagName==="string"?e.tagName.toLowerCase():""}function Kr(e,t="the popover"){let n=typeof e.id==="string"?e.id:Gr(e,"id");if(n)return`#${n}`;let a=ao(e);return a===""?t:`the <${a}>`}function bs(e){let t=Wl(e).popover;return typeof t==="string"?t:null}var gs=["popovertarget","popovertargetaction","command","commandfor"];function Aa(e){let t=new Set,n=new Set;for(let a of e){let o=typeof a?.tagName==="string"?a.tagName:"";if(!o.includes("-"))continue;if(Lt(a))t.add(o);let r=a.observedAttributes;if(Array.isArray(r)&&gs.every((i)=>r.includes(i)))n.add(o)}return{invokerTags:n,popoverTags:t}}function Lt(e){return"popover"in Wl(e)||"popover"in e}function Gs(e,t){return Lt(e)||(t?.popoverTags?.has(ao(e))??!1)}function nh(e){if(typeof e.id==="string"&&e.id!=="")return e.id;let t=Gr(e,"id");return t===""?null:t}function*Ya(e,t=[],n=null,a){yield{enclosing:n,node:e,path:t};let o=Gs(e,a)?e:n,{children:r}=e;if(Array.isArray(r)){for(let[d,l]of r.entries())if(l&&typeof l==="object")yield*Ya(l,[...t,"children",d],o,a)}else if(nt(r)&&nt(r.map))yield*Ya(r.map,[...t,"children","map"],o,a);let i=nt(e.map)?e.map:null;if(i)yield*Ya(i,[...t,"map"],o,a);let s=nt(e.cases)?e.cases:{};for(let[d,l]of Object.entries(s))if(l&&typeof l==="object")yield*Ya(l,[...t,"cases",d],o,a)}function Bm(e,t){let n=[];for(let{node:a}of Ya(e,[],null,t)){if(!Gs(a,t))continue;let o=nh(a);if(o!==null&&!n.includes(o))n.push(o)}return n}function EI(e,t){for(let{node:n}of Ya(e,[],null,t))if(Gs(n,t))return!0;return!1}function Ye(e){return e.startsWith("@")}function Ma(e){return e.startsWith(":")||e.startsWith("&")||e.startsWith(".")||e.startsWith("[")}function er(e,t){let n=e?.[t];if(n===void 0||ih(n)||Array.isArray(n))return null;return String(n)}function Ha(e){for(let[t,n]of Object.entries(e??{})){if(!ih(n))continue;if(Ma(t)&&t.includes(":popover-open")&&er(n,"display")!==null)return!0;if(Ye(t)&&Ha(n))return!0}return!1}function La(e){for(let[t,n]of Object.entries(e??{})){if(!ih(n))continue;if(Ma(t)&&t.includes(":popover-open"))return!0;if(Ye(t)&&La(n))return!0}return!1}var ws=["flexDirection","flex-direction","alignItems","align-items","justifyContent","justify-content","flexWrap","flex-wrap","gridTemplateColumns","grid-template-columns","gridTemplateRows","grid-template-rows","gap"];function xs(e){return ws.some((t)=>er(e,t)!==null)}function Na(e){if(!e)return[];let t=[];for(let[n,a]of Object.entries(e))if(Ye(n)&&ih(a)&&er(a,"display")!==null)t.push(n);return t}function Ia(e){if(!e)return[];let t=[],n=er(e,"transition");if(n!==null)t.push(n);for(let[a,o]of Object.entries(e))if(Ye(a)&&ih(o))t.push(...Ia(o));return t}function vs(e){if(!e)return!1;if(er(e,"positionAnchor")!==null||er(e,"position-anchor")!==null)return!0;return["top","left","right","bottom","inset","insetBlockStart","insetInlineStart"].some((t)=>(er(e,t)??"").includes("anchor("))}function ys(e){if(!e)return!1;if(er(e,"positionArea")!==null||er(e,"position-area")!==null||er(e,"positionTryFallbacks")!==null||er(e,"position-try-fallbacks")!==null)return!0;return Object.keys(e).some((t)=>t.startsWith("@supports"))}var R="See docs/framework/concepts/overlays.";function TI(e,t){let n=[...Ya(e,[],null,t)],a=Bm(e,t),o=n.some(({node:s})=>Gs(s,t)),r=new Set;for(let{node:s}of n)if(Ea.has(ao(s))){let d=Gr(s,"popovertarget");if(d!==null)r.add(d)}let i=[];for(let{enclosing:s,node:d,path:l}of n)if(i.push(...ks(d,l,s,a,o,t)),Lt(d))i.push(...$s(d,l,r));return i}function ks(e,t,n,a,o,r){let i=[],s=ao(e),d=Gr(e,"popovertarget"),l=Ea.has(s)||(r?.invokerTags?.has(s)??!1);if(d!==null&&!l)return i.push({detail:"`popovertarget` and `popovertargetaction` come from the `PopoverTargetAttributes` IDL mixin, which HTML includes into `HTMLButtonElement` and `HTMLInputElement` and into nothing else. Elsewhere they parse and do nothing. A link inside an open popover "+"dismisses it by navigating away, which is why this looks like it works — but it does "+`not for a new tab or a same-page fragment. Remove both attributes. ${R}`,fix:"invoker",message:`<${s||"element"}> carries popovertarget, which only <button> and <input> support.`,path:t,rule:"invoker-not-button",severity:"error"}),i;if(d!==null){if(o&&!a.includes(d)){let h=a.length>0?`The popovers here are: ${a.map((c)=>`"${c}"`).join(", ")}. `:"";i.push({detail:`No element in this document declares \`popover\` with the id "${d}". ${h}A target that names nothing does nothing, silently. ${R}`,message:`popovertarget="${d}" names no popover in this document.`,path:t,rule:"target-missing",severity:"error"})}else if(n!==null&&nh(n)!==null&&nh(n)!==d)i.push({detail:`This control is inside ${Kr(n)} but targets "${d}". Dismissing a different popover leaves the one the reader is looking at open. This is usually a copy-paste between two panels in the same file. ${R}`,message:`A control inside ${Kr(n)} targets "${d}" instead.`,path:t,rule:"target-mismatch",severity:"warn"})}if(s==="a"&&n!==null&&d===null){let h=Gr(e,"href")??(typeof e.href==="string"?e.href:null),c=Gr(e,"target")==="_blank",u=h!==null&&h.includes("#");if(c||u){let p=c?"it opens a new tab, so the panel stays open on the page behind it. ":"it is a same-document fragment, so the page scrolls behind the open panel. ";i.push({detail:`A link inside a panel normally dismisses it by navigating away. This one does not: ${p}`+"There is no declarative fix — a link cannot carry `popovertarget`. Move it out of the "+`panel, make it a <button>, or accept it deliberately. ${R}`,message:`A link inside ${Kr(n)} does not dismiss it.`,path:t,rule:"link-does-not-dismiss",severity:"warn"})}}return i}function $s(e,t,n){let a=[],{style:o}=e,r=Kr(e),i=bs(e);if(i!==null&&i!==""&&!ms.includes(i))a.push({detail:"`popover` is an enumerated attribute taking `auto`, `manual` or `hint`. Anything else falls back to the invalid-value default `manual`, which gives up light dismiss and gives "+`up Escape — so the panel opens and there is no way to close it. Write "auto". ${R}`,fix:"mode",message:`${r} declares popover="${i}", which is not one of auto, manual or hint.`,path:t,rule:"invalid-mode",severity:"error"});else if(typeof Wl(e).popover==="boolean")a.push({detail:`\`popover\` carries its value in its text, so a boolean is not the right shape. Written as \`true\` it reaches two of the compiler's emitters as \`popover="true"\`, which is not one of the three keywords, so HTML falls back to \`manual\`: no light dismiss, no Escape, and the trigger stops toggling. Write "auto". ${R}`,fix:"mode",message:`${r} writes popover as a boolean.`,path:t,rule:"invalid-mode",severity:"error"});let s=er(o,"display");if(s!==null&&s!=="revert"&&s!=="revert-layer")a.push({detail:"A closed popover is hidden by the browser's own `[popover]:not(:popover-open) { display: none }`. That rule is UA-origin, so any author `display` beats it at any specificity, and "+"the panel is laid out on every page whether it is open or not — usually parked off the "+`side of the viewport by the transform meant to animate it, so nothing looks wrong until you scroll sideways. \`display\` belongs in \`:popover-open\` and nowhere else. ${R}`,fix:"display",message:`${r} sets display in its base rule.`,path:t,rule:"base-display",severity:"error"});for(let l of Na(o))a.push({detail:`The same defect as a base \`display\`, arriving through \`${l}\` and therefore only at `+"one width — which is what makes it hard to see. Gate the TRIGGER on a breakpoint, never "+`the panel: the popover mechanism is what hides the panel. ${R}`,fix:"display",message:`${r} sets display inside ${l}.`,path:t,rule:"breakpoint-display",severity:"error"});if(er(o,"visibility")!==null)a.push({detail:`A second hiding mechanism the browser already provides. Once \`display\` leaves the base rule this one only adds a frame of flicker on open, and it hides the element from assistive technology in a way \`display: none\` already did. ${R}`,fix:"display",message:`${r} also hides itself with visibility.`,path:t,rule:"base-visibility",severity:"warn"});if(!La(o))a.push({detail:"Nothing changes when it opens, so no transition on it can run and — if `display` is not "+"in the base rule — the panel has no `display` at all while open. This is usually a panel "+`that was styled before it was made a popover. ${R}`,message:`${r} has no :popover-open rule.`,path:t,rule:"no-open-rule",severity:"warn"});else if(!Ha(o)&&s===null&&xs(o))a.push({detail:`${r} declares flex or grid properties, but neither its base rule nor its `+"`:popover-open` rule sets a `display` for them to apply to — and the base rule must not "+`(that is what keeps the closed panel hidden). So it opens with the UA's \`display: block\` and the layout silently does nothing. Put \`display: flex\` in \`:popover-open\`. ${R}`,fix:"open-display",message:`${r} is laid out with flex or grid but never sets display.`,path:t,rule:"no-open-display",severity:"error"});for(let l of Ia(o))if(l.includes("display")&&!l.includes("overlay")){a.push({detail:"`display …allow-discrete` keeps the box alive while it animates out; `overlay "+"…allow-discrete` is what keeps it in the TOP LAYER for those same milliseconds. "+`Without it the panel drops behind the page content and the backdrop disappears a frame early, so the exit reads as a flicker rather than an animation. ${R}`,message:`${r} transitions display but not overlay.`,path:t,rule:"cut-exit",severity:"warn"});break}if(vs(o)&&!ys(o))a.push({detail:"When `anchor()` does not resolve, every inset it feeds computes to `auto` — and a "+`\`position: fixed\` box with four \`auto\` insets falls back to its STATIC position, which for a panel declared inside a header is in the middle of the header. Use \`position-area\` with \`position-try-fallbacks\`, or add a \`@supports\` block that positions it without anchors. ${R}`,message:`${r} is anchor-positioned with no fallback.`,path:t,rule:"unsafe-anchor",severity:"warn"});let d=nh(e);if(d!==null&&!n.has(d))a.push({detail:`No \`<button>\` or \`<input>\` in this document names it with \`popovertarget\`. If it is opened from another file or from a function that calls \`showPopover()\`, this is fine; otherwise there is no way for a reader to open it. ${R}`,message:`${r} has no invoker in this document.`,path:t,rule:"no-invoker",severity:"warn"});return a}function LI(e){if(!e)return null;let t=[];if(er(e,"display")!==null)t.push("display");if(er(e,"visibility")!==null)t.push("visibility");let n=Na(e);if(t.length===0&&n.length===0)return null;let a=va(e,":popover-open")??va(e,"&:popover-open"),o=er(a,"display")!==null?null:er(e,"display")??null;return{base:t,breakpoints:n,openDisplay:o}}var Ca=el(null);function RI(e){Ca.value=e}function ne(){return Ca.value}function Oa(e){return e.replaceAll(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}var js=new Set(["all","print","screen","speech"]);function Ra(e,t){if(e.startsWith("@--"))return t[e.slice(1)]??e.slice(1);if(e.startsWith("@(")){let n=e.slice(2,-1).trim();return js.has(n.toLowerCase())?n:e.slice(1)}return null}function Nt(e){return e.startsWith("@position-try")||e.startsWith("@property")||e.startsWith("@font-face")||e.startsWith("@counter-style")}function Rv(e){return e.startsWith("@keyframes")}function Da(e,t){let n=[];for(let a of It(e))for(let o of It(t))n.push(Ss(a,o));return n.join(", ")}function Ss(e,t){if(t.startsWith("&"))return t.replaceAll("&",e);if(t.startsWith("[")||t.startsWith(":")||t.startsWith("."))return`${e}${t}`;return`${e} ${t}`}function It(e){let t=[],n=0,a=null,o=0;for(let i=0;i<e.length;i+=1){let s=e[i];if(a){if(s==="\\")i+=1;else if(s===a)a=null;continue}if(s==='"'||s==="'")a=s;else if(s==="("||s==="[")n+=1;else if(s===")"||s==="]")n=Math.max(0,n-1);else if(s===","&&n===0)t.push(e.slice(o,i)),o=i+1}t.push(e.slice(o));let r=t.map((i)=>i.trim()).filter((i)=>i!=="");return r.length>0?r:[e]}var Ts=/[\s>+~,()]/,Es=/^[A-Za-z_\u{00A0}-\u{FFFF}][\w\u{00A0}-\u{FFFF}-]*/u;function As(e,t){let n="",a=0;for(;;){let o=e.indexOf("[open]",a);if(o===-1)return n+e.slice(a);let r=o;while(r>0&&!Ts.test(e[r-1]))r-=1;let i=Es.exec(e.slice(r,o))?.[0]?.toLowerCase(),s=i===void 0?t.dialog===!0:i==="dialog";n+=e.slice(a,o)+(s?"[data-jx-dialog-open]":"[open]"),a=o+6}}function Ct(e,t={}){if(e.includes("::backdrop"))return null;let n=e.replaceAll(":popover-open","[data-jx-popover-open]").replaceAll(":modal","[data-jx-dialog-open]").replaceAll("[inert]","[data-jx-inert]");return As(n,t)}var ke="data-color-scheme";function $v(e){return/^\(\s*prefers-color-scheme\s*:\s*(light|dark)\s*\)$/.exec(e.trim())?.[1]??null}function Pa(e,t){if(e===":root"||e==="html")return{auto:`${e}:where(:not([${ke}]))`,forced:`${e}:where([${ke}="${t}"])`};return{auto:`:where(:root:not([${ke}])) ${e}`,forced:`:where(:root[${ke}="${t}"]) ${e}`}}function Rt(e){return e.startsWith(":")||e.startsWith(".")||e.startsWith("&")||e.startsWith("[")}function Dt(e){return e.startsWith("--")?e:Oa(e)}function $e(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Fa(e,t,n){let a=n.map(([r,i])=>`${r}: ${i}`).join("; "),o=t===null?a:`${t} { ${a} }`;for(let r=e.length-1;r>=0;r-=1)o=`${e[r]} { ${o} }`;return o}function Ms(e,t,n){let a=n.map(({selector:r,declarations:i})=>`${r} { ${i.map(([s,d])=>`${s}: ${d}`).join("; ")} }`).join(" "),o=`@keyframes ${t} { ${a} }`;for(let r=e.length-1;r>=0;r-=1)o=`${e[r]} { ${o} }`;return o}function Hs(e){let t=Object.keys(e).filter((a)=>Rv(a));if(t.length===0)return e;let n={...e};for(let a of t)delete n[a];return n}function Ls(e){let t=e.startsWith("&")?e.slice(1):e;return t===""||t.startsWith(":")||t.startsWith(".")||t.startsWith("[")}function je(e,t={}){let{scope:n=null,mediaQueries:a={},transposeValue:o=(f)=>f,transposeSelector:r=(f)=>f,resolveValue:i}=t,s=[],d=(f)=>f!==null&&typeof f==="object"&&!Array.isArray(f)&&!Ot(f),l=(f,m)=>{if(d(m))return[m];if(!Nt(f)||!Array.isArray(m)||m.length===0)return[];return m.every((x)=>d(x))?m:[]},h=(f,m,x,y)=>{if(m===void 0||m===null)return null;if(Ot(m))return x?i?.(f,m,y)??null:null;if(typeof m==="object")return null;let k=String(m);if(Ks(k))return x?i?.(f,k,y)??null:null;return o(k)},c=(f,m,x=!0,y="self")=>{let k=[];for(let[T,I]of Object.entries(f)){if(l(T,I).length>0)continue;if(m&&(T.startsWith("@")||Rt(T)))continue;if(T.startsWith("$"))continue;let j=h(T,I,x,y);if(j!==null)k.push([Dt(T),j])}return k},u=(f,m,x,y,k)=>{if(x.length===0)return;let T=m;if(T!==null){let j=r(T);if(j===null)return;T=j}let I=Fa(f,T,x);s.push({text:I,conditions:[...f],selector:T,declarations:x,target:y,key:$e(I),...typeof k==="string"&&k!==""?{description:k}:{}})},p=(f,m,x)=>{let y=f.slice(10).trim();if(y==="")return;let k=[];for(let[I,j]of Object.entries(m)){if(!d(j))continue;let C=c(j,!0,!1,"unscoped");if(C.length>0)k.push({declarations:C,selector:I.trim()})}if(k.length===0)return;let T=Ms(x,y,k);s.push({blocks:k,conditions:[...x],declarations:[],key:$e(T),selector:null,target:"unscoped",text:T})},g=(f,m,x,y,k)=>{if(f==="@--")return;if(Nt(f)){u([...y,f],null,c(m,!1,!0,"unscoped"),"unscoped",m.$description);return}if(Rv(f)){p(f,m,y);return}let T=Ra(f,a),I=T===null?f:`@media ${T}`,j=T===null?null:$v(T);if(j!==null&&x!==null){let{auto:C,forced:w}=Pa(x,j);b(m,C,[...y,I],k),b(Hs(m),w,y,k);return}b(m,x,[...y,I],k)};function b(f,m,x,y){u(x,m,c(f,!0,!0,y),y,f.$description);for(let[k,T]of Object.entries(f))for(let I of l(k,T))if(k.startsWith("@"))g(k,I,m,x,y);else if(m!==null)b(I,Da(m,k),x,Ls(k)?y:"descendant")}return b(e,n,[],"self"),s}var z="en-US",za="UTC",Va=[{api:"Intl.NumberFormat",params:["value","locale","options"],path:"Intl/formatNumber",summary:"Format a number for a locale — grouping, decimals, currency, percent, units."},{api:"Intl.DateTimeFormat",params:["value","locale","options"],path:"Intl/formatDate",summary:"Format a date or timestamp for a locale. Pass `timeZone` in options."},{api:"Intl.RelativeTimeFormat",params:["value","unit","locale","options"],path:"Intl/formatRelativeTime",summary:'Format a relative time — `-3, "day"` becomes "3 days ago".'},{api:"Intl.ListFormat",params:["values","locale","options"],path:"Intl/formatList",summary:'Join a list the way a locale does — "a, b, and c", not a hand-written comma join.'},{api:"Intl.PluralRules",params:["value","locale","options"],path:"Intl/plural",summary:'Which plural category a number falls in ("one", "few", "other") — many languages have '+"more than two, so a ternary on `n === 1` is wrong outside English."},{api:"Intl.Collator",params:["a","b","locale","options"],path:"Intl/compare",summary:'Compare two strings for sorting. `<` and `sort()` order by UTF-16 code unit, which puts "Zebra" before "apple" and sorts every accented word into the wrong place.'},{api:"Intl.DisplayNames",params:["code","type","locale","options"],path:"Intl/displayName",summary:'The name of a language, region, script or currency in a locale — "de" as "German" or '+'"Deutsch", from CLDR rather than a hand-kept table.'},{api:"Intl.Segmenter",params:["value","granularity","locale"],path:"Intl/segment",summary:"Split text into graphemes, words or sentences (UAX #29). `[...str]` splits code points, so it cuts an emoji with a skin-tone modifier in half."}],Pt=Va.map((e)=>e.path),Wa=Object.fromEntries(Va.map((e)=>[e.path,e.params.indexOf("locale")]));function CI(){return`the Intl helpers ${Pt.join(", ")}`}function Ns(e){return e.replaceAll("~1","/").replaceAll("~0","~")}function Ft(e){if(e==="")return[];return e.split("/").map((t)=>Ns(t))}function P(e,t){let n=e;for(let a of Ft(t))n=n?.[a];return n}function Zt(e){let t=e.$map;return t&&typeof t==="object"?t:void 0}var Ba=new Set(["=","+=","-=","*=","/=","push","pop","shift","unshift","splice"]),qa=new Set(["!","-"]),Ka=new Set(["+","-","*","/","%","===","!==","<","<=",">",">=","&&","||","??"]),Is=new Set(["=","+=","-=","*=","/="]),Cs=new Set(["push","pop","shift","unshift","splice"]),Ua=new Set(["reduce","map","filter"]),Ga=new Set(["?:","switch"]),$p=new Set(["includes","indexOf","lastIndexOf","join","slice","concat","at","flat","toSorted","toReversed","toSpliced","with","toUpperCase","toLowerCase","trim","trimStart","trimEnd","split","startsWith","endsWith","padStart","padEnd","replaceAll","repeat","charAt","normalize","toLocaleUpperCase","toLocaleLowerCase","toFixed","toPrecision","toLocaleString"]),xS=new Set([...Ba,...qa,...Ka,...Ua,...Ga,...$p,"call"]),_S=new Set(["isNaN","isFinite","parseFloat","parseInt","encodeURIComponent","decodeURIComponent","structuredClone","Math/abs","Math/ceil","Math/floor","Math/round","Math/trunc","Math/sign","Math/sqrt","Math/cbrt","Math/pow","Math/exp","Math/log","Math/log2","Math/log10","Math/min","Math/max","Math/hypot","Number/isInteger","Number/isFinite","Number/isNaN","Number/parseFloat","Number/parseInt","JSON/parse","JSON/stringify","Object/keys","Object/values","Object/entries","Object/fromEntries","Array/from","Array/isArray","Array/of","String/fromCharCode","String/fromCodePoint",...Pt]),Os={"Intl/compare":(e,t,n,a)=>new Intl.Collator(n??z,a).compare(e,t),"Intl/displayName":(e,t,n,a)=>new Intl.DisplayNames(n??z,{...a,type:t??"language"}).of(e),"Intl/formatDate":(e,t,n)=>new Intl.DateTimeFormat(t??z,{timeZone:za,...n}).format(new Date(e)),"Intl/formatList":(e,t,n)=>new Intl.ListFormat(t??z,n).format(e),"Intl/formatNumber":(e,t,n)=>new Intl.NumberFormat(t??z,n).format(e),"Intl/formatRelativeTime":(e,t,n,a)=>new Intl.RelativeTimeFormat(n??z,a).format(e,t),"Intl/plural":(e,t,n)=>new Intl.PluralRules(t??z,n).select(e),"Intl/segment":(e,t,n)=>[...new Intl.Segmenter(n??z,{granularity:t??"grapheme"}).segment(e)].map((a)=>a.segment)};function Rs(e,t,n){let a=Wa[e];if(a===void 0||a<0||t[a]!=null)return t;let r=n.$page?.locale;if(typeof r!=="string"||r==="")return t;let i=[...t];return i[a]=r,i}function Ds(e){return e.startsWith("window#/")&&_S.has(e.slice(8))}function Fm(e){return Ba.has(e)}var _a=64,Ps=64;function L(e,t){if(!e)return;let n=(e.depth??0)+1;if(n>Ps)return;return{depth:n,path:[...e.path??[],...Array.isArray(t)?t:[t]],report:e.report}}function H(e,t,n,a,o){if(e===null||e===void 0)return e;if(typeof e==="object"&&!Array.isArray(e)&&"operator"in e)return qs(e,t,n,a,o);if(typeof e==="object"&&!Array.isArray(e)&&"$ref"in e){let r=Xe(e.$ref,t,n,a);return o?.report(o.path??[],r),r}if(Array.isArray(e))return e.map((r,i)=>H(r,t,n,a,L(o,i)));return o?.report(o.path??[],e),e}function Fs(e,t,n,a){let o=(r)=>{if(!e.slice(r.length).includes("/"))return t;return Xe(e.slice(0,e.lastIndexOf("/")),t,n,a)};if(e.startsWith("#/state/"))return o("#/state/");if(e.startsWith("parent#/"))return o("parent#/");if(e.startsWith("$map/")||e.startsWith("$args/"))return e.split("/").length>2?Xe(e.slice(0,e.lastIndexOf("/")),t,n,a):void 0;return}function Xe(e,t,n,a){if(e==="$reduce/acc")return a?.acc;if(e.startsWith("$reduce/"))return a?.acc;if(e.startsWith("$args/")){let o=e.slice(6).split("/"),r=a?.args?.[o[0]];return o.length>1?_(r,o.slice(1).join("/")):r}if(e.startsWith("event#/")){let o=e.slice(7);return _(n,o)}if(e.startsWith("$map/")){let o=e.split("/"),[,r]=o,i,s=Zt(t);if(r==="item")i=a?.item??s?.item??t["$map/item"];else if(r==="index")i=a?.index??s?.index??t["$map/index"];else i=s?.[r]??t[`$map/${r}`];return o.length>2?_(i,o.slice(2).join("/")):i}if(e.startsWith("#/state/"))return P(t,e.slice(8));if(e.startsWith("parent#/"))return P(t,e.slice(8));if(e.startsWith("window#/"))return _(globalThis.window,e.slice(8));if(e.startsWith("document#/"))return _(globalThis.document,e.slice(10));return P(t,e)??null}function Zs(e,t,n,a){if(e.startsWith("$map/")){let o=e.split("/"),[,r]=o,i,s=Zt(t);if(r==="item")i=a?.item??s?.item??t["$map/item"];else if(r==="index")i=a?.index??s?.index??t["$map/index"];else i=s?.[r]??t[`$map/${r}`];if(o.length>2){let d=o.slice(2),l=d.pop(),h=d.length>0?_(i,d.join("/")):i;return{key:l,obj:h}}return{key:r==="item"?"$map/item":"$map/index",obj:Zt(t)??t}}if(e.startsWith("#/state/")){let o=e.slice(8);if(o.indexOf("/")===-1)return{key:o,obj:t};let i=Ft(o),s=i.pop(),d=t;for(let l of i)d=d[l];return{key:s,obj:d}}return{key:e,obj:t}}function qs(e,t,n,a,o){let r=zs(e,t,n,a,o);return o?.report(o.path??[],r),r}function zs(e,t,n,a,o){let{operator:r,target:i,value:s,initial:d}=e;if(!xS.has(r))throw Error(`$expression: unknown operator "${r}"`);if(qa.has(r)&&!("value"in e)){let l=H(i,t,n,a,L(o,"target"));if(r==="!")return!l;if(r==="-")return-l}if(r==="call"){let l=i?.$ref;if(typeof l!=="string")throw TypeError("$expression: call target must be a $ref pointer");let h=(a?.callDepth??0)+1;if(h>_a)throw Error(`$expression: call depth exceeded (${_a})`);let c=Array.isArray(s)?s.map((p,g)=>H(p,t,n,a,L(o,["value",g]))):[];if(l.startsWith("window#/")){if(!Ds(l))throw Error(`$expression: "${l}" is not a blessed pure global`);let p=l.slice(8),g=Os[p];if(g)return g(...Rs(p,c,t));let b=_(globalThis.window,p),f=p.lastIndexOf("/"),m=f===-1?globalThis.window:_(globalThis.window,p.slice(0,f));return b.apply(m,c)}let u=Xe(l,t,n,a);if(typeof u==="function")return u.apply(Fs(l,t,n,a),c);if(u&&typeof u==="object"&&"$expression"in u){let p=u,g={};for(let[b,f]of(p.parameters??[]).entries()){let m=typeof f==="string"?f:f?.name??"";if(!m)continue;g[m]=c[b]===void 0&&typeof f==="object"&&f!==null&&"default"in f?f.default:c[b]}return qs(p.$expression,t,n,{args:g,callDepth:h})}throw TypeError(`$expression: call target "${l}" is not callable`)}if(Ga.has(r)){if(r==="?:"){let p=H(i,t,n,a,L(o,"target"));if(o){let g=H(s,t,n,a,L(o,"value")),b=H(d,t,n,a,L(o,"initial"));return p?g:b}return p?H(s,t,n,a):H(d,t,n,a)}let l=H(i,t,n,a,L(o,"target")),h=String(l),c=e.cases??{},u=Object.hasOwn(c,h);if(o){let p;for(let[b,f]of Object.entries(c)){let m=H(f,t,n,a,L(o,["cases",b]));if(b===h)p=m}let g=H(e.default,t,n,a,L(o,"default"));return u?p:g}return u?H(c[h],t,n,a):H(e.default,t,n,a)}if(Ka.has(r)){let l=H(i,t,n,a,L(o,"target")),h=H(s,t,n,a,L(o,"value"));switch(r){case"+":return l+h;case"-":return l-h;case"*":return l*h;case"/":return l/h;case"%":return l%h;case"===":return l===h;case"!==":return l!==h;case"<":return l<h;case"<=":return l<=h;case">":return l>h;case">=":return l>=h;case"&&":return l&&h;case"||":return l||h;case"??":return l??h;default:break}}if(Is.has(r)){let l=H(s,t,n,a,L(o,"value")),{obj:h,key:c}=Zs(i.$ref,t,n,a);switch(r){case"=":{h[c]=l;break}case"+=":{let u=h[c];h[c]=u+l;break}case"-=":{let u=h[c];h[c]=u-l;break}case"*=":{let u=h[c];h[c]=u*l;break}case"/=":{let u=h[c];h[c]=u/l;break}default:break}return}if(Cs.has(r)){let l=H(i,t,n,a,L(o,"target"));switch(r){case"push":return l.push(H(s,t,n,a,L(o,"value")));case"unshift":return l.unshift(H(s,t,n,a,L(o,"value")));case"pop":return l.pop();case"shift":return l.shift();case"splice":{let h=H(s,t,n,a,L(o,"value"));return l.splice(...h)}default:break}}if($p.has(r)){let l=H(i,t,n,a,L(o,"target")),h=s===void 0?[]:Array.isArray(s)?H(s,t,n,a,L(o,"value")):[H(s,t,n,a,L(o,"value"))],c=l?.[r];if(typeof c!=="function")return;return c.apply(l,h)}if(Ua.has(r)){let l=H(i,t,n,a,L(o,"target"));if(r==="reduce"){let h=H(d,t,n,a,L(o,"initial"));for(let[c,u]of l.entries())h=qs(s,t,n,{acc:h,index:c,item:u},c===0?L(o,"value"):void 0);return h}if(r==="map")return l.map((h,c)=>qs(s,t,n,{...a,index:c,item:h},c===0?L(o,"value"):void 0));if(r==="filter")return l.filter((h,c)=>qs(s,t,n,{...a,index:c,item:h},c===0?L(o,"value"):void 0))}return}function _(e,t){return P(e,t)}function Y(e,t,n,a){return H(e,t,n,a)}function Js(e){if("operator"in e)return"expression";if("if"in e)return"if";if("$switch"in e)return"switch";if("stopPropagation"in e)return"stopPropagation";if("preventDefault"in e)return"preventDefault";return"dispatch"}async function se(e,t,n,a={}){let o=a.args?{args:a.args}:void 0;for(let r of e)switch(Js(r)){case"expression":{let i=qs(r,t,n,o);if(i&&typeof i.then==="function")await i;break}case"if":{let i=r,s=Y(i.if,t,n,o)?i.then:i.else;if(Array.isArray(s))await se(s,t,n,a);break}case"switch":{let i=r,s=String(Y(i.$switch,t,n,o)),d=i.cases??{},l=Object.hasOwn(d,s)?d[s]:i.default;if(Array.isArray(l))await se(l,t,n,a);break}case"dispatch":{let i=r,s=typeof a.target==="function"?a.target():a.target,d=n?.currentTarget??s;if(!d)break;let l={};if("detail"in i)l.detail=Y(i.detail,t,n,o);if(i.bubbles!==void 0)l.bubbles=i.bubbles;if(i.composed!==void 0)l.composed=i.composed;d.dispatchEvent(new CustomEvent(i.dispatchEvent,l));break}case"stopPropagation":{n?.stopPropagation();break}case"preventDefault":{n?.preventDefault();break}default:break}}function eo(e,t){for(let n of e.split(";")){let a=n.indexOf("=");if(a===-1)continue;if(n.slice(0,a).trim()===t)return n.slice(a+1)}return null}function to(e,t,n){let a=e.startsWith("__Host-"),o=[`${e}=${encodeURIComponent(JSON.stringify(t))}`];if(n.maxAge!==void 0)o.push(`Max-Age=${n.maxAge}`);let r=a?"/":n.path;if(r)o.push(`Path=${r}`);if(n.domain&&!a)o.push(`Domain=${n.domain}`);let{sameSite:i}=n;if(n.secure===!0||a||e.startsWith("__Secure-")||i?.toLowerCase()==="none")o.push("Secure");if(i)o.push(`SameSite=${i}`);return o.join("; ")}var no=1,oo=!1;function Vs(e){if(oo||typeof e!=="string")return;let t=e.match(/\/schema\/v(\d+)\b/);if(t&&Number(t[1])!==no)oo=!0,console.warn(`Jx: document $schema is version v${t[1]} but this runtime supports v${no}. Behavior may be undefined; there is no format migrator yet.`)}var Ws=/^[$#]/;function _s(e){for(let t of Object.keys(e))if(Ws.test(t))throw TypeError(`Jx mount: host scope key "${t}" is reserved — names beginning with "$" or "#" are `+"runtime vocabulary")}async function SI(e,t,n={}){let a=n.scope??{};_s(a);let o=n.base?new URL(n.base,location.href).href:location.href,r={base:o,media:n.media??e.$media??null,root:null,...n.resolver?{resolver:n.resolver}:{},...n.skipServerFunctions===void 0?{}:{skipServerFunctions:n.skipServerFunctions},...n.skipAutoRequests===void 0?{}:{skipAutoRequests:n.skipAutoRequests}};if(Vs(e.$schema),e.$elements)await st(e.$elements,o,r);if(e.$head)Zl(e.$head,o);let i=await Ap(e,a,o,r),s=new Set,d={_ctx:r,onNodeCreated:(g,b,f,m)=>{if(g instanceof Element&&g.tagName.includes("-"))s.add(g.tagName.toLowerCase());n.onNodeCreated?.(g,b,f,m)},...n.onNodeMoved?{onNodeMoved:n.onNodeMoved}:{}},{result:l,stop:h}=CS(()=>Ja(e,i,d));r.root=l;let c=!1,u=!1,p=()=>{if(u)return;if(u=!0,n.signal?.removeEventListener("abort",p),h(),c&&typeof i.onUnmount==="function")i.onUnmount(i);l.remove()};if(n.signal?.aborted)p();else if(n.signal?.addEventListener("abort",p,{once:!0}),t.append(l),c=!0,typeof i.onMount==="function")i.onMount(i);return{scope:i,root:l,elements:s,dispose:p}}var Se=new Map;function Wx(e,t){let n=Promise.resolve(t);Se.set(e,n);try{Se.set(new URL(e,location.href).href,n)}catch{}}async function Kt(e,t){if(typeof e!=="string")return e;let n=t?.resolver?.(e);if(n)return n;if(Se.has(e))return Se.get(e);let a=fetch(e).then(async(o)=>{if(!o.ok)throw Error(`Jx: failed to fetch ${e} (${o.status})`);if((o.headers?.get("Content-Type")??"").includes("text/html"))throw Error(`Jx: ${e} returned HTML, not a document — the host answered a missing file with its `+"app shell (a single-page fallback), so this path is not served.");return await o.json()});return Se.set(e,a),a}var Bs=new Set(["type","properties","items","enum","minimum","maximum","minLength","maxLength","pattern","required","examples"]),yo={skip:!1};function Dp(e){yo.skip=e}var Us={skip:!1};var ro=null;function ko(e){return ro?`${e}?token=${encodeURIComponent(ro)}`:e}function CS(e){let t=ge(!0);try{return{result:t.run(e),stop:()=>t.stop()}}catch(n){throw t.stop(),n}}var Ys=!1;var Xs=/(-?\d*\.?\d+)(?:s|l|d)?v(h|w|min|max|i|b)\b/gi,Qs={b:"cqb",h:"cqh",i:"cqi",max:"cqmax",min:"cqmin",w:"cqw"};function tl(e){if(!Ys||!e.includes("v"))return e;return e.replace(Xs,(t,n,a)=>`${n}${Qs[a.toLowerCase()]??`cq${a}`}`)}var nl=!1;var $o=!1;var jo=!1;var et=!1;function Jt(e){return et||e.dataset.jxPath!==void 0}function al(e,t){if(nl&&t==="href"&&(e.tagName==="A"||e.tagName==="AREA"))return"data-jx-href";if($o&&t==="popover"&&Jt(e))return"data-jx-popover";if(jo&&Jt(e)){if(t==="commandfor")return"data-jx-commandfor";if(t==="inert")return"data-jx-inert";if(t==="open"&&e.tagName==="DIALOG")return"data-jx-open"}return t}var de=null;function SS(e){de=e}var ol=new Set(["src","poster","data"]),rl=new Set(["srcset","imagesrcset"]),il=new Set(["LINK"]);function sl(e,t){return ol.has(t)||t==="href"&&il.has(e)}function ot(e,t,n){if(!de||n==="")return n;let a=t.toLowerCase();if(rl.has(a)){let o=OI(n),r=!1,i=o.map((s)=>{let d=de?.(s.url,a)??null;if(d===null||d===s.url)return s;return r=!0,{descriptor:s.descriptor,url:d}});return r?MI(i):n}if(!sl(e,a))return n;return de(n,a)??n}var ll=/\burl\(\s*(?<q>["']?)(?<u>[^"')]*)\k<q>\s*\)/g;function dl(e){if(!de||!e.includes("url("))return e;return e.replaceAll(ll,(t,n,a)=>{let o=a===""?null:de?.(a,"url()")??null;return o===null?t:`url(${n}${o}${n})`})}function io(e){return tl(dl(e))}var cl=!1;var hl=/^\s*\$\{\s*state\.(\w+)\s*\}\s*$/;function ul(e,t,n){if(!cl||e!=="textContent")return null;let a=null;if(N(t)){if(!t.$ref.startsWith("#/state/"))return null;let r=t.$ref.slice(8);a=r&&!r.includes("/")?r:null}else if(typeof t==="string")a=hl.exec(t)?.[1]??null;if(!a)return null;let o=re(n)[a];if(Hd(o)||typeof o==="function")return null;if(typeof o==="object"&&o!==null)return null;return a}async function Ap(e,t={},n=location.href,a){let o=()=>a?.root??null,r={},i=e.state??{},s=Vm(t);for(let c of Object.keys(t))if(s&&!(c in i))Object.defineProperty(r,c,{configurable:!0,enumerable:!0,get:()=>t[c],set:(u)=>{t[c]=u}});else r[c]=t[c];let d=e.imports??{};for(let[,c]of Object.entries(i))if($S(c)&&!c.$src){let u=d[c.$prototype];if(u){if(!u.endsWith(".class.json")){console.warn(`Jx: import "${c.$prototype}" must map to a .class.json path, got "${u}"`);continue}c.$src=u}}for(let[c,u]of Object.entries(i)){if(typeof u==="string"){if(!u.includes("${"))r[c]=u;continue}if(typeof u==="number"||typeof u==="boolean"||u===null){r[c]=u;continue}if(Array.isArray(u)){r[c]=u;continue}if(typeof u==="object"){if(u.$prototype)continue;if(ba(u))continue;if(DS(u))continue;if("default"in u){r[c]=u.default;continue}if(pl(u))continue;r[c]=u}}let l=v(r);for(let[c,u]of Object.entries(i))if(typeof u==="string"&&u.includes("${"))l[c]=Bd(()=>J(u,l));for(let[c,u]of Object.entries(i))if(ba(u)){let p=u.$expression;if(Ov(u)){let g=u.parameters;l[c]=(...b)=>{let f={};for(let[m,x]of g.entries()){let y=typeof x==="string"?x:x?.name??"";if(!y)continue;f[y]=b[m]===void 0&&typeof x==="object"&&x!==null&&"default"in x?x.default:b[m]}return qs(p,l,null,{args:f})}}else if(Fm(p.operator)){let g=(b,f)=>qs(p,b,f);l[c]=g}else l[c]=Bd(()=>qs(p,l,null))}for(let[c,u]of Object.entries(i))if(RS(u)){let{body:p}=u;if(Array.isArray(u.parameters)&&u.parameters.length>0){let g=u.parameters;l[c]=(...b)=>{let f={};for(let[m,x]of g.entries()){let y=typeof x==="string"?x:x?.name??"";if(!y)continue;f[y]=b[m]===void 0&&typeof x==="object"&&x!==null&&"default"in x?x.default:b[m]}return se(p,l,null,{args:f,target:o})}}else{let g=(b,f)=>{se(p,b,f??null,{target:o})};l[c]=g}}else if(Za(u))l[c]=await bl(u,l,c,n);for(let[c,u]of Object.entries(i))if($S(u))l[c]=await Ml(u,l,c,n,a);if(!(a?.skipServerFunctions??yo.skip)){for(let[c,u]of Object.entries(i))if(DS(u))l[c]=await Cl(u,l,c,n)}let h=a?.media??Fl;if(e.$media)l.$media=e.$media;else if(!l.$media&&Object.keys(h).length>0)l.$media=h;return l}function pl(e){for(let t of Object.keys(e))if(Bs.has(t))return!0;return!1}function J(e,t){let n=t?.$map;return Function("state","$map","item","index",`return \`${e}\``)(t,n,n?.item,n?.index)}function fl(e){if(!e.startsWith("${")||!e.endsWith("}"))return!1;let t=0;for(let n=1;n<e.length;n+=1){let a=e[n];if(a==="{")t+=1;else if(a==="}"){if(t-=1,t===0)return n===e.length-1}}return!1}function ml(e,t){if(!fl(e))return J(e,t);let n=t?.$map;return Function("state","$map","item","index",`return (${e.slice(2,-1)})`)(t,n,n?.item,n?.index)}var X=new Map,le=new Map;function So(e,t){if(typeof t==="function"){X.delete(e),le.set(e,t);return}le.delete(e),X.set(e,t)}function Ut(e){let t=X.get(e);if(t)return t;let n=le.get(e);if(!n)return;if(typeof n!=="function")return n;let a=Promise.resolve(n()).then((o)=>(X.set(e,o),le.delete(e),o),(o)=>{throw le.set(e,n),o});return le.set(e,a),a}async function bl(e,t,n,a){if(e.body&&e.$src)throw Error(`Jx: '${n}' declares both body and $src — these are mutually exclusive`);if(!e.body&&!e.$src){let s=Vt(e),d=Function(...s,"");return Object.defineProperty(d,"name",{configurable:!0,value:e.name??n}),d}let o;if(typeof e.body==="string"){let s=Vt(e);o=Function(...s,e.body),Object.defineProperty(o,"name",{configurable:!0,value:e.name??n})}else{let s=e.$src;if(!s)throw Error(`Jx: '${n}' has neither body nor $src`);let d=e.$export??n,l,h=Ut(s);if(h instanceof Promise)l=await h;else if(h)l=h;else{if(a){let u=new URL(s,a).href;try{l=await import(u)}catch{l=await import(s)}}else l=await import(s);X.set(s,l)}let c=l[d]??l.default?.[d];if(typeof c!=="function")throw TypeError(`Jx: export "${d}" not found or not a function in "${s}"`);o=c}let r=(e.parameters??e.arguments??[]).length>0,i=!1;if(!r){if(typeof e.body==="string")i=AS(e.body);else if(o)i=o.length<=1&&AS(o.toString())}if(i)return Bd(()=>o(t));return o}function Vt(e){let t=e.parameters?Mv(e.parameters):e.arguments??[];return t.length>0&&t[0]==="state"?t:["state",...t]}var Gt=new Set(["$schema","$id","$defs","state","$ref","$props","$elements","$title","$description","$switch","$prototype","$src","$export","$media","$map","timing","default","description","body","parameters","arguments","name","tagName","children","style","attributes","items","map","filter","sort","cases","observedAttributes"]),so=new Set,gl="http://www.w3.org/2000/svg",wl="http://www.w3.org/1998/Math/MathML";function xl(e,t){if(e==="svg")return gl;if(e==="math")return wl;return t??null}function Ja(e,t,n){let a=n?._path??[];if(typeof e==="string"||typeof e==="number"||typeof e==="boolean"){let c=document.createTextNode(String(e));if(typeof e==="string"&&Ks(e))Q(()=>{c.textContent=J(e,t)});return c}let o=t;for(let[c,u]of Object.entries(e))if(c.startsWith("$")&&!Gt.has(c)){if(o===t)o=Object.create(t);o[c]=N(u)?O(u.$ref,t):u}if("$ref"in e&&!e.tagName){let c=String(e.$ref??"");if(!so.has(c))so.add(c),console.warn(`Jx: a $ref child ("${c}") is not a supported component instance; register the `+"component in $elements and use its custom-element tag instead (spec §13).")}let r=Qt(e.tagName,o),i=r.includes("-")&&customElements.get(r);if(e.$props&&i)return vo(e,o,n,a);if(e.$props){if(r.includes("-"))return vo(e,o,n,a);let{$props:c,...u}=e;return Ja(u,Pl(e,o),n)}if(e.$switch)return Al(e,o,n);let s=xl(r,n?._ns),d=r==="foreignObject"?null:s,l=s?document.createElementNS(s,r):document.createElement(r);if(n?.onNodeCreated)n.onNodeCreated(l,a,e,o);if(Yt(l,e,o),e.style&&r.includes("-"))Xt.set(l,e.style);rt(l,e.style??{},o.$media??{},o),it(l,e.attributes??{},o);let h=e.children;if(Ux(h)){let c=n||d?{...n,_ns:d,_path:[...a,"children"]}:void 0;Bt(l,h,o,c)}else if(Array.isArray(h))for(let c=0;c<h.length;c++){let u=h[c],p=n||d?{...n,_ns:d,_path:[...a,"children",c]}:void 0;if(Ux(u))Bt(l,u,o,p);else l.append(Ja(u,o,p))}return l}function Yt(e,t,n){for(let[a,o]of Object.entries(t)){if(Gt.has(a))continue;if(a.startsWith("$"))continue;if(a.startsWith("on")&&To(e,a,o,n))continue;Eo(e,a,o,n)}}function To(e,t,n,a){let o=t.slice(2),r=a;if(N(n)){let i=O(n.$ref,a);if(typeof i==="function"){let s=i;e.addEventListener(o,(d)=>s(r,d))}return!0}if(RS(n)){let{body:i}=n;return e.addEventListener(o,(s)=>{se(i,r,s)}),!0}if(Za(n)&&typeof n.body==="string"){let i=Vt(n),s=Function(...i,n.body);return e.addEventListener(o,(d)=>s(r,d)),!0}if(ba(n)){let i=n.$expression;return e.addEventListener(o,(s)=>qs(i,r,s)),!0}return!1}function vl(e,t,n){for(let[a,o]of Object.entries(t))if(a.startsWith("on")&&!Gt.has(a))To(e,a,o,n)}function Eo(e,t,n,a){let o=e,r=ul(t,n,a);if(r)e.dataset.jxBoundProp=r;let i=(d)=>typeof d==="string"?ot(e.tagName,t,d):d,s=(d)=>{let l=e;if(t==="className"&&!(l instanceof HTMLElement)){l.setAttribute("class",d==null?"":String(d));return}if(o[t]===d)return;o[t]=d};if(N(n)){let d=n;if(t==="id"){o[t]=O(d.$ref,a);return}Q(()=>{s(i(O(d.$ref,a)))});return}if(Ks(n)){Q(()=>{s(i(J(n,a)))});return}s(i(n))}function lo(e,t){let n=[];return{detach:t,insert(a){let o=[];for(let i of a){let s=e.cssRules.length;try{e.insertRule(i,s)}catch{continue}let d=e.cssRules[s];if(d)o.push(d)}let r={rules:o,texts:a};return n.push(r),r},remove(a){let o=n.indexOf(a);if(o!==-1)n.splice(o,1);if(a.rules.length===0)return;let r=[...e.cssRules],i=a.rules.map((s)=>r.indexOf(s)).filter((s)=>s>=0).toSorted((s,d)=>d-s);for(let s of i)e.deleteRule(s);a.rules.length=0},replaceAll(a){n.length=0,n.push({rules:[],texts:a}),e.replaceSync(a.join(`
1
+ import{II,RI}from"./studio-693nhyky.js";import{nt,Ot,Za,ba,Mv,Tk,Lk,Ik,Vx,Ks,Rk,ih,va,Pv,Hd,Mp}from"./studio-nbxqcgvf.js";import{ge,Xa,Q,sh,ah,Ux,v,Hm,Bm,re,Bd,Qa,el,zd}from"./studio-fqq890ap.js";import{$i}from"./studio-0bbxhhce.js";var Ht={};$i(Ht,{SUBMENU_PLACEMENT:()=>Sa,clampIntoViewport:()=>ae,ensureCaret:()=>_k,focusRow:()=>Z,hideMenu:()=>oe,onMenuBeforeToggle:()=>cs,onMenuKeydown:()=>ds,onMenuPointerOver:()=>fs,onMenuToggle:()=>hs,openSubmenu:()=>At,parentRowOf:()=>U,rootMenuOf:()=>Ue,rowsOf:()=>W,showMenu:()=>Ta,submenuOf:()=>ie});var Et={};$i(Et,{anchorOf:()=>ye,clampIntoViewport:()=>ae,close:()=>Fd,measureAnchor:()=>ja,onBeforeToggle:()=>es,onToggle:()=>ts,onTransitionEnd:()=>ns,openAt:()=>zl,supportsAnchorPositioning:()=>te});function te(){let e=globalThis.CSS;return typeof e?.supports==="function"&&e.supports("position-area","block-end")}function ya(e){return e}var Be=new WeakMap;function ka(e){let t=e.currentTarget;return t instanceof HTMLElement?t:null}function ye(e){return Be.get(e)??null}function zl(e,t){let n=ya(e);if(typeof n.showPopover!=="function")return;if(!t){n.showPopover();return}Be.set(e,t);try{Yi(n,t)}catch(a){throw Be.delete(e),a}}function Yi(e,t){try{e.showPopover?.({source:t})}catch(n){if(!(n instanceof TypeError))throw n;e.showPopover?.()}}function Fd(e){let t=ya(e);if(typeof t.hidePopover==="function")t.hidePopover()}function Xi(e){let{id:t}=e;if(!t)return null;for(let n of e.ownerDocument.querySelectorAll("[popovertarget]"))if(n.getAttribute("popovertarget")===t)return n;return null}function $a(e,t){let{source:n}=t;if(n instanceof Element)return n;return ye(e)??Xi(e)}function ja(e,t,n=ye(t)){if(e.matchWidth!==!0||!n)return;let a=n.getBoundingClientRect();if(a.width>0)e.anchorWidth=Math.round(a.width)}function Qi(e,t){let n=()=>{if(typeof t.getAnimations==="function"&&t.getAnimations().length>0)return;e.settling=!1};if(typeof requestAnimationFrame==="function")requestAnimationFrame(n);else n()}function es(e,t){let n=ka(t);if(!n)return;let a=t.newState==="open",o=Number(e.floor??0);e.anchored=a&&o<=0&&$a(n,t)!==null}function ts(e,t){let n=ka(t);if(!n)return;let a=t.newState==="open";if(e.open=a,e.settling=!0,a){if(ja(e,n,$a(n,t)),!(e.anchored===!0&&te()))ae(e,n,{floor:Number(e.floor??0)})}else Be.delete(n);Qi(e,n)}function ns(e,t){if(t.target===t.currentTarget)e.settling=!1}function as(e){let t=Number.parseFloat(getComputedStyle(e).marginBlockStart);return Number.isFinite(t)&&t>0?t:0}function ae(e,t,n={}){let a=()=>{let o=t.getBoundingClientRect();if(o.width===0&&o.height===0)return;let r=4,i=n.floor&&n.floor>0?n.floor:window.innerHeight;if(o.right>window.innerWidth-r){let s=n.flipAgainst??null,d=s?Math.round(s.getBoundingClientRect().left)-o.width+2:-1;e.x=d>=r?d:Math.max(r,Math.round(window.innerWidth-o.width-r))}if(o.bottom>i)e.y=Math.max(r,Math.round(i-o.height-as(t)))};if(typeof requestAnimationFrame==="function")requestAnimationFrame(a);else a()}var qe="jx-menu-item",G="jx-menu",Sa="inline-end span-block-end";function Ke(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===G?t:null}function os(e,t){return t instanceof Element&&t.closest(G)===e}function W(e,t={}){let n=[...e.querySelectorAll(qe)].filter((a)=>a.closest(G)===e);return t.includeDisabled?n:n.filter((a)=>a.getAttribute("aria-disabled")!=="true")}function ie(e){for(let t of e.querySelectorAll(G))if(t.parentElement?.closest(qe)===e)return t;return null}function U(e){return e.parentElement?.closest(qe)??null}function Ue(e){let t=e;for(;;){let n=U(t),a=n?.closest(G);if(!n||!(a instanceof HTMLElement))return t;t=a}}function Ge(e){return e.open===!0}function Ta(e,t){if(!Ge(e))zl(e,t??null)}function oe(e){if(Ge(e)&&typeof e.hidePopover==="function")e.hidePopover()}function Z(e,t){if(e.length===0)return null;let n=(t%e.length+e.length)%e.length;for(let[o,r]of e.entries())r.tabIndex=o===n?0:-1;let a=e[n];return a.focus(),a}function rs(e,t){return e.findIndex((n)=>n===t||t instanceof Node&&n.contains(t))}function At(e,t={}){let n=ie(e);if(!n)return null;let a=e.getBoundingClientRect();if(n.x=Math.round(a.right)-2,n.y=Math.round(a.top)-4,e.expanded=!0,Ta(n,e),t.focus)Z(W(n),0);return n}function Mt(e,t=null){for(let n of W(e,{includeDisabled:!0})){if(n===t)continue;let a=ie(n);if(a)oe(a)}}function is(e){return e.querySelector('[part="label"]')?.textContent??e.textContent??""}function ss(e,t,n){let a=e.map((o)=>is(o).trim().toLowerCase());for(let o=1;o<=a.length;o++){let r=(t+o)%a.length;if(a[r].startsWith(n))return r}return-1}function ls(e){return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?e.key.toLowerCase():null}function ds(e,t){let n=Ke(t);if(!n||!os(n,t.target))return;let a=W(n),o=rs(a,t.target);switch(t.key){case"ArrowDown":{Z(a,o+1);break}case"ArrowUp":{Z(a,o===-1?-1:o-1);break}case"Home":{Z(a,0);break}case"End":{Z(a,-1);break}case"Enter":case" ":{a[o]?.click();break}case"ArrowRight":{let r=a[o];if(!r||!ie(r))return;Mt(n,r),At(r,{focus:!0});break}case"ArrowLeft":{let r=U(n);if(!r)return;oe(n),r.focus();break}case"Escape":{let r=U(n);oe(n),r?.focus();break}case"Tab":{oe(Ue(n));break}default:{let r=ls(t);if(r===null)return;let i=ss(a,o,r);if(i===-1)return;Z(a,i)}}t.preventDefault(),t.stopPropagation()}function cs(e,t){let n=Ke(t);if(!n)return;let a=t.newState==="open",o=String(e.placement??"")||(U(n)?Sa:"");e.area=o;let{source:r}=t,i=r instanceof Element?r:ye(n);e.anchored=a&&o!==""&&i!==null&&!us(n)}function hs(e,t){let n=Ke(t);if(!n)return;let a=t.newState==="open";e.open=a;let o=U(n);if(!a){if(Mt(n),o)o.expanded=!1;return}if(!(e.anchored===!0&&te()))ae(e,n,{flipAgainst:o?.closest(G)??null,floor:ps(n)});if(!n.contains(document.activeElement))Z(W(n),0)}function us(e){return Number(Ue(e).floor??0)>0}function ps(e){let t=Number(Ue(e).floor??0);return t>0?t:window.innerHeight}function _k(e){if(e.contains(document.activeElement))return;let t=e;for(;;){let a=W(t,{includeDisabled:!0}).map((o)=>ie(o)).find((o)=>o!==null&&Ge(o));if(!a)break;t=a}let n=U(t);if(W(t).length===0&&n){oe(t),n.focus();return}Z(W(t),0)}function fs(e,t){let n=Ke(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest(qe);if(!a||a.closest(G)!==n)return;let o=ie(a);if(Mt(n,a),o&&!Ge(o)&&a.getAttribute("aria-disabled")!=="true")At(a)}var ms=["auto","manual","hint"],Ea=new Set(["button","input"]),kk="auto";function Wl(e){return nt(e.attributes)?e.attributes:{}}function Kr(e,t){let n=Wl(e)[t];return typeof n==="string"?n:null}function ro(e){return typeof e.tagName==="string"?e.tagName.toLowerCase():""}function Jr(e,t="the popover"){let n=typeof e.id==="string"?e.id:Kr(e,"id");if(n)return`#${n}`;let a=ro(e);return a===""?t:`the <${a}>`}function bs(e){let t=Wl(e).popover;return typeof t==="string"?t:null}var gs=["popovertarget","popovertargetaction","command","commandfor"];function Aa(e){let t=new Set,n=new Set;for(let a of e){let o=typeof a?.tagName==="string"?a.tagName:"";if(!o.includes("-"))continue;if(Lt(a))t.add(o);let r=a.observedAttributes;if(Array.isArray(r)&&gs.every((i)=>r.includes(i)))n.add(o)}return{invokerTags:n,popoverTags:t}}function Lt(e){return"popover"in Wl(e)||"popover"in e}function Gs(e,t){return Lt(e)||(t?.popoverTags?.has(ro(e))??!1)}function nh(e){if(typeof e.id==="string"&&e.id!=="")return e.id;let t=Kr(e,"id");return t===""?null:t}function*Ya(e,t=[],n=null,a){yield{enclosing:n,node:e,path:t};let o=Gs(e,a)?e:n,{children:r}=e;if(Array.isArray(r)){for(let[d,l]of r.entries())if(l&&typeof l==="object")yield*Ya(l,[...t,"children",d],o,a)}else if(nt(r)&&nt(r.map))yield*Ya(r.map,[...t,"children","map"],o,a);let i=nt(e.map)?e.map:null;if(i)yield*Ya(i,[...t,"map"],o,a);let s=nt(e.cases)?e.cases:{};for(let[d,l]of Object.entries(s))if(l&&typeof l==="object")yield*Ya(l,[...t,"cases",d],o,a)}function Fm(e,t){let n=[];for(let{node:a}of Ya(e,[],null,t)){if(!Gs(a,t))continue;let o=nh(a);if(o!==null&&!n.includes(o))n.push(o)}return n}function wI(e,t){for(let{node:n}of Ya(e,[],null,t))if(Gs(n,t))return!0;return!1}function Ye(e){return e.startsWith("@")}function Ma(e){return e.startsWith(":")||e.startsWith("&")||e.startsWith(".")||e.startsWith("[")}function Qo(e,t){let n=e?.[t];if(n===void 0||ih(n)||Array.isArray(n))return null;return String(n)}function Ha(e){for(let[t,n]of Object.entries(e??{})){if(!ih(n))continue;if(Ma(t)&&t.includes(":popover-open")&&Qo(n,"display")!==null)return!0;if(Ye(t)&&Ha(n))return!0}return!1}function La(e){for(let[t,n]of Object.entries(e??{})){if(!ih(n))continue;if(Ma(t)&&t.includes(":popover-open"))return!0;if(Ye(t)&&La(n))return!0}return!1}var ws=["flexDirection","flex-direction","alignItems","align-items","justifyContent","justify-content","flexWrap","flex-wrap","gridTemplateColumns","grid-template-columns","gridTemplateRows","grid-template-rows","gap"];function xs(e){return ws.some((t)=>Qo(e,t)!==null)}function Na(e){if(!e)return[];let t=[];for(let[n,a]of Object.entries(e))if(Ye(n)&&ih(a)&&Qo(a,"display")!==null)t.push(n);return t}function Ia(e){if(!e)return[];let t=[],n=Qo(e,"transition");if(n!==null)t.push(n);for(let[a,o]of Object.entries(e))if(Ye(a)&&ih(o))t.push(...Ia(o));return t}function vs(e){if(!e)return!1;if(Qo(e,"positionAnchor")!==null||Qo(e,"position-anchor")!==null)return!0;return["top","left","right","bottom","inset","insetBlockStart","insetInlineStart"].some((t)=>(Qo(e,t)??"").includes("anchor("))}function ys(e){if(!e)return!1;if(Qo(e,"positionArea")!==null||Qo(e,"position-area")!==null||Qo(e,"positionTryFallbacks")!==null||Qo(e,"position-try-fallbacks")!==null)return!0;return Object.keys(e).some((t)=>t.startsWith("@supports"))}var R="See docs/framework/concepts/overlays.";function xI(e,t){let n=[...Ya(e,[],null,t)],a=Fm(e,t),o=n.some(({node:s})=>Gs(s,t)),r=new Set;for(let{node:s}of n)if(Ea.has(ro(s))){let d=Kr(s,"popovertarget");if(d!==null)r.add(d)}let i=[];for(let{enclosing:s,node:d,path:l}of n)if(i.push(...ks(d,l,s,a,o,t)),Lt(d))i.push(...$s(d,l,r));return i}function ks(e,t,n,a,o,r){let i=[],s=ro(e),d=Kr(e,"popovertarget"),l=Ea.has(s)||(r?.invokerTags?.has(s)??!1);if(d!==null&&!l)return i.push({detail:"`popovertarget` and `popovertargetaction` come from the `PopoverTargetAttributes` IDL mixin, which HTML includes into `HTMLButtonElement` and `HTMLInputElement` and into nothing else. Elsewhere they parse and do nothing. A link inside an open popover "+"dismisses it by navigating away, which is why this looks like it works — but it does "+`not for a new tab or a same-page fragment. Remove both attributes. ${R}`,fix:"invoker",message:`<${s||"element"}> carries popovertarget, which only <button> and <input> support.`,path:t,rule:"invoker-not-button",severity:"error"}),i;if(d!==null){if(o&&!a.includes(d)){let h=a.length>0?`The popovers here are: ${a.map((c)=>`"${c}"`).join(", ")}. `:"";i.push({detail:`No element in this document declares \`popover\` with the id "${d}". ${h}A target that names nothing does nothing, silently. ${R}`,message:`popovertarget="${d}" names no popover in this document.`,path:t,rule:"target-missing",severity:"error"})}else if(n!==null&&nh(n)!==null&&nh(n)!==d)i.push({detail:`This control is inside ${Jr(n)} but targets "${d}". Dismissing a different popover leaves the one the reader is looking at open. This is usually a copy-paste between two panels in the same file. ${R}`,message:`A control inside ${Jr(n)} targets "${d}" instead.`,path:t,rule:"target-mismatch",severity:"warn"})}if(s==="a"&&n!==null&&d===null){let h=Kr(e,"href")??(typeof e.href==="string"?e.href:null),c=Kr(e,"target")==="_blank",u=h!==null&&h.includes("#");if(c||u){let p=c?"it opens a new tab, so the panel stays open on the page behind it. ":"it is a same-document fragment, so the page scrolls behind the open panel. ";i.push({detail:`A link inside a panel normally dismisses it by navigating away. This one does not: ${p}`+"There is no declarative fix — a link cannot carry `popovertarget`. Move it out of the "+`panel, make it a <button>, or accept it deliberately. ${R}`,message:`A link inside ${Jr(n)} does not dismiss it.`,path:t,rule:"link-does-not-dismiss",severity:"warn"})}}return i}function $s(e,t,n){let a=[],{style:o}=e,r=Jr(e),i=bs(e);if(i!==null&&i!==""&&!ms.includes(i))a.push({detail:"`popover` is an enumerated attribute taking `auto`, `manual` or `hint`. Anything else falls back to the invalid-value default `manual`, which gives up light dismiss and gives "+`up Escape — so the panel opens and there is no way to close it. Write "auto". ${R}`,fix:"mode",message:`${r} declares popover="${i}", which is not one of auto, manual or hint.`,path:t,rule:"invalid-mode",severity:"error"});else if(typeof Wl(e).popover==="boolean")a.push({detail:`\`popover\` carries its value in its text, so a boolean is not the right shape. Written as \`true\` it reaches two of the compiler's emitters as \`popover="true"\`, which is not one of the three keywords, so HTML falls back to \`manual\`: no light dismiss, no Escape, and the trigger stops toggling. Write "auto". ${R}`,fix:"mode",message:`${r} writes popover as a boolean.`,path:t,rule:"invalid-mode",severity:"error"});let s=Qo(o,"display");if(s!==null&&s!=="revert"&&s!=="revert-layer")a.push({detail:"A closed popover is hidden by the browser's own `[popover]:not(:popover-open) { display: none }`. That rule is UA-origin, so any author `display` beats it at any specificity, and "+"the panel is laid out on every page whether it is open or not — usually parked off the "+`side of the viewport by the transform meant to animate it, so nothing looks wrong until you scroll sideways. \`display\` belongs in \`:popover-open\` and nowhere else. ${R}`,fix:"display",message:`${r} sets display in its base rule.`,path:t,rule:"base-display",severity:"error"});for(let l of Na(o))a.push({detail:`The same defect as a base \`display\`, arriving through \`${l}\` and therefore only at `+"one width — which is what makes it hard to see. Gate the TRIGGER on a breakpoint, never "+`the panel: the popover mechanism is what hides the panel. ${R}`,fix:"display",message:`${r} sets display inside ${l}.`,path:t,rule:"breakpoint-display",severity:"error"});if(Qo(o,"visibility")!==null)a.push({detail:`A second hiding mechanism the browser already provides. Once \`display\` leaves the base rule this one only adds a frame of flicker on open, and it hides the element from assistive technology in a way \`display: none\` already did. ${R}`,fix:"display",message:`${r} also hides itself with visibility.`,path:t,rule:"base-visibility",severity:"warn"});if(!La(o))a.push({detail:"Nothing changes when it opens, so no transition on it can run and — if `display` is not "+"in the base rule — the panel has no `display` at all while open. This is usually a panel "+`that was styled before it was made a popover. ${R}`,message:`${r} has no :popover-open rule.`,path:t,rule:"no-open-rule",severity:"warn"});else if(!Ha(o)&&s===null&&xs(o))a.push({detail:`${r} declares flex or grid properties, but neither its base rule nor its `+"`:popover-open` rule sets a `display` for them to apply to — and the base rule must not "+`(that is what keeps the closed panel hidden). So it opens with the UA's \`display: block\` and the layout silently does nothing. Put \`display: flex\` in \`:popover-open\`. ${R}`,fix:"open-display",message:`${r} is laid out with flex or grid but never sets display.`,path:t,rule:"no-open-display",severity:"error"});for(let l of Ia(o))if(l.includes("display")&&!l.includes("overlay")){a.push({detail:"`display …allow-discrete` keeps the box alive while it animates out; `overlay "+"…allow-discrete` is what keeps it in the TOP LAYER for those same milliseconds. "+`Without it the panel drops behind the page content and the backdrop disappears a frame early, so the exit reads as a flicker rather than an animation. ${R}`,message:`${r} transitions display but not overlay.`,path:t,rule:"cut-exit",severity:"warn"});break}if(vs(o)&&!ys(o))a.push({detail:"When `anchor()` does not resolve, every inset it feeds computes to `auto` — and a "+`\`position: fixed\` box with four \`auto\` insets falls back to its STATIC position, which for a panel declared inside a header is in the middle of the header. Use \`position-area\` with \`position-try-fallbacks\`, or add a \`@supports\` block that positions it without anchors. ${R}`,message:`${r} is anchor-positioned with no fallback.`,path:t,rule:"unsafe-anchor",severity:"warn"});let d=nh(e);if(d!==null&&!n.has(d))a.push({detail:`No \`<button>\` or \`<input>\` in this document names it with \`popovertarget\`. If it is opened from another file or from a function that calls \`showPopover()\`, this is fine; otherwise there is no way for a reader to open it. ${R}`,message:`${r} has no invoker in this document.`,path:t,rule:"no-invoker",severity:"warn"});return a}function _I(e){if(!e)return null;let t=[];if(Qo(e,"display")!==null)t.push("display");if(Qo(e,"visibility")!==null)t.push("visibility");let n=Na(e);if(t.length===0&&n.length===0)return null;let a=va(e,":popover-open")??va(e,"&:popover-open"),o=Qo(a,"display")!==null?null:Qo(e,"display")??null;return{base:t,breakpoints:n,openDisplay:o}}var Ca=el(null);function kI(e){Ca.value=e}function ne(){return Ca.value}function Oa(e){return e.replaceAll(/[A-Z]/g,(t)=>`-${t.toLowerCase()}`)}var js=new Set(["all","print","screen","speech"]);function Ra(e,t){if(e.startsWith("@--"))return t[e.slice(1)]??e.slice(1);if(e.startsWith("@(")){let n=e.slice(2,-1).trim();return js.has(n.toLowerCase())?n:e.slice(1)}return null}function Nt(e){return e.startsWith("@position-try")||e.startsWith("@property")||e.startsWith("@font-face")||e.startsWith("@counter-style")}function $v(e){return e.startsWith("@keyframes")}function Da(e,t){let n=[];for(let a of It(e))for(let o of It(t))n.push(Ss(a,o));return n.join(", ")}function Ss(e,t){if(t.startsWith("&"))return t.replaceAll("&",e);if(t.startsWith("[")||t.startsWith(":")||t.startsWith("."))return`${e}${t}`;return`${e} ${t}`}function It(e){let t=[],n=0,a=null,o=0;for(let i=0;i<e.length;i+=1){let s=e[i];if(a){if(s==="\\")i+=1;else if(s===a)a=null;continue}if(s==='"'||s==="'")a=s;else if(s==="("||s==="[")n+=1;else if(s===")"||s==="]")n=Math.max(0,n-1);else if(s===","&&n===0)t.push(e.slice(o,i)),o=i+1}t.push(e.slice(o));let r=t.map((i)=>i.trim()).filter((i)=>i!=="");return r.length>0?r:[e]}var Ts=/[\s>+~,()]/,Es=/^[A-Za-z_\u{00A0}-\u{FFFF}][\w\u{00A0}-\u{FFFF}-]*/u;function As(e,t){let n="",a=0;for(;;){let o=e.indexOf("[open]",a);if(o===-1)return n+e.slice(a);let r=o;while(r>0&&!Ts.test(e[r-1]))r-=1;let i=Es.exec(e.slice(r,o))?.[0]?.toLowerCase(),s=i===void 0?t.dialog===!0:i==="dialog";n+=e.slice(a,o)+(s?"[data-jx-dialog-open]":"[open]"),a=o+6}}function Ct(e,t={}){if(e.includes("::backdrop"))return null;let n=e.replaceAll(":popover-open","[data-jx-popover-open]").replaceAll(":modal","[data-jx-dialog-open]").replaceAll("[inert]","[data-jx-inert]");return As(n,t)}var ke="data-color-scheme";function Dv(e){return/^\(\s*prefers-color-scheme\s*:\s*(light|dark)\s*\)$/.exec(e.trim())?.[1]??null}function Pa(e,t){if(e===":root"||e==="html")return{auto:`${e}:where(:not([${ke}]))`,forced:`${e}:where([${ke}="${t}"])`};return{auto:`:where(:root:not([${ke}])) ${e}`,forced:`:where(:root[${ke}="${t}"]) ${e}`}}function Rt(e){return e.startsWith(":")||e.startsWith(".")||e.startsWith("&")||e.startsWith("[")}function Dt(e){return e.startsWith("--")?e:Oa(e)}function $e(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Fa(e,t,n){let a=n.map(([r,i])=>`${r}: ${i}`).join("; "),o=t===null?a:`${t} { ${a} }`;for(let r=e.length-1;r>=0;r-=1)o=`${e[r]} { ${o} }`;return o}function Ms(e,t,n){let a=n.map(({selector:r,declarations:i})=>`${r} { ${i.map(([s,d])=>`${s}: ${d}`).join("; ")} }`).join(" "),o=`@keyframes ${t} { ${a} }`;for(let r=e.length-1;r>=0;r-=1)o=`${e[r]} { ${o} }`;return o}function Hs(e){let t=Object.keys(e).filter((a)=>$v(a));if(t.length===0)return e;let n={...e};for(let a of t)delete n[a];return n}function Ls(e){let t=e.startsWith("&")?e.slice(1):e;return t===""||t.startsWith(":")||t.startsWith(".")||t.startsWith("[")}function je(e,t={}){let{scope:n=null,mediaQueries:a={},transposeValue:o=(f)=>f,transposeSelector:r=(f)=>f,resolveValue:i}=t,s=[],d=(f)=>f!==null&&typeof f==="object"&&!Array.isArray(f)&&!Ot(f),l=(f,m)=>{if(d(m))return[m];if(!Nt(f)||!Array.isArray(m)||m.length===0)return[];return m.every((x)=>d(x))?m:[]},h=(f,m,x,y)=>{if(m===void 0||m===null)return null;if(Ot(m))return x?i?.(f,m,y)??null:null;if(typeof m==="object")return null;let k=String(m);if(Ks(k))return x?i?.(f,k,y)??null:null;return o(k)},c=(f,m,x=!0,y="self")=>{let k=[];for(let[T,I]of Object.entries(f)){if(l(T,I).length>0)continue;if(m&&(T.startsWith("@")||Rt(T)))continue;if(T.startsWith("$"))continue;let j=h(T,I,x,y);if(j!==null)k.push([Dt(T),j])}return k},u=(f,m,x,y,k)=>{if(x.length===0)return;let T=m;if(T!==null){let j=r(T);if(j===null)return;T=j}let I=Fa(f,T,x);s.push({text:I,conditions:[...f],selector:T,declarations:x,target:y,key:$e(I),...typeof k==="string"&&k!==""?{description:k}:{}})},p=(f,m,x)=>{let y=f.slice(10).trim();if(y==="")return;let k=[];for(let[I,j]of Object.entries(m)){if(!d(j))continue;let C=c(j,!0,!1,"unscoped");if(C.length>0)k.push({declarations:C,selector:I.trim()})}if(k.length===0)return;let T=Ms(x,y,k);s.push({blocks:k,conditions:[...x],declarations:[],key:$e(T),selector:null,target:"unscoped",text:T})},g=(f,m,x,y,k)=>{if(f==="@--")return;if(Nt(f)){u([...y,f],null,c(m,!1,!0,"unscoped"),"unscoped",m.$description);return}if($v(f)){p(f,m,y);return}let T=Ra(f,a),I=T===null?f:`@media ${T}`,j=T===null?null:Dv(T);if(j!==null&&x!==null){let{auto:C,forced:w}=Pa(x,j);b(m,C,[...y,I],k),b(Hs(m),w,y,k);return}b(m,x,[...y,I],k)};function b(f,m,x,y){u(x,m,c(f,!0,!0,y),y,f.$description);for(let[k,T]of Object.entries(f))for(let I of l(k,T))if(k.startsWith("@"))g(k,I,m,x,y);else if(m!==null)b(I,Da(m,k),x,Ls(k)?y:"descendant")}return b(e,n,[],"self"),s}var z="en-US",za="UTC",Va=[{api:"Intl.NumberFormat",params:["value","locale","options"],path:"Intl/formatNumber",summary:"Format a number for a locale — grouping, decimals, currency, percent, units."},{api:"Intl.DateTimeFormat",params:["value","locale","options"],path:"Intl/formatDate",summary:"Format a date or timestamp for a locale. Pass `timeZone` in options."},{api:"Intl.RelativeTimeFormat",params:["value","unit","locale","options"],path:"Intl/formatRelativeTime",summary:'Format a relative time — `-3, "day"` becomes "3 days ago".'},{api:"Intl.ListFormat",params:["values","locale","options"],path:"Intl/formatList",summary:'Join a list the way a locale does — "a, b, and c", not a hand-written comma join.'},{api:"Intl.PluralRules",params:["value","locale","options"],path:"Intl/plural",summary:'Which plural category a number falls in ("one", "few", "other") — many languages have '+"more than two, so a ternary on `n === 1` is wrong outside English."},{api:"Intl.Collator",params:["a","b","locale","options"],path:"Intl/compare",summary:'Compare two strings for sorting. `<` and `sort()` order by UTF-16 code unit, which puts "Zebra" before "apple" and sorts every accented word into the wrong place.'},{api:"Intl.DisplayNames",params:["code","type","locale","options"],path:"Intl/displayName",summary:'The name of a language, region, script or currency in a locale — "de" as "German" or '+'"Deutsch", from CLDR rather than a hand-kept table.'},{api:"Intl.Segmenter",params:["value","granularity","locale"],path:"Intl/segment",summary:"Split text into graphemes, words or sentences (UAX #29). `[...str]` splits code points, so it cuts an emoji with a skin-tone modifier in half."}],Pt=Va.map((e)=>e.path),Wa=Object.fromEntries(Va.map((e)=>[e.path,e.params.indexOf("locale")]));function bI(){return`the Intl helpers ${Pt.join(", ")}`}function Ns(e){return e.replaceAll("~1","/").replaceAll("~0","~")}function Ft(e){if(e==="")return[];return e.split("/").map((t)=>Ns(t))}function P(e,t){let n=e;for(let a of Ft(t))n=n?.[a];return n}function Zt(e){let t=e.$map;return t&&typeof t==="object"?t:void 0}var Ba=new Set(["=","+=","-=","*=","/=","push","pop","shift","unshift","splice"]),qa=new Set(["!","-"]),Ka=new Set(["+","-","*","/","%","===","!==","<","<=",">",">=","&&","||","??"]),Is=new Set(["=","+=","-=","*=","/="]),Cs=new Set(["push","pop","shift","unshift","splice"]),Ua=new Set(["reduce","map","filter"]),Ga=new Set(["?:","switch"]),Rp=new Set(["includes","indexOf","lastIndexOf","join","slice","concat","at","flat","toSorted","toReversed","toSpliced","with","toUpperCase","toLowerCase","trim","trimStart","trimEnd","split","startsWith","endsWith","padStart","padEnd","replaceAll","repeat","charAt","normalize","toLocaleUpperCase","toLocaleLowerCase","toFixed","toPrecision","toLocaleString"]),vk=new Set([...Ba,...qa,...Ka,...Ua,...Ga,...Rp,"call"]),yk=new Set(["isNaN","isFinite","parseFloat","parseInt","encodeURIComponent","decodeURIComponent","structuredClone","Math/abs","Math/ceil","Math/floor","Math/round","Math/trunc","Math/sign","Math/sqrt","Math/cbrt","Math/pow","Math/exp","Math/log","Math/log2","Math/log10","Math/min","Math/max","Math/hypot","Number/isInteger","Number/isFinite","Number/isNaN","Number/parseFloat","Number/parseInt","JSON/parse","JSON/stringify","Object/keys","Object/values","Object/entries","Object/fromEntries","Array/from","Array/isArray","Array/of","String/fromCharCode","String/fromCodePoint",...Pt]),Os={"Intl/compare":(e,t,n,a)=>new Intl.Collator(n??z,a).compare(e,t),"Intl/displayName":(e,t,n,a)=>new Intl.DisplayNames(n??z,{...a,type:t??"language"}).of(e),"Intl/formatDate":(e,t,n)=>new Intl.DateTimeFormat(t??z,{timeZone:za,...n}).format(new Date(e)),"Intl/formatList":(e,t,n)=>new Intl.ListFormat(t??z,n).format(e),"Intl/formatNumber":(e,t,n)=>new Intl.NumberFormat(t??z,n).format(e),"Intl/formatRelativeTime":(e,t,n,a)=>new Intl.RelativeTimeFormat(n??z,a).format(e,t),"Intl/plural":(e,t,n)=>new Intl.PluralRules(t??z,n).select(e),"Intl/segment":(e,t,n)=>[...new Intl.Segmenter(n??z,{granularity:t??"grapheme"}).segment(e)].map((a)=>a.segment)};function Rs(e,t,n){let a=Wa[e];if(a===void 0||a<0||t[a]!=null)return t;let r=n.$page?.locale;if(typeof r!=="string"||r==="")return t;let i=[...t];return i[a]=r,i}function Ds(e){return e.startsWith("window#/")&&yk.has(e.slice(8))}function Om(e){return Ba.has(e)}var _a=64,Ps=64;function L(e,t){if(!e)return;let n=(e.depth??0)+1;if(n>Ps)return;return{depth:n,path:[...e.path??[],...Array.isArray(t)?t:[t]],report:e.report}}function H(e,t,n,a,o){if(e===null||e===void 0)return e;if(typeof e==="object"&&!Array.isArray(e)&&"operator"in e)return qs(e,t,n,a,o);if(typeof e==="object"&&!Array.isArray(e)&&"$ref"in e){let r=Xe(e.$ref,t,n,a);return o?.report(o.path??[],r),r}if(Array.isArray(e))return e.map((r,i)=>H(r,t,n,a,L(o,i)));return o?.report(o.path??[],e),e}function Fs(e,t,n,a){let o=(r)=>{if(!e.slice(r.length).includes("/"))return t;return Xe(e.slice(0,e.lastIndexOf("/")),t,n,a)};if(e.startsWith("#/state/"))return o("#/state/");if(e.startsWith("parent#/"))return o("parent#/");if(e.startsWith("$map/")||e.startsWith("$args/"))return e.split("/").length>2?Xe(e.slice(0,e.lastIndexOf("/")),t,n,a):void 0;return}function Xe(e,t,n,a){if(e==="$reduce/acc")return a?.acc;if(e.startsWith("$reduce/"))return a?.acc;if(e.startsWith("$args/")){let o=e.slice(6).split("/"),r=a?.args?.[o[0]];return o.length>1?_(r,o.slice(1).join("/")):r}if(e.startsWith("event#/")){let o=e.slice(7);return _(n,o)}if(e.startsWith("$map/")){let o=e.split("/"),[,r]=o,i,s=Zt(t);if(r==="item")i=a?.item??s?.item??t["$map/item"];else if(r==="index")i=a?.index??s?.index??t["$map/index"];else i=s?.[r]??t[`$map/${r}`];return o.length>2?_(i,o.slice(2).join("/")):i}if(e.startsWith("#/state/"))return P(t,e.slice(8));if(e.startsWith("parent#/"))return P(t,e.slice(8));if(e.startsWith("window#/"))return _(globalThis.window,e.slice(8));if(e.startsWith("document#/"))return _(globalThis.document,e.slice(10));return P(t,e)??null}function Zs(e,t,n,a){if(e.startsWith("$map/")){let o=e.split("/"),[,r]=o,i,s=Zt(t);if(r==="item")i=a?.item??s?.item??t["$map/item"];else if(r==="index")i=a?.index??s?.index??t["$map/index"];else i=s?.[r]??t[`$map/${r}`];if(o.length>2){let d=o.slice(2),l=d.pop(),h=d.length>0?_(i,d.join("/")):i;return{key:l,obj:h}}return{key:r==="item"?"$map/item":"$map/index",obj:Zt(t)??t}}if(e.startsWith("#/state/")){let o=e.slice(8);if(o.indexOf("/")===-1)return{key:o,obj:t};let i=Ft(o),s=i.pop(),d=t;for(let l of i)d=d[l];return{key:s,obj:d}}return{key:e,obj:t}}function qs(e,t,n,a,o){let r=zs(e,t,n,a,o);return o?.report(o.path??[],r),r}function zs(e,t,n,a,o){let{operator:r,target:i,value:s,initial:d}=e;if(!vk.has(r))throw Error(`$expression: unknown operator "${r}"`);if(qa.has(r)&&!("value"in e)){let l=H(i,t,n,a,L(o,"target"));if(r==="!")return!l;if(r==="-")return-l}if(r==="call"){let l=i?.$ref;if(typeof l!=="string")throw TypeError("$expression: call target must be a $ref pointer");let h=(a?.callDepth??0)+1;if(h>_a)throw Error(`$expression: call depth exceeded (${_a})`);let c=Array.isArray(s)?s.map((p,g)=>H(p,t,n,a,L(o,["value",g]))):[];if(l.startsWith("window#/")){if(!Ds(l))throw Error(`$expression: "${l}" is not a blessed pure global`);let p=l.slice(8),g=Os[p];if(g)return g(...Rs(p,c,t));let b=_(globalThis.window,p),f=p.lastIndexOf("/"),m=f===-1?globalThis.window:_(globalThis.window,p.slice(0,f));return b.apply(m,c)}let u=Xe(l,t,n,a);if(typeof u==="function")return u.apply(Fs(l,t,n,a),c);if(u&&typeof u==="object"&&"$expression"in u){let p=u,g={};for(let[b,f]of(p.parameters??[]).entries()){let m=typeof f==="string"?f:f?.name??"";if(!m)continue;g[m]=c[b]===void 0&&typeof f==="object"&&f!==null&&"default"in f?f.default:c[b]}return qs(p.$expression,t,n,{args:g,callDepth:h})}throw TypeError(`$expression: call target "${l}" is not callable`)}if(Ga.has(r)){if(r==="?:"){let p=H(i,t,n,a,L(o,"target"));if(o){let g=H(s,t,n,a,L(o,"value")),b=H(d,t,n,a,L(o,"initial"));return p?g:b}return p?H(s,t,n,a):H(d,t,n,a)}let l=H(i,t,n,a,L(o,"target")),h=String(l),c=e.cases??{},u=Object.hasOwn(c,h);if(o){let p;for(let[b,f]of Object.entries(c)){let m=H(f,t,n,a,L(o,["cases",b]));if(b===h)p=m}let g=H(e.default,t,n,a,L(o,"default"));return u?p:g}return u?H(c[h],t,n,a):H(e.default,t,n,a)}if(Ka.has(r)){let l=H(i,t,n,a,L(o,"target")),h=H(s,t,n,a,L(o,"value"));switch(r){case"+":return l+h;case"-":return l-h;case"*":return l*h;case"/":return l/h;case"%":return l%h;case"===":return l===h;case"!==":return l!==h;case"<":return l<h;case"<=":return l<=h;case">":return l>h;case">=":return l>=h;case"&&":return l&&h;case"||":return l||h;case"??":return l??h;default:break}}if(Is.has(r)){let l=H(s,t,n,a,L(o,"value")),{obj:h,key:c}=Zs(i.$ref,t,n,a);switch(r){case"=":{h[c]=l;break}case"+=":{let u=h[c];h[c]=u+l;break}case"-=":{let u=h[c];h[c]=u-l;break}case"*=":{let u=h[c];h[c]=u*l;break}case"/=":{let u=h[c];h[c]=u/l;break}default:break}return}if(Cs.has(r)){let l=H(i,t,n,a,L(o,"target"));switch(r){case"push":return l.push(H(s,t,n,a,L(o,"value")));case"unshift":return l.unshift(H(s,t,n,a,L(o,"value")));case"pop":return l.pop();case"shift":return l.shift();case"splice":{let h=H(s,t,n,a,L(o,"value"));return l.splice(...h)}default:break}}if(Rp.has(r)){let l=H(i,t,n,a,L(o,"target")),h=s===void 0?[]:Array.isArray(s)?H(s,t,n,a,L(o,"value")):[H(s,t,n,a,L(o,"value"))],c=l?.[r];if(typeof c!=="function")return;return c.apply(l,h)}if(Ua.has(r)){let l=H(i,t,n,a,L(o,"target"));if(r==="reduce"){let h=H(d,t,n,a,L(o,"initial"));for(let[c,u]of l.entries())h=qs(s,t,n,{acc:h,index:c,item:u},c===0?L(o,"value"):void 0);return h}if(r==="map")return l.map((h,c)=>qs(s,t,n,{...a,index:c,item:h},c===0?L(o,"value"):void 0));if(r==="filter")return l.filter((h,c)=>qs(s,t,n,{...a,index:c,item:h},c===0?L(o,"value"):void 0))}return}function _(e,t){return P(e,t)}function Y(e,t,n,a){return H(e,t,n,a)}function Js(e){if("operator"in e)return"expression";if("if"in e)return"if";if("$switch"in e)return"switch";if("stopPropagation"in e)return"stopPropagation";if("preventDefault"in e)return"preventDefault";return"dispatch"}async function se(e,t,n,a={}){let o=a.args?{args:a.args}:void 0;for(let r of e)switch(Js(r)){case"expression":{let i=qs(r,t,n,o);if(i&&typeof i.then==="function")await i;break}case"if":{let i=r,s=Y(i.if,t,n,o)?i.then:i.else;if(Array.isArray(s))await se(s,t,n,a);break}case"switch":{let i=r,s=String(Y(i.$switch,t,n,o)),d=i.cases??{},l=Object.hasOwn(d,s)?d[s]:i.default;if(Array.isArray(l))await se(l,t,n,a);break}case"dispatch":{let i=r,s=typeof a.target==="function"?a.target():a.target,d=n?.currentTarget??s;if(!d)break;let l={};if("detail"in i)l.detail=Y(i.detail,t,n,o);if(i.bubbles!==void 0)l.bubbles=i.bubbles;if(i.composed!==void 0)l.composed=i.composed;d.dispatchEvent(new CustomEvent(i.dispatchEvent,l));break}case"stopPropagation":{n?.stopPropagation();break}case"preventDefault":{n?.preventDefault();break}default:break}}function eo(e,t){for(let n of e.split(";")){let a=n.indexOf("=");if(a===-1)continue;if(n.slice(0,a).trim()===t)return n.slice(a+1)}return null}function to(e,t,n){let a=e.startsWith("__Host-"),o=[`${e}=${encodeURIComponent(JSON.stringify(t))}`];if(n.maxAge!==void 0)o.push(`Max-Age=${n.maxAge}`);let r=a?"/":n.path;if(r)o.push(`Path=${r}`);if(n.domain&&!a)o.push(`Domain=${n.domain}`);let{sameSite:i}=n;if(n.secure===!0||a||e.startsWith("__Secure-")||i?.toLowerCase()==="none")o.push("Secure");if(i)o.push(`SameSite=${i}`);return o.join("; ")}var no=1,ao=!1;function Vs(e){if(ao||typeof e!=="string")return;let t=e.match(/\/schema\/v(\d+)\b/);if(t&&Number(t[1])!==no)ao=!0,console.warn(`Jx: document $schema is version v${t[1]} but this runtime supports v${no}. Behavior may be undefined; there is no format migrator yet.`)}var Ws=/^[$#]/;function _s(e){for(let t of Object.keys(e))if(Ws.test(t))throw TypeError(`Jx mount: host scope key "${t}" is reserved — names beginning with "$" or "#" are `+"runtime vocabulary")}async function vI(e,t,n={}){let a=n.scope??{};_s(a);let o=n.base?new URL(n.base,location.href).href:location.href,r={base:o,media:n.media??e.$media??null,root:null,...n.resolver?{resolver:n.resolver}:{},...n.skipServerFunctions===void 0?{}:{skipServerFunctions:n.skipServerFunctions},...n.skipAutoRequests===void 0?{}:{skipAutoRequests:n.skipAutoRequests}};if(Vs(e.$schema),e.$elements)await st(e.$elements,o,r);if(e.$head)Zl(e.$head,o);let i=await Dp(e,a,o,r),s=new Set,d={_ctx:r,onNodeCreated:(g,b,f,m)=>{if(g instanceof Element&&g.tagName.includes("-"))s.add(g.tagName.toLowerCase());n.onNodeCreated?.(g,b,f,m)},...n.onNodeMoved?{onNodeMoved:n.onNodeMoved}:{}},{result:l,stop:h}=wk(()=>Ja(e,i,d));r.root=l;let c=!1,u=!1,p=()=>{if(u)return;if(u=!0,n.signal?.removeEventListener("abort",p),h(),c&&typeof i.onUnmount==="function")i.onUnmount(i);l.remove()};if(n.signal?.aborted)p();else if(n.signal?.addEventListener("abort",p,{once:!0}),t.append(l),c=!0,typeof i.onMount==="function")i.onMount(i);return{scope:i,root:l,elements:s,dispose:p}}var Se=new Map;function zx(e,t){let n=Promise.resolve(t);Se.set(e,n);try{Se.set(new URL(e,location.href).href,n)}catch{}}async function Kt(e,t){if(typeof e!=="string")return e;let n=t?.resolver?.(e);if(n)return n;if(Se.has(e))return Se.get(e);let a=fetch(e).then(async(o)=>{if(!o.ok)throw Error(`Jx: failed to fetch ${e} (${o.status})`);if((o.headers?.get("Content-Type")??"").includes("text/html"))throw Error(`Jx: ${e} returned HTML, not a document — the host answered a missing file with its `+"app shell (a single-page fallback), so this path is not served.");return await o.json()});return Se.set(e,a),a}var Bs=new Set(["type","properties","items","enum","minimum","maximum","minLength","maxLength","pattern","required","examples"]),yo={skip:!1};function $p(e){yo.skip=e}var Us={skip:!1};var oo=null;function ko(e){return oo?`${e}?token=${encodeURIComponent(oo)}`:e}function wk(e){let t=ge(!0);try{return{result:t.run(e),stop:()=>t.stop()}}catch(n){throw t.stop(),n}}var Ys=!1;var Xs=/(-?\d*\.?\d+)(?:s|l|d)?v(h|w|min|max|i|b)\b/gi,Qs={b:"cqb",h:"cqh",i:"cqi",max:"cqmax",min:"cqmin",w:"cqw"};function tl(e){if(!Ys||!e.includes("v"))return e;return e.replace(Xs,(t,n,a)=>`${n}${Qs[a.toLowerCase()]??`cq${a}`}`)}var nl=!1;var $o=!1;var jo=!1;var et=!1;function Jt(e){return et||e.dataset.jxPath!==void 0}function al(e,t){if(nl&&t==="href"&&(e.tagName==="A"||e.tagName==="AREA"))return"data-jx-href";if($o&&t==="popover"&&Jt(e))return"data-jx-popover";if(jo&&Jt(e)){if(t==="commandfor")return"data-jx-commandfor";if(t==="inert")return"data-jx-inert";if(t==="open"&&e.tagName==="DIALOG")return"data-jx-open"}return t}var de=null;function xk(e){de=e}var ol=new Set(["src","poster","data"]),rl=new Set(["srcset","imagesrcset"]),il=new Set(["LINK"]);function sl(e,t){return ol.has(t)||t==="href"&&il.has(e)}function ot(e,t,n){if(!de||n==="")return n;let a=t.toLowerCase();if(rl.has(a)){let o=II(n),r=!1,i=o.map((s)=>{let d=de?.(s.url,a)??null;if(d===null||d===s.url)return s;return r=!0,{descriptor:s.descriptor,url:d}});return r?RI(i):n}if(!sl(e,a))return n;return de(n,a)??n}var ll=/\burl\(\s*(?<q>["']?)(?<u>[^"')]*)\k<q>\s*\)/g;function dl(e){if(!de||!e.includes("url("))return e;return e.replaceAll(ll,(t,n,a)=>{let o=a===""?null:de?.(a,"url()")??null;return o===null?t:`url(${n}${o}${n})`})}function io(e){return tl(dl(e))}var cl=!1;var hl=/^\s*\$\{\s*state\.(\w+)\s*\}\s*$/;function ul(e,t,n){if(!cl||e!=="textContent")return null;let a=null;if(N(t)){if(!t.$ref.startsWith("#/state/"))return null;let r=t.$ref.slice(8);a=r&&!r.includes("/")?r:null}else if(typeof t==="string")a=hl.exec(t)?.[1]??null;if(!a)return null;let o=re(n)[a];if(Bd(o)||typeof o==="function")return null;if(typeof o==="object"&&o!==null)return null;return a}async function Dp(e,t={},n=location.href,a){let o=()=>a?.root??null,r={},i=e.state??{},s=Bm(t);for(let c of Object.keys(t))if(s&&!(c in i))Object.defineProperty(r,c,{configurable:!0,enumerable:!0,get:()=>t[c],set:(u)=>{t[c]=u}});else r[c]=t[c];let d=e.imports??{};for(let[,c]of Object.entries(i))if(Lk(c)&&!c.$src){let u=d[c.$prototype];if(u){if(!u.endsWith(".class.json")){console.warn(`Jx: import "${c.$prototype}" must map to a .class.json path, got "${u}"`);continue}c.$src=u}}for(let[c,u]of Object.entries(i)){if(typeof u==="string"){if(!u.includes("${"))r[c]=u;continue}if(typeof u==="number"||typeof u==="boolean"||u===null){r[c]=u;continue}if(Array.isArray(u)){r[c]=u;continue}if(typeof u==="object"){if(u.$prototype)continue;if(ba(u))continue;if(Ik(u))continue;if("default"in u){r[c]=u.default;continue}if(pl(u))continue;r[c]=u}}let l=v(r);for(let[c,u]of Object.entries(i))if(typeof u==="string"&&u.includes("${"))l[c]=zd(()=>J(u,l));for(let[c,u]of Object.entries(i))if(ba(u)){let p=u.$expression;if(Mv(u)){let g=u.parameters;l[c]=(...b)=>{let f={};for(let[m,x]of g.entries()){let y=typeof x==="string"?x:x?.name??"";if(!y)continue;f[y]=b[m]===void 0&&typeof x==="object"&&x!==null&&"default"in x?x.default:b[m]}return qs(p,l,null,{args:f})}}else if(Om(p.operator)){let g=(b,f)=>qs(p,b,f);l[c]=g}else l[c]=zd(()=>qs(p,l,null))}for(let[c,u]of Object.entries(i))if(Tk(u)){let{body:p}=u;if(Array.isArray(u.parameters)&&u.parameters.length>0){let g=u.parameters;l[c]=(...b)=>{let f={};for(let[m,x]of g.entries()){let y=typeof x==="string"?x:x?.name??"";if(!y)continue;f[y]=b[m]===void 0&&typeof x==="object"&&x!==null&&"default"in x?x.default:b[m]}return se(p,l,null,{args:f,target:o})}}else{let g=(b,f)=>{se(p,b,f??null,{target:o})};l[c]=g}}else if(Za(u))l[c]=await bl(u,l,c,n);for(let[c,u]of Object.entries(i))if(Lk(u))l[c]=await Ml(u,l,c,n,a);if(!(a?.skipServerFunctions??yo.skip)){for(let[c,u]of Object.entries(i))if(Ik(u))l[c]=await Cl(u,l,c,n)}let h=a?.media??Fl;if(e.$media)l.$media=e.$media;else if(!l.$media&&Object.keys(h).length>0)l.$media=h;return l}function pl(e){for(let t of Object.keys(e))if(Bs.has(t))return!0;return!1}function J(e,t){let n=t?.$map;return Function("state","$map","item","index",`return \`${e}\``)(t,n,n?.item,n?.index)}function fl(e){if(!e.startsWith("${")||!e.endsWith("}"))return!1;let t=0;for(let n=1;n<e.length;n+=1){let a=e[n];if(a==="{")t+=1;else if(a==="}"){if(t-=1,t===0)return n===e.length-1}}return!1}function ml(e,t){if(!fl(e))return J(e,t);let n=t?.$map;return Function("state","$map","item","index",`return (${e.slice(2,-1)})`)(t,n,n?.item,n?.index)}var X=new Map,le=new Map;function So(e,t){if(typeof t==="function"){X.delete(e),le.set(e,t);return}le.delete(e),X.set(e,t)}function Ut(e){let t=X.get(e);if(t)return t;let n=le.get(e);if(!n)return;if(typeof n!=="function")return n;let a=Promise.resolve(n()).then((o)=>(X.set(e,o),le.delete(e),o),(o)=>{throw le.set(e,n),o});return le.set(e,a),a}async function bl(e,t,n,a){if(e.body&&e.$src)throw Error(`Jx: '${n}' declares both body and $src — these are mutually exclusive`);if(!e.body&&!e.$src){let s=Vt(e),d=Function(...s,"");return Object.defineProperty(d,"name",{configurable:!0,value:e.name??n}),d}let o;if(typeof e.body==="string"){let s=Vt(e);o=Function(...s,e.body),Object.defineProperty(o,"name",{configurable:!0,value:e.name??n})}else{let s=e.$src;if(!s)throw Error(`Jx: '${n}' has neither body nor $src`);let d=e.$export??n,l,h=Ut(s);if(h instanceof Promise)l=await h;else if(h)l=h;else{if(a){let u=new URL(s,a).href;try{l=await import(u)}catch{l=await import(s)}}else l=await import(s);X.set(s,l)}let c=l[d]??l.default?.[d];if(typeof c!=="function")throw TypeError(`Jx: export "${d}" not found or not a function in "${s}"`);o=c}let r=(e.parameters??e.arguments??[]).length>0,i=!1;if(!r){if(typeof e.body==="string")i=Rk(e.body);else if(o)i=o.length<=1&&Rk(o.toString())}if(i)return zd(()=>o(t));return o}function Vt(e){let t=e.parameters?Pv(e.parameters):e.arguments??[];return t.length>0&&t[0]==="state"?t:["state",...t]}var Gt=new Set(["$schema","$id","$defs","state","$ref","$props","$elements","$title","$description","$switch","$prototype","$src","$export","$media","$map","timing","default","description","body","parameters","arguments","name","tagName","children","style","attributes","items","map","filter","sort","cases","observedAttributes"]),so=new Set,gl="http://www.w3.org/2000/svg",wl="http://www.w3.org/1998/Math/MathML";function xl(e,t){if(e==="svg")return gl;if(e==="math")return wl;return t??null}function Ja(e,t,n){let a=n?._path??[];if(typeof e==="string"||typeof e==="number"||typeof e==="boolean"){let c=document.createTextNode(String(e));if(typeof e==="string"&&Ks(e))Q(()=>{c.textContent=J(e,t)});return c}let o=t;for(let[c,u]of Object.entries(e))if(c.startsWith("$")&&!Gt.has(c)){if(o===t)o=Object.create(t);o[c]=N(u)?O(u.$ref,t):u}if("$ref"in e&&!e.tagName){let c=String(e.$ref??"");if(!so.has(c))so.add(c),console.warn(`Jx: a $ref child ("${c}") is not a supported component instance; register the `+"component in $elements and use its custom-element tag instead (spec §13).")}let r=Qt(e.tagName,o),i=r.includes("-")&&customElements.get(r);if(e.$props&&i)return vo(e,o,n,a);if(e.$props){if(r.includes("-"))return vo(e,o,n,a);let{$props:c,...u}=e;return Ja(u,Pl(e,o),n)}if(e.$switch)return Al(e,o,n);let s=xl(r,n?._ns),d=r==="foreignObject"?null:s,l=s?document.createElementNS(s,r):document.createElement(r);if(n?.onNodeCreated)n.onNodeCreated(l,a,e,o);if(Yt(l,e,o),e.style&&r.includes("-"))Xt.set(l,e.style);rt(l,e.style??{},o.$media??{},o),it(l,e.attributes??{},o);let h=e.children;if(Vx(h)){let c=n||d?{...n,_ns:d,_path:[...a,"children"]}:void 0;Bt(l,h,o,c)}else if(Array.isArray(h))for(let c=0;c<h.length;c++){let u=h[c],p=n||d?{...n,_ns:d,_path:[...a,"children",c]}:void 0;if(Vx(u))Bt(l,u,o,p);else l.append(Ja(u,o,p))}return l}function Yt(e,t,n){for(let[a,o]of Object.entries(t)){if(Gt.has(a))continue;if(a.startsWith("$"))continue;if(a.startsWith("on")&&To(e,a,o,n))continue;Eo(e,a,o,n)}}function To(e,t,n,a){let o=t.slice(2),r=a;if(N(n)){let i=O(n.$ref,a);if(typeof i==="function"){let s=i;e.addEventListener(o,(d)=>s(r,d))}return!0}if(Tk(n)){let{body:i}=n;return e.addEventListener(o,(s)=>{se(i,r,s)}),!0}if(Za(n)&&typeof n.body==="string"){let i=Vt(n),s=Function(...i,n.body);return e.addEventListener(o,(d)=>s(r,d)),!0}if(ba(n)){let i=n.$expression;return e.addEventListener(o,(s)=>qs(i,r,s)),!0}return!1}function vl(e,t,n){for(let[a,o]of Object.entries(t))if(a.startsWith("on")&&!Gt.has(a))To(e,a,o,n)}function Eo(e,t,n,a){let o=e,r=ul(t,n,a);if(r)e.dataset.jxBoundProp=r;let i=(d)=>typeof d==="string"?ot(e.tagName,t,d):d,s=(d)=>{let l=e;if(t==="className"&&!(l instanceof HTMLElement)){l.setAttribute("class",d==null?"":String(d));return}if(o[t]===d)return;o[t]=d};if(N(n)){let d=n;if(t==="id"){o[t]=O(d.$ref,a);return}Q(()=>{s(i(O(d.$ref,a)))});return}if(Ks(n)){Q(()=>{s(i(J(n,a)))});return}s(i(n))}function lo(e,t){let n=[];return{detach:t,insert(a){let o=[];for(let i of a){let s=e.cssRules.length;try{e.insertRule(i,s)}catch{continue}let d=e.cssRules[s];if(d)o.push(d)}let r={rules:o,texts:a};return n.push(r),r},remove(a){let o=n.indexOf(a);if(o!==-1)n.splice(o,1);if(a.rules.length===0)return;let r=[...e.cssRules],i=a.rules.map((s)=>r.indexOf(s)).filter((s)=>s>=0).toSorted((s,d)=>d-s);for(let s of i)e.deleteRule(s);a.rules.length=0},replaceAll(a){n.length=0,n.push({rules:[],texts:a}),e.replaceSync(a.join(`
2
2
  `))},text(){return n.flatMap((a)=>a.texts.join(`
3
3
  `)).join(`
4
4
  `)}}}function yl(e){let t=[],n=()=>{e.textContent=t.map((a)=>a.texts.join(`
5
5
  `)).join(`
6
- `)};return{detach(){e.remove()},insert(a){let o={rules:[],texts:a};return t.push(o),n(),o},remove(a){let o=t.indexOf(a);if(o!==-1)t.splice(o,1),n()},replaceAll(a){t.length=0,t.push({rules:[],texts:a}),n()},text(){return e.textContent??""}}}function Ao(e){let n=e.defaultView?.CSSStyleSheet;if(typeof n==="function"&&Array.isArray(e.adoptedStyleSheets))try{let o=new n;return e.adoptedStyleSheets=[...e.adoptedStyleSheets,o],lo(o,()=>{e.adoptedStyleSheets=e.adoptedStyleSheets.filter((r)=>r!==o)})}catch{}let a=e.createElement("style");return a.dataset.jxSheet="",(e.head??e.documentElement).append(a),a.sheet?lo(a.sheet,()=>a.remove()):yl(a)}var Wt=new WeakMap;function kl(e){let t=Wt.get(e);if(t)return t;let n={hoisted:new Map,interned:new Map,scratch:null,scratchOwners:new Map,serial:0,shared:Ao(e)};return Wt.set(e,n),n}var _t=new WeakMap,co="\x01jx-scope\x01";function Mo(e){e.scratch.replaceAll([...e.scratchOwners.values()].flat())}function ho(e,t,n){let a=t.get(n);if(a.refs-=1,a.refs<=0)t.delete(n),e.shared.remove(a.inserted)}function uo(e,t,n,a){let o=t.get(n);if(o){o.refs+=1;return}t.set(n,{inserted:e.shared.insert(a),refs:1})}function po(e,t){let n=_t.get(e);if(!n||t!==void 0&&n!==t)return;_t.delete(e),n.stop?.();for(let o of n.vars)e.style.removeProperty(o);if(delete e.dataset.jx,Wt.get(n.doc)!==n.state)return;let{state:a}=n;if(n.interned===null){if(a.scratchOwners.delete(e))Mo(a)}else ho(a,a.interned,n.interned);for(let o of n.hoisted)ho(a,a.hoisted,o)}function $l(e){return Boolean(e)&&typeof e==="object"&&"display"in e}var Xt=new WeakMap;function Ho(e,t){if(!t)return e;let n={...e};for(let[a,o]of Object.entries(t)){let r=n[a];n[a]=r!==null&&typeof r==="object"&&o!==null&&typeof o==="object"&&!Array.isArray(o)?Ho(r,o):o}return n}function rt(e,t,n={},a={}){jl(e,t,n,a,!1)}function jl(e,t,n,a,o){po(e);let r=e.ownerDocument??document,i=kl(r),s=($o||jo)&&Jt(e)?(m)=>Ct(m,{dialog:e.tagName==="DIALOG"}):(m)=>m,d=-1,l=0,h=[],c=je(t,{mediaQueries:n,resolveValue:(m,x,y)=>{if(y==="self"&&m.startsWith("--"))return h.push({name:m,value:x}),null;if(d<0)({serial:d}=i),i.serial+=1;let k=`--jx-r${d}-${l}`;return l+=1,h.push({name:k,value:x}),`var(${k})`},scope:co,transposeSelector:s,transposeValue:io});if(c.length===0&&h.length===0)return;let u=c.filter((m)=>m.target!=="unscoped"),p=c.filter((m)=>m.target==="unscoped");for(let m of p)uo(i,i.hoisted,m.text,[m.text]);let g=`jx-${$e(u.map((m)=>m.key).join("|"))}`,b=u.map((m)=>m.text.replaceAll(co,`[data-jx="${g}"]`));if(b.length>0)if(e.dataset.jx=g,o)i.scratch??=Ao(r),i.scratchOwners.set(e,b),Mo(i);else uo(i,i.interned,g,b);let f={doc:r,hoisted:p.map((m)=>m.text),interned:b.length>0&&!o?g:null,state:i,stop:null,uid:g,vars:h.map((m)=>m.name)};if(h.length>0){let m=ge();m.run(()=>{for(let{name:x,value:y}of h)Q(()=>{let k=N(y)?O(y.$ref,a):J(y,a);e.style.setProperty(x,io(String(k??"")))})}),f.stop=()=>m.stop()}_t.set(e,f),Xa(()=>po(e,f),!0)}var Sl=new Set(["contenteditable","draggable","spellcheck"]);function Tl(e,t){let n=e.toLowerCase();if(n.startsWith("aria-")||Sl.has(n))return String(t);return t?"":null}function it(e,t,n){for(let[a,o]of Object.entries(t)){let r=al(e,a),i=(s)=>{if(s===null||s===void 0){e.removeAttribute(r);return}if(typeof s==="boolean"){let d=Tl(r,s);if(d===null)e.removeAttribute(r);else e.setAttribute(r,d);return}e.setAttribute(r,ot(e.tagName,a,String(s)))};if(N(o))Q(()=>i(O(o.$ref,n)));else if(Ks(o))Q(()=>i(ml(o,n)));else i(o)}}function Bt(e,t,n,a){let o=a?._path??[],r=document.createComment("jx-array");e.append(r);let{items:i,map:s,filter:d,sort:l,key:h}=t,c=N(h)?h.$ref:null,u=ce,p=!1,g=(j)=>{if(!p)p=!0,console.warn(`Jx $map: ${j}`)},b=[],f=(j)=>{j.scope.stop(),j.node.remove()},m=(j,C,w)=>{let M=Wm({index:w,item:C}),S=Object.create(n);S.$map=M,Object.defineProperty(S,"$map/item",{enumerable:!0,get:()=>M.item}),Object.defineProperty(S,"$map/index",{enumerable:!0,get:()=>M.index});let E=ge(!0),F=a?{...a,_path:[...o,"map",w]}:void 0,ve=E.run(()=>Ja(s,S,F));return{key:j,map:M,node:ve,scope:E}},x=(j,C)=>{let w=new Map;for(let E of b)w.set(E.key,E);let M=[];for(let E=0;E<j.length;E++){let F=C[E],ve=j[E],K=w.get(F);if(K){if(w.delete(F),K.map.item!==ve)K.map.item=ve;if(K.map.index!==E)K.map.index=E,a?.onNodeMoved?.(K.node,[...o,"map",E]);M.push(K)}else M.push(m(F,ve,E))}for(let E of w.values())f(E);let S=b.find((E)=>!w.has(E.key))?.node??r;for(let E of M){if(E.node===S){S=S.nextSibling??r;continue}S.before(E.node)}b=M},y=()=>{let j=N(i)?O(i.$ref,n):i;if(Array.isArray(j)&&N(d)){let S=O(d.$ref,n);if(typeof S==="function")j=j.filter(S)}if(Array.isArray(j)&&N(l)){let S=O(l.$ref,n);if(typeof S==="function")j=[...j].toSorted(S)}let C=Array.isArray(j)&&s?j:[],w=C.map((S,E)=>El(c,S,E,g)),M=new Set;for(let S=0;S<w.length;S++)if(M.has(w[S]))g(`duplicate key ${String(w[S])} — every occurrence after the first is rebuilt on each change`),w[S]={duplicate:S};else M.add(w[S]);sh();try{at(qt(u),()=>x(C,w))}finally{ah()}},k=!1,T=!1,I=Q(y,{scheduler:()=>{if(k)return;k=!0,queueMicrotask(()=>{if(k=!1,!T)I()})}});Xa(()=>{T=!0;for(let j of b)f(j);b=[]},!0)}function El(e,t,n,a){if(e===null)return n;if(e==="$map/item")return t;if(e.startsWith("$map/item/")){let o=P(t,e.slice(10));if(o===void 0||o===null)return a(`key "${e}" is empty for some items — those rows fall back to their index`),n;return o}return a(`key "${e}" is not a $map/item pointer — rows fall back to their index`),n}function Qt(e,t){if(typeof e==="string")return e;if(!jd(e))return"div";let n=e.$expression;if(n.operator==="?:")return Y(n.target,t,null)?n.value:n.initial;let a=Y(n.target,t,null);return n.cases[String(a)]??n.default}function Al(e,t,n){let a=n?._path??[],o=document.createElement(Qt(e.tagName,t)),r=ce;if(n?.onNodeCreated)n.onNodeCreated(o,a,e,t);Yt(o,e,t),rt(o,e.style??{},t.$media??{},t),it(o,e.attributes??{},t);let i=0,s=null,d=null,l=()=>{s?.stop(),s=null};return Q(()=>{if(!N(e.$switch)){l(),o.replaceChildren(),i+=1;return}let h=String(O(e.$switch.$ref,t));if(h===d)return;d=h,l(),o.replaceChildren(),i+=1;let c=e.cases?.[h];if(!c)return;let u=i,p=ge(!0);s=p;let g=n?{...n,_path:[...a,"cases",h]}:void 0;if(N(c)){let{href:b}=new URL(c.$ref,n?._ctx?.base??location.href);Kt(b,n?._ctx).then(async(f)=>{if(u!==i)return;let m=await Ap(f,{},b,n?._ctx);if(u!==i)return;o.replaceChildren(),at(qt(r),()=>p.run(()=>o.append(Ja(f,m,g))))}).catch((f)=>console.error("Jx $switch: failed to load external case",c.$ref,f));return}sh();try{at(qt(r),()=>p.run(()=>o.append(Ja(c,t,g))))}finally{ah()}}),Xa(l,!0),o}async function Ml(e,t,n,a,o){if(e.$src)return Hl(e,t,n,a);switch(e.$prototype){case"Request":{let r=Qa(null),i=e.debounce??0,s=null;if(!e.manual&&!(o?.skipAutoRequests??Us.skip))Q(()=>{let d;if(Ks(e.url))d=J(e.url,t);else({url:d}=e);if(!d||d==="undefined"||d.includes("undefined"))return;let l=new AbortController;qx(()=>{if(l.abort(),s!==null)clearTimeout(s)});let h=()=>fetch(d,{method:e.method??"GET",signal:l.signal,...e.headers&&{headers:e.headers},...e.body&&{body:typeof e.body==="object"?JSON.stringify(e.body):e.body}}).then((c)=>c.ok?c.json():Promise.reject(c.statusText)).then((c)=>{r.value=c}).catch((c)=>{if(!(c instanceof Error&&c.name==="AbortError"))r.value={error:String(c)}});if(i>0)s=setTimeout(h,i);else h()});return r}case"URLSearchParams":return Bd(()=>{let r={};for(let[i,s]of Object.entries(e))if(i!=="$prototype")r[i]=N(s)?O(s.$ref,t):Ks(s)?J(s,t):s;return new URLSearchParams(r).toString()});case"LocalStorage":case"SessionStorage":{let r=e.$prototype==="LocalStorage"?localStorage:sessionStorage,i=e.key??n,s;try{let l=r.getItem(i);s=l!==null?JSON.parse(l):e.default??null}catch{s=e.default??null}let d=Qa(s);return Q(()=>{let l=d.value;if(l===null)try{r.removeItem(i)}catch{}else try{r.setItem(i,JSON.stringify(l))}catch{}}),d}case"Cookie":{let r=e.name??n,s=Qa((()=>{let d=eo(document.cookie,r);if(d===null)return null;try{return JSON.parse(decodeURIComponent(d))}catch{return d}})()??e.default??null);return Q(()=>{document.cookie=to(r,s.value,e)}),s}case"IndexedDB":{let r=Qa(null),{database:i,store:s,version:d=1,keyPath:l="id",autoIncrement:h=!0,indexes:c=[]}=e;if(!i||!s)throw Error(`Jx: IndexedDB entry '${n}' requires database and store`);let u=indexedDB.open(i,d);return u.addEventListener("upgradeneeded",(p)=>{let g=p.target.result;if(!g.objectStoreNames.contains(s)){let b=g.createObjectStore(s,{autoIncrement:h,keyPath:l});for(let f of c)b.createIndex(f.name,f.keyPath,{unique:f.unique??!1})}}),u.addEventListener("success",(p)=>{let g=p.target.result;r.value={database:i,getStore:(b="readwrite")=>Promise.resolve(g.transaction(s,b).objectStore(s)),isReady:!0,store:s,version:d}}),u.addEventListener("error",()=>{r.value={error:u.error?.message}}),r}case"Set":return new Set(Array.isArray(e.default)?e.default:[]);case"Map":return new Map(Object.entries(nt(e.default)?e.default:{}));case"FormData":{let r=new FormData;for(let[i,s]of Object.entries(e.fields??{}))r.append(i,s);return r}case"Blob":return new Blob(e.parts??[],{type:typeof e.type==="string"?e.type:"text/plain"});case"ReadableStream":return null;default:return console.warn(`Jx: unknown $prototype "${e.$prototype}" for "${n}". Did you mean to add '$src'?`),Qa(null)}}var en=new Set(["$prototype","$src","$export","timing","default","description","body","parameters","arguments","name"]);async function Hl(e,t,n,a){let o=e.$src;if(!o||!o.endsWith(".class.json"))throw Error(`Jx: $prototype "${e.$prototype}" requires a .class.json $src, got "${o}". Wrap the class in a .class.json schema with $implementation.`);return Nl(e,t,n,a)}async function Ll(e,t,n,a){let o,r=Ut(t);if(r instanceof Promise)o=await r;else if(r)o=r;else{try{o=await import(t)}catch{if(a)o=await import(new URL(t,a).href);else throw Error(`Failed to import "${t}"`)}X.set(t,o)}let i=o[n]??o.default?.[n];if(!i)throw Error(`Jx: export "${n}" not found in "${t}"`);if(typeof i!=="function")throw TypeError(`Jx: "${n}" from "${t}" is not a class`);let s={};for(let[u,p]of Object.entries(e))if(!en.has(u))s[u]=p;let l=new i(s),h;if(typeof l.resolve==="function")h=await l.resolve();else if("value"in l)({value:h}=l);else h=l;let c=Qa(h);if(typeof l.subscribe==="function")l.subscribe((u)=>{c.value=u});return c}async function Nl(e,t,n,a){let o=e.$src,r;if(!o.startsWith(".")&&!o.startsWith("/")&&!o.startsWith("http")&&!o.startsWith("file:"))return Qe(e,t,n,a);try{let u=a?new URL(o,a).href:o,p=await fetch(u);if(!p.ok)throw Error(`HTTP ${p.status}`);r=await p.json()}catch{return Qe(e,t,n,a)}if(r.$implementation){if(JSON.stringify(r).includes('"#/$context/'))return Qe(e,t,n,a);let p=a?new URL(o,a).href:new URL(o,location.href).href,g=new URL(r.$implementation,p).href,b=e.$export??r.title??e.$prototype;try{return await Ll(e,g,b,a)}catch{return Qe(e,t,n,a)}}let s=Il(r),d={};for(let[u,p]of Object.entries(e))if(!en.has(u))d[u]=p;let l=new s(d),h;if(typeof l.resolve==="function")h=await l.resolve();else if("value"in l)({value:h}=l);else h=l;let c=Qa(h);if(typeof l.subscribe==="function")l.subscribe((u)=>{c.value=u});return c}function Il(e){let t=e.$defs?.fields??{},n=e.$defs?.constructor,a=typeof n==="object"?n:void 0,o=e.$defs?.methods??{};class r{constructor(s={}){for(let[d,l]of Object.entries(t)){let h=l.identifier??d,c=l.access==="private"?`_${h}`:h;if(s[h]!==void 0)this[c]=s[h];else if(l.initializer!==void 0)this[c]=l.initializer;else if(l.default!==void 0)this[c]=structuredClone(l.default);else this[c]=null}if(a?.body){let d=Array.isArray(a.body)?a.body.join(`
6
+ `)};return{detach(){e.remove()},insert(a){let o={rules:[],texts:a};return t.push(o),n(),o},remove(a){let o=t.indexOf(a);if(o!==-1)t.splice(o,1),n()},replaceAll(a){t.length=0,t.push({rules:[],texts:a}),n()},text(){return e.textContent??""}}}function Ao(e){let n=e.defaultView?.CSSStyleSheet;if(typeof n==="function"&&Array.isArray(e.adoptedStyleSheets))try{let o=new n;return e.adoptedStyleSheets=[...e.adoptedStyleSheets,o],lo(o,()=>{e.adoptedStyleSheets=e.adoptedStyleSheets.filter((r)=>r!==o)})}catch{}let a=e.createElement("style");return a.dataset.jxSheet="",(e.head??e.documentElement).append(a),a.sheet?lo(a.sheet,()=>a.remove()):yl(a)}var Wt=new WeakMap;function kl(e){let t=Wt.get(e);if(t)return t;let n={hoisted:new Map,interned:new Map,scratch:null,scratchOwners:new Map,serial:0,shared:Ao(e)};return Wt.set(e,n),n}var _t=new WeakMap,co="\x01jx-scope\x01";function Mo(e){e.scratch.replaceAll([...e.scratchOwners.values()].flat())}function ho(e,t,n){let a=t.get(n);if(a.refs-=1,a.refs<=0)t.delete(n),e.shared.remove(a.inserted)}function uo(e,t,n,a){let o=t.get(n);if(o){o.refs+=1;return}t.set(n,{inserted:e.shared.insert(a),refs:1})}function po(e,t){let n=_t.get(e);if(!n||t!==void 0&&n!==t)return;_t.delete(e),n.stop?.();for(let o of n.vars)e.style.removeProperty(o);if(delete e.dataset.jx,Wt.get(n.doc)!==n.state)return;let{state:a}=n;if(n.interned===null){if(a.scratchOwners.delete(e))Mo(a)}else ho(a,a.interned,n.interned);for(let o of n.hoisted)ho(a,a.hoisted,o)}function $l(e){return Boolean(e)&&typeof e==="object"&&"display"in e}var Xt=new WeakMap;function Ho(e,t){if(!t)return e;let n={...e};for(let[a,o]of Object.entries(t)){let r=n[a];n[a]=r!==null&&typeof r==="object"&&o!==null&&typeof o==="object"&&!Array.isArray(o)?Ho(r,o):o}return n}function rt(e,t,n={},a={}){jl(e,t,n,a,!1)}function jl(e,t,n,a,o){po(e);let r=e.ownerDocument??document,i=kl(r),s=($o||jo)&&Jt(e)?(m)=>Ct(m,{dialog:e.tagName==="DIALOG"}):(m)=>m,d=-1,l=0,h=[],c=je(t,{mediaQueries:n,resolveValue:(m,x,y)=>{if(y==="self"&&m.startsWith("--"))return h.push({name:m,value:x}),null;if(d<0)({serial:d}=i),i.serial+=1;let k=`--jx-r${d}-${l}`;return l+=1,h.push({name:k,value:x}),`var(${k})`},scope:co,transposeSelector:s,transposeValue:io});if(c.length===0&&h.length===0)return;let u=c.filter((m)=>m.target!=="unscoped"),p=c.filter((m)=>m.target==="unscoped");for(let m of p)uo(i,i.hoisted,m.text,[m.text]);let g=`jx-${$e(u.map((m)=>m.key).join("|"))}`,b=u.map((m)=>m.text.replaceAll(co,`[data-jx="${g}"]`));if(b.length>0)if(e.dataset.jx=g,o)i.scratch??=Ao(r),i.scratchOwners.set(e,b),Mo(i);else uo(i,i.interned,g,b);let f={doc:r,hoisted:p.map((m)=>m.text),interned:b.length>0&&!o?g:null,state:i,stop:null,uid:g,vars:h.map((m)=>m.name)};if(h.length>0){let m=ge();m.run(()=>{for(let{name:x,value:y}of h)Q(()=>{let k=N(y)?O(y.$ref,a):J(y,a);e.style.setProperty(x,io(String(k??"")))})}),f.stop=()=>m.stop()}_t.set(e,f),Xa(()=>po(e,f),!0)}var Sl=new Set(["contenteditable","draggable","spellcheck"]);function Tl(e,t){let n=e.toLowerCase();if(n.startsWith("aria-")||Sl.has(n))return String(t);return t?"":null}function it(e,t,n){for(let[a,o]of Object.entries(t)){let r=al(e,a),i=(s)=>{if(s===null||s===void 0){e.removeAttribute(r);return}if(typeof s==="boolean"){let d=Tl(r,s);if(d===null)e.removeAttribute(r);else e.setAttribute(r,d);return}e.setAttribute(r,ot(e.tagName,a,String(s)))};if(N(o))Q(()=>i(O(o.$ref,n)));else if(Ks(o))Q(()=>i(ml(o,n)));else i(o)}}function Bt(e,t,n,a){let o=a?._path??[],r=document.createComment("jx-array");e.append(r);let{items:i,map:s,filter:d,sort:l,key:h}=t,c=N(h)?h.$ref:null,u=ce,p=!1,g=(j)=>{if(!p)p=!0,console.warn(`Jx $map: ${j}`)},b=[],f=(j)=>{j.scope.stop(),j.node.remove()},m=(j,C,w)=>{let M=Hm({index:w,item:C}),S=Object.create(n);S.$map=M,Object.defineProperty(S,"$map/item",{enumerable:!0,get:()=>M.item}),Object.defineProperty(S,"$map/index",{enumerable:!0,get:()=>M.index});let E=ge(!0),F=a?{...a,_path:[...o,"map",w]}:void 0,ve=E.run(()=>Ja(s,S,F));return{key:j,map:M,node:ve,scope:E}},x=(j,C)=>{let w=new Map;for(let E of b)w.set(E.key,E);let M=[];for(let E=0;E<j.length;E++){let F=C[E],ve=j[E],K=w.get(F);if(K){if(w.delete(F),K.map.item!==ve)K.map.item=ve;if(K.map.index!==E)K.map.index=E,a?.onNodeMoved?.(K.node,[...o,"map",E]);M.push(K)}else M.push(m(F,ve,E))}for(let E of w.values())f(E);let S=b.find((E)=>!w.has(E.key))?.node??r;for(let E of M){if(E.node===S){S=S.nextSibling??r;continue}S.before(E.node)}b=M},y=()=>{let j=N(i)?O(i.$ref,n):i;if(Array.isArray(j)&&N(d)){let S=O(d.$ref,n);if(typeof S==="function")j=j.filter(S)}if(Array.isArray(j)&&N(l)){let S=O(l.$ref,n);if(typeof S==="function")j=[...j].toSorted(S)}let C=Array.isArray(j)&&s?j:[],w=C.map((S,E)=>El(c,S,E,g)),M=new Set;for(let S=0;S<w.length;S++)if(M.has(w[S]))g(`duplicate key ${String(w[S])} — every occurrence after the first is rebuilt on each change`),w[S]={duplicate:S};else M.add(w[S]);sh();try{at(qt(u),()=>x(C,w))}finally{ah()}},k=!1,T=!1,I=Q(y,{scheduler:()=>{if(k)return;k=!0,queueMicrotask(()=>{if(k=!1,!T)I()})}});Xa(()=>{T=!0;for(let j of b)f(j);b=[]},!0)}function El(e,t,n,a){if(e===null)return n;if(e==="$map/item")return t;if(e.startsWith("$map/item/")){let o=P(t,e.slice(10));if(o===void 0||o===null)return a(`key "${e}" is empty for some items — those rows fall back to their index`),n;return o}return a(`key "${e}" is not a $map/item pointer — rows fall back to their index`),n}function Qt(e,t){if(typeof e==="string")return e;if(!Hd(e))return"div";let n=e.$expression;if(n.operator==="?:")return Y(n.target,t,null)?n.value:n.initial;let a=Y(n.target,t,null);return n.cases[String(a)]??n.default}function Al(e,t,n){let a=n?._path??[],o=document.createElement(Qt(e.tagName,t)),r=ce;if(n?.onNodeCreated)n.onNodeCreated(o,a,e,t);Yt(o,e,t),rt(o,e.style??{},t.$media??{},t),it(o,e.attributes??{},t);let i=0,s=null,d=null,l=()=>{s?.stop(),s=null};return Q(()=>{if(!N(e.$switch)){l(),o.replaceChildren(),i+=1;return}let h=String(O(e.$switch.$ref,t));if(h===d)return;d=h,l(),o.replaceChildren(),i+=1;let c=e.cases?.[h];if(!c)return;let u=i,p=ge(!0);s=p;let g=n?{...n,_path:[...a,"cases",h]}:void 0;if(N(c)){let{href:b}=new URL(c.$ref,n?._ctx?.base??location.href);Kt(b,n?._ctx).then(async(f)=>{if(u!==i)return;let m=await Dp(f,{},b,n?._ctx);if(u!==i)return;o.replaceChildren(),at(qt(r),()=>p.run(()=>o.append(Ja(f,m,g))))}).catch((f)=>console.error("Jx $switch: failed to load external case",c.$ref,f));return}sh();try{at(qt(r),()=>p.run(()=>o.append(Ja(c,t,g))))}finally{ah()}}),Xa(l,!0),o}async function Ml(e,t,n,a,o){if(e.$src)return Hl(e,t,n,a);switch(e.$prototype){case"Request":{let r=Qa(null),i=e.debounce??0,s=null;if(!e.manual&&!(o?.skipAutoRequests??Us.skip))Q(()=>{let d;if(Ks(e.url))d=J(e.url,t);else({url:d}=e);if(!d||d==="undefined"||d.includes("undefined"))return;let l=new AbortController;Ux(()=>{if(l.abort(),s!==null)clearTimeout(s)});let h=()=>fetch(d,{method:e.method??"GET",signal:l.signal,...e.headers&&{headers:e.headers},...e.body&&{body:typeof e.body==="object"?JSON.stringify(e.body):e.body}}).then((c)=>c.ok?c.json():Promise.reject(c.statusText)).then((c)=>{r.value=c}).catch((c)=>{if(!(c instanceof Error&&c.name==="AbortError"))r.value={error:String(c)}});if(i>0)s=setTimeout(h,i);else h()});return r}case"URLSearchParams":return zd(()=>{let r={};for(let[i,s]of Object.entries(e))if(i!=="$prototype")r[i]=N(s)?O(s.$ref,t):Ks(s)?J(s,t):s;return new URLSearchParams(r).toString()});case"LocalStorage":case"SessionStorage":{let r=e.$prototype==="LocalStorage"?localStorage:sessionStorage,i=e.key??n,s;try{let l=r.getItem(i);s=l!==null?JSON.parse(l):e.default??null}catch{s=e.default??null}let d=Qa(s);return Q(()=>{let l=d.value;if(l===null)try{r.removeItem(i)}catch{}else try{r.setItem(i,JSON.stringify(l))}catch{}}),d}case"Cookie":{let r=e.name??n,s=Qa((()=>{let d=eo(document.cookie,r);if(d===null)return null;try{return JSON.parse(decodeURIComponent(d))}catch{return d}})()??e.default??null);return Q(()=>{document.cookie=to(r,s.value,e)}),s}case"IndexedDB":{let r=Qa(null),{database:i,store:s,version:d=1,keyPath:l="id",autoIncrement:h=!0,indexes:c=[]}=e;if(!i||!s)throw Error(`Jx: IndexedDB entry '${n}' requires database and store`);let u=indexedDB.open(i,d);return u.addEventListener("upgradeneeded",(p)=>{let g=p.target.result;if(!g.objectStoreNames.contains(s)){let b=g.createObjectStore(s,{autoIncrement:h,keyPath:l});for(let f of c)b.createIndex(f.name,f.keyPath,{unique:f.unique??!1})}}),u.addEventListener("success",(p)=>{let g=p.target.result;r.value={database:i,getStore:(b="readwrite")=>Promise.resolve(g.transaction(s,b).objectStore(s)),isReady:!0,store:s,version:d}}),u.addEventListener("error",()=>{r.value={error:u.error?.message}}),r}case"Set":return new Set(Array.isArray(e.default)?e.default:[]);case"Map":return new Map(Object.entries(nt(e.default)?e.default:{}));case"FormData":{let r=new FormData;for(let[i,s]of Object.entries(e.fields??{}))r.append(i,s);return r}case"Blob":return new Blob(e.parts??[],{type:typeof e.type==="string"?e.type:"text/plain"});case"ReadableStream":return null;default:return console.warn(`Jx: unknown $prototype "${e.$prototype}" for "${n}". Did you mean to add '$src'?`),Qa(null)}}var en=new Set(["$prototype","$src","$export","timing","default","description","body","parameters","arguments","name"]);async function Hl(e,t,n,a){let o=e.$src;if(!o||!o.endsWith(".class.json"))throw Error(`Jx: $prototype "${e.$prototype}" requires a .class.json $src, got "${o}". Wrap the class in a .class.json schema with $implementation.`);return Nl(e,t,n,a)}async function Ll(e,t,n,a){let o,r=Ut(t);if(r instanceof Promise)o=await r;else if(r)o=r;else{try{o=await import(t)}catch{if(a)o=await import(new URL(t,a).href);else throw Error(`Failed to import "${t}"`)}X.set(t,o)}let i=o[n]??o.default?.[n];if(!i)throw Error(`Jx: export "${n}" not found in "${t}"`);if(typeof i!=="function")throw TypeError(`Jx: "${n}" from "${t}" is not a class`);let s={};for(let[u,p]of Object.entries(e))if(!en.has(u))s[u]=p;let l=new i(s),h;if(typeof l.resolve==="function")h=await l.resolve();else if("value"in l)({value:h}=l);else h=l;let c=Qa(h);if(typeof l.subscribe==="function")l.subscribe((u)=>{c.value=u});return c}async function Nl(e,t,n,a){let o=e.$src,r;if(!o.startsWith(".")&&!o.startsWith("/")&&!o.startsWith("http")&&!o.startsWith("file:"))return Qe(e,t,n,a);try{let u=a?new URL(o,a).href:o,p=await fetch(u);if(!p.ok)throw Error(`HTTP ${p.status}`);r=await p.json()}catch{return Qe(e,t,n,a)}if(r.$implementation){if(JSON.stringify(r).includes('"#/$context/'))return Qe(e,t,n,a);let p=a?new URL(o,a).href:new URL(o,location.href).href,g=new URL(r.$implementation,p).href,b=e.$export??r.title??e.$prototype;try{return await Ll(e,g,b,a)}catch{return Qe(e,t,n,a)}}let s=Il(r),d={};for(let[u,p]of Object.entries(e))if(!en.has(u))d[u]=p;let l=new s(d),h;if(typeof l.resolve==="function")h=await l.resolve();else if("value"in l)({value:h}=l);else h=l;let c=Qa(h);if(typeof l.subscribe==="function")l.subscribe((u)=>{c.value=u});return c}function Il(e){let t=e.$defs?.fields??{},n=e.$defs?.constructor,a=typeof n==="object"?n:void 0,o=e.$defs?.methods??{};class r{constructor(s={}){for(let[d,l]of Object.entries(t)){let h=l.identifier??d,c=l.access==="private"?`_${h}`:h;if(s[h]!==void 0)this[c]=s[h];else if(l.initializer!==void 0)this[c]=l.initializer;else if(l.default!==void 0)this[c]=structuredClone(l.default);else this[c]=null}if(a?.body){let d=Array.isArray(a.body)?a.body.join(`
7
7
  `):a.body;Function("config",d).call(this,s)}}}for(let[s,d]of Object.entries(o)){let l=d.identifier??s,h=(d.parameters??[]).map((u)=>{if(u.$ref)return u.$ref.split("/").pop();let p=u.identifier??u.name;return typeof p==="string"?p:"arg"}),c=Array.isArray(d.body)?d.body.join(`
8
- `):d.body??"";if(d.role==="accessor"){let u={};if(d.getter)u.get=Function(d.getter.body??"");if(d.setter){let p=(d.setter.parameters??[]).map((g)=>g.$ref?.split("/").pop()??"v");u.set=Function(...p,d.setter.body??"")}Object.defineProperty(r.prototype,l,{...u,configurable:!0})}else if(d.scope==="static")r[l]=Function(...h,c);else r.prototype[l]=Function(...h,c)}return Object.defineProperty(r,"name",{configurable:!0,value:e.title}),r}async function Qe(e,t,n,a){let o={};for(let[d,l]of Object.entries(e))if(!en.has(d))o[d]=l;let r=Object.values(o).some((d)=>Ks(d)),i=(d)=>fetch(ko("/__jx_resolve__"),{body:JSON.stringify({$base:a,$export:e.$export,$prototype:e.$prototype,$src:e.$src,...d}),headers:{"Content-Type":"application/json"},method:"POST"}).then((l)=>{if(!l.ok)throw Error(`Jx dev proxy ${l.status} for "${n}"`);return l.json()}),s=Qa(null);if(r)Q(()=>{let d={};for(let[l,h]of Object.entries(o))d[l]=Ks(h)?J(h,t):h;i(d).then((l)=>{s.value=l}).catch((l)=>console.error("Jx dev proxy:",l))});else i(o).then((d)=>{s.value=d}).catch((d)=>console.error("Jx dev proxy:",d));return s}async function Cl(e,t,n,a){let{$src:o,$export:r}=e,i,s=Ut(o);if(s instanceof Promise)i=await s;else if(s)i=s;else{try{i=await import(o)}catch{if(a)try{i=await import(new URL(o,a).href)}catch{return fo(e,t,n,a)}else return fo(e,t,n,a)}X.set(o,i)}let d=i[r]??i.default?.[r];if(!d)throw Error(`Jx: export "${r}" not found in "${o}" for "${n}"`);if(typeof d!=="function")throw TypeError(`Jx: "${r}" from "${o}" is not a function`);let l=d,h=e.arguments??{},c=Object.values(h).some((g)=>N(g)),u=()=>{let g={};for(let[b,f]of Object.entries(h))g[b]=N(f)?O(f.$ref,t):f;return g},p=Qa(null);if(c)Q(()=>{let g=u();qx(()=>{}),l(g).then((b)=>{p.value=b}).catch(()=>{})});else p.value=await l(u());return p}async function fo(e,t,n,a){let o=e.arguments??{},r=Object.values(o).some((l)=>N(l)),i=()=>{let l={};for(let[h,c]of Object.entries(o))l[h]=N(c)?O(c.$ref,t):c;return l},s=(l)=>fetch(ko("/__jx_server__"),{body:JSON.stringify({$base:a,$export:e.$export,$src:e.$src,arguments:l}),headers:{"Content-Type":"application/json"},method:"POST"}).then((h)=>{if(!h.ok)throw Error(`Jx server proxy ${h.status} for "${n}"`);return h.json()}),d=Qa(null);if(r)Q(()=>{let l=i();qx(()=>{}),s(l).then((h)=>{d.value=h}).catch((h)=>console.error("Jx server proxy:",h))});else s(i()).then((l)=>{d.value=l}).catch((l)=>console.error("Jx server proxy:",l));return d}function O(e,t){if(typeof e!=="string")return e;if(e.startsWith("$map/")||e.startsWith("#/$map/")){let n=(e.startsWith("#/")?e.slice(2):e).split("/"),[,a]=n,r=t.$map?.[a]??t[`$map/${a}`];return n.length>2?zt(r,n.slice(2).join("/")):r}if(e.startsWith("#/state/"))return P(t,e.slice(8));if(e.startsWith("parent#/"))return P(t,e.slice(8));if(e.startsWith("window#/"))return zt(globalThis.window,e.slice(8));if(e.startsWith("document#/"))return zt(globalThis.document,e.slice(10));return P(t,e)??null}function N(e){return Ot(e)}function zt(e,t){return P(e,t)}function mo(e,t,n,a){let o=t.replaceAll(/-([a-z])/g,(i,s)=>s.toUpperCase()),r=e[o];if(typeof r==="boolean"){e[o]=n!==null&&n!=="false";return}if(n===null){let i=a?.get(o);e[o]=i===void 0?typeof r==="number"?0:"":i;return}e[o]=typeof r==="number"?Number(n):n}function Ol(e){let t=new Map;for(let[n,a]of Object.entries(e.state??{})){if(a!==null&&typeof a==="object"){let o=a;if("default"in o){t.set(n,o.default);continue}if(Rl.some((r)=>(r in o)))continue}t.set(n,a)}return t}var Rl=["$expression","$prototype","$ref","$src"],bo=new Set;function Dl(e,t){if(Object.hasOwn(e,t))return!0;if(e.hasAttribute(t))return!0;let n=t.replaceAll(/[A-Z]/gu,(a)=>`-${a.toLowerCase()}`);return n!==t&&e.hasAttribute(n)}function tt(e,t){if(!Pp(e))return!1;let n=t===void 0?e:`${t}:${e}`;if(!bo.has(n))bo.add(n),console.warn(`Jx: "${e}" is private state (spec.md §5.6) and cannot be set through $props`+`${t===void 0?"":` (${t})`}. The write was ignored; rename the entry without the leading # to make it part of the component's interface.`);return!0}function Pl(e,t){let n=Object.create(t);for(let[a,o]of Object.entries(e.$props??{})){if(tt(a,"$props"))continue;n[a]=N(o)?O(o.$ref,t):o}return n}var Fl={},Te=new Map;async function kI(e,t){let n=t??location.href,{tagName:a}=e;if(!a||!a.includes("-"))throw Error(`Jx redefineElement: tagName "${a}" must contain a hyphen`);if(!customElements.get(a)){await jm(e,n);return}if(e.$elements)await st(e.$elements,n);let o=Te.get(a)?.doc.observedAttributes??[],r=e.observedAttributes??[];if(JSON.stringify(o)!==JSON.stringify(r))console.warn(`Jx redefineElement: <${a}> keeps observedAttributes [${o.join(", ")}] as first defined; [${r.join(", ")}] takes effect only in a fresh realm`);Te.set(a,{base:n,doc:e})}async function st(e,t,n){for(let a of e){if(typeof a==="string"){try{await import(a.startsWith("/")||a.startsWith(".")?a:`/node_modules/${a}`)}catch(i){console.warn(`Jx: failed to import package "${a}"`,i)}continue}if(!N(a))continue;let{href:o}=new URL(a.$ref,t),r=await Kt(o,n);if(!r.tagName||!r.tagName.includes("-"))continue;if(customElements.get(r.tagName))continue;if(r.$elements)await st(r.$elements,o,n);await jm(r,o)}}function Zl(e,t){for(let n of e){if(!n||!n.tagName)continue;let a=n.tagName.toLowerCase(),o={...n.attributes};for(let s of["href","src"]){let d=o[s];if(typeof d!=="string"||d==="")continue;if(!d.startsWith("/")&&!d.startsWith(".")&&!d.startsWith("http")){o[s]=`/node_modules/${d}`;continue}o[s]=ot(a.toUpperCase(),s,d)}let r=`${a}${o.href?`[href="${o.href}"]`:""}${o.src?`[src="${o.src}"]`:""}`;if(r!==a&&document.head.querySelector(r))continue;let i=document.createElement(a);for(let[s,d]of Object.entries(o))i.setAttribute(s,String(d));if(n.textContent)i.textContent=typeof n.textContent==="object"?JSON.stringify(n.textContent,null,2):n.textContent;document.head.append(i)}}var go=32,Jl={expansion:0,frames:[]},ce=Jl;function at(e,t){let n=ce;ce=e;try{return t()}finally{ce=n}}function qt(e){return{expansion:e.frames.length,frames:e.frames}}function Vl(e,t){if(Object.is(e,t))return!0;if(!wo(e)||!wo(t))return!1;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}function wo(e){if(typeof e!=="object"||e===null)return!1;let t=re(e);if(Array.isArray(t))return!0;let n=Object.getPrototypeOf(t);return n===Object.prototype||n===null}function _l(e,t){if(e.tag!==t.tag)return!1;let n=Object.keys(e.props);if(n.length!==Object.keys(t.props).length)return!1;return n.every((a)=>Object.hasOwn(t.props,a)&&Vl(e.props[a],t.props[a]))}function Bl(e,t){let n=[...e.frames.map((a)=>a.tag),t.tag].join(" → ");if(e.frames.slice(e.expansion).some((a)=>_l(a,t)))throw Error(`Component <${t.tag}> renders itself: ${n}. A component cannot appear inside its own `+"definition with the same props — the expansion would never end.");if(e.frames.length>=go)throw Error(`Component nesting exceeds ${go} levels: ${n}. A component that renders itself with changing props needs a case that stops.`);return{expansion:e.expansion,frames:[...e.frames,t]}}var xo=new Set;async function jm(e,t){let n=t,a=e;if(typeof e==="string"){if(n=new URL(e,n??location.href).href,xo.has(n))return;xo.add(n),a=await Kt(e)}n??=location.href;let o=a,{tagName:r}=o;if(!r||!r.includes("-"))throw Error(`Jx defineElement: tagName "${r}" must contain a hyphen`);if(customElements.get(r))return;if(o.$elements)await st(o.$elements,n);Te.set(r,{base:n,doc:o});let i=o,s=n,d=i.observedAttributes??[],l=class extends HTMLElement{_jxInitialized=!1;_state=null;static get observedAttributes(){return d}async connectedCallback(){if(this.dataset.jxDefinitionRoot!==void 0)return;if(this._jxInitialized)return;this._jxInitialized=!0;let h=ce,c={},u=Te.get(r)??{base:s,doc:i},{doc:p,base:g}=u,b=await Ap(p,{},g,{base:g,media:null,root:this});for(let w of d)if(this.hasAttribute(w))mo(b,w,this.getAttribute(w)),c[w]=this.getAttribute(w);let f=this.dataset.jxProps;if(f){try{let w=JSON.parse(f);for(let[M,S]of Object.entries(w)){if(tt(M,"data-jx-props"))continue;if(M in(p.state??{}))b[M]=S,c[M]=S}}catch{}delete this.dataset.jxProps}let m=this.getAttributeNames().filter((w)=>w.startsWith("props.")&&w.length>6);for(let w of m){let M=w.slice(6);if(tt(M,"props.* attribute")){this.removeAttribute(w);continue}if(M in(p.state??{}))b[M]=this.getAttribute(w),c[M]=this.getAttribute(w),this.removeAttribute(w)}for(let w of Object.keys(p.state??{})){if(Pp(w))continue;if(w in this&&this[w]!==void 0&&Dl(this,w))b[w]=this[w],c[w]=this[w]}let x;try{x=Bl(h,{props:c,tag:r})}catch(w){if(this.replaceChildren(),!this.isConnected)return;console.error(`Jx: <${r}> was not rendered:`,w),this.dispatchEvent(new ErrorEvent("jx-error",{bubbles:!0,composed:!0,error:w,message:w instanceof Error?w.message:String(w)}));return}for(let w of Object.keys(p.state??{})){if(Pp(w))continue;if(!(w in HTMLElement.prototype))Object.defineProperty(this,w,{configurable:!0,get:()=>b[w],set:(M)=>{b[w]=M}})}this._state=b;let y=[...this.childNodes];this.replaceChildren();let k=$l(p.style)?p.style:{display:"block",...p.style},T=Ho(k,Xt.get(this));if(rt(this,T,b.$media??{},b),it(this,p.attributes??{},b),vl(this,p,b),!Array.isArray(p.children)&&p.textContent!==void 0)Eo(this,"textContent",p.textContent,b);let I=Array.isArray(p.children)?p.children:[],j=et;et||=this.dataset.jxPath!==void 0;try{at(x,()=>{for(let w of I)this.append(Ja(w,b))})}finally{et=j}ql(this,y);let{onMount:C}=b;if(typeof C==="function")queueMicrotask(()=>C(b,this))}disconnectedCallback(){if(typeof this._state?.onUnmount==="function")this._state.onUnmount(this._state)}adoptedCallback(){if(typeof this._state?.onAdopted==="function")this._state.onAdopted(this._state)}attributeChangedCallback(h,c,u){if(!this._state||c===u)return;mo(this._state,h,u,Ol(Te.get(r)?.doc??i))}};customElements.define(r,l)}function vo(e,t,n,a){let o=document.createElement(Qt(e.tagName,t));if(n?.onNodeCreated)n.onNodeCreated(o,a??[],e,t);for(let[i,s]of Object.entries(e.$props??{})){if(tt(i,"$props"))continue;let d=(l)=>{o[i]=typeof l==="string"?ot(o.tagName,i,l):l};if(N(s)){let l=s;d(O(l.$ref,t)),Q(()=>{d(O(l.$ref,t))})}else if(Ks(s))Q(()=>{d(J(s,t))});else d(s)}if(e.style)Xt.set(o,e.style);rt(o,e.style??{},t.$media??{},t),it(o,e.attributes??{},t),Yt(o,e,t);let r=Array.isArray(e.children)?e.children:[];for(let i=0;i<r.length;i++){let s=r[i],d=n&&a?{...n,_path:[...a,"children",i]}:void 0;if(Ux(s))Bt(o,s,t,d);else o.append(Ja(s,t,d))}return o}function ql(e,t){let n=e.querySelectorAll("slot");if(n.length===0)return;let a=new Map,o=[];for(let r of t)if(r.nodeType===Node.ELEMENT_NODE&&r.getAttribute("slot")){let i=r.getAttribute("slot");if(!a.has(i))a.set(i,[]);a.get(i).push(r)}else o.push(r);for(let r of n){let i=r.getAttribute("name"),s=i?a.get(i)??[]:o;r.replaceWith(...s.length>0?s:[...r.childNodes])}}var tn={};Di(tn,{close:()=>sn,onCancelClick:()=>ed,onCommand:()=>Yl,onConfirm:()=>Xl,onNativeCancel:()=>Ul,onNativeClose:()=>Gl,onSecondary:()=>Ql,onToggle:()=>Kl,showModal:()=>hn});function he(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-dialog"):null}function Lo(e){return e.querySelector('dialog[part="dialog"]')}function Ee(e,t){e?.dispatchEvent(new CustomEvent(t,{bubbles:!0}))}function No(e,t){if(typeof ToggleEvent<"u")return;let n=new Event("toggle",{bubbles:!1});Object.assign(n,{newState:t,oldState:t==="open"?"closed":"open"}),e.dispatchEvent(n)}function hn(e){let t=Lo(e);if(!t||t.open)return;t.showModal(),No(t,"open")}function sn(e,t){let n=Lo(e);if(!n?.open)return;n.close(t),No(n,"closed")}function Kl(e,t){e.open=t.newState==="open"}function Ul(e,t){e.open=!1,Ee(he(t),"cancel")}function Gl(e,t){e.open=!1,Ee(he(t),"close")}function Yl(e,t){let n=he(t),a=t.command??"";if(!n)return;if(a==="--show")hn(n);else if(a==="--close")sn(n)}function Xl(e,t){Ee(he(t),"confirm")}function Ql(e,t){Ee(he(t),"secondary")}function ed(e,t){let n=he(t);if(Ee(n,"cancel"),n)sn(n,"cancel")}var on={};Di(on,{focusItem:()=>Np,itemsOf:()=>Ae,onGroupKeydown:()=>id,onGroupReady:()=>sd,syncRoving:()=>an});function Co(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-action-group"?t:null}function td(e,t){return t instanceof Element&&t.closest("jx-action-group")===e}function Ae(e){return[...e.querySelectorAll("jx-action-button")].filter((t)=>t.closest("jx-action-group")===e)}function nn(e){return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function nd(e){if(e.selected===void 0&&e.checked===void 0)return e.hasAttribute("selected")||e.getAttribute("checked")==="true";return e.selected===!0||e.checked==="true"}function ad(e){(e.querySelector('[part="control"]')??e).focus()}function Oo(e,t){for(let n of e)n.tabindex=n===t?"0":"-1"}function Ro(e){let t=e.filter((a)=>!nn(a));return t.find((a)=>a.tabindex==="0")??t.find((a)=>nd(a))??t[0]??null}function Np(e,t){let n=Ae(e),a=n.filter((i)=>!nn(i));if(a.length===0)return null;let o=(t%a.length+a.length)%a.length,r=a[o];return Oo(n,r),ad(r),r}function an(e){let t=Ae(e);Oo(t,Ro(t))}function od(e){let t=Ae(e),n=Ro(t);return t.every((a)=>a.tabindex===(a===n?"0":"-1"))}var Io=new WeakSet;function rd(e){if(Io.has(e))return;Io.add(e),new MutationObserver(()=>{if(!od(e))an(e)}).observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["disabled"]})}function id(e,t){let n=Co(t);if(!n||!td(n,t.target))return;let a=e.orientation==="vertical",r=Ae(n).filter((s)=>!nn(s)).findIndex((s)=>s===t.target||t.target instanceof Node&&s.contains(t.target)),i=null;if(t.key===(a?"ArrowDown":"ArrowRight"))i=Np(n,r+1);else if(t.key===(a?"ArrowUp":"ArrowLeft"))i=Np(n,r===-1?-1:r-1);else if(t.key==="Home")i=Np(n,0);else if(t.key==="End")i=Np(n,-1);else return;if(t.preventDefault(),t.stopPropagation(),i&&e.selects==="single")i.click()}function sd(e,t){let n=Co(t);if(n)an(n),rd(n)}var cn={};Di(cn,{onSplitDoubleClick:()=>fd,onSplitKeydown:()=>pd,onSplitPointerDown:()=>cd,onSplitPointerMove:()=>hd,onSplitPointerUp:()=>ud,splitModifiersOf:()=>ES,trackOf:()=>Dv});var ld=Object.freeze({altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1});function Me(e){let t=e;return{altKey:t.altKey===!0,ctrlKey:t.ctrlKey===!0,metaKey:t.metaKey===!0,shiftKey:t.shiftKey===!0}}function ES(e){let{detail:t}=e;return t!==null&&typeof t==="object"?Me(t):{...ld}}var rn=new WeakMap;function He(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-split"?t:null}function lt(e,t,...n){for(let a of n)e.dispatchEvent(new CustomEvent(a,{bubbles:!0,composed:!0,detail:t}))}function ue(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function Do(e,t){let n=Number(e);return Number.isFinite(n)&&n>0?n:t}function dt(e){return String(e.orientation)!=="horizontal"}function Fo(e,t){return e?t.clientX:t.clientY}var Po=new WeakMap;function Dv(e,t){let n=Po.get(e);if(n&&n.vertical===t&&n.element.isConnected&&e.isConnected&&n.element.contains(e)){let a=n.element.getBoundingClientRect(),o=t?a.width:a.height;if(o>0)return o}for(let a=e.parentElement;a;a=a.parentElement){if(globalThis.getComputedStyle(a).display==="contents")continue;let o=a.getBoundingClientRect(),r=t?o.width:o.height;if(r>0)return Po.set(e,{element:a,vertical:t}),r}return 0}function ln(e,t){let n=Dv(t,dt(e)),a=ue(e.min,0),o=ue(e.max,1),r=n>0?Math.max(0,ue(e.gap,0))/n:0,i=Math.max(a,r),s=Math.min(o,1-r);if(i>s){let d=(i+s)/2;i=d,s=d}return{hi:s,length:n,lo:i}}function dn(e,t,n,a){let o=Math.min(a,Math.max(n,t));if(!Number.isFinite(o)||o===Number(e.value))return!1;return e.value=o,!0}function Zo(e,t,n){let a=Math.min(n,Math.max(t,ue(e.collapse,t))),o=Number(e.value);if(Math.abs(o-a)>0.000001)return e.restore=o,a;let r=ue(e.restore,-1);return r>=0&&Math.abs(r-a)>0.000001?r:(t+n)/2}function dd(e,t){if(e)return t==="ArrowLeft"?-1:t==="ArrowRight"?1:0;return t==="ArrowUp"?-1:t==="ArrowDown"?1:0}function cd(e,t){let n=He(t);if(!n||e.disabled===!0||ue(t.button,0)!==0)return;let{hi:a,length:o,lo:r}=ln(e,n);if(o<=0)return;if(t.preventDefault(),n.focus(),rn.set(n,{hi:a,length:o,lo:r,origin:Fo(dt(e),t),start:Number(e.value)}),typeof n.setPointerCapture==="function")try{n.setPointerCapture(t.pointerId)}catch{}e.dragging=!0}function hd(e,t){let n=He(t),a=n?rn.get(n):void 0;if(!n||!a)return;let o=Fo(dt(e),t)-a.origin;if(dn(e,a.start+o/a.length,a.lo,a.hi))lt(n,Me(t),"input")}function ud(e,t){let n=He(t);if(!n||!rn.delete(n))return;if(e.dragging=!1,typeof n.releasePointerCapture==="function"&&n.hasPointerCapture?.(t.pointerId))n.releasePointerCapture(t.pointerId);lt(n,Me(t),"change")}function pd(e,t){let n=He(t);if(!n||e.disabled===!0)return;let{hi:a,lo:o}=ln(e,n),r;if(t.key==="Home")r=o;else if(t.key==="End")r=a;else if(t.key==="Enter")r=Zo(e,o,a);else{let i=dd(dt(e),t.key);if(i===0)return;let s=t.shiftKey?Do(e.largeStep,0.1):Do(e.step,0.02);r=Number(e.value)+i*s}if(t.preventDefault(),dn(e,r,o,a))lt(n,Me(t),"input","change")}function fd(e,t){let n=He(t);if(!n||e.disabled===!0)return;let{hi:a,lo:o}=ln(e,n);if(dn(e,Zo(e,o,a),o,a))lt(n,Me(t),"input","change")}var un={};Di(un,{clearField:()=>bd,focusField:()=>Wo,mintFieldId:()=>gd,nameFieldControl:()=>xd,selectValue:()=>Hm});function Vo(e){return e.querySelector('[part="input"]')}function Hm(e,t="all"){let n=Vo(e);if(!n)return;if(n.focus(),t==="none")return;if(t==="stem"){let a=n.value.lastIndexOf(".");n.setSelectionRange(0,a>0?a:n.value.length);return}n.select()}function Wo(e){Vo(e)?.focus()}function md(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-textfield"):null}function bd(e,t){let n=md(t);if(!n)return;e.value="",Wo(n),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}var zo=0;function gd(e){zo+=1,e.uid=`jx-tf-${zo}`}var Jo=0;function wd(e){return customElements.get(e.localName)?.observedAttributes?.includes("labelledby")===!0}function xd(e,t){Jo+=1;let n=`jx-field-${Jo}`;e.uid=n;let a=(s)=>[...t.children].find((d)=>d.getAttribute("part")===s),o=a("control")?.firstElementChild;if(!o||!wd(o))return;let r=o;r.labelledby||=`${n}-label`;let i=a("help");if(i&&(i.firstElementChild!==null||i.textContent!==""))r.describedby||=`${n}-help`}var _o={$schema:"https://jxsuite.com/schema/v1",$id:"JxAccordion",tagName:"jx-accordion",observedAttributes:["multiple"],state:{multiple:{type:"boolean",default:!0,attribute:"multiple",description:`Whether more than one section may stand open at once, which is what an un-named details already is and what all six shipped Studio panels want. It is ADVISORY: the container declares the intent and reflects it as data-exclusive, and it does NOT enforce it, because the platform's own switch for exclusivity is the name attribute on each details and that attribute belongs to the item. A container that reached into its slotted children to write one would be the foreign-attribute write §2 principle 5 forbids, and there is no declarative channel from a container to light-DOM children it did not author — a slot leaves no node and projects no props. So multiple="false" is a statement a consumer makes true by giving every item the same name; the element is the place that statement is written down and read back, not the place it is imposed. The marker is spelled for the NOTABLE state rather than for the prop: every other boolean reflection in the kit (quiet, compact, checked, disabled, open, loading, stepper, selected, stacked, determinate, destructive, badInput, indeterminate) defaults false and marks attribute-present, so a marker named data-multiple would have been present on every default stack and absent exactly where the intent was declared, and styling the exclusive case would read :not([data-multiple]).`}},attributes:{"data-exclusive":"${state.multiple ? null : ''}"},style:{display:"flex","&[hidden]":{display:"none"},flexDirection:"column",minWidth:"0","& > :not([hidden]) ~ *":{borderBlockStart:"1px solid var(--jx-border)"}},children:[{tagName:"slot"}]};var Bo={$schema:"https://jxsuite.com/schema/v1",$id:"JxAccordionItem",tagName:"jx-accordion-item",observedAttributes:["label","open","name","level"],$elements:[{$ref:"./jx-icon.json"}],state:{label:{type:"string",default:"",attribute:"label",description:`The section's title, printed in the summary row, and the disclosure control's accessible name — it is written as aria-label on the summary rather than left to name-from-content, because the actions row lives inside the summary and would otherwise be read as part of the section's name (measured in Chrome: "Typography Clear typography overrides"). It is not optional: with no label the summary is a control a reader hears as "collapsed, button" and nothing else, and no lint asks for it, so the element's own test pins it instead.`},open:{type:"boolean",default:!1,attribute:"open",description:"Whether the section is disclosed. It is a two-way value: the platform writes it when the reader opens the section, and a host may write it to open or close one. Written as a property it does NOT reflect back onto the host's own open attribute, so read it as a property (or from the toggle event) rather than with getAttribute."},name:{type:"string",default:"",attribute:"name",description:"Forwarded to the inner details as its name, which is how the platform makes a group of sections mutually exclusive: every item carrying the same name closes the others when it opens. Empty means the item is independent, which is what every shipped accordion in Studio wants."},level:{type:"string",default:"",attribute:"level",description:`Opt in to heading semantics: a number here exposes the section's label as a heading at that level, so a long settings panel can be skimmed by heading navigation. It is a visually hidden [part="heading"] carrying the label, NOT a role on the summary — measured in Chrome, role=heading on a summary REPLACES the disclosure, which loses expandable and the expanded state, and a heading nested inside the summary is pruned out of the tree entirely. The cost of the shape that works is that the label text is announced twice when reading linearly, once as the heading and once as the disclosure; that is the trade, and it is why the prop is opt-in.`},onToggle:{$prototype:"Function",body:[{if:{operator:"!==",target:{$ref:"event#/detail"},value:{$ref:"event#/target/open"}},then:[{operator:"=",target:{$ref:"#/state/open"},value:{$ref:"event#/target/open"}},{dispatchEvent:"toggle",detail:{$ref:"#/state/open"},bubbles:!0}]}],emits:[{name:"toggle",description:"The section opened or closed; detail is the new open state. The PLATFORM's event name, so a host that already reads e.target.open off a native details toggle changes nothing but the element it listens on — e.target is the inner details element, not the host, and details.open is the state that just changed. It bubbles out of the details as far as the host and stops there (see onHostToggle), so bind it ON the jx-accordion-item rather than on a container."}],description:"Mirrors the platform's own toggle into open and re-announces it as an event that reaches the host, because a native toggle does not bubble and would never leave the inner details. The guard is what makes that safe: the re-announcement is dispatched from the same details the handler listens on, so an unguarded body would hear its own event and recurse forever. A toggle whose detail already equals the details' own open state is that echo and is dropped."},onHostToggle:{$prototype:"Function",body:[{stopPropagation:!0}],description:"Stops the re-announced toggle at the element's own boundary. The platform's toggle never bubbles, and the kit's overlays rely on that: jx-popover, jx-menu, jx-tooltip and jx-dialog all bind ontoggle on their own root and read event.newState with no target guard, so a toggle arriving from a descendant would be read as the overlay's own. Measured in Chrome before this existed: opening a section inside a shown jx-popover flipped the panel's open to false and dropped its data-open styling while it was still in the top layer. Listeners bound on this element still run — stopPropagation does not stop the other listeners on the node it is called from — so a host's ontoggle on the jx-accordion-item is unaffected; only ancestors stop hearing it."},onActions:{$prototype:"Function",body:[{stopPropagation:!0},{if:{operator:"===",target:{$ref:"event#/target"},value:{$ref:"event#/currentTarget"}},then:[{preventDefault:!0}]}],description:`The actions row sits INSIDE the summary, so that it stays visible while the section is closed — a sibling of summary inside details is hidden by the UA whenever the section is shut. The cost is that a click on the row's own space would also toggle the section, so the row cancels the activation, and a click on the row that reached nothing else toggles nothing: that is the intended trade. It cancels ONLY that click. A slotted control does not need cancelling — it is the click's own activation target, so the summary never toggles for it (measured: a button inside a summary leaves details.open alone) — and cancelling there would kill the control's own default, which is exactly what it did before this guard: a slotted link did not navigate and a popovertarget invoker did not open its popover. The residue is a non-interactive element slotted into the actions row, which still toggles the section; inert marks belong in [slot="heading"], which is what that slot is for.`}},ontoggle:{$ref:"#/state/onHostToggle"},style:{display:"block","&[hidden]":{display:"none"},fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",'& > [part="heading"]':{position:"absolute",width:"1px",height:"1px",margin:"-1px",overflow:"hidden",clipPath:"inset(50%)",whiteSpace:"nowrap"},'& > [part="details"] > [part="summary"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)",cursor:"default",userSelect:"none",outline:"none",listStyle:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},"&::-webkit-details-marker":{display:"none"}},'& > [part="details"] > [part="summary"] > [part="marker"]':{display:"inline-flex",flex:"none",color:"var(--jx-fg-dim)",transition:"transform var(--jx-dur-1) var(--jx-ease-out)"},'& > [part="details"][open] > [part="summary"] > [part="marker"]':{transform:"rotate(90deg)"},'& > [part="details"] > [part="summary"] > [part="label"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontWeight:"500"},'& > [part="details"] > [part="summary"] > [part="actions"]':{display:"inline-flex",flex:"none",alignItems:"center",gap:"var(--jx-space-1)"},'& > [part="details"] > [part="body"]':{padding:"var(--jx-space-2)"},'& > [part="details"] > [part="summary"] > [part="actions"]:empty':{display:"none"}},children:[{tagName:"span",attributes:{part:"heading",role:"${state.level ? 'heading' : null}","aria-level":"${state.level || null}",hidden:"${state.level ? null : ''}"},textContent:"${state.label}"},{tagName:"details",attributes:{part:"details",open:{$ref:"#/state/open"},name:"${state.name || null}"},ontoggle:{$ref:"#/state/onToggle"},children:[{tagName:"summary",attributes:{part:"summary","aria-label":"${state.label || null}"},children:[{tagName:"span",attributes:{part:"marker","aria-hidden":"true"},children:[{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"marker-icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"slot",attributes:{name:"heading"}},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]}]},{tagName:"div",attributes:{part:"body"},children:[{tagName:"slot"}]}]}]};var qo={$schema:"https://jxsuite.com/schema/v1",$id:"JxActionButton",tagName:"jx-action-button",observedAttributes:["label","hint","icon","mirror","weight","toggles","selected","quiet","emphasized","size","disabled","popovertarget","popovertargetaction","command","commandfor","stacked","haspopup","expanded","badge","loading","labelledby","describedby","checked"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-spinner.json"},{$ref:"./jx-tooltip.json"}],state:{label:{type:"string",default:"",attribute:"label",description:"The accessible name, required: an action button is icon-first, so its name is not on screen. It is NOT also the tooltip — see hint."},hint:{type:"string",default:"",attribute:"hint",description:"The tooltip, and the whole of it. While the button is ENABLED it is drawn as a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — and the control names it in aria-describedby, so it is a description beside the name and never the name itself. While the button is DISABLED it is the control's native title instead, because a disabled control receives no focus and no pointer event and could never open a tip, while the platform still shows a title on hover: that is the one affordance a button whose hint says why it cannot act still has. Never both at once. It used to fall back to label, so EVERY button got a tooltip whether or not its name was already on screen and a reader heard the name twice. Now each call site decides: pass hint on an icon-only button or one whose visible label ellipses, where a tooltip carrying the name is the standard affordance and hint equal to label is the right answer; leave it empty wherever the text is already fully visible."},icon:{type:"string",default:"",attribute:"icon",description:"The glyph, by its name in the kit's manifest. Empty for a text-only action button, which the host reflects as data-no-icon so a sheet outside the element can tell the two apart: the icon PART is hidden while a glyph button is loading as well, the spinner having taken its place, so a compact group keyed on that span widened an icon segment by 4px for the length of a verb."},mirror:{type:"boolean",default:!1,attribute:"mirror",description:"Draw the glyph flipped horizontally: one shipped glyph serves both sides of a pair."},weight:{type:"string",default:"regular",attribute:"weight",description:"The glyph's weight: regular, bold or fill. A selected toggle draws fill by convention."},toggles:{type:"boolean",default:!1,attribute:"toggles",description:"A two-state button: selected flips on activation and aria-pressed says which state it is in."},selected:{type:"boolean",default:!1,attribute:"selected",description:"The pressed or chosen state, and the ONLY thing the selected drawing follows — whoever wrote it. A host that owns the selection sets it with toggles off and the button draws selected without flipping itself or emitting change; with toggles on the button also flips it on activation. What selected does NOT do is announce anything by itself: aria-pressed comes from toggles and aria-checked from checked, so a host-owned segment that must be announced is a checked radio (and setting checked also draws it selected, so the two never disagree)."},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain button; true or false for one segment of a radio group, which then carries role=radio and aria-checked on its control, is drawn selected while it is true, and puts role=none on the HOST so the radio is the radiogroup's own child rather than a grandchild behind a generic. It is the ALTERNATIVE to toggles, not a companion: a button that is one of several mutually exclusive choices is a radio, a button that is independently on or off is a toggle. Setting both is not a second opinion but a refusal — checked wins, so no aria-pressed is written on a radio (it is not a state of that role) and the button does not flip itself either."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the button inside, not the host, so a group moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. Write tabindex on the host and you get the platform's meaning — the host is the tab stop and nothing reaches the control.`},quiet:{type:"boolean",default:!0,attribute:"quiet",description:"No fill and no border until hovered, which is what a toolbar wants. Off for a standalone tool button. It has no effect on a member of a compact jx-action-group, which draws the segmented frame itself; a row of quiet tools is a group with compact=false."},emphasized:{type:"boolean",default:!1,attribute:"emphasized",description:"Draws the selected state in the accent rather than a neutral fill."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot act. Disabled, never absent, and the hint moves from the tip to the control's title while it is: a disabled control cannot open a tip, and the reason it cannot act is exactly what the reader hovers to find out."},loading:{type:"boolean",default:!1,attribute:"loading",description:"Working on the last activation: the click is swallowed, the glyph gives way to a spinner, and aria-busy says so. An action button draws its icon from a name and has no icon slot, so this is the only way a host can put a spinner where the glyph was."},stacked:{type:"boolean",default:!1,attribute:"stacked",description:"Icon above the label, the label visible and small: the shape of a rail button. The label is then on screen, so it is the accessible name by itself."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby: the id of the visible text that names this button, when something on screen already does."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby: the id of a description beside the name, after the hint's own tip when there is one. A hint needs none of this — the element names its own tip — so it is for a description the host draws elsewhere."},haspopup:{type:"string",default:"",attribute:"haspopup",description:"What the button opens instead of running a command: menu, dialog or listbox. Forwarded to the control as aria-haspopup."},expanded:{type:"boolean",default:!1,attribute:"expanded",description:"Whether what haspopup names is showing. Forwarded to the control as aria-expanded, only when haspopup is set."},badge:{type:"string",default:"",attribute:"badge",description:"A count or a mark drawn over the button's corner; empty for none."},popovertarget:{type:"string",default:"",attribute:"popovertarget",description:"The popover this button invokes; forwarded to the inner control."},popovertargetaction:{type:"string",default:"",attribute:"popovertargetaction",description:"toggle, show or hide; forwarded with popovertarget."},command:{type:"string",default:"",attribute:"command",description:"The invoker command this button sends; forwarded to the inner control."},commandfor:{type:"string",default:"",attribute:"commandfor",description:"The element the command is sent to; forwarded to the inner control."},uid:{type:"string",default:"",description:"This button's own id stem, minted on mount by the tooltip sidecar. The control's id, the tip's id and the three attributes that wire one to the other are all built from it, so a consumer writes none of them and two hinted buttons in one toolbar cannot collide. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},noIcon:{$expression:{operator:"!",target:{$ref:"#/state/icon"}}},notLoading:{$expression:{operator:"!",target:{$ref:"#/state/loading"}}},iconHidden:{$expression:{operator:"||",target:{$ref:"#/state/noIcon"},value:{$ref:"#/state/loading"}}},notRadio:{$expression:{operator:"!",target:{$ref:"#/state/checked"}}},canToggle:{$expression:{operator:"&&",target:{$ref:"#/state/toggles"},value:{operator:"&&",target:{$ref:"#/state/notRadio"},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{$ref:"#/state/notLoading"}}}}},hasBadge:{$expression:{operator:"!==",target:{$ref:"#/state/badge"},value:""}},onSwallow:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The swallow, on the INNER CONTROL rather than the host: stopPropagation halts an event at the node it is called on and every node after it, not the other listeners on that same node — so a swallow on the host cancels the default and then runs the host's own click listeners anyway, which is the one path a consumer actually uses. Called one node earlier, the click never reaches the host at all."},onClick:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]},{if:{$ref:"#/state/canToggle"},then:[{operator:"=",target:{$ref:"#/state/selected"},value:{operator:"!",target:{$ref:"#/state/selected"}}},{dispatchEvent:"change",detail:{$ref:"#/state/selected"},bubbles:!0}]}],emits:[{name:"change",description:"A toggling button flipped; detail is the new selected state."}],description:"A toggling button flips selected and says so with change. A plain one leaves the click to the host, which listens for it on the element. The loading branch is the second half of the swallow: a click dispatched at the HOST never passes the inner control, so this is the only guard that sees it."}},onclick:{$ref:"#/state/onClick"},attributes:{role:"${state.checked ? 'none' : null}","data-size":"${state.size}","data-no-icon":"${state.icon ? null : ''}","data-quiet":"${state.quiet ? '' : null}","data-emphasized":"${state.emphasized ? '' : null}","data-selected":"${state.selected || state.checked === 'true' ? '' : null}","data-stacked":"${state.stacked ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--jx-space-2)",minWidth:"var(--jx-control-h)",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-2)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)",cursor:"pointer",whiteSpace:"nowrap",outline:"none",transition:"background var(--jx-dur-1) var(--jx-ease-out), color var(--jx-dur-1) var(--jx-ease-out)",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"},'&[aria-busy="true"]':{cursor:"progress"},position:"relative"},'&[data-quiet] > [part="control"]':{background:"transparent",borderColor:"transparent",":hover":{background:"var(--jx-hover-bg)"}},'&[data-stacked] > [part="control"]':{flexDirection:"column",gap:"2px",width:"100%",minWidth:"0",padding:"var(--jx-space-2) var(--jx-space-1)",borderRadius:"0",fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-xs)"},'&[data-stacked] > [part="control"] > [part="label"]':{display:"block",maxWidth:"100%",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'&[data-stacked] > [part="control"] > [part="label"]:empty, &[data-stacked] > [part="control"] > [part="label"]:has([part="label-slot"]:empty)':{display:"none"},'&[data-selected] > [part="control"]':{background:"var(--jx-accent-15)",color:"var(--jx-fg)"},'&[data-selected][data-emphasized] > [part="control"]':{background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[data-size="sm"] > [part="control"]':{$description:"The small action button is the kit's most packed control — Studio's toolbars, block action bar and inspector rows declare it some four hundred times — and it draws 4px under the kit's control height, which is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3). The `::before` is the hit area, jx-tab's close-button technique: an empty pseudo-element that reaches 2px past the drawn box on every side, so the region that accepts the pointer is exactly `--jx-control-h` square while the picture stays 20px. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under (jx-tab's close button is borderless, so -4px was exact there). The control is already `position: relative` for the badge, so the pseudo-element needs nothing more. A 4px gap (jx-toolbar's) lets two extended neighbours abut; a compact jx-action-group packs its members touching, and its sheet zeroes the extension on that axis, because an extension over a neighbour's box would take the neighbour's clicks, and the criterion gives an overlapped strip to the target on top rather than to both; a default group's 2px gap leaves every member but the last at 22px on that axis, which ui.md §11 names as a non-claim. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box, as it is on jx-button's small control: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so a small action button whose box touched a scrolling host's edge widened that host's scrollable region by 2px and drew a scrollbar over content that fit (Preferences · Keyboard's `Search by keystroke`, and the `Change` of a row whose title wraps, both did). The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it. A row that holds a small action button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout. The containment also makes the control a stacking context and the containing block of anything fixed inside it; neither moves a pixel here, because the badge is already positioned against the control, nothing fixed lives inside it, and a compact group's later member still paints over an earlier one, both painting in the positioned layer in tree order.",minWidth:"calc(var(--jx-control-h) - 4px)",minHeight:"calc(var(--jx-control-h) - 4px)",padding:"0 var(--jx-space-1)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-3px"}},'&[data-size="lg"] > [part="control"]':{minWidth:"calc(var(--jx-control-h) + 8px)",minHeight:"calc(var(--jx-control-h) + 8px)",padding:"0 var(--jx-space-3)"},'& [part="icon"]':{display:"inline-flex",color:"inherit"},'& [part="icon"][hidden]':{display:"none"},'& [part="label"]':{display:"contents"},'& [part="label-slot"]':{display:"contents"},'& [part="badge-slot"]':{display:"contents"},'& > [part="tooltip"]':{display:"contents"},'& [part="badge"]':{display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:"16px",padding:"0 var(--jx-space-2)",borderRadius:"999px",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)",fontSize:"var(--jx-text-xs)",lineHeight:"16px",fontVariantNumeric:"tabular-nums",position:"absolute",top:"2px",right:"2px",boxSizing:"border-box",pointerEvents:"none"},'& [part="spinner"]':{display:"inline-flex",color:"inherit"},'& [part="spinner"][hidden]':{display:"none"}},children:[{tagName:"button",onclick:{$ref:"#/state/onSwallow"},attributes:{part:"control",type:"button",disabled:{$ref:"#/state/disabled"},id:"${state.uid || null}","aria-label":"${state.label || null}",title:"${state.disabled && state.hint ? state.hint : null}",interestfor:"${state.hasTip ? state.uid + '-tip' : null}",role:"${state.checked ? 'radio' : null}","aria-checked":"${state.checked || null}","aria-pressed":"${state.toggles && !state.checked ? (state.selected ? 'true' : 'false') : null}",tabindex:"${state.tabindex || null}",popovertarget:"${state.popovertarget || null}",popovertargetaction:"${state.popovertargetaction || null}",command:"${state.command || null}",commandfor:"${state.commandfor || null}","aria-haspopup":"${state.haspopup || null}","aria-expanded":"${state.haspopup ? (state.expanded ? 'true' : 'false') : null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-busy":"${state.loading ? 'true' : null}","aria-disabled":"${state.loading ? 'true' : null}"},children:[{tagName:"span",attributes:{part:"icon"},hidden:{$ref:"#/state/iconHidden"},children:[{tagName:"jx-icon",$props:{name:{$ref:"#/state/icon"},weight:{$ref:"#/state/weight"},mirror:{$ref:"#/state/mirror"}},attributes:{part:"icon-glyph"}}]},{tagName:"jx-spinner",attributes:{part:"spinner"},hidden:{$ref:"#/state/notLoading"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"badge-slot"},$switch:{$ref:"#/state/hasBadge"},cases:{true:{tagName:"span",attributes:{part:"badge","aria-hidden":"true"},textContent:"${state.badge}"}}}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var Ko={$schema:"https://jxsuite.com/schema/v1",$id:"JxActionGroup",tagName:"jx-action-group",observedAttributes:["selects","compact","label","orientation"],state:{selects:{type:"string",default:"none",attribute:"selects",description:`Which ARIA pattern the row is: none is a toolbar of unrelated tools, single is a radiogroup of mutually exclusive choices, multiple is a plain group of independent toggles. It chooses the pattern and the keyboard; it does NOT own the selection. Every shipped call site keeps the selected value in the host, so in single the group clicks the child an arrow lands on and lets the host decide what that means. In single the host must also give every child a checked prop of "true" or "false": a radiogroup's required owned element is a radio, and jx-action-button becomes one only when checked is non-empty — a group of bare buttons is announced as a radiogroup with no checked member at all.`},compact:{type:"boolean",default:!0,attribute:"compact",description:`Draw the children joined into one segmented control, sharing their inner borders and rounding only the outer corners. The group draws every member's frame and fill itself, whatever the member's own quiet says: a strong border round an input fill, the selected member in the accent tint with an accent edge (the solid accent with emphasized), 6px of inline padding on a small member that shows text and no glyph, because the small size's 2px ran "Edit" into "Design", and muted ink on a disabled member, because fading it whole would fade its share of the shared frame. A member's quiet has no effect here. The control is one LINE — a segmented frame is written in tree order and no selector can find the ends of a wrapped line — so a row of choices that has to wrap is compact=false too. Off leaves them as separate buttons with a gap, each drawing itself, so a row of borderless tools is compact=false, never a compact group of quiet members. This is the one thing no button can do about itself: joining N of them needs selectors about a child's position among its siblings. The seam is a DIRECT-CHILD rule: it reaches the buttons the group itself owns — a slot leaves no node, so a distributed child is one — and so a nested group keeps its own compact, and a button a surface wraps in a div of its own is roved but not joined.`},label:{type:"string",default:"",attribute:"label",description:"The accessible name of the group, and it is not optional in practice: a toolbar, a radiogroup and a group are all containers a reader is told they have entered, and an unnamed one is announced by its role alone. Nothing lints its absence — a bound role switches the naming rules off — so the element's own test pins it instead."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:`horizontal or vertical. It chooses which arrow pair moves the caret, and it turns both the layout and the segmented seam through 90 degrees off data-orientation. It also sets aria-orientation, but only where ARIA permits one: role=group — what selects="multiple" resolves to — supports neither aria-orientation nor its inheritance, and Chrome drops the attribute there, so writing it anyway would be an aria-allowed-attr violation in a consumer's own axe run.`},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/action-group.ts",$export:"onGroupKeydown",description:"The group keyboard contract: the arrow along its own axis moves the roving caret between enabled children with wrap, Home and End go to the ends, and in selects=single the child that takes the caret is clicked."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/action-group.ts",$export:"onGroupReady",description:"Collapses the group to one tab stop once it has rendered, and keeps it collapsed to one as children come and go. It listens for the element's own jx-ready because onMount is handed the reactive scope alone, and placing a caret needs the host."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The group has rendered and distributed its children, so its caret can be placed."}],description:"Announces that the element has rendered. The group's own onReady listens for it, and a host may too."}},attributes:{role:"${state.selects === 'single' ? 'radiogroup' : (state.selects === 'multiple' ? 'group' : 'toolbar')}","aria-label":"${state.label || null}","aria-orientation":"${state.selects === 'multiple' ? null : state.orientation}","data-orientation":"${state.orientation}","data-compact":"${state.compact ? '' : null}"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle",alignItems:"center",gap:"var(--jx-space-1)",'&[data-orientation="vertical"]':{flexDirection:"column",alignItems:"stretch"},"&[data-compact]":{$description:"A segmented control is ONE line, and this is where it says so. Every seam rule below is written in TREE order — the -1px overlap on `+ jx-action-button`, the rounded ends on `:first-of-type` and `:last-of-type` — and CSS has no selector for the first or last item on a flex LINE, so a group that wrapped put the overlap on a line-start member (1px outside the group's own edge), left both line ends square, and abutted the two lines into a doubled 2px border. Nothing in a sheet can see a line break, so the group refuses one rather than drawing it badly. A row of choices that has to wrap is `compact: false`: there each member draws its own rounded frame and the gap comes back, so every line reads the same (Studio's Size and Features chips are that row).",gap:"0",flexWrap:"nowrap"},'&[data-compact] > jx-action-button > [part="control"]':{borderRadius:"0"},'&[data-compact] > jx-action-button + jx-action-button > [part="control"]':{marginInlineStart:"-1px"},'&[data-compact] > jx-action-button:first-of-type > [part="control"]':{borderStartStartRadius:"var(--jx-radius-sm)",borderEndStartRadius:"var(--jx-radius-sm)"},'&[data-compact] > jx-action-button:last-of-type > [part="control"]':{borderStartEndRadius:"var(--jx-radius-sm)",borderEndEndRadius:"var(--jx-radius-sm)"},'&[data-compact][data-orientation="vertical"] > jx-action-button > [part="control"]':{$description:"A vertical group stretches its member HOSTS to the widest one (`align-items: stretch` above), and a host is an inline-flex row whose control sits inside it at its own content width: so the segments' end edges stepped in and out down the column, one frame per label length, from the moment the group started drawing those frames. The control takes the whole host, as the zoom pod's label does for the same reason, and keeps the control's own centring.",flex:"1"},'&[data-compact][data-orientation="vertical"] > jx-action-button + jx-action-button > [part="control"]':{marginInlineStart:"0",marginBlockStart:"-1px"},'&[data-compact][data-orientation="vertical"] > jx-action-button:first-of-type > [part="control"]':{borderEndStartRadius:"0",borderStartEndRadius:"var(--jx-radius-sm)"},'&[data-compact][data-orientation="vertical"] > jx-action-button:last-of-type > [part="control"]':{borderStartEndRadius:"0",borderEndStartRadius:"var(--jx-radius-sm)"},'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]':{$description:"The frame is the group's, not the member's. Every seam rule above acts on a member's border, and jx-action-button is quiet by default (a transparent border and fill, which is what a toolbar wants), so the shared borders, the rounded ends and the -1px overlap all worked on borders nobody could see, and a compact group drew as a gap-less row of bare words: the Canvas view switch, the Style panel's Display row, Preferences' Theme, the zoom pod and every other group Studio converted from Spectrum, whose sp-action-button was NOT quiet by default, so the conversion dropped the frame without anybody writing it off. So the group draws its members whatever their quiet says, which is what ui.md §5.4 means by `compact` with `single` being the segmented control. This rule and the selected one below are mutually exclusive, so neither depends on sheet order against the member's own; at (0,4,1) under the scope handle each outranks the member's quiet and selected rules at (0,3,0) and quiet's hover at (0,4,0). The ink restates the member's resting colour at this specificity so that only the hover rule below, which leaves a disabled member alone, can raise it: the member's own hover is not gated on disabled, and a disabled segment brightening under the pointer reads as one that can act.",borderColor:"var(--jx-border-strong)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)"},'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]:hover:not(:disabled)':{$description:"The hover wash is LAYERED over the input fill rather than replacing it, as the member's own hover does. `--jx-hover-bg` is 6% of the ink over transparent, so on its own it shows whatever stands behind the group, and on the zoom pod's darkest background that came out a shade from the resting fill: a hover that did not read. As an image over the fill it is always the resting colour plus the wash, in both schemes.",backgroundColor:"var(--jx-bg-input)",backgroundImage:"linear-gradient(var(--jx-hover-bg), var(--jx-hover-bg))",color:"var(--jx-fg)"},'&[data-compact] > jx-action-button[data-selected] > [part="control"]':{$description:"The chosen segment: the accent tint with an accent EDGE. The member's own selected state is a 15% tint and nothing else, which beside a bordered neighbour read as a faint wash rather than as the one that is on. Raised over both neighbours, so the accent edge shows on every side through the -1px overlap, and still under a focus ring. A hovered selected segment stays as it is: this outranks the member's quiet hover.",borderColor:"var(--jx-accent)",background:"var(--jx-accent-20)",color:"var(--jx-fg)",zIndex:"1"},'&[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]':{$description:"The member's emphasized, kept: the solid accent, edge and all.",borderColor:"var(--jx-accent-solid)",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[data-compact] > jx-action-button > [part="control"]:disabled':{$description:"A disabled segment dims its INK and not the frame. jx-action-button fades the whole control (`opacity: 0.5`), which is right where the border is the button's own; in a group the border is one member's share of a frame drawn across all of them, so half-fading it left the outer rectangle bright on one side of a seam and faint on the other — a control that reads as half-broken rather than as half-unavailable. Muted ink is a step below the resting dim, and it carries a selected segment too: the accent fill and edge stay, so the chosen one still reads as chosen while it cannot act. AFTER the selected rules on purpose, because it ties with them at (0,4,1) and has to win the ink.",opacity:"1",color:"var(--jx-fg-muted)"},'&[data-compact] > jx-action-button[data-size="sm"][data-no-icon] > [part="control"]':{$description:'A small member that shows no glyph is a text segment, and the small size\'s inline padding is 2px, which is right for a 20px glyph button and ran the words of a text row together ("flex" into "grid"). A text segment takes 6px: one step between --jx-space-2 and --jx-space-3, because the widest Style panel row measured 220px of its 256px at 4px and --jx-space-3 overflowed it. 6px costs that row 4px — `nowrap`, `wrap-reverse`, `normal` and `auto` are the only values css-meta leaves without a glyph, so no button row draws more than two text segments and the six-segment rows draw one. Keyed on the HOST\'s data-no-icon, not on a hidden icon part: the icon span is hidden while a glyph segment is `loading` too, since the spinner takes its place, so an icon segment grew 4px mid-verb and snapped back when it settled. Scoped to the group rather than made the small size\'s own, because some forty other small text buttons in Studio would widen with it.',paddingInline:"6px"},'&[data-compact] > jx-action-button > [part="control"]:focus-visible':{$description:"Over everything, the selected segment's raised edge included, so a focus ring is never painted under a neighbour.",zIndex:"2"},'&[data-compact] > jx-action-button[data-size="sm"] > [part="control"]::before':{$description:"A small action button carries a `::before` that extends its hit area 2px past its drawn box on every side (an inset of -3px: the button's 1px border, then half the 4px it is under, because an absolutely positioned box is offset from the padding edge), so that a 20px picture accepts the pointer over the kit's 24px control height (WCAG 2.2 SC 2.5.8, ui.md §4.3). In a compact group the boxes TOUCH on the packed axis — no gap, and each border drawn over the last — so an extension there could reach nothing but the neighbour's own box, and the later sibling paints above the earlier one: the last 2px of every button but the last would activate the button after it. The criterion gives an overlapped area to the target on TOP, so the extension would buy the earlier button nothing and cost it a stolen strip. The default 2px gap is the other case: two extensions overlap by 2px there, the later member keeps the strip, and every small member but the last counts 22px on the packed axis, which is under the floor and which ui.md §11 names beside this one. The packed axis is therefore zeroed here — `0` is the padding edge, 1px inside the drawn border, and the button's own box accepts the pointer over that pixel — and the cross axis keeps its 2px past the drawn box, which reaches only the gap around the group: a compact group's small members are 24px tall and as wide as they draw, which ui.md §11 records as the one thing the technique cannot reach. The vertical variant swaps the axes, and its inline value is the button's own -3px for the same reason.",insetInline:"0"},'&[data-compact][data-orientation="vertical"] > jx-action-button[data-size="sm"] > [part="control"]::before':{insetInline:"-3px",insetBlock:"0"},"@(forced-colors: active)":{'&[data-compact] > jx-action-button[data-selected] > [part="control"], &[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]':{$description:"The chosen segment, redrawn. Forced colours replace every author colour with the user's palette, so the accent tint and the accent edge both collapse into the ones around them and the segmented control would say nothing about which segment is on. The system's own selection pair says it instead, as jx-switch does for its checked track. The emphasized selector is spelled out beside the plain one because a media condition adds no specificity: at (0,4,1) this block won `forced-color-adjust: none` and then LOST border, background and colour to the emphasized rule at (0,5,1), which painted the author's blue over the user's palette with adjustment switched off — the one combination where forced colours were worse than none.",forcedColorAdjust:"none",borderColor:"Highlight",background:"Highlight",color:"HighlightText"}}},children:[{tagName:"slot"}]};var Uo={$schema:"https://jxsuite.com/schema/v1",$id:"JxButton",tagName:"jx-button",observedAttributes:["variant","size","quiet","disabled","loading","type","autofocus","label","hint","labelledby","describedby","popovertarget","popovertargetaction","command","commandfor"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-spinner.json"},{$ref:"./jx-tooltip.json"}],state:{variant:{type:"string",default:"secondary",attribute:"variant",description:"How much the button asks for: accent (the one primary action on a surface), primary (a solid neutral), secondary (the default outline) or negative (a destructive action)."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},quiet:{type:"boolean",default:!1,attribute:"quiet",description:"No fill and no border until hovered: a button that sits in a toolbar or beside text."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the control inside, not the host, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot act. Disabled, never absent; a reason belongs in the surrounding text or in hint, which a disabled button draws as the control's native title because a disabled control can open no tip."},loading:{type:"boolean",default:!1,attribute:"loading",description:"Working on the last activation: blocks another one, keeps its width, and says so through aria-busy."},type:{type:"string",default:"button",attribute:"type",description:"The native button type: button, submit or reset."},autofocus:{type:"boolean",default:!1,attribute:"autofocus",description:"Takes focus when the surface it is on opens. Forwarded to the inner control, which is the element the platform reads it from: a dialog's showModal() focuses the first focusable descendant unless one claims autofocus."},label:{type:"string",default:"",attribute:"label",description:"The accessible name when the visible text is not it, or there is none. Forwarded to the inner control as aria-label."},hint:{type:"string",default:"",attribute:"hint",description:"A tooltip beside the name, for a button whose visible text is cut short or whose disabled state needs a reason; empty, the usual case, draws nothing. The same shape as jx-action-button's: while the button is ENABLED it is a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — named on the control in aria-describedby so it describes rather than names; while the button is DISABLED it is the control's native title instead, the one affordance a control that receives no focus and no pointer still has. Never both at once."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the hint's own tip when there is one."},uid:{type:"string",default:"",description:"This button's own id stem, minted on mount by the tooltip sidecar. The control's id, the tip's id and the three attributes that wire one to the other are all built from it, so a consumer writes none of them. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},popovertarget:{type:"string",default:"",attribute:"popovertarget",description:"The popover this button invokes; forwarded to the inner control, which is the element the platform reads it from."},popovertargetaction:{type:"string",default:"",attribute:"popovertargetaction",description:"toggle, show or hide; forwarded with popovertarget."},command:{type:"string",default:"",attribute:"command",description:"The invoker command this button sends; forwarded to the inner control."},commandfor:{type:"string",default:"",attribute:"commandfor",description:"The element the command is sent to; forwarded to the inner control."},notLoading:{$expression:{operator:"!",target:{$ref:"#/state/loading"}}},onSwallow:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The swallow, on the INNER CONTROL rather than the host: stopPropagation halts an event at the node it is called on and every node after it, not the other listeners on that same node — so a swallow on the host cancels the default and then runs the host's own click listeners anyway, which is the one path a consumer actually uses. Called one node earlier, the click never reaches the host at all."},onClick:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The second half of the swallow, for a click dispatched AT the host: that one never passes the inner control, so this is the only guard that sees it. Its default (a form submission, a popover, a command) is cancelled either way. A disabled button never gets this far, because its inner control is disabled."}},onclick:{$ref:"#/state/onClick"},attributes:{"data-variant":"${state.variant}","data-size":"${state.size}","data-quiet":"${state.quiet ? '' : null}","data-loading":"${state.loading ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-4)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",cursor:"pointer",whiteSpace:"nowrap",outline:"none",transition:"background var(--jx-dur-1) var(--jx-ease-out), border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"},'&[aria-busy="true"]':{cursor:"progress"}},'&[data-variant="accent"] > [part="control"]':{background:"var(--jx-accent-solid)",borderColor:"transparent",color:"var(--jx-accent-fg)",":hover":{background:"var(--jx-accent-hover)"}},'&[data-variant="primary"] > [part="control"]':{background:"var(--jx-fg)",borderColor:"transparent",color:"var(--jx-bg)",":hover":{background:"var(--jx-fg-dim)"}},'&[data-variant="negative"] > [part="control"]':{background:"var(--jx-danger)",borderColor:"transparent",color:"var(--jx-accent-fg)",":hover":{filter:"brightness(1.1)"}},'&[data-quiet] > [part="control"]':{background:"transparent",borderColor:"transparent",":hover":{background:"var(--jx-hover-bg)"}},'&[data-size="sm"] > [part="control"]':{$description:"A small button draws 4px under the kit's control height, and the control height is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the drawn box alone would be a 20px pointer target at the default density. The `::before` is the hit area: an empty pseudo-element that reaches 2px past the drawn box on every side, so what accepts the pointer is exactly `--jx-control-h` square while the picture stays small — jx-tab's close button's technique, and the criterion measures the region that accepts the pointer, not the paint. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under. jx-tab's close button is borderless, which is why -4px was exact there, and why the number did not carry over unchanged. In a jx-toolbar (a 4px gap) two extended neighbours abut and neither loses a pixel; jx-action-group's own sheet zeroes the packed axis in a compact group, where the boxes touch and an extension could only steal a strip of the neighbour. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so every `sm` button inside a host that scrolls (Preferences · Assistant's `Refresh models` and `Save` both are) was quietly widening and heightening that host's scrollable region by a few px — enough, with jx-textfield's clear button and jx-combobox's toggle doing the same thing beside it, to draw a scrollbar over a panel whose visible content fit. The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it (Welcome's `Recent` header stood 7px taller for it until it centred its `Clear all`). A row that holds a small button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout.",position:"relative",minHeight:"calc(var(--jx-control-h) - 4px)",padding:"0 var(--jx-space-3)",fontSize:"var(--jx-text-sm)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-3px"}},'&[data-size="lg"] > [part="control"]':{minHeight:"calc(var(--jx-control-h) + 8px)",padding:"0 var(--jx-space-5)",fontSize:"var(--jx-text-lg)"},'& > [part="control"] > [part="icon"]':{display:"contents"},'& [part="spinner"]':{display:"inline-flex",color:"inherit"},'& [part="spinner"][hidden]':{display:"none"},'& > [part="tooltip"]':{display:"contents"}},children:[{tagName:"button",onclick:{$ref:"#/state/onSwallow"},attributes:{part:"control",id:"${state.uid || null}",type:"${state.type}",disabled:{$ref:"#/state/disabled"},"aria-disabled":"${state.loading ? 'true' : null}","aria-busy":"${state.loading ? 'true' : null}","aria-label":"${state.label || null}",title:"${state.disabled && state.hint ? state.hint : null}",interestfor:"${state.hasTip ? state.uid + '-tip' : null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}",tabindex:"${state.tabindex || null}",popovertarget:"${state.popovertarget || null}",popovertargetaction:"${state.popovertargetaction || null}",command:"${state.command || null}",commandfor:"${state.commandfor || null}",autofocus:{$ref:"#/state/autofocus"}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"jx-spinner",attributes:{part:"spinner"},hidden:{$ref:"#/state/notLoading"}}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var Go={$schema:"https://jxsuite.com/schema/v1",$id:"JxCheckbox",tagName:"jx-checkbox",observedAttributes:["checked","indeterminate","disabled","label","labelledby","describedby","name","size"],state:{checked:{type:"boolean",default:!1,attribute:"checked",description:"Whether the box is ticked. Bound to the control BOTH ways, and each binding answers a different question. The PROPERTY is the live state: once the reader clicks, the checkedness dirty flag is set and the content attribute stops controlling the box, so a property binding is the only one that keeps tracking a host write after the first click. The content ATTRIBUTE is the control's DEFAULT checkedness, and it is mirrored because this element is not form-associated (specs/ui.md 3.2): it never hears form.reset(), so without the mirror a reset would move the CONTROL to the authored default and leave the element's state where it was, and the two would disagree silently. With it, a reset is a visible no-op, which is a missing feature rather than a lie."},indeterminate:{type:"boolean",default:!1,attribute:"indeterminate",description:"The mixed state: neither ticked nor clear, for a box standing over a set that is partly on. HTML gives it no content attribute at all — it exists only as a property — which is the reason this element exists: written into attributes it would parse, validate and silently do nothing. So there is nothing to mirror and no default for a form reset to return to, and a click clears it in the platform."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be ticked or focused. Disabled, never absent."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Leave it empty when the slotted text is on screen: the empty value REMOVES the attribute so the wrapping label's text names the box, rather than naming it twice."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby, for a visible label the box does not wrap."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, for a help or error sentence the row owns."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The row height is the kit's, so a column of controls lines up."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the input inside, not the host and not the label that wraps it, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/checked"},value:{$ref:"event#/target/checked"}},{operator:"=",target:{$ref:"#/state/indeterminate"},value:{$ref:"event#/target/indeterminate"}}],description:"Mirrors both halves of the control's state back. A click on a mixed box clears indeterminate and toggles checked in the platform; reading only checked would let the next flush re-assert mixed over the reader's own tick. The native change and input events bubble from the control as they always do."}},attributes:{"data-size":"${state.size}","data-checked":"${state.checked ? '' : null}","data-indeterminate":"${state.indeterminate ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",minWidth:"0","&[hidden]":{display:"none"},'& > [part="control"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",minWidth:"0",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",cursor:"pointer"},'& [part="input"]':{accentColor:"var(--jx-accent-solid)",flex:"none",width:"var(--jx-icon-size)",height:"var(--jx-icon-size)",margin:"0",cursor:"inherit",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px",borderRadius:"var(--jx-radius-xs)"}},'& [part="label"]':{minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="label"]:empty':{display:"none"},'&[data-disabled] > [part="control"]':{opacity:"0.5",cursor:"default",color:"var(--jx-fg-dim)"},'&[data-size="sm"] > [part="control"]':{$description:"The control is the `<label>` wrapping the input, and the label is the pointer target: a click anywhere on it toggles the box. At `sm` it draws 4px under the kit's control height, the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the `::before` extends the hit area 2px beyond the box on every side — jx-tab's close-button technique, the same shape jx-button carries — and the region that accepts the pointer is `--jx-control-h` tall while the row stays 20px. -2px is exact here where jx-button needs -3px: an absolutely positioned box is offset from the PADDING edge, and the label draws no border, so its padding edge is its drawn edge. The label needs `position: relative` here for the pseudo-element to measure against; the input inside is 14px and needs nothing of its own, because the label around it is the target. Held by target-size.test.ts and the conformance gate. `contain: layout` keeps the reach LOCAL, as it does on jx-button's and jx-action-button's small controls: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, invisible or not, so a small checkbox touching a scrolling host's edge would add 2px to that host's scrollable region and draw a scrollbar over content that fit. The price is the baseline: a layout-contained label exports none, so a row aligned on `baseline` puts the label's bottom edge on its text baseline, and a row that holds a small checkbox centres it (`align-items: center`) instead.",position:"relative",minHeight:"calc(var(--jx-control-h) - 4px)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-2px"}},'&[data-size="sm"] [part="input"]':{width:"calc(var(--jx-icon-size) - 2px)",height:"calc(var(--jx-icon-size) - 2px)"},'&[data-size="lg"] > [part="control"]':{minHeight:"calc(var(--jx-control-h) + 8px)",fontSize:"var(--jx-text-lg)",lineHeight:"var(--jx-leading-lg)"},'&[data-size="lg"] [part="input"]':{width:"calc(var(--jx-icon-size) + 2px)",height:"calc(var(--jx-icon-size) + 2px)"}},children:[{tagName:"label",attributes:{part:"control"},children:[{tagName:"input",attributes:{part:"input",type:"checkbox","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${state.describedby || null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},checked:{$ref:"#/state/checked"}},checked:{$ref:"#/state/checked"},indeterminate:{$ref:"#/state/indeterminate"},onchange:{$ref:"#/state/onChange"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]}]};var Yo={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorArea",tagName:"jx-color-area",observedAttributes:["label","x-label","y-label","hue","saturation","brightness","step","disabled"],state:{label:{type:"string",default:"",attribute:"label",description:`The accessible name of the square, which is a role="group" holding two sliders. NOT optional: role="group" is in neither the accessibility lint's content-named roles nor its labelled ones, so an unnamed one is invisible to every gate, and a reader entering it is told they have entered a group and nothing more. "Colour" or the name of the property being edited is the right answer; the two axes carry their own names.`},xLabel:{type:"string",default:"Saturation",attribute:"x-label",description:"The horizontal slider's accessible name. A prop rather than a constant because it is words on a screen reader's lips, and a shell in another language must be able to say them; the default is the English one so a consumer who does not care writes nothing."},yLabel:{type:"string",default:"Brightness",attribute:"y-label",description:"The vertical slider's accessible name, on the same terms as xLabel."},hue:{type:"number",default:0,attribute:"hue",description:"The hue the square is drawn under, 0-360. The element READS it and never writes it: a saturation/brightness field has no hue of its own, and the control that owns the hue is a jx-color-slider beside it. Dragging into the grey corner therefore leaves the hue exactly where the reader put it, which is the whole reason the two are separate elements."},saturation:{type:"number",default:100,attribute:"saturation",description:"The horizontal axis, 0-100. It is the x coordinate of the thumb and the value of the horizontal range, and those are the same number rather than two that must be kept in step."},brightness:{type:"number",default:100,attribute:"brightness",description:"The vertical axis, 0-100, measured UPWARD from the bottom edge — 100 is the top. The thumb's CSS offset is the complement, computed in the document, because a reader's mental model of a colour square is bright at the top and a stylesheet's is zero at the top, and only one of those two should be in a prop."},step:{type:"number",default:1,attribute:"step",description:"The grid both axes move on, for the platform's own arrow keys, for the kit's cross-axis and ten-step keys, and for the snap a pointer drag is put through. One grid for the pointer and the keyboard is what stops the thumb and the announced value disagreeing during a drag."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved or focused. Forwarded to both ranges, so the refusal is the platform's; the pointer and key handlers check it too, because a pointer on the track never reaches a disabled control to be refused by it."},xText:"${Math.round(state.saturation) + '%'}",yText:"${Math.round(state.brightness) + '%'}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaAxisInput",emits:[{name:"input",description:"An axis is moving under the reader's hand. It comes from the ELEMENT, so e.target.saturation and e.target.brightness are the whole answer."}],description:"Mirrors whichever range moved into its axis and re-says input from the host. The native event is stopped: two controls holding half a coordinate each cannot both be e.target for one colour."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaAxisChange",emits:[{name:"change",description:"The reader committed a value; e.target is the element."}],description:"The same mirror and the same re-say, for the commit."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaKeydown",description:"The two keyboard jobs a range cannot do for itself: the arrow across the OTHER axis, and Shift+Arrow for ten steps. An along-axis arrow with no Shift is left entirely to the platform, which already clamps, snaps and announces it."},onPointerDown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerDown",description:"Takes the colour under the pointer, captures the gesture on the track, and puts the caret on the horizontal range so the keyboard carries on from where the pointer stopped. A single press with no movement is a complete gesture, which is what keeps this clear of WCAG 2.5.7."},onPointerMove:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerMove",description:"The drag. Nothing moves without a press first, so a hover across the square changes no colour."},onPointerUp:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerUp",description:"Ends the gesture and commits once. Bound to pointercancel as well as pointerup: a gesture the system takes away is over, and a square left in the dragging state would follow the next pointer that crossed it with no button down."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"},onpointerdown:{$ref:"#/state/onPointerDown"},onpointermove:{$ref:"#/state/onPointerMove"},onpointerup:{$ref:"#/state/onPointerUp"},onpointercancel:{$ref:"#/state/onPointerUp"},attributes:{role:"group","aria-label":"${state.label || null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",inlineSize:"100%","--jx-color-area-size":"160px","--jx-color-area-hue":"hsl(${state.hue} 100% 50%)","--jx-color-area-x":"${state.saturation}%","--jx-color-area-y":"${100 - state.brightness}%","&[data-disabled]":{opacity:"0.5"},'& > [part="track"]':{position:"relative",display:"block",boxSizing:"border-box",inlineSize:"100%",blockSize:"var(--jx-color-area-size)",borderRadius:"var(--jx-radius-sm)",background:"linear-gradient(to bottom, transparent, oklch(0 0 0)), linear-gradient(to right, oklch(1 0 0), var(--jx-color-area-hue))",boxShadow:"inset 0 0 0 1px var(--jx-border-strong)",touchAction:"none",cursor:"crosshair"},'&[data-disabled] > [part="track"]':{cursor:"default"},'& [part="x"], & [part="y"]':{$description:"The two ranges are TRANSPARENT rather than hidden, and that is the whole accessibility of this element. display:none or visibility:hidden would take them out of the accessibility tree and out of the tab order, leaving a square only a pointer can operate — a WCAG 2.1.1 failure with a thumb drawn on it. opacity:0 keeps the role, the name, the announced value and the focus; pointer-events:none hands the gesture to the track, whose own handler owns the two-dimensional maths.",appearance:"none",position:"absolute",insetInline:"0",insetBlock:"0",inlineSize:"100%",blockSize:"100%",margin:"0",padding:"0",border:"0",background:"none",font:"inherit",opacity:"0",pointerEvents:"none"},'& [part="y"]':{writingMode:"vertical-lr",direction:"rtl"},'& [part="thumb"]':{position:"absolute",insetInlineStart:"var(--jx-color-area-x)",insetBlockStart:"var(--jx-color-area-y)",inlineSize:"14px",blockSize:"14px",translate:"-50% -50%",borderRadius:"50%",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",pointerEvents:"none"},'&:has([part="x"]:focus-visible) [part="thumb"], &:has([part="y"]:focus-visible) [part="thumb"]':{outline:"var(--jx-focus-ring)",outlineOffset:"2px"}},children:[{tagName:"div",attributes:{part:"track"},children:[{tagName:"input",attributes:{part:"x",type:"range","aria-label":"${state.xLabel}","aria-valuetext":"${state.xText}",min:"0",max:"100",step:"${state.step}",value:"${state.saturation}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/saturation"}},{tagName:"input",attributes:{part:"y",type:"range","aria-label":"${state.yLabel}","aria-valuetext":"${state.yText}",min:"0",max:"100",step:"${state.step}",value:"${state.brightness}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/brightness"}},{tagName:"span",attributes:{part:"thumb","aria-hidden":"true"}}]}]};var Xo={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorField",tagName:"jx-color-field",observedAttributes:["value","resolved","format","alpha","label","labelledby","size","disabled","system","eyedropper"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-action-button.json"},{$ref:"./jx-textfield.json"},{$ref:"./jx-popover.json"},{$ref:"./jx-color-area.json"},{$ref:"./jx-color-slider.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The colour, spelled as format says. This is what the element HOLDS; the four channels behind the picker are a working copy of it, and the sidecar rewrites that copy only when the two genuinely disagree. The empty string means no colour has been chosen and draws the slashed chip rather than black."},resolved:{type:"string",default:"",attribute:"resolved",description:"The colour behind value, for a value the page cannot resolve: a var() naming a token whose definition lives in the document being EDITED rather than in the one drawing this field, which is what Studio's palette commits. Empty, the chip draws value itself, which is right whenever the browser can resolve it. Set, it is what the chip draws and what the picker opens on, so the first drag starts from the token's own colour rather than from wherever the sliders last were; value is untouched, and the text field still shows the reference. A host that sets it is answering for the value it also set, so it clears it when the value stops being a reference."},format:{type:"string",default:"hex",attribute:"format",description:"hex or oklch: which spelling the element writes when the reader moves anything. It changes what is WRITTEN, never what is read — a reader may type any of hex, rgb() or oklch() into the text field whatever this says, because refusing a colour the element itself could have produced would be a trap."},alpha:{type:"boolean",default:!1,attribute:"alpha",description:"Whether the colour has an opacity at all: it adds the alpha track to the picker and the alpha channel to the value. Off, every value the element writes is opaque, so a field that feeds a property with no alpha cannot be handed one by accident."},label:{type:"string",default:"",attribute:"label",description:'What the colour is FOR — "Background", "Border" — and the stem every control inside the element takes its own name from: the text field is named this, the swatch button is "Pick <label>", the screen picker is "Pick <label> from the screen". Required: five controls named only by their roles is five sliders and two buttons in a row, and a reader has no way to tell this field from the next one.'},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the text field as aria-labelledby, for a visible label the element does not own. The other controls keep their composed names, because a visible label naming the row does not name the button inside it."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg, forwarded to the text field so a row of controls lines up."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be opened or edited. Forwarded to every control inside, and checked again by the handlers that open the picker and the screen picker, because those act on a click rather than on a control's own refusal."},system:{type:"boolean",default:!0,attribute:"system",description:"Offer the operating system's own colour picker, through a native input type=color. It is a DOOR and never the control: it opens the platform's dialog, takes what comes back, and has no part in how the element is operated. Turn it off where a project's colours must come from its own palette."},eyedropper:{type:"boolean",default:!0,attribute:"eyedropper",description:"Offer the screen picker, where the engine has one. The button is drawn only when BOTH this and the EyeDropper API are there, so an engine without it shows no dead control rather than one that does nothing when pressed."},tabindex:{type:"string",default:"",description:`Forwarded to the swatch button as its tabindex, which is what makes a roving caret possible: a jx-toolbar moving focus writes this rather than reaching into the element's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. The swatch is THE stop, and it is named part=control for that reason, which is the kit's name for the node a roving container focuses. It is the opener, so Enter on it reaches the whole picker and a reader parked on it can choose any colour; it is the one control the element always draws; and it is first in the row, so Tab lands where the eye does. While the prop is set the text field, the screen picker and the system door step out of the tab order (tabindex -1): a container that has been told this element is one stop must find exactly one, and those three are then the pointer's. Unset, which is every form, each keeps its own stop.`},hue:{type:"number",default:0,description:"The working hue, 0-360. It is kept across a colour going grey, which is why it is state rather than something derived from value each time: a round trip through the string would send the hue track back to red the moment the reader dragged the saturation to zero."},saturation:{type:"number",default:0,description:"The working saturation, 0-100: the square's horizontal axis."},brightness:{type:"number",default:0,description:"The working brightness, 0-100: the square's vertical axis, measured upward."},opacity:{type:"number",default:100,description:"The working opacity, 0-100, in the alpha track's own units. Only ever written into the value when alpha is on."},text:{type:"string",default:"",description:"What the text field is showing, which is NOT value while the reader is mid-word: a half-typed hex is not a colour and the element must not refuse it or reformat it under the caret. It becomes the value on the commit, and follows the value whenever anything else moves it."},invalid:{type:"boolean",default:!1,description:"Whether the text field is holding something that is not a colour. Raised on the COMMIT rather than on each keystroke, and forwarded to the text field so the refusal is announced there."},expanded:{type:"boolean",default:!1,description:"Whether the picker is showing. It follows the panel's own toggle event, so light dismissal and Escape move it as surely as the button does; writing it opens nothing."},ink:{type:"string",default:"",description:"black or white, whichever can be seen on the current colour. The preview chip's boundary is drawn in it, because a neutral border disappears against a neutral colour and a control whose edge cannot be seen is a WCAG 1.4.11 failure."},solid:{type:"string",default:"",description:"The current colour at full opacity, as hex. Two things need it and neither can compute it: the alpha track fades from it, and a native input type=color accepts the six-digit form and nothing else."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The picker panel takes its id from it and the swatch button names that id in aria-controls, so nothing a consumer writes has to be unique."},dropperAvailable:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"eyeDropperAvailable",parameters:["offered"],description:"Whether the screen picker is both offered here and present in the engine. A capability question, asked by the document rather than assumed by it. It takes the opt-in as an argument because a Function entry with no declared parameters is an event handler rather than a callable, and calling one from a template throws mid-render and takes the element's whole child tree with it."},hasDropper:"${state.dropperAvailable(state.eyedropper)}",preview:"${state.resolved || state.value || 'transparent'}",pickerId:"${state.uid ? state.uid + '-picker' : ''}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldInput",emits:[{name:"input",description:"The colour is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is the colour whichever of the five controls moved it."}],description:"The one listener the whole composed control speaks through: it works out which channel fired from the data-channel beside each part, stops the original, and re-says the platform's own name from the host."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldChange",emits:[{name:"change",description:"The reader committed a colour; e.target is the element."}],description:"The same routing, for the commit. It is also where a typed colour is parsed: a keystroke is not a colour and the refusal waits for this."},onOpen:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onOpenPicker",description:"Positions the panel under the field and shows it, or hides it when it is already showing. The coordinates are written before the panel is shown, which is what jx-popover asks of whoever opens it."},onDropper:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onEyeDropper",description:"Opens the system's screen picker and takes what comes back. A reader who dismisses it has cancelled rather than failed, so the rejection is swallowed and the colour is left where it was."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldMount",description:"Learns the element, mints its id stem, takes the value apart into the working channels, and keeps them in step with value for as long as it lives — through data-value, which is the one thing that moves when a host writes el.value."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The element has rendered, which is how onReady reaches the element itself."}],description:"Announces that the element has rendered. Its own onReady listens for it, and a host may too."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},"onjx-ready":{$ref:"#/state/onReady"},attributes:{"data-value":"${state.value}","data-resolved":"${state.resolved}","data-size":"${state.size}","data-expanded":"${state.expanded ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle",minInlineSize:"0","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px","--jx-color-field-preview":"${state.preview}","--jx-color-field-ink":"${state.ink || 'var(--jx-border-strong)'}",'& > [part="row"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minInlineSize:"0"},'& > [part="row"] > [part="control"]':{appearance:"none",font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"none",inlineSize:"var(--jx-control-h)",blockSize:"var(--jx-control-h)",margin:"0",padding:"var(--jx-space-1)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",cursor:"pointer",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="preview"]':{display:"block",inlineSize:"100%",blockSize:"100%",borderRadius:"var(--jx-radius-xs)",background:"linear-gradient(var(--jx-color-field-preview), var(--jx-color-field-preview)), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-color-field-ink)"},'& [part="text"]':{minInlineSize:"0",inlineSize:"11ch"},'& [part="system-slot"], & [part="dropper-slot"], & [part="opacity-slot"]':{display:"contents"},'& [part="system"]':{appearance:"none",inlineSize:"var(--jx-control-h)",blockSize:"var(--jx-control-h)",flex:"none",margin:"0",padding:"2px",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",cursor:"pointer",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="picker"]':{"--jx-popover-offset":"6px"},'& [part="panel"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",inlineSize:"200px"},'& [part="tokens"]':{display:"block"},'& [part="tokens"]:empty':{display:"none"}},children:[{tagName:"div",attributes:{part:"row"},children:[{tagName:"button",attributes:{part:"control",type:"button","aria-label":"Pick ${state.label}","aria-haspopup":"dialog","aria-expanded":"${state.expanded ? 'true' : 'false'}","aria-controls":"${state.pickerId || null}",tabindex:"${state.tabindex || null}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onOpen"},children:[{tagName:"span",attributes:{part:"preview","aria-hidden":"true"}}]},{tagName:"jx-textfield",attributes:{part:"text","data-jx-channel":"text"},$props:{label:{$ref:"#/state/label"},labelledby:{$ref:"#/state/labelledby"},value:{$ref:"#/state/text"},size:{$ref:"#/state/size"},invalid:{$ref:"#/state/invalid"},disabled:{$ref:"#/state/disabled"},mono:!0,autocomplete:"off",spellcheck:!1,tabindex:"${state.tabindex ? '-1' : ''}"}},{tagName:"span",attributes:{part:"dropper-slot"},$switch:{$ref:"#/state/hasDropper"},cases:{true:{tagName:"jx-action-button",attributes:{part:"dropper"},$props:{icon:"eyedropper",label:"Pick ${state.label} from the screen",hint:"Pick ${state.label} from the screen",quiet:!1,tabindex:"${state.tabindex ? '-1' : ''}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onDropper"}}}},{tagName:"span",attributes:{part:"system-slot"},$switch:{$ref:"#/state/system"},cases:{true:{tagName:"input",attributes:{part:"system","data-jx-channel":"system",type:"color","aria-label":"Choose ${state.label} in the system picker",value:"${state.solid}",tabindex:"${state.tabindex ? '-1' : null}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/solid"}}}}]},{tagName:"jx-popover",attributes:{part:"picker",id:"${state.pickerId || null}"},$props:{label:"${state.label} picker"},children:[{tagName:"div",attributes:{part:"panel"},children:[{tagName:"jx-color-area",attributes:{part:"area","data-jx-channel":"area"},$props:{label:"Saturation and brightness",hue:{$ref:"#/state/hue"},saturation:{$ref:"#/state/saturation"},brightness:{$ref:"#/state/brightness"},disabled:{$ref:"#/state/disabled"}}},{tagName:"jx-color-slider",attributes:{part:"hue","data-jx-channel":"hue"},$props:{label:"Hue",channel:"hue",value:{$ref:"#/state/hue"},disabled:{$ref:"#/state/disabled"}}},{tagName:"span",attributes:{part:"opacity-slot"},$switch:{$ref:"#/state/alpha"},cases:{true:{tagName:"jx-color-slider",attributes:{part:"opacity","data-jx-channel":"opacity"},$props:{label:"Opacity",channel:"alpha",value:{$ref:"#/state/opacity"},color:{$ref:"#/state/solid"},disabled:{$ref:"#/state/disabled"}}}}},{tagName:"div",attributes:{part:"tokens","data-jx-channel":"palette"},children:[{tagName:"slot",attributes:{name:"tokens"}}]}]}]}]};var Qo={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorSlider",tagName:"jx-color-slider",observedAttributes:["label","labelledby","channel","value","min","max","step","color","disabled"],state:{label:{type:"string",default:"",attribute:"label",description:`The accessible name, forwarded to the inner range as aria-label. Required unless labelledby names a visible one: a slider is in the accessibility lint's LABELLED_ROLES, so it may not take its name from anything it contains, and an unnamed hue track is announced as "slider" and a number.`},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner range as aria-labelledby, for a visible label the element does not own."},channel:{type:"string",default:"hue",attribute:"channel",description:"What the track is made of: hue draws the full spectrum and runs 0-360, alpha draws the colour fading out over a checkerboard and runs 0-100. It chooses the drawing, the default top of the range and the units the value is announced in, so it is the one prop that has to be right; everything else has a sensible answer without it."},value:{type:"number",default:0,attribute:"value",description:"Where the thumb is, in the track's own units — degrees on a hue track, percent on an alpha one. It is bound to the inner range BOTH ways: as the value property, which is the live value once the reader's first drag has set the control's dirty flag, and as the value attribute, which is the control's default and therefore what a form reset returns to."},min:{type:"number",default:0,attribute:"min",description:"The bottom of the range. Zero for both shipped channels, and there so a consumer can cut a track down to a band."},max:{type:"number",default:0,attribute:"max",description:"The top of the range, or 0 to let the channel decide — 360 for hue, 100 for alpha. Zero means unset rather than a top of zero, because a numeric prop coerces a removed attribute through the current value's type and a non-zero default could then never be cleared; a track that genuinely ends at zero has nowhere to move and is not a control."},step:{type:"number",default:1,attribute:"step",description:"The grid the value moves on, for the platform's own arrow keys and for the kit's ten-step Shift+Arrow."},color:{type:"string",default:"",attribute:"color",description:"The colour an alpha track fades from, as any CSS colour. Ignored by a hue track. Empty falls back to currentColor, so a track with nothing told to it still draws something honest rather than nothing at all."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved or focused. Forwarded to the inner range, so the refusal is the platform's rather than a style that only looks like one."},maxValue:"${state.max > 0 ? state.max : (state.channel === 'alpha' ? 100 : 360)}",trackImage:"${state.channel === 'alpha' ? 'linear-gradient(to right, transparent, ' + (state.color || 'currentColor') + ')' : 'linear-gradient(to right, hsl(0 100% 50%), hsl(60 100% 50%), hsl(120 100% 50%), hsl(180 100% 50%), hsl(240 100% 50%), hsl(300 100% 50%), hsl(360 100% 50%))'}",valueText:"${state.channel === 'alpha' ? Math.round(state.value) + '%' : Math.round(state.value) + ' degrees'}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderInput",emits:[{name:"input",description:"The value is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is the number in the track's own units."}],description:"Mirrors the inner range into value and re-says the platform's own input from the host, so one e.target answers for every colour element in the kit."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderChange",emits:[{name:"change",description:"The reader committed the value; e.target is the element."}],description:"The same mirror and the same re-say, for the commit."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderKeydown",description:"Shift+Arrow moves ten steps, which no range has of its own. A plain arrow, Home, End and the Page keys are the platform's and are not touched."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-channel":"${state.channel}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",inlineSize:"100%",minInlineSize:"120px","--jx-color-track-h":"16px","--jx-color-track-image":"${state.trackImage}","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px","&[data-disabled]":{opacity:"0.5"},'& > [part="track"]':{position:"relative",display:"block",boxSizing:"border-box",inlineSize:"100%",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-color-track-image), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-border-strong)"},'& [part="input"]':{appearance:"none",position:"absolute",insetInline:"0",insetBlock:"0",inlineSize:"100%",blockSize:"100%",margin:"0",padding:"0",border:"0",background:"none",font:"inherit",cursor:"pointer",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px",borderRadius:"var(--jx-radius-sm)"},":disabled":{cursor:"default"}},'& [part="input"]::-webkit-slider-thumb':{appearance:"none",inlineSize:"12px",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-xs)",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",cursor:"inherit"},'& [part="input"]::-moz-range-thumb':{appearance:"none",inlineSize:"12px",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-xs)",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",cursor:"inherit"}},children:[{tagName:"div",attributes:{part:"track"},children:[{tagName:"input",attributes:{part:"input",type:"range","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-valuetext":"${state.valueText}",min:"${state.min}",max:"${state.maxValue}",step:"${state.step}",value:"${state.value}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/value"}}]}]};var tr={$schema:"https://jxsuite.com/schema/v1",$id:"JxDialog",tagName:"jx-dialog",observedAttributes:["headline","confirm-label","secondary-label","cancel-label","destructive","dismissible","size"],$elements:[{$ref:"./jx-button.json"}],state:{headline:{type:"string",default:"",attribute:"headline",description:"The dialog's title, which is also its accessible name. Empty for a dialog named by its content."},confirmLabel:{type:"string",default:"OK",attribute:"confirm-label",description:"The primary button's text; empty for no primary button."},secondaryLabel:{type:"string",default:"",attribute:"secondary-label",description:"A third answer beside confirm and cancel, such as Discard; empty for none."},cancelLabel:{type:"string",default:"Cancel",attribute:"cancel-label",description:"The cancel button's text; empty for no cancel button."},destructive:{type:"boolean",default:!1,attribute:"destructive",description:"The primary action destroys something: its button draws in the negative variant, and the dialog opens with CANCEL focused instead of it, so a reader who answers with Enter does not destroy anything."},dismissible:{type:"boolean",default:!1,attribute:"dismissible",description:"A click outside the dialog closes it, as Escape always does. Off for an answer the reader must give."},size:{type:"string",default:"sm",attribute:"size",description:"sm, md or lg: the dialog's width."},open:{type:"boolean",default:!1,description:"Whether the dialog is showing. Read-only state, mirrored from the platform: open it with showModal(host) from the behaviours module, or with a --show invoker command aimed at the element."},hasHeadline:{$expression:{operator:"!==",target:{$ref:"#/state/headline"},value:""}},hasConfirm:{$expression:{operator:"!==",target:{$ref:"#/state/confirmLabel"},value:""}},hasSecondary:{$expression:{operator:"!==",target:{$ref:"#/state/secondaryLabel"},value:""}},hasCancel:{$expression:{operator:"!==",target:{$ref:"#/state/cancelLabel"},value:""}},confirmVariant:"${state.destructive ? 'negative' : 'accent'}",closedby:"${state.dismissible ? 'any' : 'closerequest'}",onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onToggle",description:"The platform's toggle on the inner dialog, mirrored into open."},onNativeCancel:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onNativeCancel",description:"Escape or a light dismissal: the platform closes the dialog, and the element dispatches cancel.",emits:[{name:"cancel",description:"The reader declined: Escape, a dismissal, or the cancel button."}]},onNativeClose:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onNativeClose",description:"The platform's close, whatever closed it, dispatched as close.",emits:[{name:"close",description:"The dialog closed, for any reason."}]},onCommand:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onCommand",description:"An invoker command aimed at the element: --show opens it modally, --close closes it."},onConfirm:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onConfirm",description:"The primary button: dispatches confirm and leaves closing to the host, so a refused value can keep the dialog open.",emits:[{name:"confirm",description:"The primary button was activated."}]},onSecondary:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onSecondary",description:"The secondary button: dispatches secondary.",emits:[{name:"secondary",description:"The secondary button was activated."}]},onCancelClick:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onCancelClick",description:"The cancel button: dispatches cancel and closes the dialog."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its native dialog, so a host may open it."}},oncommand:{$ref:"#/state/onCommand"},attributes:{"data-size":"${state.size}","data-open":"${state.open ? '' : null}","data-destructive":"${state.destructive ? '' : null}"},style:{display:"contents","&[hidden]":{display:"none"},'& > [part="dialog"]':{boxSizing:"border-box",width:"min(90vw, 24rem)",maxHeight:"85vh",margin:"auto",padding:"0",border:"1px solid var(--jx-border)",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-dialog)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",overflow:"auto","&::backdrop":{background:"rgba(0, 0, 0, 0.4)"},":focus-visible":{outline:"var(--jx-focus-ring)"}},'&[data-size="md"] > [part="dialog"]':{width:"min(90vw, 32rem)"},'&[data-size="lg"] > [part="dialog"]':{width:"min(90vw, 44rem)"},'& [part="header"]':{padding:"var(--jx-space-5) var(--jx-space-5) 0"},'& [part="header"]:empty':{display:"none"},'& [part="headline"]':{margin:"0",fontSize:"var(--jx-text-lg)",lineHeight:"var(--jx-leading-lg)",fontWeight:"600"},'& [part="body"]':{padding:"var(--jx-space-4) var(--jx-space-5)"},'& [part="footer"]':{display:"flex",justifyContent:"flex-end",alignItems:"center",gap:"var(--jx-space-2)",padding:"0 var(--jx-space-5) var(--jx-space-5)"},'& [part="secondary"]':{marginRight:"auto"},'& [part="secondary-slot"], & [part="cancel-slot"], & [part="confirm-slot"]':{display:"contents"}},children:[{tagName:"dialog",attributes:{part:"dialog",closedby:"${state.closedby}","aria-label":"${state.headline || null}"},ontoggle:{$ref:"#/state/onToggle"},oncancel:{$ref:"#/state/onNativeCancel"},onclose:{$ref:"#/state/onNativeClose"},children:[{tagName:"header",attributes:{part:"header"},$switch:{$ref:"#/state/hasHeadline"},cases:{true:{tagName:"h2",attributes:{part:"headline"},textContent:"${state.headline}"}}},{tagName:"div",attributes:{part:"body"},children:[{tagName:"slot"}]},{tagName:"footer",attributes:{part:"footer"},children:[{tagName:"div",attributes:{role:"none",part:"secondary-slot"},$switch:{$ref:"#/state/hasSecondary"},cases:{true:{tagName:"jx-button",$props:{quiet:!0},attributes:{part:"secondary"},onclick:{$ref:"#/state/onSecondary"},children:[{tagName:"span",textContent:"${state.secondaryLabel}",attributes:{part:"secondary-label"}}]}}},{tagName:"div",attributes:{role:"none",part:"cancel-slot"},$switch:{$ref:"#/state/hasCancel"},cases:{true:{tagName:"jx-button",attributes:{part:"cancel",autofocus:"${state.destructive ? '' : null}"},onclick:{$ref:"#/state/onCancelClick"},children:[{tagName:"span",textContent:"${state.cancelLabel}",attributes:{part:"cancel-label"}}]}}},{tagName:"div",attributes:{role:"none",part:"confirm-slot"},$switch:{$ref:"#/state/hasConfirm"},cases:{true:{tagName:"jx-button",$props:{variant:{$ref:"#/state/confirmVariant"}},attributes:{part:"confirm",autofocus:"${state.destructive ? null : ''}"},onclick:{$ref:"#/state/onConfirm"},children:[{tagName:"span",textContent:"${state.confirmLabel}",attributes:{part:"confirm-label"}}]}}}]},{tagName:"div",attributes:{part:"overlay-slot"}}]}]};var nr={$schema:"https://jxsuite.com/schema/v1",$id:"JxDivider",tagName:"jx-divider",observedAttributes:["orientation"],state:{orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical."}},attributes:{orientation:"${state.orientation}"},style:{display:"block","&[hidden]":{display:"none"},flex:"none",margin:"var(--jx-space-1) 0",'& > [part="rule"]':{margin:"0",border:"0",borderTop:"1px solid var(--jx-border)"},'&[orientation="vertical"]':{display:"flex",alignSelf:"stretch",margin:"0 var(--jx-space-1)"},'&[orientation="vertical"][hidden]':{display:"none"},'&[orientation="vertical"] > [part="rule"]':{borderTop:"0",borderLeft:"1px solid var(--jx-border)"}},children:[{tagName:"hr",attributes:{part:"rule",role:"separator","aria-orientation":"${state.orientation}"}}]};var ar={$schema:"https://jxsuite.com/schema/v1",$id:"JxDot",tagName:"jx-dot",observedAttributes:["tone"],state:{tone:{type:"string",default:"",attribute:"tone",description:"danger, success or warning. Anything else, the empty default included, is the neutral disc."}},attributes:{tone:"${state.tone || null}"},style:{display:"inline-block","&[hidden]":{display:"none"},flex:"none",width:"6px",height:"6px",borderRadius:"50%",background:"var(--jx-fg-muted)",'&[tone="danger"]':{background:"var(--jx-danger)"},'&[tone="success"]':{background:"var(--jx-success)"},'&[tone="warning"]':{background:"var(--jx-warning)"}},children:[]};var or={$schema:"https://jxsuite.com/schema/v1",$id:"JxField",tagName:"jx-field",observedAttributes:["label","description","required","invalid","warning","span"],state:{label:{type:"string",default:"",attribute:"label",description:"The visible label in the left column. It is drawn into the element's own label node, and that node's id is what names the slotted control — so the text is the accessible name without the consumer writing an id anywhere."},description:{type:"string",default:"",attribute:"description",description:'A sentence under the row explaining the control. It is the FALLBACK of the help slot, so slotting richer help replaces it rather than stacking with it, and an empty description leaves the help line with nothing in it — which is exactly what [part="help"]:empty keys on to take the line out of flow. The control is pointed at the sentence only when the line HAS something in it at mount — an empty one would be a reference to an empty paragraph, which the four classes never wrote. A sentence that starts empty and fills later should therefore be SLOTTED into help, whose presence the row can see, rather than passed here.'},required:{type:"boolean",default:!1,attribute:"required",description:"Draws the required mark after the label. The mark is DRAWN, in content with an empty alt string, never appended to the label text: the label is the control's accessible name, and an asterisk inside that name is read out as a word. Marking the row does not make the control required — say so on the control as well, which is the element that validates."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The row's value is refused: the label and the help sentence both draw in the danger colour. This is the whole of the old .jx-help-text--error class, folded in as a state of the row rather than a second class on the sentence. It says nothing to assistive technology — aria-invalid belongs on the control that holds the value."},warning:{type:"boolean",default:!1,attribute:"warning",description:"The row's value is accepted but worth a second look: the label draws in the warning colour. The help sentence is left alone, because a warning is a shade on the name rather than a correction of the sentence under it."},span:{type:"boolean",default:!1,attribute:"span",description:"Collapses the row to ONE column: the label sits above the control and reads from the left. It is the shape a long label, a wide control or a checkbox list needs, and it is a property of the row rather than of anything in it."},uid:{type:"string",default:"",description:"This row's own id stem, minted on mount. The label node and the help sentence take their ids from it, and the slotted control is handed those ids as its labelledby and describedby props."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"nameFieldControl",description:"Mints the row's id stem and names the slotted control with it. A document cannot do either: the closed operator set has no counter, and no body can write a property on an element other than the one whose handler is running. It runs once, over what is slotted then: a control APPENDED to the row afterwards lands outside the control part, unplaced and unnamed. Keep the control in the document and switch its state rather than adding it later."}},attributes:{"data-span":"${state.span ? '' : null}","data-required":"${state.required ? '' : null}","data-invalid":"${state.invalid ? '' : null}","data-warning":"${state.warning ? '' : null}"},style:{display:"grid",gridTemplateColumns:"var(--jx-field-label-w) minmax(0, 1fr)",columnGap:"var(--jx-space-3)",rowGap:"var(--jx-space-1)",alignItems:"center",padding:"var(--jx-space-1) 0",minWidth:"0","&[hidden]":{display:"none"},"&[data-span]":{gridTemplateColumns:"minmax(0, 1fr)"},'& > [part="label"]':{display:"block",width:"var(--jx-field-label-w)",minWidth:"0",textAlign:"right",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'&[data-span] > [part="label"]':{width:"auto",textAlign:"left"},'&[data-invalid] > [part="label"]':{color:"var(--jx-danger)"},'&[data-warning] > [part="label"]':{color:"var(--jx-warning)"},'&[data-required] > [part="label"]':{"::after":{content:'"*" / ""',color:"var(--jx-danger)",marginInlineStart:"var(--jx-space-1)"}},'& > [part="control"]':{display:"contents"},'& > [part="help"]':{gridColumn:"1 / -1",margin:"0",minWidth:"0",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)"},'& > [part="help"]:empty':{display:"none"},'&[data-invalid] > [part="help"]':{color:"var(--jx-danger)"}},children:[{tagName:"label",attributes:{part:"label",id:"${state.uid ? state.uid + '-label' : null}"},textContent:"${state.label}"},{tagName:"div",attributes:{part:"control",role:"none"},children:[{tagName:"slot"}]},{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},children:[{tagName:"slot",attributes:{name:"help"},children:["${state.description}"]}]}]};var rr={$schema:"https://jxsuite.com/schema/v1",$id:"JxKbd",tagName:"jx-kbd",style:{display:"inline-block","&[hidden]":{display:"none"},padding:"0 var(--jx-space-2)",border:"1px solid var(--jx-border)",borderRadius:"var(--jx-radius-xs)",background:"var(--jx-bg-panel)",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-mono)",fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-sm)"},children:[{tagName:"slot"}]};var ir={$schema:"https://jxsuite.com/schema/v1",$id:"JxIcon",tagName:"jx-icon",observedAttributes:["name","weight","label","mirror"],state:{name:{type:"string",default:"",attribute:"name",description:"The glyph to draw, by its Phosphor name. Every name the kit ships is in icons/list.json."},weight:{type:"string",default:"regular",attribute:"weight",description:"regular, bold, or fill. fill is the active drawing of the same glyph; a weight the manifest lacks falls back to regular."},label:{type:"string",default:"",attribute:"label",description:"The accessible name. Empty hides the icon from assistive technology, which is right whenever visible text already names the control."},mirror:{type:"boolean",default:!1,attribute:"mirror",description:"Flip horizontally: a directional glyph in a right-to-left layout, or its opposite."},lookup:{$prototype:"Function",$src:"jx-ui:/icons.ts",$export:"iconPath",parameters:["name","weight"],description:"Path data for a name and weight, from the committed manifest."},path:"${state.lookup(state.name, state.weight)}"},style:{display:"inline-flex","&[hidden]":{display:"none"},flex:"none",width:"var(--jx-icon-size, 16px)",height:"var(--jx-icon-size, 16px)",verticalAlign:"middle","& > svg":{display:"block",width:"100%",height:"100%"}},children:[{tagName:"svg",attributes:{part:"svg",viewBox:"0 0 256 256",fill:"currentColor",focusable:"false",role:"img","aria-label":"${state.label}","aria-hidden":"${state.label ? 'false' : 'true'}"},style:{transform:"${state.mirror ? 'scale(-1, 1)' : 'none'}"},children:[{tagName:"path",attributes:{part:"path",d:"${state.path}"}}]}]};var sr={$schema:"https://jxsuite.com/schema/v1",$id:"JxMenu",tagName:"jx-menu",observedAttributes:["label","placement","x","y","floor"],state:{label:{type:"string",default:"Menu",attribute:"label",description:"The accessible name of the menu."},placement:{type:"string",default:"",attribute:"placement",description:"Where the menu sits relative to the element it was opened from, as a CSS position-area value, or empty. Empty is the default and means placement by x and y, because a menu's usual opening is at a POINTER — a context menu — where the source it was shown from is what gets the keyboard back and not where the panel hangs. A menu that hangs from a button sets it (block-end span-inline-end, below and leading-aligned; block-end span-inline-start for a trailing edge) and is then placed by the platform against that button, followed through scroll and resize, and flipped when it would overflow; a submenu is placed inline-end span-block-end of its row without being asked. The value is passed to the property as written. A stack with a floor is never anchored: a floor is a limit the platform's fallbacks cannot express, so it keeps the coordinate placement the clamp honours."},x:{type:"number",default:0,attribute:"x",description:"Where the panel's inline-start edge sits, in viewport pixels. A root menu is placed at the pointer or beside its opener; a submenu is placed beside its row by the menu behaviour."},y:{type:"number",default:0,attribute:"y",description:"Where the panel's block-start edge sits, in viewport pixels."},floor:{type:"number",default:0,attribute:"floor",description:"The lowest edge this panel and its submenus may reach, in viewport pixels; 0 means the viewport. A menu opened from a rail that abuts a status bar sets it to the rail's bottom, so a tall submenu never runs down over the bar."},anchored:{type:"boolean",default:!1,description:"Whether this panel is placed by the platform against the element it was shown from: an opening with a source, an area to use (placement, or the submenu default), and no floor on the stack's root. Written by the behaviour on beforetoggle, before layout, so the first frame is already in place; cleared on close; mirrored as data-anchored for the anchored rule. Not an attribute, because it is the platform's fact."},area:{type:"string",default:"",description:"The position-area the anchored rule reads: placement when it is set, else the submenu default for a menu inside a row, else empty. Derived by the behaviour on beforetoggle rather than by the document, because only the behaviour can see whether this menu is a submenu."},open:{type:"boolean",default:!1,description:"Whether the panel is showing. Follows the platform's toggle event; write it through showPopover() and hidePopover(), not directly."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuKeydown",description:"The menu keyboard contract: Arrow keys, Home, End and typeahead move; Enter and Space activate; ArrowRight opens a submenu and ArrowLeft leaves it; Escape closes one level; Tab closes the whole stack."},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuBeforeToggle",description:"Decides anchored and area before the panel is laid out (see the two)."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuToggle",description:"Mirrors the platform's toggle event into open, clamps a freshly shown panel into the viewport, and moves focus to the first row."},onPointerOver:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuPointerOver",description:"Opens the submenu of the row under the pointer and closes any sibling's."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it. A menu is always an auto popover: light dismiss and Escape are the platform's."}},attributes:{role:"menu","aria-label":"${state.label}",popover:"auto",tabindex:"-1","data-anchored":"${state.anchored ? '' : null}"},onkeydown:{$ref:"#/state/onKeydown"},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},onpointerover:{$ref:"#/state/onPointerOver"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",margin:"0",padding:"var(--jx-space-2)",minWidth:"180px",maxWidth:"min(360px, calc(100vw - 8px))",maxHeight:"calc(100vh - 8px)",overflowY:"auto",boxSizing:"border-box",flexDirection:"column",gap:"var(--jx-space-1)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-md)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",pointerEvents:"auto",outline:"none",":popover-open":{display:"flex"},"&[hidden]:popover-open":{display:"none"},"@supports (position-area: block-end)":{$description:"The anchored placement, for a menu that hangs from a button and for every submenu: the platform puts it against its IMPLICIT anchor — the element it was shown from — follows that element through scroll and resize, and flips it when the first placement would overflow, which for a submenu is the flip to its parent's inline-start the clamp used to compute by hand. No anchor-name is involved; a popover's invoker is its implicit anchor by the platform's own rule (ui.md 5.2, 6). The insets are released so x and y stop mattering. Outside this block, and for a menu at a pointer or on a stack with a floor, the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",positionArea:"${state.area}",positionTryFallbacks:"flip-block, flip-inline, flip-block flip-inline"}},"& hr":{border:"0",borderTop:"1px solid var(--jx-border)",margin:"var(--jx-space-1) 0"}},children:[{tagName:"slot"}]};var lr={$schema:"https://jxsuite.com/schema/v1",$id:"JxMenuItem",tagName:"jx-menu-item",observedAttributes:["value","disabled","destructive","requires","checked","haspopup"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for; the detail of the select event it dispatches."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot act is disabled, never absent; it stays reachable and explains itself through requires."},destructive:{type:"boolean",default:!1,attribute:"destructive",description:"Draws the row in the danger colour. Derived from the command record, never decided per menu."},requires:{type:"string",default:"",attribute:"requires",description:"The one-sentence reason a DISABLED row cannot act, drawn as the row's native title while it is disabled and nowhere at all while it is not. The title is the whole contract here, and deliberately not the tooltip hybrid jx-button, jx-action-button and jx-switch ship: a disabled row can open no tip, so the hybrid collapses to its disabled half, and an ENABLED row never carries a requires — every Studio projection fills it from the registry's disabledReason, which is undefined for a command that can run, and a reason on a row that can act is a contradiction rather than a hint. Studio's menu surface also prints the same sentence as the row's visible description (`Needs …`), so a keyboard reader hears it without the title."},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain item; true or false for a checkbox item, which then carries aria-checked."},haspopup:{type:"boolean",default:!1,attribute:"haspopup",description:"The row owns a submenu, slotted as submenu. It still runs its own command; the submenu opens on hover, ArrowRight or the chevron."},expanded:{type:"boolean",default:!1,description:"Whether the row's submenu is showing. Written by the menu behaviour."},noPopup:{$expression:{operator:"!",target:{$ref:"#/state/haspopup"}}},onClick:{$prototype:"Function",body:[{stopPropagation:!0},{if:{operator:"!",target:{$ref:"#/state/disabled"}},then:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0}]}],emits:[{name:"select",description:"The row was activated; detail is its value."}],description:"Activation dispatches select unless the row is disabled. The click stops here: a row inside a submenu is a descendant of the row that owns it, and a click that kept bubbling would activate both."}},attributes:{role:"${state.checked ? 'menuitemcheckbox' : 'menuitem'}",tabindex:"-1","aria-disabled":"${state.disabled ? 'true' : 'false'}","aria-checked":"${state.checked || null}","aria-haspopup":"${state.haspopup ? 'menu' : null}","aria-expanded":"${state.haspopup ? (state.expanded ? 'true' : 'false') : null}",title:"${state.disabled && state.requires ? state.requires : null}"},onclick:{$ref:"#/state/onClick"},style:{display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-3)",borderRadius:"var(--jx-radius-sm)",cursor:"default",userSelect:"none",outline:"none",color:"${state.destructive && !state.disabled ? 'var(--jx-danger)' : 'inherit'}",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-disabled="true"]':{opacity:"0.5"},'& > [part="icon"]':{display:"inline-flex",color:"var(--jx-fg-dim)"},'& > [part="text"]':{display:"flex",flexDirection:"column",flex:"1",minWidth:"0"},'& > [part="text"] > [part="label"]':{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},'& > [part="text"] > [part="description"]':{fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-xs)",color:"var(--jx-fg-muted)"},'& > [part="value"]':{color:"var(--jx-fg-dim)",fontSize:"var(--jx-text-sm)",whiteSpace:"nowrap"},'& > [part="value"] kbd':{fontFamily:"var(--jx-font-mono)",fontSize:"var(--jx-text-xs)",color:"var(--jx-fg-dim)"},'& > [part="chevron"]':{display:"inline-flex",color:"var(--jx-fg-dim)"},'& > [part="chevron"][hidden]':{display:"none"}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"text"},children:[{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"description"},children:[{tagName:"slot",attributes:{name:"description"}}]}]},{tagName:"span",attributes:{part:"value"},children:[{tagName:"slot",attributes:{name:"value"}}]},{tagName:"span",attributes:{part:"chevron"},hidden:{$ref:"#/state/noPopup"},children:[{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"chevron-icon"}}]},{tagName:"slot",attributes:{name:"submenu"}}]};var dr={$schema:"https://jxsuite.com/schema/v1",$id:"JxPopover",tagName:"jx-popover",observedAttributes:["label","arrow","match-width","placement","x","y","floor"],state:{label:{type:"string",default:"",attribute:"label",description:`The panel's accessible name. Set, the panel becomes a named role="group"; empty, it carries no role at all. A PANEL HOLDING CONTROLS MUST SET IT: role="group" is in neither the accessibility lint's content-named roles nor its labelled roles, so an unnamed one is invisible to every gate, and a non-modal group of form controls with no role and no name announces no boundary on entry. A panel holding only a jx-menu leaves it empty, because the menu carries its own name.`},arrow:{type:"boolean",default:!1,attribute:"arrow",description:`Draw a pointer at the panel's block-start edge. Decorative and aria-hidden; off by default, because a panel placed by measured coordinates cannot promise the arrow lands on its anchor. THE PANEL ITSELF NEVER SCROLLS: the scroll box is [part="content"], because a scroll container clips whatever hangs outside its padding box and the arrow hangs 5px above it; with overflow on the host the arrow paints nothing at all.`},matchWidth:{type:"boolean",default:!1,attribute:"match-width",description:"Make the panel at least as wide as the element it was opened from, the way a select's list matches its trigger. The width is re-measured on each toggle and never continuously, from whatever the toggle names as its source: a raw <button popovertarget>, a kit button forwarding popovertarget, and openAt(panel, trigger) all measure the trigger."},placement:{type:"string",default:"block-end span-inline-end",attribute:"placement",description:"Where the panel sits relative to the element it was opened from, as a CSS position-area value: block-end span-inline-end (below, its inline-start edge on the trigger's) by default; block-end span-inline-start for a panel that hangs from a trigger's trailing edge; block-start for one that opens above. It applies only while the panel is ANCHORED, which is whenever it was shown from a source, and only on an engine with CSS anchor positioning: the trigger becomes the popover's implicit anchor the moment it is passed to showPopover({ source }) or names the panel with popovertarget, so no anchor-name is ever written on a consumer's element (specs/ui.md 2, 6). Everywhere else the panel stands at x and y. The value is passed to the property as written and is not validated here, because the platform's own grammar is the contract and a value it refuses computes to none, which is the coordinate placement again."},x:{type:"number",default:0,attribute:"x",description:"Where the panel's inline-start edge sits, in viewport pixels, whenever the panel is NOT anchored: shown with no source, given a floor, or on an engine without CSS anchor positioning. A panel shown from a source is placed by the platform against that source (see placement) and ignores x and y, though an opener may still write them, because they are exactly the fallback the anchored rule stands on."},y:{type:"number",default:0,attribute:"y",description:`Where the panel's block-start edge sits, in viewport pixels, under the same condition as x. The gap between that edge and the anchor is the --jx-popover-offset token, not a prop: a numeric prop with a non-zero default cannot express "unset", because removing its attribute coerces through the current value's type and writes 0. Anchored, the same margin is the gap below the trigger.`},floor:{type:"number",default:0,attribute:"floor",description:"The lowest edge the panel may reach, in viewport pixels; 0 means the viewport's bottom. A panel opened from a rail that abuts a status bar sets it to the rail's bottom, so a tall panel never runs down over the bar."},open:{type:"boolean",default:!1,description:"Whether the panel is showing. THIS IS NOT A DOOR: writing el.open = true shows nothing. It follows the platform's toggle event; write it through showPopover() and hidePopover(), or through the openAt() and close() helpers in the behaviours module, not directly."},settling:{type:"boolean",default:!1,description:"Whether a discrete open or close transition is still running. Mirrored as data-jx-settling, so a host can wait for the panel to come to rest before measuring it."},anchorWidth:{type:"number",default:0,description:"The measured border-box width of the element the panel was opened from, in pixels. Written by the behaviour under matchWidth and read by the panel's own min-width; 0 when nothing has been measured."},anchored:{type:"boolean",default:!1,description:"Whether the panel is showing from a source the platform knows, and therefore positioned by anchor rather than by x and y. Written by the behaviour on beforetoggle, before the panel is laid out, so the first frame is already in the right place; cleared when it closes. Mirrored as data-anchored, which the anchored rule keys on. Not an attribute, because it is the platform's fact and never a consumer's to set. A panel given a floor is never anchored: a floor is a limit the platform's fallbacks cannot express, so it keeps the coordinate placement the clamp honours."},panelWidth:"${state.matchWidth && state.anchorWidth > 0 ? state.anchorWidth + 'px' : '180px'}",noArrow:{$expression:{operator:"===",target:{$ref:"#/state/arrow"},value:!1}},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onBeforeToggle",description:"Decides anchored before the panel is laid out: an opening toggle whose source the platform names, on a panel with no floor, is anchored; everything else is not. On beforetoggle rather than toggle because toggle is queued after the show and a panel that learned it was anchored one frame late would paint once at its coordinates and then jump."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onToggle",description:"Mirrors the platform's toggle event into open, raises settling for the transition, measures the anchor under matchWidth, and clamps a freshly shown panel into the viewport when it is not anchored; an anchored panel is placed and flipped by the platform and is left alone."},onTransitionEnd:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onTransitionEnd",description:"Clears settling when the panel's own transition finishes. A transition on a child is not the panel coming to rest, so only an event whose target is the host counts."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it. A panel is always an auto popover: light dismiss, Escape and focus restoration are the platform's."}},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},ontransitionend:{$ref:"#/state/onTransitionEnd"},attributes:{popover:"auto",role:"${state.label ? 'group' : null}","aria-label":"${state.label || null}","data-open":"${state.open ? '' : null}","data-jx-settling":"${state.settling ? '' : null}","data-anchored":"${state.anchored ? '' : null}"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",margin:"0",marginBlockStart:"var(--jx-popover-offset, 4px)",padding:"var(--jx-space-2)",minWidth:"${state.panelWidth}",maxWidth:"min(360px, calc(100vw - 8px))",maxHeight:"calc(100vh - 8px)",overflow:"visible",boxSizing:"border-box",flexDirection:"column",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-md)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",pointerEvents:"auto",outline:"none",opacity:"0",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete, overlay var(--jx-dur-1) allow-discrete",":popover-open":{display:"flex",opacity:"1"},"&[hidden]:popover-open":{display:"none"},"&:focus-visible":{outline:"var(--jx-focus-ring)"},"@supports (position-area: block-end)":{$description:"The anchored placement, and the whole of what CSS anchor positioning gives a panel: the platform puts it against its IMPLICIT anchor — the element it was shown from — follows that element through scroll and resize, and flips it to the other side when the first placement would overflow, none of which a measured coordinate can do without a listener per cause. No anchor-name is involved: a popover's invoker is its implicit anchor by the platform's own rule, which is what makes this reachable under ui.md 2 (an element writes no style on a consumer's trigger). The insets are released so x and y stop mattering, and matchWidth becomes anchor-size, which follows the trigger as it resizes where the measured width could not. Outside this block, and on a panel shown from nothing or with a floor, the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",positionArea:"${state.placement}",positionTryFallbacks:"flip-block, flip-inline, flip-block flip-inline",minWidth:"${state.matchWidth ? 'anchor-size(width)' : '180px'}"}},"@starting-style":{"&:popover-open":{opacity:"0"}},'& > [part="content"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minHeight:"0",overflow:"auto"},'& > [part="arrow"]':{display:"block",position:"absolute",insetBlockStart:"-5px",insetInlineStart:"var(--jx-space-4)",width:"8px",height:"8px",rotate:"45deg",background:"var(--jx-bg-overlay)",borderTop:"1px solid var(--jx-border-strong)",borderInlineStart:"1px solid var(--jx-border-strong)"},'& > [part="arrow"][hidden]':{display:"none"}},children:[{tagName:"div",attributes:{part:"content"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"arrow","aria-hidden":"true"},hidden:{$ref:"#/state/noArrow"}}]};var cr={$schema:"https://jxsuite.com/schema/v1",$id:"JxCombobox",tagName:"jx-combobox",observedAttributes:["value","placeholder","label","labelledby","describedby","invalid","disabled","readonly","required","size","name","autocomplete","allows-custom-value","error","help"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-popover.json"},{$ref:"./jx-option.json"},{$ref:"./jx-listbox.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The text in the field, which IS the value. A row's label is what it draws and its value is what it commits, and for a combobox those are normally one string: a picker whose rows carry a hidden key is a jx-select. Written by the reader as they type, by a pick, and by the host."},options:{type:"array",default:[],description:"The rows to draw, as { value, label?, description?, disabled?, face?, swatch?, line?, weight?, slant?, variant?, transform?, decoration? } — the last eight being jx-option's drawing channels, passed through as they are. THE ELEMENT FILTERS NOTHING: this is the list that will be shown, not a corpus to match against. Every consumer already owns its own matching — a fuzzy ranker that knows about modes and recents, a catalogue fetched from a provider — so a second opinion here would be one more thing for each of them to defeat. A host re-answers it on input. It carries no attribute key, because a list cannot be one. Empty, there is nothing to open: the chevron is not drawn (data-empty) and neither typing nor an arrow shows the panel, so a field whose catalogue has not arrived is a text field until it does."},allowsCustomValue:{type:"boolean",default:!1,attribute:"allows-custom-value",description:"Whether a value no row holds is kept. Set, the rows are a set of SUGGESTIONS and anything typed stands — which is the reported gap: a model id field whose catalogue is what a provider happens to list, not what the field will accept. Unset, the list is closed and a value no row holds is refused on the COMMIT, putting back the last one that was accepted."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless labelledby names a visible label. The list takes its own name from it too, so a reader entering the popup hears which field it belongs to."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the element's own error and help sentences."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},autocomplete:{type:"string",default:"off",attribute:"autocomplete",description:"The browser's own autofill, forwarded to the control. It defaults to off rather than to nothing, because the UA's own dropdown over a listbox the element is already drawing is two panels answering one question."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited, opened or focused."},readonly:{type:"boolean",default:!1,attribute:"readonly",description:"Can be focused and selected, not edited — and the list never opens, because every row is an edit."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the field and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the field."},open:{type:"boolean",default:!1,description:"Whether the list is showing. THIS IS NOT A DOOR: it follows the panel's own toggle event, so a light dismiss and an Escape move it as surely as the chevron does. Writing it opens nothing."},activeIndex:{type:"number",default:-1,description:"Which row the caret is on, or -1 for none — and -1 is where a keystroke leaves it, so Enter commits what the READER typed until they arrow onto a row. A list opened by a GESTURE lands on the row the field's value already names: the chevron and Alt+ArrowDown put the caret there, so a catalogue that arrived after the reader typed an id shows it as theirs rather than as a list with nothing chosen. It is kept apart from the rows on purpose: a key moves the highlight without the row list reconciling, and the id it computes is the one string the field and the listbox are both told."},committed:{type:"string",default:"",description:"The last value the element accepted, which is what a closed list puts back when it refuses one. Written by the sidecar at mount and on every accepted commit."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The panel, the listbox, each row and the two sentences take their ids from it, so a consumer writes none of them and two comboboxes on one surface cannot collide."},listId:"${state.uid ? state.uid + '-list' : ''}",panelId:"${state.uid ? state.uid + '-panel' : ''}",activeId:"${state.uid && state.activeIndex >= 0 ? state.uid + '-o' + state.activeIndex : ''}",hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"mountCombobox",description:"Mints the id stem and records the value the element starts out holding, so a refused edit has something to be put back to."},onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxInput",description:"Mirrors what the reader types into value, clears the highlight and opens the list — if there is anything to list. The control's own input event goes on to bubble out of the element unchanged, which is how a host knows to re-answer options."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxKeydown",description:"The editable-combobox keyboard: ArrowDown and ArrowUp open the list and move the caret through it with wrap, Alt+ArrowDown opens without moving and Alt+ArrowUp closes, Enter takes the highlighted row, Tab takes it on the way out, and Escape closes the list and is stopped so it does not also close a dialog around the field. Home and End are left to the text caret."},onCommit:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxCommit",emits:[{name:"change",description:"A refused value was put back; e.target is the element. An accepted one lets the control's own change bubble instead, so exactly one change reaches a host per edit."}],description:"The commit, on the control's own change. An accepted value stands in the row's spelling; a value a closed list does not hold is put back, the control's change is stopped at the control, and the element says change once for itself."},onPick:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxPick",emits:[{name:"input",description:"A row was taken; e.target is the element."},{name:"change",description:"The edit the pick made is finished; e.target is the element."}],description:"A row's own bubbling select: its value into the field, the list closed, the caret back in the control, and one input then change from the element rather than from the row."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxToggle",description:"Mirrors the panel's toggle into open, and drops the highlight when the list closes."},onButton:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxButton",description:"The chevron: shows the list under the field with the caret on the row the field already holds, and puts the text caret in the control — or hides a list that is already showing. Not drawn while there are no rows."},onRowsPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps the caret in the control while the panel's own gutter is pressed. jx-option cancels the press on a row; this is the same cancellation for the space around the rows, so a press that lands between two of them does not blur the field and fire a change for an edit the reader has not finished."}},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-size":"${state.size}","data-open":"${state.open ? '' : null}","data-empty":"${Array.isArray(state.options) && state.options.length > 0 ? null : ''}","data-invalid":"${state.invalid ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-combobox-h":"var(--jx-control-h)","--jx-combobox-pad":"var(--jx-space-3)",'&[data-size="sm"]':{"--jx-combobox-h":"calc(var(--jx-control-h) - 4px)","--jx-combobox-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-combobox-h":"calc(var(--jx-control-h) + 8px)"},'& [part="field"]':{display:"flex",alignItems:"center",boxSizing:"border-box",width:"100%",minHeight:"var(--jx-combobox-h)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{borderColor:"var(--jx-fg-muted)"},":focus-within":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-invalid] [part="field"]':{borderColor:"var(--jx-danger)"},'&[data-disabled] [part="field"]':{opacity:"0.5"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",flex:"1 1 auto",minWidth:"0",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-combobox-pad) var(--jx-space-1)",border:"0",background:"none",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",outline:"none","::placeholder":{color:"var(--jx-fg-muted)"},":disabled":{cursor:"default"}},'&[data-size="sm"] [part="input"]':{fontSize:"var(--jx-text-sm)"},'&[data-size="lg"] [part="input"]':{fontSize:"var(--jx-text-lg)"},'& [part="toggle"]':{$description:"The toggle sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3), the same shape as jx-textfield's clear button: an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the caret and its box stay where they were; on a large field the inset is positive and the pseudo-element is an invisible box inside a button already over the floor. `position: relative` is what the pseudo-element measures against, and it is new here: the toggle is a flex item of the field, not an absolutely placed one. The rotation the open state applies turns the pseudo-element with the button, which a square does not mind. `contain: layout` keeps that invisible expansion a LOCAL fact: an absolutely positioned box still contributes to the SCROLLABLE overflow of the nearest ancestor whose own `overflow` is not `visible`, even though nothing clips it and nothing paints there, so a form host that scrolls (Preferences · Assistant does, at `overflow: auto`) picked up a couple of phantom pixels on every axis from these `::before`s alone and drew scrollbars over content that fit.",position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",flex:"0 0 auto",width:"calc(var(--jx-combobox-h) - 2px)",height:"calc(var(--jx-combobox-h) - 2px)",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",outline:"none",contain:"layout",transition:"rotate var(--jx-dur-1) var(--jx-ease-out)","::before":{content:'""',position:"absolute",inset:"calc((var(--jx-combobox-h) - 2px - var(--jx-control-h)) / 2)"},":hover":{color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-open] [part="toggle"]':{rotate:"180deg"},'&[data-empty] [part="toggle"]':{display:"none"},'&[data-empty] [part="input"]':{paddingInlineEnd:"var(--jx-combobox-pad)"},'& [part="list"]':{"--jx-listbox-max-block-size":"min(320px, 50vh)",minWidth:"0"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border, which is how a surface's banner rule drew a small painted box over a field's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="help-slot"]':{display:"contents"}},children:[{tagName:"div",attributes:{part:"field",role:"none"},children:[{tagName:"input",attributes:{part:"input",type:"text",role:"combobox",autocomplete:"${state.autocomplete}","aria-autocomplete":"list","aria-controls":"${state.listId || null}","aria-expanded":"${state.open ? 'true' : 'false'}","aria-activedescendant":"${state.open && state.activeId ? state.activeId : null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",placeholder:"${state.placeholder || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onCommit"}},{tagName:"button",attributes:{part:"toggle",type:"button",tabindex:"-1","aria-label":"Show suggestions",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onButton"},children:[{tagName:"jx-icon",$props:{name:"caret-down"},attributes:{part:"toggle-icon"}}]}]},{$description:"match-width, because a list narrower than its field reads as belonging to something else: the panel measures the HOST the sidecar names as its source, so the rows are as wide as the text box plus the chevron beside it.",tagName:"jx-popover",attributes:{part:"popup","match-width":"",id:"${state.panelId || null}"},ontoggle:{$ref:"#/state/onToggle"},children:[{tagName:"jx-listbox",attributes:{part:"list",id:"${state.listId || null}"},$props:{label:"${state.label || 'Suggestions'}",active:"${state.activeId}"},onselect:{$ref:"#/state/onPick"},onpointerdown:{$ref:"#/state/onRowsPointerDown"},children:[{$prototype:"Array",items:{$ref:"#/state/options"},key:{$ref:"$map/item/value"},map:{tagName:"jx-option",attributes:{part:"option",id:"${state.uid}-o${$map.index}",value:"${$map.item.value}",label:"${$map.item.label || $map.item.value}",description:"${$map.item.description || ''}",face:"${$map.item.face || ''}",swatch:"${$map.item.swatch || ''}",line:"${$map.item.line || ''}",weight:"${$map.item.weight || ''}",slant:"${$map.item.slant || ''}",variant:"${$map.item.variant || ''}",transform:"${$map.item.transform || ''}",decoration:"${$map.item.decoration || ''}",disabled:"${!!$map.item.disabled}"}}}]}]},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var hr={$schema:"https://jxsuite.com/schema/v1",$id:"JxListbox",tagName:"jx-listbox",observedAttributes:["label","labelledby","active"],state:{label:{type:"string",default:"",attribute:"label",description:`The list's accessible name, forwarded as aria-label. REQUIRED unless labelledby names a visible heading: listbox takes its name from a label rather than from its rows, so an unnamed one is announced as "listbox" and nothing else. Nothing lints it — a bound role makes the naming rules stand down — so the element's own test is what holds it.`},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded as aria-labelledby, naming the element that already says what this list is."},active:{type:"string",default:"",attribute:"active",description:"The ID of the row the caret is on; the empty string when none is. THIS IS THE ONE STRING A CONSUMER WRITES: the same id its owning field points aria-activedescendant at, so the field and the row are told the same thing once instead of the question being re-decided per row. The sidecar turns it into each row's selected and scrolls the new one back into view."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/listbox.ts",$export:"mountListbox",description:"Keeps every row's selected in step with active for as long as the element lives, and scrolls the active row into view. Both are things a document body cannot say: the flag lives on a foreign element, and scrolling is a measurement."}},attributes:{role:"listbox","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","data-active":"${state.active}"},style:{$description:"There is deliberately NO tabindex here, and no rule that draws a focus ring: the element never takes DOM focus. One of its two owners is a field that must keep the caret, and the other is nothing at all — a panel filtering for a caret in another realm. A listbox that is operated from somewhere else is exactly the shape ARIA's aria-activedescendant exists for.",display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",minHeight:"0",maxBlockSize:"var(--jx-listbox-max-block-size, none)",overflowY:"auto",margin:"0",padding:"0",color:"var(--jx-fg)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",'& [part="group-heading"]':{$description:`A furniture part a CONSUMER writes, styled from here because this is the definition that owns the box it sits in (ui.md 3.1). A grouped list is a role="group" wrapper holding a heading and its rows — the formula palette's shape — and in a light DOM the container's own rule reaches it without a class, which is the whole point of the cascade being one.`,display:"block",padding:"var(--jx-space-3) var(--jx-space-3) var(--jx-space-1)",fontSize:"var(--jx-text-xs)",textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--jx-fg-muted)"},'& [part="empty"]':{$description:'The other furniture part: the sentence a consumer draws when its own filter matched nothing. What that sentence SAYS belongs to the surface — "No matches", "Nothing here yet", a hint about the mode — so the element draws it and never writes it.',display:"block",padding:"var(--jx-space-4) var(--jx-space-3)",textAlign:"center",color:"var(--jx-fg-muted)"}},children:[{tagName:"slot"}]};var ur={$schema:"https://jxsuite.com/schema/v1",$id:"JxOption",tagName:"jx-option",observedAttributes:["value","label","description","selected","disabled","face","swatch","line","weight","slant","variant","transform","decoration"],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for; the detail of the select event it dispatches. The empty string is a LEGAL value — a row meaning inherit or none — and never absence."},label:{type:"string",default:"",attribute:"label",description:"The row's words, and its accessible name. There is deliberately no default slot, which is jx-tab's answer to the same question: option takes its name from its contents, so unnamed content in the row would join the name, and a row whose only content was a badge would be announced as the badge."},description:{type:"string",default:"",attribute:"description",description:"A muted note drawn at the end of the row — a path, a category, a return type. It is TEXT and part of the row's name rather than a slot, exactly as jx-select's row description is, so a reader hears what they can see and the row keeps one accessible name. Absent draws no box."},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether this is the row the caret is on. THE LISTBOX IS ITS SINGLE WRITER, exactly as jx-tabs is of every tab's: a consumer moves the highlight by writing the listbox's active id — the same id its owning field already points aria-activedescendant at — and never a row's flag. In this listbox the active descendant and the selection are ONE row, because selection follows the caret; a multi-select listbox, which would need them apart, is not offered."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot be picked is disabled, never absent: it stays in the list, stays announced, and dispatches nothing when clicked."},face:{type:"string",default:"",attribute:"face",description:"The font family the label draws in, for a row that IS its own preview. It reaches the label as a custom property set inline on that span, so seventy rows intern the rules two rows do (spec.md 9.1) — the same channel jx-select's rows carry, under the same token name."},swatch:{type:"string",default:"",attribute:"swatch",description:"A colour chip drawn before the label, as any CSS colour. Absent by default, so a row that is not about a colour pays no box for one."},line:{type:"string",default:"",attribute:"line",description:"A border-style keyword drawn as a short rule before the label: solid, dashed, dotted, double. Absent by default."},weight:{type:"string",default:"",attribute:"weight",description:"The font weight the label draws in, for a row that IS its own preview: 700, bold, lighter. It reaches the label the way face does, as a custom property set inline on that span, so a list of nine weights interns one rule. Absent draws the row's own weight."},slant:{type:"string",default:"",attribute:"slant",description:"The font style the label draws in: italic or oblique. Named slant rather than style because style is the attribute every element already has. Absent draws upright."},variant:{type:"string",default:"",attribute:"variant",description:"The font variant the label draws in: small-caps. Absent draws the row's own."},transform:{type:"string",default:"",attribute:"transform",description:"The text transform the label draws with: uppercase, lowercase, capitalize. The label's WORDS are unchanged, so a reader hears the row's name and sees what choosing it would do. Absent draws the words as written."},decoration:{type:"string",default:"",attribute:"decoration",description:"The text decoration the label draws with, as any text-decoration value: underline, line-through, underline wavy. Absent draws none."},noSwatch:{$expression:{operator:"!",target:{$ref:"#/state/swatch"}}},noLine:{$expression:{operator:"!",target:{$ref:"#/state/line"}}},noDescription:{$expression:{operator:"!",target:{$ref:"#/state/description"}}},onClick:{$prototype:"Function",body:[{if:{operator:"!",target:{$ref:"#/state/disabled"}},then:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0,composed:!0}]}],emits:[{name:"select",description:"The row was picked; detail is its value. It bubbles, so the listbox's owner hears every row through one handler rather than one per row."}],description:"Activation dispatches select unless the row is disabled. The click is NOT stopped, which is where this differs from jx-menu-item: a menu row can contain another menu row and would activate both, and a listbox row can contain nothing, so stopping the click here would only take the gesture away from the panel's own handler."},onPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps the caret where it was while a row is pressed. A listbox row is not focusable, so the press would otherwise move focus to the nearest focusable ancestor — off the field that owns the keyboard, and out of the canvas the slash menu is filtering for — and a combobox would fire a change for a value the reader was in the middle of replacing. The same fix jx-textfield's clear button makes, for the same reason."}},attributes:{role:"option","aria-selected":"${state.selected ? 'true' : 'false'}","aria-disabled":"${state.disabled ? 'true' : null}"},onclick:{$ref:"#/state/onClick"},onpointerdown:{$ref:"#/state/onPointerDown"},style:{display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-3)",borderRadius:"var(--jx-radius-sm)",color:"var(--jx-fg)",cursor:"pointer",userSelect:"none",scrollMarginBlock:"var(--jx-space-1)",":hover":{background:"var(--jx-hover-bg)"},'&[aria-selected="true"]':{$description:"The highlight is keyed on aria-selected rather than on a second data attribute, so the state a reader hears and the state a reader sees cannot come apart — and :hover is left as its own weaker rule, because the pointer moving over a row is a suggestion and the caret is the answer.",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[aria-disabled="true"]':{opacity:"0.45",cursor:"default"},'& [part="swatch"]':{display:"block",flex:"0 0 auto",inlineSize:"16px",blockSize:"16px",borderRadius:"var(--jx-radius-xs)",background:"var(--jx-row-swatch, transparent)",boxShadow:"inset 0 0 0 1px var(--jx-border)"},'& [part="line"]':{display:"block",flex:"0 0 auto",inlineSize:"32px",blockSize:"0",borderBlockStart:"2px var(--jx-row-line, none) currentColor"},'& [part="icon"]':{display:"inline-flex",flex:"0 0 auto",color:"var(--jx-fg-dim)"},'& [part="label"]':{display:"block",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontFamily:"var(--jx-row-face, inherit)",fontWeight:"var(--jx-row-weight, inherit)",fontStyle:"var(--jx-row-slant, inherit)",fontVariant:"var(--jx-row-variant, inherit)",textTransform:"var(--jx-row-transform, inherit)",textDecoration:"var(--jx-row-decoration, inherit)"},'& [part="description"]':{display:"block",minWidth:"0",marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-4)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="end"]':{display:"inline-flex",alignItems:"center",flex:"0 0 auto",paddingInlineStart:"var(--jx-space-3)",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="swatch"][hidden], & [part="line"][hidden], & [part="description"][hidden]':{display:"none"},'& [part="icon"]:empty, & [part="end"]:empty':{$description:"A slot leaves NO node once its content is distributed (spec.md 16.6), so a container that received nothing is genuinely empty and asking it is how an element finds out (ui.md 3.2). Without this, a row using neither channel still pays two boxes and the one gap between its label and its end becomes three.",display:"none"},'& [part="description"][hidden] + [part="end"], & [part="description"]:empty + [part="end"]':{$description:"The auto margin that pushes the end of the row to the end of the row lives on the description, which is where it belongs when there is one. With no description there is nothing holding that space open, so it moves here — and a display:none sibling still matches +, which is what makes one rule enough.",marginInlineStart:"auto"},'&[aria-selected="true"] [part="description"], &[aria-selected="true"] [part="end"], &[aria-selected="true"] [part="icon"]':{$description:"A highlighted row draws on the accent, and a muted grey on an accent fails SC 1.4.3. Every channel takes the row's own ink instead of keeping its own.",color:"inherit"}},children:[{tagName:"span",attributes:{part:"swatch","aria-hidden":"true"},style:{"--jx-row-swatch":"${state.swatch || 'transparent'}"},hidden:{$ref:"#/state/noSwatch"}},{tagName:"span",attributes:{part:"line","aria-hidden":"true"},style:{"--jx-row-line":"${state.line || 'none'}"},hidden:{$ref:"#/state/noLine"}},{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},style:{"--jx-row-face":"${state.face || 'inherit'}","--jx-row-weight":"${state.weight || 'inherit'}","--jx-row-slant":"${state.slant || 'inherit'}","--jx-row-variant":"${state.variant || 'inherit'}","--jx-row-transform":"${state.transform || 'inherit'}","--jx-row-decoration":"${state.decoration || 'inherit'}"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"description"},hidden:{$ref:"#/state/noDescription"},textContent:"${state.description}"},{tagName:"span",attributes:{part:"end"},children:[{tagName:"slot",attributes:{name:"end"}}]}]};var pr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSelect",tagName:"jx-select",observedAttributes:["label","labelledby","describedby","value","name","disabled","required","size","invalid","error","help"],state:{value:{type:"string",default:"",attribute:"value",description:"The chosen row's value. The empty string is a LEGAL value here — it is the inherit row, an option a reader can arrow to — and never means unset, so nothing in this element treats it as absence. It is written into the control as a PROPERTY and re-asserted by the sidecar whenever the option list changes; the selected content attribute is never written, because the first real keyboard pick makes an option dirty and the attribute stops moving selectedness from that moment on."},options:{type:"array",default:[],description:"Ungrouped rows, drawn above every group. A row is { value, label, description?, disabled?, face?, swatch?, line?, weight?, slant?, variant?, transform?, decoration? }: value and label are what the control is made of, and the rest are the drawing channels — a font face, a colour, a border style, and the five typographic axes the label can draw itself in (font weight, font style, font variant, text transform, text decoration), each arriving as a custom property on its own span so seventy rows still cost zero rules."},groups:{type:"array",default:[],description:"Grouped rows, as { id, label, rows }. Each group draws BOTH halves of its delimiter: the optgroup's label is what names the group in the accessibility tree, and the legend inside it is what draws the heading. Neither half substitutes for the other — strip the legend and the group keeps its name with nothing to look at, an 18px empty band above its first row."},unlisted:{type:"array",default:[],description:'Zero rows or one: the stand-in row for a value no group holds. A select whose value matches no option falls silently to index 0, so the sidecar synthesises the row rather than letting the element lie about what it holds. The sidecar computes it and this document renders it — the sidecar never builds DOM — and the row it renders carries part="unlisted", which is how the same computation tells its own row apart from the listed ones and does not loop.'},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the element's own error and help sentences."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control. It is also the answer to the one HTML-validity issue a page carrying this element otherwise raises: a form field element should have an id or a name."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be opened or focused, and submits nothing."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the control and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the control."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The error and help sentences take their ids from it, and the control names those ids in aria-describedby."},hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/select.ts",$export:"mountSelect",description:"Mints the id stem, then keeps the control's selectedness and its stand-in row in step with state.value as the option list changes. Both are things a document body cannot say: the value property binding runs before the first option exists, its write is refused, and it never re-runs because nothing it read changed."},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}}],description:"Writes what the reader picked into value, and NOTHING else. The control's own input and change already bubble out of the element with e.target being the inner select, which is the contract jx-textfield has; a body that dispatched change as well would hear its own event and re-enter — one pick measured 43 change events before this said only the one thing."}},attributes:{"data-size":"${state.size}","data-invalid":"${state.invalid ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-select-h":"var(--jx-control-h)","--jx-select-pad":"var(--jx-space-3)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-select-h":"calc(var(--jx-control-h) - 4px)","--jx-select-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-select-h":"calc(var(--jx-control-h) + 8px)"},"& select":{appearance:"base-select",boxSizing:"border-box",display:"flex",alignItems:"center",width:"100%",minHeight:"var(--jx-select-h)",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-select-pad)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",textAlign:"start",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"},"&::picker(select)":{appearance:"base-select",boxSizing:"border-box",margin:"0",padding:"var(--jx-space-1)",border:"0",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-popover)",maxHeight:"min(320px, 60vh)",overflowY:"auto",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)"},"&::picker-icon":{marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-2)",color:"var(--jx-fg-muted)",transition:"rotate var(--jx-dur-1) var(--jx-ease-out)"},"&:open::picker-icon":{rotate:"180deg"},"& optgroup":{margin:"0",padding:"0",font:"inherit",color:"inherit",background:"none"},"& hr":{margin:"var(--jx-space-1) var(--jx-space-2)",border:"0",borderBlockStart:"1px solid var(--jx-border)"},"& option":{boxSizing:"border-box",display:"flex",alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-select-h)",paddingBlock:"var(--jx-space-1)",paddingInline:"var(--jx-space-2)",borderRadius:"var(--jx-radius-xs)",color:"var(--jx-fg)",":hover":{background:"var(--jx-hover-bg)"},":disabled":{opacity:"0.45"},"&::checkmark":{order:"1",marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-3)"},"&:checked::checkmark":{color:"var(--jx-accent)"}},"& option[hidden]":{display:"none"}},"&[data-invalid] select":{borderColor:"var(--jx-danger)"},'& [part="trigger"]':{display:"flex",alignItems:"center",flex:"1 1 auto",minWidth:"0",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"0",background:"none",color:"inherit",font:"inherit",textAlign:"start",outline:"none"},'& [part="preview"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-3)",minWidth:"0",overflow:"hidden",whiteSpace:"nowrap"},'& [part="preview"] [part="description"]':{display:"none"},'& [part="group-heading"]':{display:"block",padding:"var(--jx-space-2) var(--jx-space-2) var(--jx-space-1)",fontSize:"var(--jx-text-sm)",fontWeight:"600",color:"var(--jx-fg-muted)"},'& [part="text"]':{fontFamily:"var(--jx-row-face, inherit)",fontWeight:"var(--jx-row-weight, inherit)",fontStyle:"var(--jx-row-slant, inherit)",fontVariant:"var(--jx-row-variant, inherit)",textTransform:"var(--jx-row-transform, inherit)",textDecoration:"var(--jx-row-decoration, inherit)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="swatch"]':{background:"var(--jx-row-swatch, transparent)",inlineSize:"16px",blockSize:"16px",flex:"0 0 auto",borderRadius:"var(--jx-radius-xs)",boxShadow:"inset 0 0 0 1px var(--jx-border)"},'& [part="line"]':{borderBlockStart:"2px var(--jx-row-line, none) currentColor",inlineSize:"32px",blockSize:"0",flex:"0 0 auto"},'& [part="description"]':{marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-4)",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="swatch"][hidden], & [part="line"][hidden], & [part="description"][hidden]':{display:"none"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border: Studio's Source Control banner rule drew a 16×13 box over the branch picker's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="help-slot"]':{display:"contents"}},children:[{tagName:"select",attributes:{part:"control","data-value":"${state.value}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},required:{$ref:"#/state/required"}},value:{$ref:"#/state/value"},onchange:{$ref:"#/state/onChange"},children:[{tagName:"button",attributes:{part:"trigger",type:"button",tabindex:"-1",role:"none"},children:[{tagName:"selectedcontent",attributes:{part:"preview"}}]},{$prototype:"Array",items:{$ref:"#/state/unlisted"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"unlisted",value:"${$map.item.value}"},children:[{tagName:"span",attributes:{part:"text"},textContent:"${$map.item.label}"}]}},{$prototype:"Array",items:{$ref:"#/state/options"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"option",value:"${$map.item.value}",disabled:"${!!$map.item.disabled}"},children:[{tagName:"span",attributes:{part:"swatch",hidden:"${!$map.item.swatch}"},style:{"--jx-row-swatch":{$ref:"$map/item/swatch"}}},{tagName:"span",attributes:{part:"line",hidden:"${!$map.item.line}"},style:{"--jx-row-line":{$ref:"$map/item/line"}}},{tagName:"span",attributes:{part:"text"},style:{"--jx-row-face":{$ref:"$map/item/face"},"--jx-row-weight":{$ref:"$map/item/weight"},"--jx-row-slant":{$ref:"$map/item/slant"},"--jx-row-variant":{$ref:"$map/item/variant"},"--jx-row-transform":{$ref:"$map/item/transform"},"--jx-row-decoration":{$ref:"$map/item/decoration"}},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"description",hidden:"${!$map.item.description}"},textContent:"${$map.item.description || ''}"}]}},{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/id"},map:{tagName:"optgroup",attributes:{part:"group",label:"${$map.item.label}"},children:[{tagName:"legend",attributes:{part:"group-heading"},textContent:"${$map.item.label}"},{$prototype:"Array",items:{$ref:"$map/item/rows"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"option",value:"${$map.item.value}",disabled:"${!!$map.item.disabled}"},children:[{tagName:"span",attributes:{part:"swatch",hidden:"${!$map.item.swatch}"},style:{"--jx-row-swatch":{$ref:"$map/item/swatch"}}},{tagName:"span",attributes:{part:"line",hidden:"${!$map.item.line}"},style:{"--jx-row-line":{$ref:"$map/item/line"}}},{tagName:"span",attributes:{part:"text"},style:{"--jx-row-face":{$ref:"$map/item/face"},"--jx-row-weight":{$ref:"$map/item/weight"},"--jx-row-slant":{$ref:"$map/item/slant"},"--jx-row-variant":{$ref:"$map/item/variant"},"--jx-row-transform":{$ref:"$map/item/transform"},"--jx-row-decoration":{$ref:"$map/item/decoration"}},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"description",hidden:"${!$map.item.description}"},textContent:"${$map.item.description || ''}"}]}}]}},{tagName:"slot"}]},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var fr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSpinner",tagName:"jx-spinner",observedAttributes:["value","label","size"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"How far along, 0 to 100. Empty is the indeterminate state: an ARIA progressbar with no aria-valuenow IS indeterminate, so an empty value writes none of the value attributes and the ring spins instead of filling. A string, never a number, because a numeric state entry turns a removed attribute into 0 and could never say empty. A host that writes a number through the property door anyway is read through #/state/progress, which is the ONE predicate the whole element renders from."},label:{type:"string",default:"",attribute:"label",description:'What is being waited for, announced. Empty hides the spinner from assistive technology, which is right whenever the surrounding text already says the app is busy; a bare "progressbar" announcement is not.'},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. md matches the kit's icon size, so a spinner swapped in for an icon does not move the row."},progress:"${state.value === '' || state.value === null || state.value === undefined ? '' : '' + state.value}",isDeterminate:{$expression:{operator:"!==",target:{$ref:"#/state/progress"},value:""}},ring:"${state.progress === '' ? 'none' : 'conic-gradient(var(--jx-spin-color) ' + state.progress + '%, var(--jx-spin-track-color) 0)'}"},attributes:{role:"progressbar","aria-label":"${state.label || null}","aria-hidden":"${state.label ? null : 'true'}","aria-valuenow":"${state.progress || null}","aria-valuemin":"${state.progress ? '0' : null}","aria-valuemax":"${state.progress ? '100' : null}","data-size":"${state.size}","data-determinate":"${state.progress ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",flex:"none","--jx-spin-size":"var(--jx-icon-size, 16px)","--jx-spin-track":"2px","--jx-spin-dur":"900ms","--jx-spin-color":"currentColor","--jx-spin-track-color":"var(--jx-border)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-spin-size":"12px"},'&[data-size="lg"]':{"--jx-spin-size":"20px"},'& [part="glyph"]':{display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",width:"var(--jx-spin-size)",height:"var(--jx-spin-size)",borderRadius:"50%",color:"var(--jx-spin-color)",animation:"jx-spin var(--jx-spin-dur) linear infinite"},'& [part="glyph-icon"]':{"--jx-icon-size":"var(--jx-spin-size)"},'&[data-determinate] [part="glyph"]':{animation:"none",mask:"radial-gradient(farthest-side, transparent calc(100% - var(--jx-spin-track)), black 0)"},"@(prefers-reduced-motion: reduce)":{"--jx-spin-dur":"2400ms"},"@(forced-colors: active)":{"--jx-spin-track":"3px"},"@keyframes jx-spin":{from:{rotate:"0deg"},to:{rotate:"360deg"}}},children:[{tagName:"span",attributes:{part:"glyph"},style:{background:"${state.ring}"},children:[{tagName:"jx-icon",attributes:{part:"glyph-icon"},hidden:{$ref:"#/state/isDeterminate"},$props:{name:"spinner",weight:"bold"}}]}]};var mr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSplit",tagName:"jx-split",observedAttributes:["orientation","label","value","min","max","gap","step","large-step","collapse","disabled"],state:{orientation:{type:"string",default:"vertical",attribute:"orientation",description:`vertical or horizontal — the separator's OWN orientation, which is ARIA's meaning and the opposite of the axis it moves on: a vertical splitter is the upright line between two side-by-side panes, dragged left and right. Only "horizontal" turns it; every other value, the default included, is the upright one.`},label:{type:"string",default:"Split",attribute:"label",description:"The accessible name. A separator is in neither the accessibility lint's content-named roles nor its labelled ones, so an unnamed one is invisible to every gate and a reader arriving on it is told they have landed on a separator and nothing more. Name every splitter after the thing it divides."},value:{type:"number",default:0.5,attribute:"value",description:"Where the splitter sits: the LEADING side's share of the box it divides, 0-1. A fraction rather than pixels because a splitter has no size of its own to report, and because the same stored number survives a window resize. It is aria-valuenow, and the element is its own writer during a gesture — a host reads it back off the input and change events."},min:{type:"number",default:0,attribute:"min",description:"The smallest share the leading side may have, and aria-valuemin. A policy about the split, which is why it is a constant a host declares rather than something derived: gap answers the other question, and the two are intersected."},max:{type:"number",default:1,attribute:"max",description:"The largest share, and aria-valuemax."},gap:{type:"number",default:0,attribute:"gap",description:"The smallest EITHER side may be, in pixels of the measured track. Converted into the value's own units at gesture time, so it needs no listener and cannot go stale when the window resizes — which a fractional floor computed from a width by a host always does. A track too narrow for two gaps has no legal position, and the splitter goes to the middle of its crossed bounds."},step:{type:"number",default:0.02,attribute:"step",description:"What one arrow key moves the value by. Two per cent of the track is a nudge a reader can aim with; a value that is not a positive number falls back to it."},largeStep:{type:"number",default:0.1,attribute:"large-step",description:"What Shift+Arrow moves it by — the same coarse gesture jx-number-field and jx-color-slider add, and one the platform has on nothing."},collapse:{type:"number",default:-1,attribute:"collapse",description:"The value Enter and a double click move to, and back from. The default is below every legal share, so it clamps to min: collapsing means going to the floor unless a host says otherwise. A splitter whose two sides are both real panes points it wherever its double click has always gone."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved, by pointer or by key, and drops out of the tab order. aria-disabled rather than removal, because a splitter a reader cannot find is a layout they cannot explain."},dragging:{type:"boolean",default:!1,description:"Whether a pointer gesture is live. Written by the behaviour and mirrored as data-dragging, so the splitter stays lit for the length of a drag that has left it — which is the whole point of the pointer capture."},restore:{type:"number",default:-1,description:"Where the collapse toggle returns to, recorded on the way down. Negative until a collapse has recorded one, which is a value no share can be."},valueText:"${Math.round(((state.value - state.min) / ((state.max - state.min) || 1)) * 100) + '%'}",onPointerDown:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerDown",description:"Measures the track once, captures the gesture on the element and takes the focus, so the arrow keys carry on from where the pointer stopped. The value does not jump: the splitter is already the thing under the cursor."},onPointerMove:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerMove",description:"The drag, against the length measured at pointerdown. Nothing moves without a press first, so a hover moves no split.",emits:[{name:"input",description:"The splitter is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is where it is — and detail is the modifiers this step was made with, { altKey, ctrlKey, metaKey, shiftKey }, for a host whose own snap needs a way through. The element gives none of them a meaning here; what a breakpoint is, and which key skips it, is the host's to say."}]},onPointerUp:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerUp",description:"Ends the gesture and commits once. Bound to pointercancel and lostpointercapture as well as pointerup: a capture lost any other way is still a gesture that is over, and a splitter left in the dragging state would follow the next pointer that crossed it with no button down.",emits:[{name:"change",description:"The reader let go; e.target is the element, and detail is the modifiers the release carried. Dispatched even when the last move changed nothing, because the commit is about the gesture ending."}]},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitKeydown",description:"The splitter keyboard: the arrows of its own axis with Shift for the larger step, Home and End for the extremes, and Enter for the collapse toggle. A keystroke is a move AND a commit. Every other key reaches the host untouched.",emits:[{name:"input",description:"A key moved the splitter; detail is the modifiers it was pressed with. Shift is reported even though the element spent it on the large step: what a host makes of a modifier is the host's business."},{name:"change",description:"The same key committed it, with the same detail."}]},onDoubleClick:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitDoubleClick",description:"Collapses the split, and restores it on the next one. This is the SC 2.5.7 door — a single-pointer alternative to dragging — and it is deliberately the same function Enter runs, so the two cannot drift.",emits:[{name:"input",description:"The toggle moved the splitter; detail is the click's modifiers."},{name:"change",description:"And committed it, with the same detail."}]}},attributes:{role:"separator",tabindex:"${state.disabled ? '-1' : '0'}","aria-label":"${state.label}","aria-orientation":"${state.orientation}","aria-valuenow":"${state.value}","aria-valuemin":"${state.min}","aria-valuemax":"${state.max}","aria-valuetext":"${state.valueText}","aria-disabled":"${state.disabled ? 'true' : null}",orientation:"${state.orientation}","data-dragging":"${state.dragging ? '' : null}"},onpointerdown:{$ref:"#/state/onPointerDown"},onpointermove:{$ref:"#/state/onPointerMove"},onpointerup:{$ref:"#/state/onPointerUp"},onpointercancel:{$ref:"#/state/onPointerUp"},onlostpointercapture:{$ref:"#/state/onPointerUp"},onkeydown:{$ref:"#/state/onKeydown"},ondblclick:{$ref:"#/state/onDoubleClick"},style:{$description:"`z-index: 3` is not decoration: a Navigator/Inspector split sits at the shell level, a sibling of the pane grid rather than a descendant of it, so where its box happens to meet a pane's own edge is decided by whichever stacking context wins — not by DOM order. `panels/pane-context.ts`'s floating toolbar band (`surfaces/pane-context.json`'s `[part=\"chrome\"]`) is `position: relative; z-index: 2` so it can float over the canvas stage, and that band's own edge sits flush against this splitter's box at the pane boundary. At `z-index: 1` the band won the last couple of pixels of the splitter's own 5px width, so a drag started right at that edge grabbed the toolbar instead of the handle — the reader-visible shape of that was `elementFromPoint` returning the band's `[part=\"bar\"]` for x inside the splitter's own rect. `3` clears every floating band in the shell (the chrome band's `2`, `diff-toolbar`'s `2`) without touching their own stacking, which still does its job of floating over the stage.",display:"block","&[hidden]":{display:"none"},flex:"none",position:"relative",zIndex:"3",touchAction:"none",background:"var(--jx-border)",cursor:"col-resize",inlineSize:"5px",outline:"none",'&[orientation="horizontal"]':{cursor:"row-resize",inlineSize:"auto",blockSize:"5px"},"&:hover, &[data-dragging]":{background:"var(--jx-accent)",opacity:"0.5"},"&:focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-disabled="true"]':{cursor:"default"},'&[aria-disabled="true"]:hover':{background:"var(--jx-border)",opacity:"1"}},children:[]};var br={$schema:"https://jxsuite.com/schema/v1",$id:"JxTooltip",tagName:"jx-tooltip",observedAttributes:["delay","for","placement","x","y","arrow"],state:{delay:{type:"number",default:500,attribute:"delay",description:"How long the pointer must rest on the control before the tip appears, in milliseconds. Keyboard focus never waits: a reader who tabbed to the control has already committed. Read only on the FALLBACK path — where the engine implements interest invokers and the control carries interestfor, the wait is the platform's own interest-delay-start and this number is not consulted, so set the CSS property on the control if you need to change it there."},for:{type:"string",default:"",attribute:"for",description:"The id of the control this tip describes, in the same root. The declarative wiring is the other way round and is preferred — interestfor on the control, naming this tip's id, and this prop left unset — and it works on every engine: where interest invokers are missing the tip binds an interestfor control's pointer and focus events itself, exactly as it does for a control this prop names. Either way the listeners come off again when the tip leaves the document. It is read once, at mount; a host that wires a tip up later calls bindTooltip from jx-ui:/behaviors/tooltip.ts itself."},placement:{type:"string",default:"block-end span-inline-end",attribute:"placement",description:"Where the tip sits relative to its control, as a CSS position-area value: below it with leading edges aligned by default, which is where the arrow points from. It applies while the tip is anchored — shown from a control the platform knows, by interestfor or by the element's own binding — on an engine with CSS anchor positioning; the platform then follows the control through scroll and resize and flips the tip above it when it would overflow (the --jx-tooltip-above try option, which keeps the gap on the right side). Elsewhere the tip stands at x and y, placed and flipped by the element itself."},x:{type:"number",default:0,attribute:"x",description:"Where the tip's inline-start edge sits, in viewport pixels, whenever the tip is NOT anchored: on an engine without CSS anchor positioning, or shown from nothing. Written by the element when it opens, from the box of the control it describes; a host that places the tip itself sets it and names no control."},y:{type:"number",default:0,attribute:"y",description:"Where the tip's block-start edge sits, in viewport pixels. The tip is placed under its control, or above it when there is no room below — never over it, because a tip that covers the control it describes hides what the reader is pointing at."},arrow:{type:"boolean",default:!1,attribute:"arrow",description:"Draws a pointer at the edge of the tip that faces its control — the block-start edge for a tip below it, the block-end edge for one that flipped above. Decorative, and aria-hidden: it says nothing the tip's own text does not."},flipped:{type:"boolean",default:!1,description:"Whether the tip landed ABOVE its control because there was no room below. Written by the element when it opens, and read by nothing but the arrow: a pointer pinned to the block-start edge of a tip that flipped points away from the control it belongs to. A host that places the tip itself sets x and y, and sets this to say which way its arrow faces. Anchored, the flip is the platform's and this is MEASURED — the tip's box above its control's — a frame after the tip shows and again, at most once per frame, whenever the page scrolls, the window resizes or either box changes size, until the tip closes, so the arrow follows a flip the element did not make, including one the platform makes while the tip is up."},anchored:{type:"boolean",default:!1,description:"Whether the platform is placing the tip against the control it was shown from. Written by the behaviour on beforetoggle, before layout, so the first frame is already in place; cleared on close; mirrored as data-anchored for the anchored rule. Not an attribute, because it is the platform's fact."},open:{type:"boolean",default:!1,description:"Whether the tip is showing. Follows the platform's toggle event; write it through showPopover() and hidePopover(), not directly."},noArrow:{$expression:{operator:"!",target:{$ref:"#/state/arrow"}}},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipBeforeToggle",description:"Decides anchored before the tip is laid out: an opening shown from a control the platform or the binding names is anchored; a closing clears it. Before layout, so a tip that learned it was anchored a frame late would not paint once at its coordinates and jump."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipToggle",description:"Mirrors the platform's toggle into open, and places a freshly shown tip under the control it describes — or, when the platform is placing it by anchor, only reads back which side of the control it is on — a frame later and then on every scroll, resize and size change while it shows — so the arrow can follow; the closing toggle stops that reading. Placing here rather than on the gesture is what lets the declarative path work: an interestfor control shows the tip without telling the element anything, and the toggle is the first the element hears of it."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipReady",description:"Binds the control the tip is wired to — the one for names, or the one declaring interestfor at this tip — on the fallback path. Nothing is bound where the engine implements interest invokers and the control declares one, because there the platform owns the pair."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipUnmount",description:"Takes the fallback listeners off the control again, one microtask after the tip left the document and only if it is still out by then. They sit on an element the kit does not own and which outlives the tip, so without this a removed tip keeps answering its control's pointer; but a tip that is MOVED, by a keyed $map reordering its rows or a host re-parenting the control, is disconnected and reconnected in one step and never mounts again, so an unmount that disposed at once would leave it silent for good."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it — and gives the element its own first sight of itself, which is how onReady reaches the control that for names."}},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},"onjx-ready":{$ref:"#/state/onReady"},attributes:{role:"tooltip",popover:"hint","data-open":"${state.open ? '' : null}","data-flipped":"${state.flipped ? '' : null}","data-anchored":"${state.anchored ? '' : null}"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",boxSizing:"border-box",margin:"0",padding:"var(--jx-space-1) var(--jx-space-3)",maxWidth:"min(280px, calc(100vw - 8px))",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",textAlign:"start",opacity:"1",pointerEvents:"auto",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete, overlay var(--jx-dur-1) allow-discrete",":popover-open":{display:"block"},"&[hidden]:popover-open":{display:"none"},"@position-try --jx-tooltip-above":{positionArea:"block-start span-inline-end",marginBlockStart:"0",marginBlockEnd:"6px"},"@supports (position-area: block-end)":{$description:"The anchored placement: the platform puts the tip against its IMPLICIT anchor — the control it was shown from, by interestfor or by the binding's showPopover({ source }) — follows that control through scroll and resize, and flips the tip above it when it would overflow, through the --jx-tooltip-above try option rather than a bare flip-block so the 6px gap the arrow fills moves to the other side with it. No anchor-name is involved (ui.md 5.2, 6). The insets are released so x and y stop mattering. Outside this block the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",marginBlockStart:"6px",positionArea:"${state.placement}",positionTryFallbacks:"--jx-tooltip-above, flip-inline, --jx-tooltip-above flip-inline"}},"@starting-style":{"&:popover-open":{opacity:"0"}},'& > [part="arrow"]':{position:"absolute",insetBlockEnd:"100%",insetInlineStart:"var(--jx-space-4)",width:"8px",height:"8px",marginBlockEnd:"-5px",background:"var(--jx-bg-overlay)",borderInlineStart:"1px solid var(--jx-border-strong)",borderBlockStart:"1px solid var(--jx-border-strong)",transform:"rotate(45deg)"},'&[data-flipped] > [part="arrow"]':{insetBlockEnd:"auto",insetBlockStart:"100%",marginBlockEnd:"0",marginBlockStart:"-5px",borderInlineStart:"none",borderBlockStart:"none",borderInlineEnd:"1px solid var(--jx-border-strong)",borderBlockEnd:"1px solid var(--jx-border-strong)"}},children:[{tagName:"slot"},{tagName:"div",attributes:{part:"arrow","aria-hidden":"true"},hidden:{$ref:"#/state/noArrow"}}]};var gr={$schema:"https://jxsuite.com/schema/v1",$id:"JxNumberField",tagName:"jx-number-field",$elements:[{$ref:"./jx-icon.json"}],observedAttributes:["value","min","max","step","placeholder","label","labelledby","describedby","disabled","stepper","step-up-label","step-down-label","name","size"],state:{value:{type:"string",default:"",attribute:"value",description:"The field's text, as a string rather than a number. An empty value means empty: a numeric entry would read a removed attribute as 0, so clearing a numeric key would write 0 into the document instead of deleting it. It is bound twice, as the control's value property AND as its value content attribute: the property is what tracks state once the reader has typed (typing sets the control's dirty value flag, after which the attribute no longer moves the live value), and the attribute keeps the control's DEFAULT value equal to its current one. The price of that mirror is that form.reset() is a no-op here, and it is deliberate: the element is not form-associated (specs/ui.md §3.2), so it never hears the reset, and an unmirrored default would move the control while leaving this state where it was — the element and its control disagreeing silently, which is worse than a reset that does nothing."},min:{type:"string",default:"",attribute:"min",description:"The smallest value the control accepts, as a string. Empty removes the attribute rather than setting an empty one, and the step grid is measured from it."},max:{type:"string",default:"",attribute:"max",description:"The largest value the control accepts, as a string. Empty removes the attribute."},step:{type:"string",default:"",attribute:"step",description:"The stepping interval, as a string. Empty removes the attribute, leaving the platform's default of 1."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby. The help sentence under a row is the row's, not the field's."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited, stepped or focused."},stepper:{type:"boolean",default:!1,attribute:"stepper",description:"Draw the two stepping buttons. The Arrow keys step whether or not they are drawn; the buttons are for a pointer."},stepUpLabel:{type:"string",default:"Increase",attribute:"step-up-label",description:"The step-up button's accessible name. It is a real name rather than aria-hidden: a button with no name is reported as unnamed whether or not it is hidden from assistive technology."},stepDownLabel:{type:"string",default:"Decrease",attribute:"step-down-label",description:"The step-down button's accessible name."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},badInput:{type:"boolean",default:!1,description:"Mirrored from the control, never authored: the reader has typed something that is not a number, so the sanitized value reads empty while an edit is still in progress. A host that deletes a key on an empty value must not delete on this one, and it reads the case off the ELEMENT rather than off an event — this prop, or the data-bad-input attribute it mirrors, reached from a handler as event.target.closest('jx-number-field')."},onInput:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}},{operator:"=",target:{$ref:"#/state/badInput"},value:{$ref:"event#/target/validity/badInput"}}],description:"Mirrors what the reader types, and whether the control could parse it. The platform's own input event is left alone and goes on bubbling from the control, so a host's event.target is the live input."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onNumberChange",description:"The reader committed an edit: reads the control back into state. The platform's own change event is neither stopped nor re-sent, so a host still reaches event.target.valueAsNumber (NaN when empty), .validity and .form on the live control; the sanitization case is read off the element as badInput, not off a detail."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onNumberKeydown",description:"Shift and an Arrow move ten steps, through the control's own stepping API.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepUp:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onStepUp",description:"The step-up button: one step up.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepDown:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onStepDown",description:"The step-down button: one step down.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepperPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps focus in the field while a stepping button is pressed. Without it the blur that follows the press fires a second change for the same edit."}},attributes:{"data-size":"${state.size}","data-disabled":"${state.disabled ? '' : null}","data-stepper":"${state.stepper ? '' : null}","data-bad-input":"${state.badInput ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",minWidth:"0","&[hidden]":{display:"none"},'& [part="field"]':{display:"flex",alignItems:"stretch",minWidth:"0",width:"100%"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",flex:"1 1 auto",width:"100%",minWidth:"0",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-3)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",fontVariantNumeric:"tabular-nums",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)","::placeholder":{color:"var(--jx-fg-muted)"},"::-webkit-inner-spin-button":{appearance:"none",margin:"0"},"::-webkit-outer-spin-button":{appearance:"none",margin:"0"},":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="stepper-slot"]':{display:"contents"},'& [part="stepper"]':{display:"flex",flexDirection:"column",marginInlineStart:"var(--jx-space-1)"},'& [part="step-up"], & [part="step-down"]':{appearance:"none",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"1 1 0",width:"var(--jx-space-5)",padding:"0",margin:"0",border:"1px solid var(--jx-border-strong)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)",cursor:"default","--jx-icon-size":"10px",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5"}},'& [part="step-up"]':{borderRadius:"var(--jx-radius-sm) var(--jx-radius-sm) 0 0",borderBottom:"0"},'& [part="step-down"]':{borderRadius:"0 0 var(--jx-radius-sm) var(--jx-radius-sm)"},'&[data-size="sm"] [part="input"]':{minHeight:"calc(var(--jx-control-h) - 4px)",fontSize:"var(--jx-text-sm)",padding:"0 var(--jx-space-2)"},'&[data-size="lg"] [part="input"]':{minHeight:"calc(var(--jx-control-h) + 8px)",fontSize:"var(--jx-text-lg)"}},children:[{tagName:"div",attributes:{part:"field",role:"none"},children:[{tagName:"input",attributes:{part:"input",type:"number",inputmode:"decimal",placeholder:"${state.placeholder || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${state.describedby || null}",name:"${state.name || null}",min:"${state.min || null}",max:"${state.max || null}",step:"${state.step || null}",disabled:{$ref:"#/state/disabled"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"}},{tagName:"div",attributes:{part:"stepper-slot",role:"none"},$switch:{$ref:"#/state/stepper"},cases:{true:{tagName:"div",attributes:{part:"stepper",role:"none"},children:[{tagName:"button",attributes:{part:"step-up",type:"button",tabindex:"-1","aria-label":"${state.stepUpLabel}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onStepUp"},onpointerdown:{$ref:"#/state/onStepperPointerDown"},children:[{tagName:"jx-icon",$props:{name:"caret-up",weight:"bold"},attributes:{part:"step-up-icon"}}]},{tagName:"button",attributes:{part:"step-down",type:"button",tabindex:"-1","aria-label":"${state.stepDownLabel}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onStepDown"},onpointerdown:{$ref:"#/state/onStepperPointerDown"},children:[{tagName:"jx-icon",$props:{name:"caret-down",weight:"bold"},attributes:{part:"step-down-icon"}}]}]}}}]}]};var wr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwatch",tagName:"jx-swatch",observedAttributes:["color","value","label","checked","selected","disabled","size"],$elements:[{$ref:"./jx-icon.json"}],state:{color:{type:"string",default:"",attribute:"color",description:"The colour the chip draws, as any CSS colour the page can resolve. Empty is a legal value and is the NO COLOUR chip: it draws a slashed square rather than nothing, because a blank square in a palette reads as a white swatch and picking it would be picking white."},value:{type:"string",default:"",attribute:"value",description:"What the swatch stands for: the detail of the select it dispatches, and what a swatch group compares its own value against. Empty falls back to color, so a palette of literal colours needs no second attribute; set it when the swatch stands for a TOKEN whose colour is only how it looks, which is the case a project's palette is made of."},label:{type:"string",default:"",attribute:"label",description:`The swatch's name, and its accessible name: it is written to aria-label, so it wins over anything slotted beside the chip. A COLOUR IS NOT A NAME. Without this the element falls back to the value and then to the colour, which announces "#3b82f6" one character at a time — legible, technically a name, and useless. Give every swatch in a palette the word a reader would use for it.`},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain button; true or false for one member of a swatch group, which then carries role=radio and aria-checked on its control and puts role=none on the HOST so the radio is the group's own child rather than a grandchild behind a generic. jx-swatch-group is the single writer of this on its children, exactly as jx-tabs is of a tab's selected, so a host moves the selection by writing the group's value."},selected:{type:"boolean",default:!1,attribute:"selected",description:"Draws the chosen ring and the tick without announcing anything, for a swatch a host has chosen outside a radio group. It is the drawing alone: checked is what a reader is TOLD, and setting one never sets the other."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be chosen or focused. Disabled, never absent."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The chip grows; the button's target does not shrink below the kit's control height, so a small swatch is still a target a finger can hit."},tabindex:{type:"string",default:"",description:"Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the button inside, not the host, so a group moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so one control would become two tab stops."},inkOf:{$prototype:"Function",$src:"jx-ui:/color.ts",$export:"inkOn",parameters:["color"],description:"Black or white, whichever can be seen on the swatch's own colour, or the empty string for a colour only the browser can resolve. Pure: it takes the colour and returns a word."},ink:"${state.inkOf(state.color)}",token:"${state.value || state.color}",name:"${state.label || state.value || state.color || 'Colour'}",isChecked:{$expression:{operator:"===",target:{$ref:"#/state/checked"},value:"true"}},chosen:{$expression:{operator:"||",target:{$ref:"#/state/isChecked"},value:{$ref:"#/state/selected"}}},onClick:{$prototype:"Function",body:[{dispatchEvent:"select",detail:{$ref:"#/state/token"},bubbles:!0}],emits:[{name:"select",description:"The swatch was activated; detail is what it stands for. A swatch group listens for it and answers with its own change."}],description:"Activation says what the swatch stands for and nothing else. It does not write its own checked: inside a group the group owns that, and outside one the host does, and an element that chose itself would disagree with both."}},onclick:{$ref:"#/state/onClick"},attributes:{role:"${state.checked ? 'none' : null}","data-size":"${state.size}","data-chosen":"${state.chosen ? '' : null}","data-empty":"${state.color ? null : ''}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle","--jx-swatch-size":"20px","--jx-swatch-color":"${state.color || 'transparent'}","--jx-swatch-ink":"${state.ink || 'var(--jx-border-strong)'}","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px",'&[data-size="sm"]':{"--jx-swatch-size":"14px"},'&[data-size="lg"]':{"--jx-swatch-size":"28px"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minInlineSize:"var(--jx-control-h)",minBlockSize:"var(--jx-control-h)",margin:"0",padding:"var(--jx-space-1)",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg)",cursor:"pointer",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="chip"]':{$description:"The ring is drawn with the ink the element worked out from its own colour rather than with a neutral border token, because a mid-grey boundary disappears against a mid-grey swatch and a control whose edge cannot be seen is a WCAG 1.4.11 failure. The checkerboard behind it is what makes a translucent colour read as translucent instead of as a paler opaque one.",position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"none",inlineSize:"var(--jx-swatch-size)",blockSize:"var(--jx-swatch-size)",borderRadius:"var(--jx-radius-xs)",background:"linear-gradient(var(--jx-swatch-color), var(--jx-swatch-color)), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-swatch-ink)",color:"var(--jx-swatch-ink)"},'&[data-empty] [part="chip"]':{background:"linear-gradient(to bottom right, transparent calc(50% - 1px), var(--jx-danger) calc(50% - 1px), var(--jx-danger) calc(50% + 1px), transparent calc(50% + 1px)), var(--jx-bg-input)"},'&[data-chosen] [part="chip"]':{outline:"2px solid var(--jx-fg)",outlineOffset:"2px"},'& [part="mark"]':{display:"inline-flex",color:"inherit"},'& [part="label"]':{minInlineSize:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="label"]:empty':{display:"none"},'& [part="mark-slot"]':{display:"contents"}},children:[{tagName:"button",attributes:{part:"control",type:"button",role:"${state.checked ? 'radio' : null}","aria-checked":"${state.checked || null}","aria-label":"${state.name}",tabindex:"${state.tabindex || null}",disabled:{$ref:"#/state/disabled"}},children:[{tagName:"span",attributes:{part:"chip","aria-hidden":"true"},children:[{tagName:"span",attributes:{part:"mark-slot"},$switch:{$ref:"#/state/chosen"},cases:{true:{tagName:"jx-icon",$props:{name:"check",weight:"bold"},attributes:{part:"mark"}}}}]},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]}]};var xr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwatchGroup",tagName:"jx-swatch-group",observedAttributes:["value","label","columns"],state:{value:{type:"string",default:"",attribute:"value",description:"What the chosen swatch stands for; the empty string when none is. The group is the one writer of its children's checked state and of the roving caret, so a host owns this and nothing else — writing a child's checked directly puts the two into a disagreement only a re-render can settle."},label:{type:"string",default:"Colours",attribute:"label",description:'The accessible name of the group. A radiogroup is named by nothing else — it takes no name from its members — and no lint can say so, because a bound role switches the naming rules off. Name every group: "Theme palette" and "Recent colours" are two different questions and a reader hears only this.'},columns:{type:"number",default:0,attribute:"columns",description:"How many swatches to a row, or 0 to let them wrap on their own. A fixed grid is what makes a palette's rows line up when the swatches carry labels of different lengths; zero means unset rather than a grid of no columns, because a numeric prop coerces a removed attribute through the current value's type."},applySelection:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"applySwatchSelection",parameters:["scope"],description:"Writes the selection onto the swatches and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applySelection(state)}",onSelect:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupSelect",emits:[{name:"change",description:"The selection moved; detail is what the newly chosen swatch stands for, and e.target.value is the same string."}],description:"A swatch was activated: value is written first, then change is dispatched, so a listener reading e.target.value sees the new one. Re-choosing the swatch that is already chosen says nothing."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupKeydown",description:"The radio group's keyboard contract: either arrow pair moves the caret between enabled swatches with wrap, Home and End go to the ends, and the swatch the caret lands on is chosen. Both pairs move, because a palette wraps into rows and Down on a grid means the next one."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupMount",description:"Gives the group its first sight of itself, syncs the swatches, and watches the set. Not optional: applyAttributes runs before distributeSlots, so no swatch exists when the root's bindings first evaluate."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The group has rendered and taken its slotted swatches, which is how onReady reaches the element itself."}],description:"Announces that the group has rendered. Its own onReady listens for it, and a host may too."}},attributes:{role:"radiogroup","aria-label":"${state.label}","data-selection":"${state.sync}","data-columns":"${state.columns > 0 ? '' : null}"},onselect:{$ref:"#/state/onSelect"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-1)","&[data-columns]":{display:"grid",gridTemplateColumns:"repeat(${state.columns}, minmax(0, 1fr))"}},children:[{tagName:"slot"}]};var vr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwitch",tagName:"jx-switch",observedAttributes:["checked","disabled","hint","label","labelledby","describedby","name","size"],$elements:[{$ref:"./jx-tooltip.json"}],state:{checked:{type:"boolean",default:!1,attribute:"checked",description:"Whether the setting is on. Bound to the control BOTH ways, and the two halves do different jobs. The PROPERTY is what keeps tracking: once the reader flips the box the checkedness dirty flag is set and the content attribute stops controlling the live state, so an attribute binding alone would look right until the first click and then silently stop. The ATTRIBUTE is written as well so the control's defaultChecked can never disagree with the element's state — the same shape jx-textfield ships for value. The cost is that defaultChecked is also the form-reset default, so until the element is form-associated (specs/ui.md §3.2) form.reset() moves this switch nowhere. That is the deliberate half of the trade: with no form association the element never hears the reset, so a working reset would move the CONTROL to the authored default and leave the element's checked state behind it, and a control that silently disagrees with its own element is worse than a reset that does nothing."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be flipped or focused. Disabled, never absent, and the hint moves from the tip to the row's title while it is: a disabled control cannot open a tip, and why the setting cannot be changed is exactly what the reader hovers to find out."},hint:{type:"string",default:"",attribute:"hint",description:"The tooltip on the row: what turning the setting on does, or why it cannot be changed. The same hybrid jx-button and jx-action-button ship. While the switch is ENABLED it is drawn as a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — and the control names it in aria-describedby, so it is a description beside the name and never the name itself. While the switch is DISABLED it is the native title of the wrapping label instead, because a disabled control receives no focus and no pointer event and could never open a tip, while the platform still shows a title on hover. Never both at once; empty draws neither. ONE difference from the buttons, and it is the platform's rather than the kit's: the tip is wired by `for` alone and the row declares NO `interestfor`. Interest invokers are supported on `a`, `area` and `button` only — never on a label or an input — so the attribute here would show nothing on Chrome 152 while telling the tooltip sidecar the platform had the pair, which is the one combination that draws no tip on any engine. The sidecar binds the label on every engine instead, and that is what the switch pays for a tooltip: six listeners on the row and two on the tip, always, where a button pays them only where the platform lacks the attribute."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Leave it empty when the slotted text is on screen: the wrapping label is then the name, and a second one would be read twice."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby, for a visible label the element does not own."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, for the help or error sentence on the row."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The track scales with it so a row of controls lines up."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the input inside, not the host and not the label that wraps it, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},uid:{type:"string",default:"",description:"This row's own id stem, minted on mount by the tooltip sidecar. The label's id, the tip's id and the two attributes that wire one to the other are all built from it, so a consumer writes none of them and two hinted switches on one panel cannot collide. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/checked"},value:{$ref:"event#/target/checked"}}],description:"Mirrors the reader's flip into checked. The native change and input events bubble from the control as they always do, so a host reads e.target.checked exactly as it would from a bare input."}},attributes:{"data-size":"${state.size}","data-checked":"${state.checked ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",cursor:"pointer"},'&[data-disabled] > [part="control"]':{cursor:"default",color:"var(--jx-fg-muted)"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",position:"relative",flex:"0 0 auto",width:"28px",height:"16px",margin:"0",padding:"0",border:"1px solid var(--jx-switch-track)",borderRadius:"999px",background:"var(--jx-switch-track)",cursor:"inherit",outline:"none","--jx-switch-travel":"12px",transition:"background var(--jx-dur-1) var(--jx-ease-out), border-color var(--jx-dur-1) var(--jx-ease-out)","::before":{content:'""',position:"absolute",insetBlockStart:"1px",insetInlineStart:"1px",width:"12px",height:"12px",borderRadius:"50%",background:"var(--jx-switch-thumb)",transition:"translate var(--jx-dur-1) var(--jx-ease-out)"},":checked":{background:"var(--jx-accent-solid)",borderColor:"var(--jx-accent-solid)","::before":{translate:"var(--jx-switch-travel) 0"}},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"}},'&:dir(rtl) [part="input"]:checked::before':{translate:"calc(-1 * var(--jx-switch-travel)) 0"},'&[data-size="sm"] [part="input"]':{width:"22px",height:"12px","--jx-switch-travel":"10px","::before":{width:"8px",height:"8px"}},'&[data-size="lg"] [part="input"]':{width:"34px",height:"20px","--jx-switch-travel":"14px","::before":{width:"16px",height:"16px"}},'& [part="label"]':{minWidth:"0"},'& [part="label"]:empty':{display:"none"},'& > [part="tooltip"]':{display:"contents"},"@(forced-colors: active)":{'& [part="input"]':{forcedColorAdjust:"none",background:"ButtonFace",borderColor:"ButtonText","::before":{background:"ButtonText"},":checked":{background:"Highlight",borderColor:"Highlight","::before":{background:"ButtonFace"}},":disabled":{borderColor:"GrayText",opacity:"1","::before":{background:"GrayText"}}}}},children:[{tagName:"label",attributes:{part:"control",id:"${state.uid || null}",title:"${state.disabled && state.hint ? state.hint : null}"},children:[{tagName:"input",attributes:{part:"input",type:"checkbox",role:"switch","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},checked:{$ref:"#/state/checked"}},checked:{$ref:"#/state/checked"},onchange:{$ref:"#/state/onChange"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var yr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTab",tagName:"jx-tab",observedAttributes:["value","label","selected","panel","closable","dirty"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the tab stands for: the detail of the events it dispatches, and what the strip's selected is compared against."},label:{type:"string",default:"",attribute:"label",description:`The words on the tab, and its accessible name — written to aria-label as well as drawn, because a tab naming itself from its content would swallow the close button's own name and announce the label twice. That is also what makes the slots safe: aria-label wins over name-from-content, so nothing a consumer slots in — a marker, a pill, a pin — ever joins the tab's name, and each slotted control keeps announcing its own. The corollary is that label is REQUIRED once anything is slotted: with none there is no aria-label, name-from-content comes back, and a tab whose only content is a pin button is announced "Pin". Write it as an ATTRIBUTE: the runtime does not reflect a property write back to an attribute, so a host that sets el.label breaks every getAttribute("label") selector aimed at the strip while looking correct. A count belongs in this string, not in a badge of its own.`},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether this is the current tab. The strip writes it — jx-tabs is the single writer of every child's selected — so a host moves the selection by writing the strip's selected, never a tab's."},panel:{type:"string",default:"",attribute:"panel",description:"The id of the jx-tab-panel this tab controls, announced as aria-controls. Nothing checks the pairing: both ids live in the consumer's document, so mint the tab's id and this one from one key."},closable:{type:"boolean",default:!1,attribute:"closable",description:"Draws a close button on the tab, which dispatches close with this tab's value. It is a real button: Enter and Space on it close, Delete on the focused tab is the same path, and its target is 24px square though it draws 16. It carries its own name, and the tab carries its own, so neither is heard twice."},dirty:{type:"boolean",default:!1,attribute:"dirty",description:"Marks the tab as holding unsaved work. Purely visual, and hidden from assistive technology: a reader is told about unsaved work by the page, not by a dot."},onClick:{$prototype:"Function",body:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"select",description:"The tab was activated; detail is its value. The strip listens for it and answers with change."}],description:"Activation dispatches select, which the tablist turns into its own selection and one change. A click that started on the close button never reaches here."},onClose:{$prototype:"Function",body:[{stopPropagation:!0},{dispatchEvent:"close",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"close",description:"The tab was asked to close; detail is its value. Closing is the host's to do."}],description:"The click stops at the close button, so closing a tab does not also select it."},onActions:{$prototype:"Function",body:[{stopPropagation:!0}],description:"A click inside the actions slot stops there, so activating a control a consumer put on the tab never ALSO selects the tab — the same judgement onClose makes for the close button, which is the one such control the element ships itself. It stops at the CONTAINER rather than at the host: stopPropagation halts an event at the node it is called on and every node after it, never the other listeners on that node or the ones already run below it, so the slotted control's own handler has fired (it is the target) and only the tab's onclick is cut off. Nothing is stopped for icon or status: those hold marks rather than controls, and a click on a mark is a click on the tab."}},attributes:{role:"tab",tabindex:"-1","aria-label":"${state.label || null}","aria-selected":"${state.selected ? 'true' : 'false'}","aria-controls":"${state.panel || null}"},onclick:{$ref:"#/state/onClick"},style:{display:"inline-flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-2)",boxSizing:"border-box",minHeight:"var(--jx-control-h)",maxWidth:"220px",padding:"var(--jx-space-1) var(--jx-space-3)",marginBlockEnd:"-1px",borderBlockEnd:"2px solid transparent",color:"inherit",cursor:"default",userSelect:"none",whiteSpace:"nowrap",outline:"none",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-selected="true"]':{color:"var(--jx-fg)",borderBlockEndColor:"var(--jx-accent-solid)"},'& > [part="label"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="icon"], & [part="status"], & [part="actions"]':{$description:`The three consumer zones, and they generate no box of their own. display: contents is what makes an EMPTY one cost nothing: as ordinary flex items three unused containers would each take the tab's gap, which is dead space on every tab that slotted nothing — the same measurement (8px of trailing gap, the label visibly off-centre) that gave [part="dirty-slot"] its own contents. It is also what puts slotted content in the TAB's flex row rather than one box deeper, so a marker, a pill and a pin line up with the label, the dot and the close button on one gap rather than on two.`,display:"contents"},'& [part="dirty-slot"], & [part="close-slot"]':{display:"contents"},'& [part="dirty"]':{display:"inline-block",width:"6px",height:"6px",borderRadius:"50%",background:"var(--jx-accent-solid)"},'& [part="close"]':{appearance:"none",font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",width:"16px",height:"16px",padding:"0",border:"0",borderRadius:"var(--jx-radius-xs)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",contain:"layout","::before":{$description:"The hit area, and the technique every `sm` control in the kit borrows (ui.md §4.3): an empty pseudo-element, absolutely positioned and inset 4px past a borderless 16px box, so the region that accepts the pointer is the 24px SC 2.5.8 asks for while the × stays 16px. The containment above is the other half of it, and it was missing while §4.3 claimed every outset hit area had it: an absolutely positioned box counts toward the SCROLLABLE overflow of the nearest ancestor whose overflow is not visible, painted or not, so a scrolling tab strip counted 4px it could not see. Nothing here pays the containment's price — the tab is a centred flex row, so no baseline is asked of the ×, and the 4px reaches only the tab's own inline padding.",content:'""',position:"absolute",insetBlock:"-4px",insetInline:"-4px"},":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"status"},children:[{tagName:"slot",attributes:{name:"status"}}]},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]},{tagName:"span",attributes:{part:"dirty-slot"},$switch:{$ref:"#/state/dirty"},cases:{true:{tagName:"span",attributes:{part:"dirty","aria-hidden":"true"}}}},{tagName:"span",attributes:{part:"close-slot"},$switch:{$ref:"#/state/closable"},cases:{true:{tagName:"button",attributes:{part:"close",type:"button","aria-label":"Close ${state.label}",tabindex:"${state.selected ? '0' : '-1'}"},onclick:{$ref:"#/state/onClose"},children:[{tagName:"jx-icon",$props:{name:"x",weight:"bold"},attributes:{part:"close-icon"}}]}}}]};var kr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTabPanel",tagName:"jx-tab-panel",observedAttributes:["active","labelledby"],state:{active:{type:"boolean",default:!1,attribute:"active",description:"Whether this panel is the showing one. Every other panel is hidden, not absent, so the ids its tab names stay resolvable."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"The id of the tab that controls this panel, announced as aria-labelledby. Nothing checks the pairing: mint this id and the tab's aria-controls from one key."},notActive:{$expression:{operator:"!",target:{$ref:"#/state/active"}}}},attributes:{role:"tabpanel",tabindex:"0","aria-labelledby":"${state.labelledby || null}",hidden:{$ref:"#/state/notActive"}},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",padding:"var(--jx-space-3)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"}},children:[{tagName:"slot"}]};var $r={$schema:"https://jxsuite.com/schema/v1",$id:"JxTabs",tagName:"jx-tabs",observedAttributes:["selected","label","activation","orientation"],state:{selected:{type:"string",default:"",attribute:"selected",description:"The value of the tab whose panel is showing. The strip is the one writer of its children's selected state, so a host owns this and nothing else."},label:{type:"string",default:"Tabs",attribute:"label",description:"The accessible name of the strip. A tablist is named by nothing else — it takes no name from its tabs — and no lint can say so, because a bound role switches the naming rules off. Name every strip."},activation:{type:"string",default:"auto",attribute:"activation",description:"auto selects a tab as the caret lands on it; manual moves the caret alone and waits for Enter or Space. auto is right for a strip whose panels are already built, manual for one whose panels cost something to show."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical. It chooses which arrow keys move the caret, and which edge carries both the strip's rule and the selected tab's mark on it — a tab cannot see the strip's orientation from its own sheet, so the strip draws that mark."},applySelection:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"applySelection",parameters:["scope"],description:"Writes the selection onto the tabs and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applySelection(state)}",onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsKeydown",description:"The tab keyboard contract: the arrows of the strip's orientation move the caret with wrap, Home and End go to the ends, Enter and Space activate under manual activation, and Delete closes a closable tab."},onSelect:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsSelect",description:"A tab was activated: selected is written first, then change is dispatched, so a listener reading e.target.selected sees the new value.",emits:[{name:"change",description:"The selection moved; detail is the newly selected tab's value."}]},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsMount",description:"Gives the strip its first sight of itself and syncs the tabs. Not optional: applyAttributes runs before distributeSlots, so no tab exists when the root's bindings first evaluate."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the strip has rendered and taken its slotted tabs, which is how onReady reaches the element itself."}},attributes:{role:"tablist","aria-label":"${state.label}","aria-orientation":"${state.orientation}",tabindex:"-1","data-selection":"${state.sync}"},onkeydown:{$ref:"#/state/onKeydown"},onselect:{$ref:"#/state/onSelect"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},boxSizing:"border-box",alignItems:"stretch",gap:"var(--jx-space-1)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg-dim)",borderBlockEnd:"1px solid var(--jx-border)",outline:"none",'&[aria-orientation="vertical"]':{flexDirection:"column",borderBlockEnd:"0",borderInlineEnd:"1px solid var(--jx-border)","& > jx-tab":{marginBlockEnd:"0",marginInlineEnd:"-1px",borderBlockEnd:"0",borderInlineEnd:"2px solid transparent"},'& > jx-tab[aria-selected="true"]':{borderInlineEndColor:"var(--jx-accent-solid)"}}},children:[{tagName:"slot"}]};var jr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTextfield",tagName:"jx-textfield",observedAttributes:["value","placeholder","type","label","labelledby","describedby","invalid","disabled","readonly","required","mono","multiline","grows","rows","clearable","size","name","autocomplete","error","help"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The field's text. Written by the reader as they type, and by the host; a write equal to what is there never moves the caret. It is written to the control's value CONTENT attribute as well as its property, which makes the control's default value whatever the field currently says. That is deliberate: the element is not form-associated (specs/ui.md §3.2), so it never hears form.reset(), and a control whose default was the authored one would snap back while the element still said something else — an element and its own control disagreeing in silence. The cost is named rather than hidden: reset() is a no-op on this field until form association lands."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},type:{type:"string",default:"text",attribute:"type",description:"The native input type: text, search, email, url, password, number or tel."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the field's own error and help sentences."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited or focused. Clearing is an edit, so a disabled field draws no clear button and Escape empties nothing: a host that switched the control off hears no input or change from it."},readonly:{type:"boolean",default:!1,attribute:"readonly",description:"Can be focused and selected, not edited. Clearing is an edit, so a read-only field draws no clear button and Escape empties nothing."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},mono:{type:"boolean",default:!1,attribute:"mono",description:"Draws the value in the monospace face: a path, a selector, a colour."},multiline:{type:"boolean",default:!1,attribute:"multiline",description:"A textarea rather than an input."},grows:{type:"boolean",default:!1,attribute:"grows",description:"A multiline field takes the height of its text instead of scrolling inside a fixed box. field-sizing does the work, so nothing is measured and no handler runs per keystroke. Where the engine does not support it the field keeps the height rows asks for, and a growing field with no rows keeps the three-row box a fixed one gets — opting into growth never makes a field shorter than not opting in."},rows:{type:"string",default:"",attribute:"rows",description:"How many lines a multiline field is tall before it grows. Forwarded to the textarea, and it is what a growing field falls back to on an engine without field-sizing."},clearable:{type:"boolean",default:!1,attribute:"clearable",description:"Draws a button inside the field that empties it, shown only while there is something to clear and the field is neither disabled nor read-only. Escape empties the field on exactly the same terms. Firefox draws no clear affordance of its own for type=search, so this is the field's own rather than the platform's."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},autocomplete:{type:"string",default:"",attribute:"autocomplete",description:"The autocomplete purpose, forwarded to the control."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the control inside, not the host, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. The clear button is NOT given it: it is already tabindex="-1" by construction, so the field is one stop whatever the toolbar writes.`},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the field and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one; the empty region is taken out of flow rather than hidden, so it costs no layout and stays in the accessibility tree."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the field."},hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},isEmpty:{$expression:{operator:"===",target:{$ref:"#/state/value"},value:""}},isLocked:{$expression:{operator:"||",target:{$ref:"#/state/disabled"},value:{$ref:"#/state/readonly"}}},showClear:{$expression:{operator:"&&",target:{operator:"&&",target:{$ref:"#/state/clearable"},value:{operator:"!",target:{$ref:"#/state/isEmpty"}}},value:{operator:"!",target:{$ref:"#/state/isLocked"}}}},uid:{type:"string",default:"",description:"This field's own id stem, minted on mount. The error and help sentences take their ids from it, and the control names those ids in aria-describedby."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"mintFieldId",description:"Mints the field's id stem, so the sentences under it can describe the control rather than only being announced once as they change."},onInput:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}}],description:"Mirrors what the reader types into value. The native input and change events bubble from the control as they always do."},onClear:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"clearField",emits:[{name:"input",description:"The value was emptied by the clear button; e.target is the field."},{name:"change",description:"The edit the clear button made is finished; e.target is the field."}],description:"The clear button empties the value, puts focus back on the control the reader was in, and says so with input and then change. Both come from the element rather than from the button, so a host reading e.target.value reads the field."},onClearPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps focus in the control while the clear button is pressed. Without it the press moves focus to the button, the control blurs and fires its own native change carrying the value the reader is about to delete, and the clear then fires a second one: two committed edits, and two undo entries, for one gesture."},onKeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Escape:[{if:{$ref:"#/state/showClear"},then:[{preventDefault:!0},{operator:"=",target:{$ref:"#/state/value"},value:""},{dispatchEvent:"input",bubbles:!0},{dispatchEvent:"change",bubbles:!0}]}],Enter:[{if:{operator:"&&",target:{operator:"===",target:{$ref:"#/state/type"},value:"search"},value:{operator:"!",target:{$ref:"#/state/multiline"}}},then:[{preventDefault:!0}]}]}}],emits:[{name:"input",description:"Escape emptied a clearable field; e.target is the field."},{name:"change",description:"Escape finished emptying a clearable field; e.target is the field."}],description:"Two keys, and nothing else. Escape empties a clearable field that has something in it, and cancels so the key does not also close whatever the field sits in. Enter is cancelled on a single-line search field: a search input inside a form submits it, and a search field is the one kind that never means to — the element owns no form, so the guard lives here rather than at every call site. A textarea never submits on Enter, so a multiline field keeps the key and the reader keeps the newline."}},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-size":"${state.size}","data-invalid":"${state.invalid ? '' : null}","data-mono":"${state.mono ? '' : null}","data-disabled":"${state.disabled ? '' : null}","data-clearable":"${state.clearable ? '' : null}","data-multiline":"${state.multiline ? '' : null}","data-grows":"${state.grows ? '' : null}","data-rows":"${state.rows || null}"},style:{display:"inline-flex",position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-textfield-h":"var(--jx-control-h)","--jx-textfield-pad":"var(--jx-space-3)","--jx-textfield-pad-end":"var(--jx-textfield-pad)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-textfield-h":"calc(var(--jx-control-h) - 4px)","--jx-textfield-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-textfield-h":"calc(var(--jx-control-h) + 8px)"},"&[data-clearable]":{"--jx-textfield-pad-end":"var(--jx-textfield-h)"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",width:"100%",minHeight:"var(--jx-textfield-h)",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-textfield-pad) var(--jx-textfield-pad-end)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)","::placeholder":{color:"var(--jx-fg-muted)"},":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& textarea[part="input"]':{minHeight:"calc(var(--jx-textfield-h) * 3)",paddingBlock:"var(--jx-space-2)",resize:"vertical"},'&[data-grows] textarea[part="input"]':{fieldSizing:"content",resize:"none"},'&[data-grows][data-rows] textarea[part="input"]':{minHeight:"0"},"@supports (field-sizing: content)":{'&[data-grows] textarea[part="input"]':{minHeight:"0"}},'&[data-mono] [part="input"]':{fontFamily:"var(--jx-font-mono)"},'&[data-invalid] [part="input"]':{borderColor:"var(--jx-danger)"},'&[data-clearable] [part="input"]':{"::-webkit-search-cancel-button":{appearance:"none"}},'&[data-size="sm"] [part="input"]':{fontSize:"var(--jx-text-sm)"},'&[data-size="lg"] [part="input"]':{fontSize:"var(--jx-text-lg)"},'& [part="clear"]':{$description:"The clear button sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, and 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3): an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, which is -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the glyph and its hover box stay where they were. On a large field the difference is positive and the pseudo-element is an invisible box INSIDE a button that is already over the floor, which changes nothing. jx-tab's close button is the technique; the button is absolutely positioned already, so it is its own containing block. The extension lies over the input it clears, which was true of the drawn button too, and 2px past the field's edge at `sm`, where a neighbour at the kit's 4px gap extends 2px back and the two abut. `contain: layout` keeps the expansion LOCAL: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` is not `visible`, invisible or not, so a host that scrolls picks up a couple of phantom pixels from every `::before` like this one between it and the field, and draws a scrollbar over content that already fit.",position:"absolute",insetBlockStart:"1px",insetInlineEnd:"1px","::before":{content:'""',position:"absolute",inset:"calc((var(--jx-textfield-h) - 2px - var(--jx-control-h)) / 2)"},display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",width:"calc(var(--jx-textfield-h) - 2px)",height:"calc(var(--jx-textfield-h) - 2px)",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",outline:"none",contain:"layout",":hover":{color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-multiline] [part="clear"]':{insetBlockStart:"calc(var(--jx-space-2) + 1px)"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"The region is permanent and empty until it has something to say, and while it is empty it must draw nothing and take no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` (a surface's own banner, a site's stylesheet) lands on this paragraph as well — and under `box-sizing: border-box` a `width`/`height` of 0 floors at padding plus border, which is how a Studio banner's `padding: 6px 8px` and 1px rule drew a 16×13 box at the field's top-left corner that also took the click meant for the control. Pinning the size was never enough on its own; the box model is therefore reset here, and `clip-path: inset(50%)` (the kit's visually-hidden idiom, as `jx-accordion-item.json`'s heading uses it) with `pointer-events: none` removes the paint and the hit area of anything a reset does not name, such as a shadow or an outline. Its `:empty` makes the selector one pseudo-class heavier than the `X [part=\"error\"]` a consumer writes, so it wins in whichever order the sheets land. It is never `display: none` or `visibility: hidden`: a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). When text arrives `:empty` stops matching and the sentence draws in flow exactly as the two rules above say. `jx-select.json` and `jx-combobox.json` carry the same rule, for the same reason.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="control-slot"], & > [part="clear-slot"], & > [part="help-slot"]':{display:"contents"}},children:[{tagName:"div",attributes:{role:"none",part:"control-slot"},$switch:{$ref:"#/state/multiline"},cases:{false:{tagName:"input",attributes:{part:"input",type:"${state.type}",placeholder:"${state.placeholder || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",autocomplete:"${state.autocomplete || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"}},true:{tagName:"textarea",attributes:{part:"input",placeholder:"${state.placeholder || null}",rows:"${state.rows || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",autocomplete:"${state.autocomplete || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"}},textContent:"${state.value}",value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"}}}},{tagName:"div",attributes:{role:"none",part:"clear-slot"},$switch:{$ref:"#/state/showClear"},cases:{true:{tagName:"button",attributes:{part:"clear",type:"button",tabindex:"-1","aria-label":"Clear"},onclick:{$ref:"#/state/onClear"},onpointerdown:{$ref:"#/state/onClearPointerDown"},children:[{tagName:"jx-icon",$props:{name:"x"},attributes:{part:"clear-icon"}}]}}},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var Sr={$schema:"https://jxsuite.com/schema/v1",$id:"JxToast",tagName:"jx-toast",observedAttributes:["variant","open","timeout","dismiss-label"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-action-button.json"}],state:{variant:{type:"string",default:"info",attribute:"variant",description:"info, positive, negative or warning: what kind of outcome this is. It picks the accent along the toast's leading edge AND the glyph beside the message, so the severity survives greyscale, a colour-blind reader and a forced-colours theme — colour alone would be a WCAG 1.4.1 failure. It is not announced: the glyph is decorative and the toast carries no role of its own, so what a screen reader hears is the message, which is why the message has to SAY what happened rather than lean on the colour to say it."},open:{type:"boolean",default:!1,attribute:"open",description:"Whether the toast is showing. It is the host's to write — a toast appended with no open attribute draws nothing, deliberately, so that arriving and appearing are two decisions rather than one — and the element writes it back to false when it retires itself. It is also what runs the clock: opening starts timeout, and closing stops it."},timeout:{type:"number",default:0,attribute:"timeout",description:"How long the toast rests before retiring itself, in milliseconds. 0 is sticky and is the DEFAULT, which is what makes the number safe as a number: a removed attribute coerces through Number() to 0 (ui.md §5.3), and here that lands on the reading a numeric prop can never spell otherwise — nothing disappears unless a host asked for it to. The clock is suspended while the pointer is on the toast, while focus is inside it, and while the stack it belongs to is being read, and resumes with what was LEFT, so a reader who reaches the recovery control cannot have it expire under their hand."},dismissLabel:{type:"string",default:"Dismiss",attribute:"dismiss-label",description:`The name of the dismiss button, which is always drawn: a toast that can only be waited out is one a reader cannot get rid of, and a sticky one would then be permanent. Write what is being dismissed where a page raises several kinds ("Dismiss notification"), because the button is named by this alone — the message beside it is a consumer's slotted content and cannot be read into a name.`},icon:"${state.variant === 'positive' ? 'check' : state.variant === 'negative' ? 'warning-circle' : state.variant === 'warning' ? 'warning' : 'info'}",onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastMount",emits:[{name:"close",description:"The toast closed itself; detail.reason is timeout when the clock ran out."}],description:"Learns the element and starts the clock, then follows open through data-open for the rest of the toast's life."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastUnmount",description:"Stops the clock when the toast leaves the document, so a toast the host has already taken away cannot retire itself afterwards."},onHold:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastHold",description:"The pointer arrived, focus arrived, or the stack said to wait: the clock is suspended with its remaining time kept. Three separate reasons, held together, because a pointer leaving a toast the reader has tabbed into must not restart a clock the focus is still holding."},onRelease:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastRelease",description:"The last of those reasons went away, so the clock runs again for what was left of it. A focusout whose focus landed on another control inside this same toast is not a departure and releases nothing."},onDismiss:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastDismiss",emits:[{name:"close",description:"The reader dismissed the toast; detail.reason is dismissed."}],description:"The dismiss button closes the toast and says who closed it."},onAction:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastAction",emits:[{name:"close",description:"The recovery control was used; detail.reason is action."}],description:"A click on the control slotted into action closes the toast, without stopping the click: the control is the target, so its own handler has already run and a host listening above the toast is entitled to hear it. An answer that has been given is not still being asked."}},onpointerenter:{$ref:"#/state/onHold"},onpointerleave:{$ref:"#/state/onRelease"},onfocusin:{$ref:"#/state/onHold"},onfocusout:{$ref:"#/state/onRelease"},"onjx-toast-pause":{$ref:"#/state/onHold"},"onjx-toast-resume":{$ref:"#/state/onRelease"},attributes:{"data-variant":"${state.variant}","data-open":"${state.open ? '' : null}"},style:{$description:"The toast carries NO live region and no role of its own, which is the one decision in this block that is about sound rather than about pixels: jx-toast-host owns the region, and a role here would announce every toast twice in the one arrangement the kit exists to serve. A toast used without a host is drawn and not announced, and the answer to that is a host.",display:"none",boxSizing:"border-box",alignItems:"center",gap:"var(--jx-space-3)",maxInlineSize:"min(420px, calc(100vw - 2 * var(--jx-space-4)))",padding:"var(--jx-space-3)",border:"1px solid var(--jx-border)",borderInlineStartWidth:"3px",borderInlineStartColor:"var(--jx-toast-accent)",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",textAlign:"start",pointerEvents:"auto",opacity:"0",translate:"0 var(--jx-space-3)",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), translate var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete","--jx-toast-accent":"var(--jx-accent)",'&[data-variant="positive"]':{"--jx-toast-accent":"var(--jx-success)"},'&[data-variant="negative"]':{"--jx-toast-accent":"var(--jx-danger)"},'&[data-variant="warning"]':{"--jx-toast-accent":"var(--jx-warning)"},"&[data-open]":{display:"flex",opacity:"1",translate:"0 0"},"@starting-style":{"&[data-open]":{opacity:"0",translate:"0 var(--jx-space-3)"}},"&[hidden]":{$description:"AFTER the open rule, and only because of it: [data-jx][hidden] and [data-jx][data-open] weigh the same, so the later one wins and a hidden open toast would otherwise still be drawn. The UA's own [hidden] rule cannot settle it either, since the element's own display beats it at any specificity.",display:"none"},'& [part="icon"]':{display:"inline-flex",flex:"none",alignSelf:"flex-start",color:"var(--jx-toast-accent)"},'& [part="message"]':{flex:"1",minInlineSize:"0",overflowWrap:"anywhere"},'& [part="action-slot"]':{display:"contents"},'& [part="dismiss"]':{flex:"none",alignSelf:"flex-start"}},children:[{tagName:"span",attributes:{part:"icon","aria-hidden":"true"},children:[{tagName:"jx-icon",attributes:{part:"glyph"},$props:{name:{$ref:"#/state/icon"},weight:"bold"}}]},{tagName:"div",attributes:{part:"message"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"action-slot",role:"none"},onclick:{$ref:"#/state/onAction"},children:[{tagName:"slot",attributes:{name:"action"}}]},{tagName:"jx-action-button",attributes:{part:"dismiss"},$props:{icon:"x",size:"sm",label:{$ref:"#/state/dismissLabel"},hint:{$ref:"#/state/dismissLabel"}},onclick:{$ref:"#/state/onDismiss"}}]};var Tr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTree",tagName:"jx-tree",$description:'The `role="tree"` itself, over a FLAT list of `jx-tree-item` rows. Four decisions are the whole design, and each of them is forced by the same fact: a Studio tree windows, so the DOM holds a SLICE and the element must never mistake it for the model. (1) THE HOST OWNS THE ROW SET. The element takes a flat projection — one row per drawn line, each carrying its own `level`, `posinset`, `setsize` and `expanded` — rather than a nested structure, because a nested one cannot be windowed at all: a subtree is a variable number of lines and a viewport is a fixed number of them. Both Studio trees already project flat rows for exactly this reason, and neither can go back. (2) THE COUNTS DESCRIBE THE FULL SET. `aria-setsize` and `aria-posinset` are the row\'s props and are never derived from `items.length`, which is how a reader ends up told a directory holds eleven files when it holds ten thousand. (3) MULTI-SELECT IS AN INTENT, NOT A SET. The tree owns the ANCHOR and dispatches `select` with a mode — `replace`, `toggle` or `range` — and the HOST resolves it, because resolving a range means naming every row between two of them and the rows between are precisely the ones the drawn slice does not have. (4) DRAG AND DROP IS AN ISLAND. Pragmatic-drag-and-drop attaches through the host (studio-ui-guidelines.md §9.4); the element\'s job is to make every row addressable (`data-value` on each) and to keep the non-drag alternative alive, which means the roving caret reaches every row and every chord the tree does not own — cut, paste, delete, rename, select-all — passes straight through to the host (WCAG 2.2 SC 2.5.7, guidelines §8.2). The windowing contract is `padtop` and `padbottom` plus the `move` and `typeahead` events, and it is deliberately NOT a second geometry engine: the pads are the element\'s only knowledge of what it cannot see, and a caret move past one — or a letter the slice cannot honestly answer — is dispatched rather than performed.',observedAttributes:["label","multiple","current","padtop","padbottom"],state:{label:{type:"string",default:"Tree",attribute:"label",description:'The accessible name of the tree. A `tree` takes no name from its rows and nothing lints a missing one — a bound role switches the naming rules off — so name every tree. "Document outline", "Project files": what this tree is OF, since a window may hold two.'},multiple:{type:"boolean",default:!1,attribute:"multiple",description:'Whether more than one row may be selected, announced as `aria-multiselectable`. It is also the gate on the modifiers: with it off, every `select` the element dispatches is `replace` however many keys the reader is holding, so a host that never asked for multi-select cannot be handed a `toggle` it has no code for. This is where the multi answer lives rather than on the rows, because a `aria-selected="false"` on every row is the OTHER way to say it and a row cannot see its tree.'},current:{type:"string",default:"",attribute:"current",description:"The `value` of the row holding the roving caret. The tree is the single writer of every drawn row's `caret`, derived from this, so a host moves the caret by writing HERE and never a row's own state. Under windowing the row it names is routinely not drawn; the tab stop then falls back to the first drawn row so the tree cannot drop out of the tab order, and `current` itself is left exactly as the host wrote it."},anchor:{type:"string",default:"",description:"The row a `Shift` range extends from. The tree owns it — it is a fact about the reader's gesture rather than about the document — and writes it on every `replace` and `toggle`. A host may seed it to restore a session; it never has to."},padtop:{type:"number",default:0,attribute:"padtop",description:"The height, in pixels, of the rows the window left ABOVE the drawn slice, reserved as a spacer so the scrollbar stays the length of the whole model. It is also the element's only knowledge that those rows exist: a caret move off the top of the slice dispatches `move` when this is non-zero and clamps when it is zero, which is how one code path serves a windowed tree and a small one that draws every row."},padbottom:{type:"number",default:0,attribute:"padbottom",description:"The same, below. Zero at both ends means the slice IS the model, and the ends of the drawn rows are the ends of the tree."},applyCurrent:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"applyCurrent",parameters:["scope"],description:"Writes the caret onto the rows and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applyCurrent(state)}",onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeKeydown",description:"The ARIA tree keyboard contract: the arrows walk the drawn rows without wrapping, Home and End go to the ends, ArrowRight opens a closed row and steps into an open one, ArrowLeft closes an open row and steps out of a closed one, Enter activates, Space is a selection verb, and a printable character is typeahead — resolved over the drawn rows when they are the whole model and dispatched as `typeahead` when a pad says they are not. Shift extends from the anchor and Ctrl or Cmd moves the caret alone. Every other key is left alone, which is what keeps the host's cut, paste, delete and rename chords reachable from a focused row.",emits:[{name:"change",description:"The caret moved to a drawn row; detail is that row's value. `current` is written before this is dispatched, so a listener reading `e.target.current` sees the new value."},{name:"select",description:"The reader meant something by landing there; detail is `{ value, mode, anchor }` where mode is `replace`, `toggle` or `range`. An INTENT: the host owns the selection set and resolves the range."},{name:"move",description:"The caret must reach a row the drawn slice does not have; detail is `{ from, key }`. The host scrolls, repaints and writes `current`. Dispatched only when a pad says there are rows that way."},{name:"typeahead",description:"A printable character, on a tree whose drawn slice is not the whole model; detail is `{ from, char }` and the host answers it against the model exactly as it answers `move`. Dispatched for EVERY such character rather than only when the slice holds no match: a move off the end of the slice announces itself, and a letter never does — a search over a slice always answers, and the answer is simply the wrong row. Not dispatched at all when both pads are zero, where the drawn rows ARE the tree and the element resolves the letter itself."},{name:"expand",description:"A row should be opened or closed; detail is `{ value, expanded }`, and `expanded` is the state it should be PUT INTO rather than the state it is in."},{name:"activate",description:"A row was activated with Enter; detail is its value. What that means — open the file, start the rename — is the host's."}]},onClick:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeClick",description:"A pointer landed on a row: the caret follows it and the modifiers say what it meant. Delegated on the TREE rather than dispatched by each row, which is the one place the kit departs from its own child-dispatches-select idiom — a selection intent IS the modifier state, and a row would have to copy three booleans out of the mouse event for the tree to read them back.",emits:[{name:"change",description:"The caret moved to the clicked row; detail is its value."},{name:"select",description:"The selection intent the click carried; detail is `{ value, mode, anchor }`."}]},onDblClick:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeDblClick",description:"A double click means what Enter means. One verb for both, so a pointer-only reader and a keyboard-only reader reach the same thing.",emits:[{name:"activate",description:"A row was activated with a double click; detail is its value."}]},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeToggle",description:"A row's twisty was pressed. The row says only which row it was; the tree works out which way it should go and answers with its own `expand`, so that event has ONE dispatcher and `e.target` is the element the host wrote whether the reader used the twisty or ArrowLeft.",emits:[{name:"expand",description:"The row should be opened or closed; detail is `{ value, expanded }`."}]},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeMount",description:"Gives the tree its first sight of itself, syncs the caret and starts watching the row set. Not optional: `applyAttributes` runs before `distributeSlots`, so no row exists when the root's bindings first evaluate — and a scroll replaces the whole slice, so the watch is what keeps one tab stop alive afterwards."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the tree has rendered and taken its slotted rows, which is how onReady reaches the element itself."}},attributes:{role:"tree","aria-label":"${state.label}","aria-multiselectable":"${state.multiple ? 'true' : null}",tabindex:"-1","data-current":"${state.sync}"},onkeydown:{$ref:"#/state/onKeydown"},onclick:{$ref:"#/state/onClick"},ondblclick:{$ref:"#/state/onDblClick"},ontoggle:{$ref:"#/state/onToggle"},"onjx-ready":{$ref:"#/state/onReady"},style:{$description:"The tree declares no `overflow` and owns no scrollbar, which is a decision rather than an omission: one Studio tree scrolls inside itself and the other scrolls inside the panel that also holds its toolbar, and a windowing observer resolves the nearest scrolling ancestor either way. Declaring one here would settle that question wrongly for one of them. The indent is a custom property on the CONTAINER so it inherits to every row and a consumer can retune the whole tree with one declaration.",display:"block","&[hidden]":{display:"none"},boxSizing:"border-box","--jx-tree-indent":"16px",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",outline:"none",'& [part="pad-top"], & [part="pad-bottom"]':{$description:'The rows the window left out, as the height they would have occupied, so the scrollbar stays the length of the whole model. `aria-hidden` because a `role="tree"` owns `treeitem`s and a div that exists to be four thousand pixels tall is not one.',display:"block",flex:"none"}},children:[{tagName:"div",attributes:{part:"pad-top","aria-hidden":"true",style:"block-size: ${state.padtop}px"}},{tagName:"slot"},{tagName:"div",attributes:{part:"pad-bottom","aria-hidden":"true",style:"block-size: ${state.padbottom}px"}}]};var Er={$schema:"https://jxsuite.com/schema/v1",$id:"JxTreeItem",tagName:"jx-tree-item",$description:"One row of a `jx-tree`, and a row is ALL it is: it draws itself, announces itself, and knows nothing about the rows either side of it. THE HOST OWNS THE ROW SET AND THE COUNTS. `level`, `posinset` and `setsize` are props rather than anything derived, because a windowed tree's DOM holds one screen of a model that may be four thousand rows long: a row that counted its own siblings would count the ones that happen to be drawn, and a reader would be told there are eleven items in a directory holding ten thousand. So `aria-setsize` and `aria-posinset` describe the FULL set, they are the host's to supply, and this element will never invent them — a row given neither writes neither, which is ARIA's own way of saying \"ask the tree\", and is right for the one case where the DOM is the whole model. `aria-selected` is written only when the row IS selected: a `false` on every row is what tells assistive technology a tree supports multiple selection, the row cannot see whether its tree does, and `aria-multiselectable` on `jx-tree` is where that answer actually lives. The three `data-` attributes it styles but does not write — `data-dragging`, `data-drop` and the drag island generally — are the pointer half of moving a row, and they are deliberately not props: pragmatic-drag-and-drop attaches through the HOST (studio-ui-guidelines.md §9.4) and writes them directly, so a binding here would be a second writer that clobbers the island on the next repaint. What the element owes the non-drag half is `cut`, which draws a row already lifted, and a keyboard that lets go of every chord it does not own.",observedAttributes:["value","label","level","posinset","setsize","expanded","selected","disabled","cut","grip"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for: the detail of every event it provokes, and what the tree's `current` is matched against. A path, an id, a `JxPath` key — whatever the host's model already calls this row, because the tree hands it straight back and never parses it."},label:{type:"string",default:"",attribute:"label",description:"The words on the row, its accessible name, and what typeahead matches. Written to `aria-label` as well as drawn, for the reason `jx-tab` gives: a `treeitem` names itself from its content, so a badge, a status pill and a row action would all join the row's name and a reader would hear \"div Hero More actions\". `aria-label` wins over name-from-content in accname's precedence order, so the name stays exactly the string the row draws and each slotted control keeps announcing its own. It is therefore REQUIRED once anything is slotted, and a consumer whose row is a badge PLUS a name composes both into this one string rather than hoping the concatenation comes out right."},level:{type:"number",default:1,attribute:"level",description:"How deep the row sits, one-based, exactly as `aria-level` counts. It is also the indent: the row's inline padding is `--jx-tree-indent` times one less than this, so the arithmetic that decides what a level LOOKS like lives with the declarations rather than being composed per row in a host's TypeScript. A flat projection is what makes this a prop at all — under windowing there is no ancestor in the DOM to count."},posinset:{type:"number",default:0,attribute:"posinset",description:'Which of its siblings this row is, one-based, IN THE MODEL. Zero writes no `aria-posinset` at all, which is how a small tree that draws every row says "count me from the DOM". A windowed tree must supply it: the drawn slice is not the set, and a position computed from it is a number a reader can act on and be wrong about.'},setsize:{type:"number",default:0,attribute:"setsize",description:'How many siblings the row has, IN THE MODEL — the total under its parent, not the number drawn. Zero writes no `aria-setsize`, the same "ask the DOM" as `posinset`. The pair is what keeps ARIA true while the tree windows, and it is the whole reason the counts are the host\'s.'},expanded:{type:"string",default:"",attribute:"expanded",description:'Empty for a LEAF, which owns no `aria-expanded` and no twisty; `true` or `false` for a row that has children. Three values rather than a boolean because "closed" and "cannot open" are different things to a reader and to the keyboard: `ArrowRight` opens a closed row and steps into an open one, and does nothing at all on a leaf. The same string spelling `jx-menu-item`\'s `checked` uses, for the same reason.'},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether the row is in the selection. The HOST writes it, and it is the one row prop the tree is NOT the single writer of: a selection is a set, a windowed tree draws part of it, and an element that owned it would forget every row it scrolled past. Written to `aria-selected` only when true — see the element's description."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot be acted on. It stays DRAWN and stays counted, because a row that vanished would renumber its siblings, but the caret steps over it, a click on it does nothing, and it never takes the tree's tab stop."},cut:{type:"boolean",default:!1,attribute:"cut",description:"The row is on the clipboard, waiting for a paste to land it somewhere. Drawn faded, and deliberately invisible to assistive technology: cut and paste are the keyboard alternative to dragging (WCAG 2.2 SC 2.5.7, studio-ui-guidelines.md §8.2), both are host commands, and the host announces the move through its own live region — a reader is told what happened by the page, not by an opacity."},grip:{type:"boolean",default:!1,attribute:"grip",description:"Draws the drag handle. A plain `aria-hidden` span rather than a control, because it is the grab affordance for a pointer drag the drag island owns and NOT a second way to move the row: the keyboard path is cut and paste, and a focusable handle with no keyboard operation of its own would be an SC 2.1.1 failure dressed as an affordance."},caret:{type:"boolean",default:!1,description:"Whether this row holds the tree's one tab stop. `jx-tree` is the single writer of it — a host moves the caret by writing the TREE's `current`, never a row's. It is a prop rather than a `tabindex` the sidecar writes directly so that a repaint cannot lose it: the attribute is derived from state, so re-rendering the row restores the caret instead of quietly resetting it to -1."},onTwisty:{$prototype:"Function",body:[{stopPropagation:!0},{dispatchEvent:"toggle",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"toggle",description:"The row's twisty was pressed; detail is its value. The TREE's internal protocol: `jx-tree` catches it, works out which way the row should go, and answers with its own `expand`."}],description:"The click stops at the twisty, so opening a row does not also select it — the judgement `jx-menu-item` makes for a submenu chevron and `jx-tab` for its close button."},onActions:{$prototype:"Function",body:[{stopPropagation:!0}],description:"A click inside the actions slot stops there, so pressing a control a consumer put on the row never ALSO moves the selection. It stops at the CONTAINER rather than at the host: `stopPropagation` halts an event at the node it is called on and every node after it, never the listeners already run below it, so the slotted control's own handler has fired and only the TREE's delegated click is cut off. Nothing is stopped for `icon` or `status`: those hold marks rather than controls, and a click on a mark is a click on the row."}},attributes:{role:"treeitem",tabindex:"${state.caret ? '0' : '-1'}","aria-label":"${state.label || null}","aria-level":"${state.level}","aria-posinset":"${state.posinset > 0 ? state.posinset : null}","aria-setsize":"${state.setsize > 0 ? state.setsize : null}","aria-expanded":"${state.expanded || null}","aria-selected":"${state.selected ? 'true' : null}","aria-disabled":"${state.disabled ? 'true' : null}","data-value":"${state.value}","data-cut":"${state.cut ? '' : null}"},style:{$description:"The row's block size is a CONTRACT rather than a look: a tree windows, and a window can only reserve the right amount of scroll for the rows it did not draw if every row is exactly one row tall. `--jx-control-h` follows the density setting, which a hard-coded 24px could not. The indent is padding rather than a margin or a spacer element for the same reason — a row whose HEIGHT depended on its depth would make the scrollbar a lie.",display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-2)",boxSizing:"border-box",blockSize:"var(--jx-control-h)",paddingInline:"calc(var(--jx-space-3) + var(--jx-tree-indent, 16px) * ${state.level - 1}) var(--jx-space-3)",borderInlineStart:"2px solid transparent",color:"inherit",cursor:"default",userSelect:"none",whiteSpace:"nowrap",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-selected="true"]':{background:"var(--jx-accent-20)",borderInlineStartColor:"var(--jx-accent-solid)"},'&[aria-disabled="true"]':{opacity:"0.5"},"&[data-cut]":{opacity:"0.5"},"&[data-dragging]":{$description:"The two attributes the DRAG ISLAND writes, styled here and bound nowhere. Pragmatic-drag-and-drop attaches to the rows through the host and sets them imperatively for the length of a gesture; a prop mirroring either would be a second writer, and the repaint that cleared it mid-drag is exactly the stale affordance a cancelled drag used to leave on screen.",opacity:"0.4"},"&[data-drop]":{background:"var(--jx-accent-15)",outline:"1px dashed var(--jx-accent-solid)",outlineOffset:"-1px"},'& [part="twisty"]':{$description:"A leaf draws no chevron and still occupies the box, which is what lines every name in the tree up whether or not its row can be opened. It is `aria-hidden` and not a button: the row itself carries `aria-expanded`, `ArrowRight` and `ArrowLeft` operate it, and a focusable control inside a composite would put a second tab stop on every row.",display:"inline-flex",alignItems:"center",justifyContent:"center",inlineSize:"14px",flex:"none",color:"var(--jx-fg-dim)","--jx-icon-size":"12px"},'& [part="label"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="icon"], & [part="status"], & [part="actions"], & [part="grip-slot"]':{$description:"The four consumer zones generate no box of their own. `display: contents` is what makes an EMPTY one cost nothing — as ordinary flex items they would each take the row's gap, which is dead space on every row that slotted nothing — and it is what puts slotted content in the ROW's flex line rather than one box deeper, so an icon, a language chip and a pin button line up with the name on one gap rather than on three.",display:"contents"},'& [part="grip"]':{$description:"Revealed on hover, on the selected row, and whenever anything inside the row has focus. The third is what keeps it visible for a reader who arrived by keyboard, even though they will move the row with cut and paste rather than with this.",display:"none",flex:"none",color:"var(--jx-fg-dim)",fontSize:"var(--jx-text-sm)",cursor:"grab"},'&:hover [part="grip"], &[aria-selected="true"] [part="grip"], &:focus-within [part="grip"]':{display:"inline-block"},"@(forced-colors: active)":{'&[aria-selected="true"]':{$description:"The selected row, redrawn. Every author colour is replaced by one from the user's palette in forced colours, so the accent wash behind the row collapses into the page and the inline-start edge is the only marker left.",borderInlineStartColor:"Highlight"}}},children:[{tagName:"span",attributes:{part:"twisty","aria-hidden":"true"},onclick:{$ref:"#/state/onTwisty"},$switch:{$ref:"#/state/expanded"},cases:{true:{tagName:"jx-icon",$props:{name:"caret-down",weight:"bold"},attributes:{part:"twisty-icon"}},false:{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"twisty-icon"}}}},{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"status"},children:[{tagName:"slot",attributes:{name:"status"}}]},{tagName:"span",attributes:{part:"grip-slot"},$switch:{$ref:"#/state/grip"},cases:{true:{tagName:"span",attributes:{part:"grip","aria-hidden":"true",title:"Drag to reorder"},textContent:"⠿"}}},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]}]};var Ar={$schema:"https://jxsuite.com/schema/v1",$id:"JxToastHost",tagName:"jx-toast-host",observedAttributes:["label","live","placement","hotkey"],state:{label:{type:"string",default:"Notifications",attribute:"label",description:"The region's accessible name, so a reader who lands in it is told what it is rather than hearing a message with no provenance. It names the STACK and never a toast: the messages inside it change, and a region renamed on every arrival is a region announced on every arrival."},live:{type:"string",default:"polite",attribute:"live",description:"polite, assertive or off: how the stack is announced. polite waits for a pause and is right for an outcome; assertive interrupts and is for the rare message that cannot wait. off is for a host that already says these things somewhere else — Jx Studio announces through its own single announcer, and a region here as well would say every notification twice. Role and attribute move together: polite writes role=status, assertive writes role=alert, off writes neither, so an assistive technology reading the role and one reading the attribute agree."},placement:{type:"string",default:"bottom-end",attribute:"placement",description:"bottom-end, bottom-start, top-end or top-start: which corner the stack is pinned to. It moves the box and NOT the order — the toasts are drawn in the order they are written, whichever corner they are in, so the order a reader hears, the order they tab through and the order they see stay one order. A host that wants the stack in the flow of its own layout overrides position in its own stylesheet; nothing here depends on the fixed box."},hotkey:{type:"string",default:"F8",attribute:"hotkey",description:"The key that moves focus to the first control in the stack. It is what makes a recovery control reachable at all: the stack is at the end of the document and a toast may expire before a reader could Tab to it, so the reader asks for it in one press instead — and arriving suspends every clock in the stack, so nothing then expires under their hand. Escape gives focus back to where it came from, and so does a toast closing while the reader is in it. A press carrying Ctrl, Alt or Meta is left alone. Empty turns the gesture off, for an application that owns a command of its own for this."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onHostMount",description:"Registers the stack's key on the document. It has to be the document: a key that only worked once focus was already in the stack would answer the question it exists to answer with itself."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onHostUnmount",description:"Takes the key back when the stack leaves the document, so a removed host cannot go on answering a press for a stack it can no longer show."},onHold:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackHold",description:"Pointer or focus arrived anywhere in the stack: every toast in it is told to suspend its clock, not only the one underneath. An older toast retiring while the reader answers a newer one would move the very control they were reaching for."},onRelease:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackRelease",description:"The pointer or the focus left the stack for something outside it, so the clocks run again. A move between two toasts of one stack is not a departure and releases nothing."},onClose:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackClose",description:"A toast closed. If it took the reader's focus with it, focus goes back to where the hotkey found it; if the reader was somewhere else entirely, nothing moves."}},onpointerover:{$ref:"#/state/onHold"},onpointerout:{$ref:"#/state/onRelease"},onfocusin:{$ref:"#/state/onHold"},onfocusout:{$ref:"#/state/onRelease"},onclose:{$ref:"#/state/onClose"},attributes:{role:"${state.live === 'off' ? null : state.live === 'assertive' ? 'alert' : 'status'}","aria-live":"${state.live}","aria-atomic":"false","aria-label":"${state.label || null}","data-placement":"${state.placement}"},style:{$description:"aria-atomic is false and written out rather than left to the role, which supplies true: a stack re-read whole on every arrival would announce three old messages to deliver one new one. pointer-events is none on the box and auto on each toast, so the empty corner the stack reserves is not a hole the page cannot be clicked through.",display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",position:"fixed",zIndex:"1000",insetBlockEnd:"var(--jx-space-4)",insetInlineEnd:"var(--jx-space-4)",alignItems:"flex-end",maxInlineSize:"min(420px, calc(100vw - 2 * var(--jx-space-4)))",pointerEvents:"none","&[hidden]":{display:"none"},'&[data-placement="top-end"]':{insetBlockStart:"var(--jx-space-4)",insetBlockEnd:"auto"},'&[data-placement="bottom-start"]':{insetInlineStart:"var(--jx-space-4)",insetInlineEnd:"auto",alignItems:"flex-start"},'&[data-placement="top-start"]':{insetBlockStart:"var(--jx-space-4)",insetBlockEnd:"auto",insetInlineStart:"var(--jx-space-4)",insetInlineEnd:"auto",alignItems:"flex-start"}},children:[{tagName:"slot"}]};var Mr={$schema:"https://jxsuite.com/schema/v1",$id:"JxToolbar",tagName:"jx-toolbar",observedAttributes:["label","orientation"],state:{label:{type:"string",default:"",attribute:"label",description:"The accessible name of the toolbar, and it is not optional in practice: a toolbar is a container a reader is told they have entered, and an unnamed one is announced by its role alone. toolbar is in neither of the accessibility lint's named-role sets, so nothing lints its absence — the element's own test pins it instead, and so does every surface that mounts one."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical. It chooses which arrow pair moves the caret between controls, and it turns the row through 90 degrees off aria-orientation — which role=toolbar both supports and defaults to horizontal, so unlike jx-action-group there is no second data- attribute to key the layout on."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/toolbar.ts",$export:"onToolbarKeydown",description:"The toolbar keyboard contract: the arrow pair of its own axis moves the roving caret between reachable controls with wrap, Home and End go to the ends, and a control that answers the key itself keeps it — a text field holds the arrows while its caret has text left to walk in that direction, and holds Home and End always."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/toolbar.ts",$export:"onToolbarReady",description:"Collapses the toolbar to one tab stop once it has rendered, and keeps it collapsed to one as controls come and go. It listens for the element's own jx-ready because onMount is handed the reactive scope alone, and placing a caret needs the host."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The toolbar has rendered and distributed its children, so its caret can be placed."}],description:"Announces that the element has rendered. The toolbar's own onReady listens for it, and a host may too."}},attributes:{role:"toolbar","aria-label":"${state.label || null}","aria-orientation":"${state.orientation}"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},boxSizing:"border-box",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--jx-fg)",'&[aria-orientation="vertical"]':{flexDirection:"column",alignItems:"stretch"}},children:[{tagName:"slot"}]};var pe={"jx-icon":ir,"jx-spinner":fr,"jx-tooltip":br,"jx-button":Uo,"jx-action-button":qo,"jx-menu-item":lr,"jx-menu":sr,"jx-popover":dr,"jx-textfield":jr,"jx-checkbox":Go,"jx-switch":vr,"jx-number-field":gr,"jx-select":pr,"jx-option":ur,"jx-listbox":hr,"jx-combobox":cr,"jx-action-group":Ko,"jx-toolbar":Mr,"jx-tab":yr,"jx-tab-panel":kr,"jx-tabs":$r,"jx-tree-item":Er,"jx-tree":Tr,"jx-accordion-item":Bo,"jx-accordion":_o,"jx-divider":nr,"jx-split":mr,"jx-kbd":rr,"jx-dot":ar,"jx-field":or,"jx-dialog":tr,"jx-toast":Sr,"jx-toast-host":Ar,"jx-color-area":Yo,"jx-color-slider":Qo,"jx-swatch":wr,"jx-swatch-group":xr,"jx-color-field":Xo},dc=Object.keys(pe),Hr=Aa(Object.values(pe)),Fd=Hr.popoverTags??new Set,zm=Hr.invokerTags??new Set;var xn={};Di(xn,{clamp:()=>A,contrastRatio:()=>mn,formatHex:()=>me,formatOklch:()=>wn,hsvToRgb:()=>bn,inkOn:()=>uc,oklchToSrgb:()=>Ir,parseColor:()=>B,parseHex:()=>Nr,preferredInk:()=>ut,relativeLuminance:()=>fn,rgbToHsv:()=>ht,snapToStep:()=>Le,srgbToOklch:()=>gn});function A(e,t,n){if(!Number.isFinite(e))return t;return e<t?t:e>n?n:e}function Le(e,t,n,a){let o=A(e,n,a);if(!Number.isFinite(t)||t<=0)return o;let r=n+Math.round((o-n)/t)*t;if(r>a)r-=t;return A(Number(r.toFixed(6)),n,a)}function ct(e){return Math.round(A(e,0,255)).toString(16).padStart(2,"0")}function Nr(e){let t=e.trim().replace(/^#/,"");if(!/^[0-9a-f]+$/i.test(t))return null;let n=t.length===6||t.length===8,a=t.length===3||t.length===4;if(!n&&!a)return null;let o=n?2:1,r=(s)=>{let d=t.slice(s*o,s*o+o);return Number.parseInt(o===1?d+d:d,16)};return{a:t.length===4||t.length===8?r(3)/255:1,b:r(2),g:r(1),r:r(0)}}function ee(e,t){if(e.endsWith("%"))return Number(e.slice(0,-1))/100*t;return Number(e)}function Lr(e,t){let n=new RegExp(`^${t}a?\\(([^)]*)\\)$`,"i").exec(e.trim());if(!n)return null;return n[1].trim().split(/[\s,/]+/).filter(Boolean)}function B(e){let t=e.trim(),n=Lr(t,"rgb");if(n&&n.length>=3){let o=[ee(n[0],255),ee(n[1],255),ee(n[2],255)],r=n.length>3?ee(n[3],1):1;if(o.some((i)=>Number.isNaN(i))||Number.isNaN(r))return null;return{a:A(r,0,1),b:A(o[2],0,255),g:A(o[1],0,255),r:A(o[0],0,255)}}let a=Lr(t,"oklch");if(a&&a.length>=3){let o=ee(a[0],1),r=ee(a[1],0.4),i=Number(a[2].replace(/deg$/i,"")),s=a.length>3?ee(a[3],1):1;if([o,r,i,s].some((d)=>Number.isNaN(d)))return null;return Ir({a:A(s,0,1),c:r,h:i,l:o})}return Nr(t)}function me(e){let t=`#${ct(e.r)}${ct(e.g)}${ct(e.b)}`;return e.a>=1?t:`${t}${ct(A(e.a,0,1)*255)}`}function ht(e){let t=A(e.r,0,255)/255,n=A(e.g,0,255)/255,a=A(e.b,0,255)/255,o=Math.max(t,n,a),r=Math.min(t,n,a),i=o-r,s=0;if(i!==0)if(o===t)s=60*((n-a)/i%6);else if(o===n)s=60*((a-t)/i+2);else s=60*((t-n)/i+4);return{a:A(e.a,0,1),h:(s+360)%360,s:o===0?0:i/o*100,v:o*100}}function bn(e){let t=(e.h%360+360)%360,n=A(e.s,0,100)/100,a=A(e.v,0,100)/100,o=a*n,r=o*(1-Math.abs(t/60%2-1)),i=a-o,s=Math.floor(t/60)%6,d=[[o,r,0],[r,o,0],[0,o,r],[0,r,o],[r,0,o],[o,0,r]],[l,h,c]=d[s];return{a:A(e.a,0,1),b:(c+i)*255,g:(h+i)*255,r:(l+i)*255}}function fe(e){return e<=0.04045?e/12.92:((e+0.055)/1.055)**2.4}function pn(e){return e<=0.0031308?e*12.92:1.055*e**0.4166666666666667-0.055}function gn(e){let t=fe(A(e.r,0,255)/255),n=fe(A(e.g,0,255)/255),a=fe(A(e.b,0,255)/255),o=Math.cbrt(0.4122214708*t+0.5363325363*n+0.0514459929*a),r=Math.cbrt(0.2119034982*t+0.6806995451*n+0.1073969566*a),i=Math.cbrt(0.0883024619*t+0.2817188376*n+0.6299787005*a),s=0.2104542553*o+0.793617785*r-0.0040720468*i,d=1.9779984951*o-2.428592205*r+0.4505937099*i,l=0.0259040371*o+0.7827717662*r-0.808675766*i,h=Math.hypot(d,l);return{a:A(e.a,0,1),c:h,h:h<0.000001?0:(Math.atan2(l,d)*180/Math.PI+360)%360,l:s}}function Ir(e){let t=(e.h%360+360)%360*(Math.PI/180),n=e.c*Math.cos(t),a=e.c*Math.sin(t),o=(e.l+0.3963377774*n+0.2158037573*a)**3,r=(e.l-0.1055613458*n-0.0638541728*a)**3,i=(e.l-0.0894841775*n-1.291485548*a)**3,s=4.0767416621*o-3.3077115913*r+0.2309699292*i,d=-1.2684380046*o+2.6097574011*r-0.3413193965*i,l=-0.0041960863*o-0.7034186147*r+1.707614701*i;return{a:A(e.a,0,1),b:A(pn(l)*255,0,255),g:A(pn(d)*255,0,255),r:A(pn(s)*255,0,255)}}function wn(e){let t=`${(e.l*100).toFixed(1)}% ${e.c.toFixed(3)} ${e.h.toFixed(1)}`;return e.a>=1?`oklch(${t})`:`oklch(${t} / ${Number(e.a.toFixed(3))})`}function fn(e){let t=fe(A(e.r,0,255)/255),n=fe(A(e.g,0,255)/255),a=fe(A(e.b,0,255)/255);return 0.2126*t+0.7152*n+0.0722*a}function mn(e,t){let n=fn(e),a=fn(t);return(Math.max(n,a)+0.05)/(Math.min(n,a)+0.05)}var cc={a:1,b:0,g:0,r:0},hc={a:1,b:255,g:255,r:255};function ut(e){return mn(e,cc)>=mn(e,hc)?"black":"white"}function uc(e){let t=typeof e==="string"?B(e):null;return t?ut({...t,a:1}):""}var $n={};Di($n,{onAreaAxisChange:()=>gc,onAreaAxisInput:()=>bc,onAreaKeydown:()=>wc,onAreaPointerDown:()=>xc,onAreaPointerMove:()=>vc,onAreaPointerUp:()=>yc});var pc="jx-color-area",Cr={x:"saturation",y:"brightness"},fc={ArrowDown:"y",ArrowLeft:"x",ArrowRight:"x",ArrowUp:"y"},mc={ArrowDown:-1,ArrowLeft:-1,ArrowRight:1,ArrowUp:1},vn=new WeakSet;function be(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===pc?t:null}function yn(e){return e.querySelector('[part="track"]')}function kn(e){if(!(e instanceof Element))return null;let t=e.getAttribute("part");return t==="x"||t==="y"?t:null}function Or(e){let t=Number(e.step);return Number.isFinite(t)&&t>0?t:1}function we(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Ne(e,t,n){let a=Cr[t],o=Le(n,Or(e),0,100);if(e[a]===o)return!1;return e[a]=o,!0}function bc(e,t){let n=be(t),a=kn(t.target);if(!n||!a)return;t.stopPropagation(),Ne(e,a,Number(t.target.value)),we(n,"input")}function gc(e,t){let n=be(t),a=kn(t.target);if(!n||!a)return;t.stopPropagation(),Ne(e,a,Number(t.target.value)),we(n,"change")}function wc(e,t){let n=be(t),a=kn(t.target);if(!n||!a||e.disabled===!0)return;let o=fc[t.key];if(!o)return;if(o===a&&!t.shiftKey)return;t.preventDefault(),t.stopPropagation();let r=Or(e)*(t.shiftKey?10:1)*(mc[t.key]??0);if(Ne(e,o,Number(e[Cr[o]])+r))we(n,"input","change")}function Rr(e,t,n){let a=yn(t);if(!a)return!1;let o=a.getBoundingClientRect();if(o.width<=0||o.height<=0)return!1;let r=Ne(e,"x",(n.clientX-o.left)/o.width*100),i=Ne(e,"y",(1-(n.clientY-o.top)/o.height)*100);return r||i}function xc(e,t){let n=be(t);if(!n||e.disabled===!0)return;t.preventDefault(),vn.add(n);let a=yn(n);if(a&&typeof a.setPointerCapture==="function")try{a.setPointerCapture(t.pointerId)}catch{}if(n.querySelector('[part="x"]')?.focus(),Rr(e,n,t))we(n,"input")}function vc(e,t){let n=be(t);if(!n||!vn.has(n))return;if(Rr(e,n,t))we(n,"input")}function yc(e,t){let n=be(t);if(!n||!vn.delete(n))return;let a=yn(n);if(a&&typeof a.releasePointerCapture==="function"&&a.hasPointerCapture?.(t.pointerId))a.releasePointerCapture(t.pointerId);we(n,"change")}var An={};Di(An,{eyeDropperAvailable:()=>Ac,onEyeDropper:()=>Mc,onFieldChange:()=>Tc,onFieldInput:()=>Sc,onFieldMount:()=>Hc,onOpenPicker:()=>Ec,syncFromValue:()=>Tn});var Pr="jx-color-field",Dr=0,kc=new WeakMap;function Fr(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===Pr?t:null}function Zr(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest(Pr):null}function zr(e){return e.querySelector('[part="picker"]')}function Jr(e){return bn({a:e.alpha===!0?Number(e.opacity)/100:1,h:Number(e.hue),s:Number(e.saturation),v:Number(e.brightness)})}function jn(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Vr(e,t){let n={...t,a:1};e.solid=me(n),e.ink=ut(n)}function Sn(e){let t=Jr(e);e.value=e.format==="oklch"?wn(gn(t)):me(t),e.text=e.value,e.invalid=!1,Vr(e,t)}function Tn(e){let t=B(String(e.value??""))??B(String(e.resolved??""));if(e.invalid=!1,e.text=String(e.value??""),!t)return;if(Vr(e,t),me(t)===me(Jr(e)))return;let n=ht(t);if(e.saturation=Number(n.s.toFixed(2)),e.brightness=Number(n.v.toFixed(2)),e.opacity=Number((n.a*100).toFixed(2)),n.s>0&&n.v>0)e.hue=Number(n.h.toFixed(2))}var $c="[data-jx-channel]";function jc(e){let{target:t}=e;return t instanceof Element?t.closest($c):null}function Wr(e,t,n){let a=Fr(t);if(!a||t.target===a)return;let o=jc(t),r=o?.dataset.jxChannel;if(!o||!r)return;if(t.stopPropagation(),r==="text"){let i=String(t.target.value??"");e.text=i;let s=B(i);if(n==="input"){e.invalid=!1;return}if(!s){e.invalid=i!=="";return}En(e,s),Sn(e),jn(a,"input","change");return}if(r==="system"||r==="palette"){let i=B(String(t.target.value??""));if(!i)return;En(e,{...i,a:e.alpha===!0?Number(e.opacity)/100:1})}else if(r==="area")e.saturation=Number(o.saturation),e.brightness=Number(o.brightness);else if(r==="hue")e.hue=Number(o.value);else if(r==="opacity")e.opacity=Number(o.value);else return;Sn(e),jn(a,n)}function En(e,t){let n=ht(t);if(e.saturation=Number(n.s.toFixed(2)),e.brightness=Number(n.v.toFixed(2)),e.alpha===!0)e.opacity=Number((n.a*100).toFixed(2));if(n.s>0&&n.v>0)e.hue=Number(n.h.toFixed(2))}function Sc(e,t){Wr(e,t,"input")}function Tc(e,t){Wr(e,t,"change")}function Ec(e,t){let n=Zr(t),a=n?zr(n):null;if(!n||!a||e.disabled===!0)return;if(e.expanded===!0){Pd(a);return}let o=n.getBoundingClientRect();a.x=Math.round(o.left),a.y=Math.round(o.bottom),zl(a,t.currentTarget instanceof Element?t.currentTarget:n)}function Ac(e){return e===!0&&typeof globalThis.EyeDropper==="function"}function Mc(e,t){let n=Zr(t),a=globalThis.EyeDropper;if(!n||!a||e.disabled===!0)return Promise.resolve();return new a().open().then((o)=>{let r=B(String(o?.sRGBHex??""));if(!r)return;En(e,r),Sn(e),jn(n,"input","change")}).catch(()=>{})}function Hc(e,t){let n=Fr(t);if(!n)return;kc.set(e,n),Dr+=1,e.uid=`jx-color-field-${Dr}`,Tn(e),new MutationObserver(()=>{Tn(e)}).observe(n,{attributeFilter:["data-resolved","data-value"],attributes:!0});let o=zr(n);if(o)o.addEventListener("toggle",(r)=>{e.expanded=r.newState==="open"})}var Ln={};Di(Ln,{onSliderChange:()=>Rc,onSliderInput:()=>Oc,onSliderKeydown:()=>Dc});var Lc="jx-color-slider",Nc={ArrowDown:-1,ArrowLeft:-1,ArrowRight:1,ArrowUp:1};function Mn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===Lc?t:null}function Ic(e){return e.querySelector('input[part="input"]')}function Hn(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Cc(e){let t=Number.isFinite(Number(e.min))?Number(e.min):0,n=Number(e.maxValue),a=Number(e.step);return{max:Number.isFinite(n)&&n>t?n:360,min:t,step:Number.isFinite(a)&&a>0?a:1}}function Oc(e,t){let n=Mn(t);if(!n||t.target===n)return;t.stopPropagation(),e.value=Number(t.target.value),Hn(n,"input")}function Rc(e,t){let n=Mn(t);if(!n||t.target===n)return;t.stopPropagation(),e.value=Number(t.target.value),Hn(n,"change")}function Dc(e,t){let n=Mn(t),a=Nc[t.key];if(!n||!a||!t.shiftKey||e.disabled===!0)return;t.preventDefault();let{max:o,min:r,step:i}=Cc(e),s=Le(Number(e.value)+a*i*10,i,r,o);if(s===Number(e.value))return;e.value=s;let d=Ic(n);if(d)d.value=String(s);Hn(n,"input","change")}var On={};Di(On,{closeList:()=>q,inputOf:()=>In,landingIndex:()=>Cn,mountCombobox:()=>Fc,nextIndex:()=>Ie,onComboboxButton:()=>Jc,onComboboxCommit:()=>Wc,onComboboxInput:()=>Zc,onComboboxKeydown:()=>_c,onComboboxPick:()=>Vc,onComboboxToggle:()=>zc,openList:()=>Ur,rowFor:()=>mt});var Pc="jx-combobox",_r=0;function Ce(e){let t=e.currentTarget;return t instanceof Element?t.closest(Pc):null}function In(e){return e.querySelector('input[part="input"]')}function Br(e){return e.querySelector('[part="popup"]')}function Oe(e){return Array.isArray(e.options)?e.options:[]}function qr(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function pt(e){return e.disabled!==!0&&e.readonly!==!0}function Ur(e){let t=Br(e);if(!t)return;let n=e.getBoundingClientRect(),a=t;a.x=Math.round(n.left),a.y=Math.round(n.bottom),zl(t,e)}function q(e){let t=Br(e);if(t)Pd(t)}function ft(e,t){if(!pt(e)||Oe(e).length===0)return!1;return Ur(t),!0}function Cn(e){let t=Oe(e),n=mt(t,String(e.value??""));return n&&n.disabled!==!0?t.indexOf(n):-1}function Ie(e,t,n){let a=t<0?n>0?-1:0:t;for(let o of e.keys()){let r=((a+n*(o+1))%e.length+e.length)%e.length;if(e[r]?.disabled!==!0)return r}return-1}function mt(e,t){let n=t.toLowerCase();return e.find((a)=>String(a.value).toLowerCase()===n)??null}function Nn(e,t,n){let a=String(n.value);e.value=a,e.committed=a,e.activeIndex=-1,q(t),In(t)?.focus(),qr(t,"input","change")}function Fc(e,t){_r+=1,e.uid=`jx-combobox-${_r}`,e.committed=String(e.value??"")}function Zc(e,t){let n=Ce(t),a=t.target;if(!n||!(a instanceof HTMLInputElement))return;e.value=a.value,e.activeIndex=-1,ft(e,n)}function zc(e,t){let n=t.newState==="open";if(e.open=n,!n)e.activeIndex=-1}function Jc(e,t){let n=Ce(t);if(!n||!pt(e))return;if(e.open===!0){q(n);return}if(ft(e,n))e.activeIndex=Cn(e);In(n)?.focus()}function Vc(e,t){let n=Ce(t),a=String(t.detail??""),o=mt(Oe(e),a);if(!n||!o)return;Nn(e,n,o)}function Wc(e,t){let n=Ce(t);if(!n)return;let a=t.target instanceof HTMLInputElement?t.target:null,o=a?a.value:String(e.value??""),r=mt(Oe(e),o);if(e.allowsCustomValue===!0||o===""||r){e.value=r?String(r.value):o,e.committed=String(e.value),q(n);return}t.stopPropagation(),e.value=String(e.committed??""),qr(n,"change")}function _c(e,t){let n=Ce(t);if(!n||t.ctrlKey||t.metaKey)return;let a=Oe(e),o=Number(e.activeIndex??-1);switch(t.key){case"ArrowDown":{if(!pt(e))return;if(e.open!==!0){if(!ft(e,n))return;e.activeIndex=t.altKey?Cn(e):Ie(a,-1,1)}else if(!t.altKey)e.activeIndex=Ie(a,o,1);break}case"ArrowUp":{if(!pt(e))return;if(t.altKey){q(n);break}if(e.open!==!0){if(!ft(e,n))return;e.activeIndex=Ie(a,-1,-1)}else e.activeIndex=Ie(a,o,-1);break}case"Enter":{let r=e.open===!0&&o>=0?a[o]:void 0;if(!r){if(e.open===!0)q(n);return}Nn(e,n,r);break}case"Tab":{let r=e.open===!0&&o>=0?a[o]:void 0;if(r)Nn(e,n,r);else q(n);return}case"Escape":{if(e.open!==!0)return;q(n),t.stopPropagation();break}default:return}t.preventDefault()}var Rn={};Di(Rn,{mountListbox:()=>Bc,optionsOf:()=>Yr,syncListbox:()=>bt});function Yr(e){return[...e.querySelectorAll("jx-option")].filter((t)=>t.closest("jx-listbox")===e)}function bt(e,t){let n=null,a=!1;for(let o of Yr(e)){let r=t!==""&&o.id===t;if(r)n=o,a=o.selected!==!0;if(o.selected!==r)o.selected=r}if(n&&a&&typeof n.scrollIntoView==="function")n.scrollIntoView({block:"nearest"});return n}function Bc(e,t){bt(t,String(e.active??""));let n=null,a=()=>{if(n!==null)return;n=requestAnimationFrame(()=>{if(n=null,t.isConnected)bt(t,String(e.active??""))})};new MutationObserver(()=>{if(typeof requestAnimationFrame==="function")a();else bt(t,String(e.active??""))}).observe(t,{attributeFilter:["data-active"],attributes:!0,childList:!0,subtree:!0})}var Dn={};Di(Dn,{onNumberChange:()=>Yc,onNumberKeydown:()=>Kc,onStepDown:()=>Gc,onStepUp:()=>Uc,stepBy:()=>Re});function Xr(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-number-field"):null}function Qr(e){return e.querySelector('input[part="input"]')}function ei(e,t){e.value=t.value,e.badInput=t.validity?.badInput===!0}function qc(e){e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function Re(e,t,n){let a=Xr(t),o=a?Qr(a):null;if(!a||!o)return;try{if(n<0)o.stepDown(-n);else o.stepUp(n)}catch{return}ei(e,o),qc(a)}function Kc(e,t){let n=t;if(!n.shiftKey)return;if(n.key==="ArrowUp")n.preventDefault(),Re(e,t,10);else if(n.key==="ArrowDown")n.preventDefault(),Re(e,t,-10)}function Uc(e,t){Re(e,t,1)}function Gc(e,t){Re(e,t,-1)}function Yc(e,t){let n=Xr(t),a=n?Qr(n):null;if(!n||!a)return;ei(e,a)}var Fn={};Di(Fn,{mountSelect:()=>eh,syncSelect:()=>Pn});var ti=0;function Xc(e){return e.querySelector('select[part="control"]')}function Qc(e,t){return[...e.options].some((n)=>n.getAttribute("part")!=="unlisted"&&n.value===t)}function Pn(e,t){let n=String(e.value??""),a=e.unlisted??[];if(n!==""&&!Qc(t,n)){if(a.length!==1||a[0]?.value!==n)e.unlisted=[{label:n,value:n}]}else if(a.length>0)e.unlisted=[];if([...t.options].some((o)=>o.value===n)){if(t.value!==n||t.selectedIndex<0)t.value=n}else if(t.selectedIndex>=0)t.selectedIndex=-1}function eh(e,t){ti+=1,e.uid=`jx-select-${ti}`;let n=Xc(t);if(!n)return;Pn(e,n),new MutationObserver(()=>Pn(e,n)).observe(n,{attributeFilter:["data-value"],attributes:!0,childList:!0,subtree:!0})}var Jn={};Di(Jn,{applySwatchSelection:()=>rh,focusSwatch:()=>ii,onSwatchGroupKeydown:()=>ch,onSwatchGroupMount:()=>lh,onSwatchGroupSelect:()=>dh,swatchesOf:()=>gt,syncSwatches:()=>wt});var oi=new WeakMap,ni=new WeakMap;function Zn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-swatch-group"?t:null}function ri(e,t){return t instanceof Element&&t.closest("jx-swatch-group")===e}function gt(e){return[...e.querySelectorAll("jx-swatch")].filter((t)=>t.closest("jx-swatch-group")===e)}function ai(e){return String(e.value||e.color||"")}function zn(e){return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function th(e){(e.querySelector('[part="control"]')??e).focus()}function ii(e,t){let n=gt(e).filter((r)=>!zn(r));if(n.length===0)return null;let a=(t%n.length+n.length)%n.length,o=n[a];return th(o),o}function wt(e){let t=gt(e);if(t.length===0)return;let n=String(e.value??""),a=t.filter((i)=>!zn(i)),r=a.find((i)=>ai(i)===n)??a[0]??null;for(let i of t)i.checked=ai(i)===n?"true":"false",i.tabindex=i===r?"0":"-1"}function oh(e){if(ni.has(e))return;let t=new MutationObserver(()=>{wt(e)});t.observe(e,{childList:!0,subtree:!0}),ni.set(e,t)}function rh(e){let t=String(e.value??""),n=oi.get(e);if(n)wt(n);return t}function lh(e,t){let n=Zn(t);if(!n)return;oi.set(e,n),wt(n),oh(n)}function dh(e,t){let n=Zn(t);if(!n||!ri(n,t.target))return;t.stopPropagation();let a=String(t.detail??"");if(a===String(e.value??""))return;e.value=a,n.dispatchEvent(new CustomEvent("change",{bubbles:!0,detail:a}))}function ch(e,t){let n=Zn(t);if(!n||!ri(n,t.target))return;let a=gt(n).filter((i)=>!zn(i));if(a.length===0)return;let o=a.findIndex((i)=>i===t.target||t.target instanceof Node&&i.contains(t.target)),r;switch(t.key){case"ArrowDown":case"ArrowRight":{r=o+1;break}case"ArrowLeft":case"ArrowUp":{r=o===-1?-1:o-1;break}case"Home":{r=0;break}case"End":{r=-1;break}default:return}t.preventDefault(),t.stopPropagation(),ii(n,r)?.click()}var _n={};Di(_n,{applySelection:()=>uh,focusTab:()=>hi,onTabsKeydown:()=>mh,onTabsMount:()=>ph,onTabsSelect:()=>fh,syncTabs:()=>xt,tabsOf:()=>Wn});var di=new WeakMap,si=new WeakMap;function hh(e){if(si.has(e))return;let t=new MutationObserver(()=>{xt(e)});t.observe(e,{childList:!0,subtree:!0}),si.set(e,t)}function Vn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-tabs"?t:null}function ci(e,t){return t instanceof Element&&t.closest("jx-tabs")===e}function Wn(e){return[...e.querySelectorAll("jx-tab")].filter((t)=>t.closest("jx-tabs")===e)}function li(e){return String(e.value??"")}function hi(e,t){if(e.length===0)return null;let n=(t%e.length+e.length)%e.length;for(let[o,r]of e.entries())r.tabIndex=o===n?0:-1;let a=e[n];return a.focus(),a}function xt(e){let t=Wn(e);if(t.length===0)return;let n=String(e.selected??""),a=t.findIndex((r)=>li(r)===n),o=a===-1?0:a;for(let[r,i]of t.entries())i.selected=li(i)===n,i.tabIndex=r===o?0:-1}function uh(e){let t=String(e.selected??""),n=di.get(e);if(n)xt(n);return t}function ph(e,t){let n=Vn(t);if(!n)return;di.set(e,n),xt(n),hh(n)}function fh(e,t){let n=Vn(t);if(!n||!ci(n,t.target))return;t.stopPropagation();let a=String(t.detail??"");if(a===String(e.selected??""))return;e.selected=a,n.dispatchEvent(new CustomEvent("change",{bubbles:!0,detail:a}))}function mh(e,t){let n=Vn(t);if(!n||!ci(n,t.target))return;let a=Wn(n);if(a.length===0)return;let o=a.findIndex((l)=>l===t.target||t.target instanceof Node&&l.contains(t.target)),r=String(e.orientation??"horizontal")==="vertical",i=r?"ArrowDown":"ArrowRight",s=r?"ArrowUp":"ArrowLeft",d=null;switch(t.key){case i:{d=o+1;break}case s:{d=o===-1?-1:o-1;break}case"Home":{d=0;break}case"End":{d=a.length-1;break}case"Enter":case" ":{let l=a[o];if(!l||t.target!==l)return;l.click();break}case"Delete":{let l=a[o]?.querySelector('[part="close"]');if(!l)return;l.click();break}default:return}if(d!==null){let l=hi(a,d);if(l&&String(e.activation??"auto")!=="manual")l.click()}t.preventDefault(),t.stopPropagation()}var Un={};Di(Un,{cedesKey:()=>wi,controlOf:()=>Bn,focusItem:()=>gi,itemsOf:()=>De,onToolbarKeydown:()=>jh,onToolbarReady:()=>Sh,syncRoving:()=>Kn});var bh=new Set(["","text","search","url","tel","password","email"]);function pi(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-toolbar"?t:null}function gh(e,t){return t instanceof Element&&t.closest("jx-toolbar")===e}function wh(e,t){let n=t;for(let a=t.parentElement;a&&a!==e;a=a.parentElement)if(a.localName.includes("-"))n=a;return n}function Bn(e){if(e.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))return e;return[...e.querySelectorAll('[part="control"], [part="input"]')].find((n)=>n.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))??e.querySelector("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']")??e}function De(e){let t=[];for(let n of e.querySelectorAll("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']")){if(n.closest("jx-toolbar")!==e)continue;let a=n.closest("jx-action-group, jx-tabs, jx-tree, jx-swatch-group, jx-listbox, jx-menu");if(a&&e.contains(a))continue;let o=wh(e,n);if(!t.includes(o)&&!Bn(o).matches("select, input[type='range'], input[type='number'], [role='spinbutton'], [role='slider'], [role='combobox']"))t.push(o)}return t}function qn(e){if(e.hidden)return!0;return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function fi(e){return"tabindex"in e?String(e.tabindex??""):e.getAttribute("tabindex")??""}function xh(e,t){if("tabindex"in e)e.tabindex=t;else if(e.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))e.tabIndex=Number(t)}function mi(e,t){for(let n of e)xh(n,n===t?"0":"-1")}function bi(e){let t=e.filter((n)=>!qn(n));return t.find((n)=>fi(n)==="0")??t[0]??null}function gi(e,t){let n=De(e),a=n.filter((i)=>!qn(i));if(a.length===0)return null;let o=(t%a.length+a.length)%a.length,r=a[o];return mi(n,r),Bn(r).focus(),r}function vh(e,t){let n=null,a=null;try{n=e.selectionStart,a=e.selectionEnd}catch{return!0}if(n===null||a===null)return!0;if(n!==a)return!1;return t?n>=String(e.value??"").length:n<=0}function yh(e){if(e.localName==="textarea")return!0;return e.localName==="input"&&bh.has((e.getAttribute("type")??"").toLowerCase())}function wi(e,t,n){if(!(e instanceof HTMLElement)||!yh(e))return!1;if(t==="Home"||t==="End")return!0;return!vh(e,t===n)}function Kn(e){let t=De(e);mi(t,bi(t))}function kh(e){let t=De(e),n=bi(t);return t.every((a)=>fi(a)===(a===n?"0":"-1"))}var ui=new WeakSet;function $h(e){if(ui.has(e))return;ui.add(e),new MutationObserver(()=>{if(!kh(e))Kn(e)}).observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["disabled","hidden"]})}function jh(e,t){let n=pi(t);if(!n||!gh(n,t.target))return;let a=e.orientation==="vertical",o=a?"ArrowDown":"ArrowRight",r=a?"ArrowUp":"ArrowLeft";if(t.key!==o&&t.key!==r&&t.key!=="Home"&&t.key!=="End")return;if(wi(t.target,t.key,o))return;let i=De(n).filter((l)=>!qn(l));if(i.length===0)return;let s=i.findIndex((l)=>l===t.target||t.target instanceof Node&&l.contains(t.target)),d;if(t.key===o)d=s+1;else if(t.key===r)d=s===-1?-1:s-1;else if(t.key==="Home")d=0;else d=-1;gi(n,d),t.preventDefault(),t.stopPropagation()}function Sh(e,t){let n=pi(t);if(n)Kn(n),$h(n)}var ta={};Di(ta,{applyCurrent:()=>Hh,itemsOf:()=>ea,onTreeClick:()=>Fh,onTreeDblClick:()=>Zh,onTreeKeydown:()=>Ph,onTreeMount:()=>Lh,onTreeToggle:()=>zh,syncTree:()=>ze});var yi=new WeakMap,xi=new WeakMap,vt=new WeakMap;function Fe(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-tree"?t:null}function ki(e,t){return t instanceof Element&&t.closest("jx-tree")===e}function yt(e,t,n){let a=e[t];return a===void 0?e.getAttribute(n)??"":String(a)}function D(e){return yt(e,"value","value")}function Pe(e){let t=Number(yt(e,"level","aria-level"));return Number.isFinite(t)&&t>=1?Math.trunc(t):1}function Gn(e){let t=yt(e,"expanded","aria-expanded");return t==="true"||t==="false"?t:""}function Ze(e){return e.disabled===void 0?e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true":e.disabled===!0}function Th(e){let t=yt(e,"label","label");return t===""?e.textContent??"":t}function ea(e,t={}){let n=[...e.querySelectorAll("jx-tree-item")].filter((a)=>a.closest("jx-tree")===e);return t.includeDisabled?n:n.filter((a)=>!Ze(a))}function ze(e){let t=ea(e,{includeDisabled:!0});if(t.length===0)return;let n=String(e.current??""),a=t.filter((r)=>!Ze(r)),o=a.find((r)=>D(r)===n)??a[0]??null;for(let r of t)r.caret=r===o;Ah(e,n,o)}function Eh(e,t){let n=e.ownerDocument,a=n.activeElement;if(a instanceof Node&&e.contains(a))return!0;return(a===null||a===n.body)&&t.held!==null&&!t.held.isConnected}function Ah(e,t,n){let a=vt.get(e);if(!a)return;if(!Eh(e,a)){vt.delete(e);return}if(t===a.from||n===null||D(n)!==t)return;if(n.focus(),e.ownerDocument.activeElement===n)vt.delete(e)}function Mh(e){if(xi.has(e))return;let t=new MutationObserver(()=>{ze(e)});t.observe(e,{attributeFilter:["tabindex"],attributes:!0,childList:!0,subtree:!0}),xi.set(e,t)}function Hh(e){let t=String(e.current??""),n=yi.get(e);if(n)ze(n);return t}function Lh(e,t){let n=Fe(t);if(!n)return;yi.set(e,n),ze(n),Mh(n)}function Nh(e,t){return e.findIndex((n)=>n===t||t instanceof Node&&n.contains(t))}function V(e,t,n){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}))}function $i(e,t,n){if(t.current=D(n),ze(e),n.focus(),typeof n.scrollIntoView==="function")n.scrollIntoView({block:"nearest"});V(e,"change",D(n))}function Yn(e){return Number(e.padtop??0)>0}function Xn(e){return Number(e.padbottom??0)>0}function ji(e,t){vt.set(e,{from:String(t.current??""),held:e.ownerDocument.activeElement})}function vi(e,t,n){ji(e,t),V(e,"move",{from:String(t.current??""),key:n})}function Ih(e){return Yn(e)||Xn(e)}function Ch(e,t,n){ji(e,t),V(e,"typeahead",{char:n,from:String(t.current??"")})}function Qn(e,t,n,a,o){let r=t.multiple===!0?a:"replace",i=String(t.anchor??""),s=r==="range"?i===""?o||n:i:n;t.anchor=s,V(e,"select",{anchor:s,mode:r,value:n})}function Si(e){if(e.shiftKey)return"range";return e.ctrlKey||e.metaKey?"toggle":"replace"}function Oh(e){return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?e.key.toLowerCase():null}function Rh(e,t,n){let a=e.map((o)=>Th(o).trim().toLowerCase());for(let o=1;o<=a.length;o++){let r=(t+o)%a.length;if(a[r].startsWith(n))return r}return-1}function Dh(e,t){let n=Pe(e[t]);for(let a=t-1;a>=0;a--)if(Pe(e[a])<n)return a;return-1}function Ph(e,t){let n=Fe(t);if(!n||!ki(n,t.target))return;let a=ea(n);if(a.length===0)return;let o=Nh(a,t.target),r=String(e.current??""),i=t.ctrlKey||t.metaKey,s=a[o],d=null;switch(t.key){case"ArrowDown":{d={key:t.key,select:!i,to:o===-1?0:o+1};break}case"ArrowUp":{d={key:t.key,select:!i,to:o===-1?a.length-1:o-1};break}case"Home":case"End":{if(t.key==="Home"?Yn(e):Xn(e)){t.preventDefault(),t.stopPropagation(),vi(n,e,t.key);return}d={key:t.key,select:!0,to:t.key==="Home"?0:a.length-1};break}case"ArrowRight":{if(!s)return;let h=Gn(s);if(h==="")return;if(h==="false"){t.preventDefault(),t.stopPropagation(),V(n,"expand",{expanded:!0,value:D(s)});return}let c=a[o+1];if(c&&Pe(c)<=Pe(s))return;d={key:t.key,select:!0,to:o+1};break}case"ArrowLeft":{if(!s)return;if(Gn(s)==="true"){t.preventDefault(),t.stopPropagation(),V(n,"expand",{expanded:!1,value:D(s)});return}let h=Dh(a,o);if(h===-1&&Pe(s)===1)return;d={key:t.key,select:!0,to:h};break}case"Enter":{if(!s)return;t.preventDefault(),t.stopPropagation(),V(n,"activate",D(s));return}case" ":{if(!s)return;t.preventDefault(),t.stopPropagation(),Qn(n,e,D(s),e.multiple===!0?"toggle":"replace",r);return}default:{let h=Oh(t);if(h===null)return;if(Ih(e)){t.preventDefault(),t.stopPropagation(),Ch(n,e,h);return}let c=Rh(a,o,h);if(c===-1)return;d={key:t.key,select:!0,to:c}}}t.preventDefault(),t.stopPropagation();let l=a[d.to];if(!l){if(d.to<0?Yn(e):Xn(e))vi(n,e,d.key);return}if($i(n,e,l),d.select)Qn(n,e,D(l),Si(t),r)}function Fh(e,t){let n=Fe(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest("jx-tree-item");if(!a||a.closest("jx-tree")!==n||Ze(a))return;let o=String(e.current??"");$i(n,e,a),Qn(n,e,D(a),Si(t),o)}function Zh(e,t){let n=Fe(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest("jx-tree-item");if(!a||a.closest("jx-tree")!==n||Ze(a))return;V(n,"activate",D(a))}function zh(e,t){let n=Fe(t);if(!n||!ki(n,t.target)||!(t.target instanceof Element))return;t.stopPropagation();let a=t.target.closest("jx-tree-item");if(!a||Ze(a))return;V(n,"expand",{expanded:Gn(a)!=="true",value:D(a)})}var aa={};Di(aa,{TOOLTIP_HIDE_GRACE_MS:()=>Ai,bindTooltip:()=>Hi,measureAnchoredFlip:()=>Ii,mintHintId:()=>Xh,onTooltipBeforeToggle:()=>Kh,onTooltipReady:()=>Gh,onTooltipToggle:()=>Uh,onTooltipUnmount:()=>Yh,placeTooltip:()=>Ni,supportsInterestInvokers:()=>Mi});var Ai=150,Ti=6,Je=4,Ve=new WeakMap,kt=new WeakMap;function Jh(e,t){let n=kt.get(e);if(!n){let r=new Set,i=(s)=>{if(s.key!=="Escape")return;for(let d of r)d()};e.addEventListener("keydown",i,!0),n={dismiss:r,listener:i},kt.set(e,n)}let{dismiss:a,listener:o}=n;return a.add(t),()=>{if(a.delete(t),a.size===0&&kt.get(e)?.listener===o)e.removeEventListener("keydown",o,!0),kt.delete(e)}}function Vh(e){try{return e.matches(":popover-open")}catch{return!1}}function Wh(e,t){if(t)return!1;if(!(e instanceof Element))return!0;try{return e.matches(":focus-visible")}catch{return!0}}var xe=new WeakMap;function Mi(){return typeof HTMLButtonElement==="function"&&"interestForElement"in HTMLButtonElement.prototype}function _h(e,t){return Mi()&&e.id!==""&&t.getAttribute("interestfor")===e.id}function Bh(e,t){zl(e,t)}function qh(e){Pd(e)}function Hi(e,t){if(_h(e,t))return()=>{};let n=e.getRootNode(),a=null,o=null,r=!1,i=!1,s=!1,d=!1,l=!1,h=()=>{if(a!==null)clearTimeout(a),a=null;if(o!==null)clearTimeout(o),o=null},c=()=>{h(),l=!0,Bh(e,t)},u=()=>{l=!1,qh(e)},p=()=>{if(h(),r||i||s)return;u()},g=()=>{h();let S=Number(e.delay)||0;a=setTimeout(c,S)},b=()=>{h(),o=setTimeout(p,Ai)},f=()=>{r=!0,g()},m=()=>{r=!1,d=!1,b()},x=()=>{d=!0},y=()=>{d=!1},k=(S)=>{let E=Wh(S.target,d);if(d=!1,!E)return;s=!0,c()},T=()=>{s=!1,p()},I=()=>{i=!0,h()},j=()=>{i=!1,b()},C=()=>{if(!l&&!Vh(e))return;h(),u()},w=[[t,"pointerenter",f],[t,"pointerleave",m],[t,"pointerdown",x],[t,"pointerup",y],[t,"focusin",k],[t,"focusout",T],[e,"pointerenter",I],[e,"pointerleave",j]];for(let[S,E,F]of w)S.addEventListener(E,F,!0);let M=Jh(n,C);return()=>{h(),M();for(let[S,E,F]of w)S.removeEventListener(E,F,!0)}}function Li(e,t){let n=t.getRootNode(),a=typeof e.for==="string"?e.for:"",o=a===""?null:n.getElementById?.(a)??null;if(o)return o;let r=t.id;if(!/^[\w-]+$/.test(r))return null;return n.querySelector(`[interestfor="${r}"]`)}function na(e,t){let n=Li(e,t);if(n)return n;let a=t.getRootNode(),o=t.id;if(!/^[\w-]+$/.test(o))return null;return a.querySelector(`[aria-describedby~="${o}"]`)}function Ni(e,t){let n=na(e,t);if(!n)return;let a=n.getBoundingClientRect();if(a.width===0&&a.height===0)return;e.x=Math.round(a.left),e.y=Math.round(a.bottom+Ti),e.flipped=!1;let o=()=>{let r=t.getBoundingClientRect();if(r.width===0&&r.height===0)return;if(r.right>window.innerWidth-Je)e.x=Math.max(Je,Math.round(window.innerWidth-r.width-Je));if(r.bottom>window.innerHeight-Je)e.y=Math.max(Je,Math.round(a.top-r.height-Ti)),e.flipped=!0};if(typeof requestAnimationFrame==="function")requestAnimationFrame(o);else o()}function Ii(e,t){xe.get(e)?.();let n=na(e,t),a=()=>{if(!n||e.anchored!==!0)return;let l=t.getBoundingClientRect(),h=n.getBoundingClientRect();if(l.width===0&&l.height===0)return;e.flipped=l.bottom<=h.top};if(!n||typeof requestAnimationFrame!=="function")return a(),()=>{};let o=null,r=()=>{o=null,a()},i=()=>{if(o===null)o=requestAnimationFrame(r)};window.addEventListener("scroll",i,{capture:!0,passive:!0}),window.addEventListener("resize",i);let s=typeof ResizeObserver==="function"?new ResizeObserver(i):null;if(s)s.observe(t),s.observe(n);let d=()=>{if(o!==null)cancelAnimationFrame(o),o=null;if(window.removeEventListener("scroll",i,{capture:!0}),window.removeEventListener("resize",i),s?.disconnect(),xe.get(e)===d)xe.delete(e)};return xe.set(e,d),i(),d}function Kh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=t.newState==="open",{source:o}=t,r=o instanceof Element?o:na(e,n);if(e.anchored=a&&r!==null,!a)e.flipped=!1}function Uh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=t.newState==="open";if(e.open=a,!a){xe.get(e)?.();return}if(e.anchored===!0&&te())Ii(e,n);else Ni(e,n)}function Gh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=Li(e,n);if(!a)return;Ve.get(e)?.dispose(),Ve.set(e,{dispose:Hi(n,a),tip:n})}function Yh(e){xe.get(e)?.();let t=Ve.get(e);if(!t)return;queueMicrotask(()=>{if(Ve.get(e)!==t)return;if(t.tip.isConnected)return;t.dispose(),Ve.delete(e)})}var Ei=0;function Xh(e,t){Ei+=1,e.uid=`${t.localName}-${Ei}`}var sa={};Di(sa,{TOAST_PAUSE:()=>ra,TOAST_RESUME:()=>ia,closeToast:()=>St,onToastAction:()=>ou,onToastDismiss:()=>au,onToastHold:()=>tu,onToastMount:()=>Qh,onToastRelease:()=>nu,onToastUnmount:()=>eu,staysInside:()=>$t});var ra="jx-toast-pause",ia="jx-toast-resume",Oi={focusin:"focus",focusout:"focus",["jx-toast-pause"]:"stack",["jx-toast-resume"]:"stack",pointerenter:"pointer",pointerleave:"pointer",pointerout:"pointer",pointerover:"pointer"},Ci=new WeakMap,Ri=new WeakMap;function We(e){let t=Ci.get(e);if(t)return t;let n={holds:new Set,remaining:0,startedAt:0,timer:null};return Ci.set(e,n),n}function Pi(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest("jx-toast"):null}function $t(e){let{relatedTarget:t,currentTarget:n}=e;return t instanceof Node&&n instanceof Node&&n.contains(t)}function jt(e){if(e.timer!==null)clearTimeout(e.timer),e.timer=null}function oa(e){let t=We(e);if(jt(t),e.open!==!0||t.holds.size>0||t.remaining<=0)return;t.startedAt=Date.now(),t.timer=setTimeout(()=>{t.timer=null;let n=Ri.get(e);if(n)St(n,"timeout")},t.remaining)}function St(e,t){let n=e;if(n.open!==!0)return;n.open=!1,e.dispatchEvent(new CustomEvent("close",{bubbles:!0,detail:{reason:t}}))}function Qh(e,t){Ri.set(e,t);let n=We(e);n.remaining=Number(e.timeout)||0,oa(e),new MutationObserver(()=>{if(e.open===!0){n.remaining=Number(e.timeout)||0,oa(e);return}jt(n)}).observe(t,{attributeFilter:["data-open"],attributes:!0})}function eu(e){jt(We(e))}function tu(e,t){let n=We(e),a=Oi[t.type]??t.type;if(n.timer!==null)n.remaining=Math.max(1,n.remaining-(Date.now()-n.startedAt));n.holds.add(a),jt(n)}function nu(e,t){if($t(t))return;We(e).holds.delete(Oi[t.type]??t.type),oa(e)}function au(e,t){let n=Pi(t);if(n)St(n,"dismissed")}function ou(e,t){let n=Pi(t);if(n)St(n,"action")}var ua={};Di(ua,{focusStack:()=>Zi,focusablesIn:()=>Fi,onHostMount:()=>hu,onHostUnmount:()=>uu,onStackClose:()=>cu,onStackHold:()=>lu,onStackRelease:()=>du,returnFocus:()=>ha});var ru="jx-toast-host",iu='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',la=new WeakMap,da=new WeakMap;function ca(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest(ru):null}function Fi(e){return[...e.querySelectorAll(iu)].filter((t)=>t.closest("jx-toast")?.dataset.open!==void 0)}function su(e){let t=e.ownerDocument.activeElement;return t instanceof Node&&e.contains(t)}function Zi(e){let[t]=Fi(e);if(!t)return!1;let n=e.ownerDocument.activeElement;if(n instanceof HTMLElement&&!e.contains(n))la.set(e,n);return t.focus(),!0}function ha(e){let t=la.get(e);if(la.delete(e),t?.isConnected===!0)return t.focus(),!0;let n=e.ownerDocument.activeElement;if(n instanceof HTMLElement&&e.contains(n))n.blur();return!1}function zi(e,t){for(let n of e.querySelectorAll("jx-toast"))n.dispatchEvent(new Event(t))}function lu(e,t){let n=ca(t);if(n)zi(n,ra)}function du(e,t){let n=ca(t);if(n&&!$t(t))zi(n,ia)}function cu(e,t){let n=ca(t);if(!n)return;let a=n.ownerDocument.activeElement,o=t.target,r=a===null||a===n.ownerDocument.body,i=o instanceof Node&&a instanceof Node&&o.contains(a);if(r||i)ha(n)}function hu(e,t){let n=t.getRootNode(),a=(o)=>{let r=o;if(r.altKey||r.ctrlKey||r.metaKey)return;let i=typeof e.hotkey==="string"?e.hotkey:"";if(i!==""&&r.key===i){if(Zi(t))r.preventDefault();return}if(r.key==="Escape"&&su(t))ha(t),r.preventDefault()};n.addEventListener("keydown",a),da.set(e,()=>n.removeEventListener("keydown",a))}function uu(e){da.get(e)?.(),da.delete(e)}var ma={};Di(ma,{ICON_NAMES:()=>Vi,ICON_VIEW_BOX:()=>Tt,ICON_WEIGHTS:()=>_e,hasIcon:()=>Wi,iconPath:()=>_i,iconViewBox:()=>Bi});var pa={icons:{"align-bottom":{regular:"M224,216a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,216Zm-88-40V80a16,16,0,0,1,16-16h40a16,16,0,0,1,16,16v96a16,16,0,0,1-16,16H152A16,16,0,0,1,136,176Zm16,0h40V80H152ZM48,176V40A16,16,0,0,1,64,24h40a16,16,0,0,1,16,16V176a16,16,0,0,1-16,16H64A16,16,0,0,1,48,176Zm16,0h40V40H64Z"},"align-bottom-simple":{regular:"M208,232a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,232ZM80,192V40A16,16,0,0,1,96,24h64a16,16,0,0,1,16,16V192a16,16,0,0,1-16,16H96A16,16,0,0,1,80,192Zm16,0h64V40H96Z"},"align-center-horizontal":{regular:"M208,136H136V120h48a16,16,0,0,0,16-16V64a16,16,0,0,0-16-16H136V32a8,8,0,0,0-16,0V48H72A16,16,0,0,0,56,64v40a16,16,0,0,0,16,16h48v16H48a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16h72v16a8,8,0,0,0,16,0V208h72a16,16,0,0,0,16-16V152A16,16,0,0,0,208,136ZM72,64H184v40H72ZM208,192H48V152H208v40Z"},"align-center-horizontal-simple":{regular:"M208,80H136V48a8,8,0,0,0-16,0V80H48A16,16,0,0,0,32,96v64a16,16,0,0,0,16,16h72v32a8,8,0,0,0,16,0V176h72a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80Zm0,80H48V96H208v64Z"},"align-center-vertical":{regular:"M224,120H208V72a16,16,0,0,0-16-16H152a16,16,0,0,0-16,16v48H120V48a16,16,0,0,0-16-16H64A16,16,0,0,0,48,48v72H32a8,8,0,0,0,0,16H48v72a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V136h16v48a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V136h16a8,8,0,0,0,0-16ZM104,208H64V48h40Zm88-24H152V72h40Z"},"align-left":{regular:"M48,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0Zm16,64V64A16,16,0,0,1,80,48h96a16,16,0,0,1,16,16v40a16,16,0,0,1-16,16H80A16,16,0,0,1,64,104Zm16,0h96V64H80Zm152,48v40a16,16,0,0,1-16,16H80a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H216A16,16,0,0,1,232,152Zm-16,40V152H80v40H216Z"},"align-right":{regular:"M224,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM192,64v40a16,16,0,0,1-16,16H80a16,16,0,0,1-16-16V64A16,16,0,0,1,80,48h96A16,16,0,0,1,192,64Zm-16,0H80v40h96Zm16,88v40a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H176A16,16,0,0,1,192,152Zm-16,0H40v40H176Z"},"align-top":{regular:"M224,40a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,40ZM208,80v96a16,16,0,0,1-16,16H152a16,16,0,0,1-16-16V80a16,16,0,0,1,16-16h40A16,16,0,0,1,208,80Zm-16,0H152v96h40Zm-72,0V216a16,16,0,0,1-16,16H64a16,16,0,0,1-16-16V80A16,16,0,0,1,64,64h40A16,16,0,0,1,120,80Zm-16,0H64V216h40Z"},"align-top-simple":{regular:"M208,32a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,32ZM176,72V224a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16V72A16,16,0,0,1,96,56h64A16,16,0,0,1,176,72Zm-16,0H96V224h64Z"},"arrow-down":{regular:"M205.66,149.66l-72,72a8,8,0,0,1-11.32,0l-72-72a8,8,0,0,1,11.32-11.32L120,196.69V40a8,8,0,0,1,16,0V196.69l58.34-58.35a8,8,0,0,1,11.32,11.32Z",bold:"M208.49,152.49l-72,72a12,12,0,0,1-17,0l-72-72a12,12,0,0,1,17-17L116,187V40a12,12,0,0,1,24,0V187l51.51-51.52a12,12,0,0,1,17,17Z"},"arrow-elbow-left-up":{regular:"M240,192a8,8,0,0,1-8,8H88a8,8,0,0,1-8-8V67.31L45.66,101.66A8,8,0,0,1,34.34,90.34l48-48a8,8,0,0,1,11.32,0l48,48a8,8,0,0,1-11.32,11.32L96,67.31V184H232A8,8,0,0,1,240,192Z"},"arrow-left":{regular:"M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z"},"arrow-right":{regular:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z",bold:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},"arrow-square-out":{regular:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},"arrow-u-down-left":{regular:"M232,112a64.07,64.07,0,0,1-64,64H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48a8,8,0,0,1,11.32,11.32L51.31,160H168a48,48,0,0,0,0-96H80a8,8,0,0,1,0-16h88A64.07,64.07,0,0,1,232,112Z"},"arrow-u-up-left":{regular:"M232,144a64.07,64.07,0,0,1-64,64H80a8,8,0,0,1,0-16h88a48,48,0,0,0,0-96H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48A8,8,0,0,1,85.66,45.66L51.31,80H168A64.07,64.07,0,0,1,232,144Z"},"arrow-u-up-right":{regular:"M170.34,130.34,204.69,96H88a48,48,0,0,0,0,96h88a8,8,0,0,1,0,16H88A64,64,0,0,1,88,80H204.69L170.34,45.66a8,8,0,0,1,11.32-11.32l48,48a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32-11.32Z"},"arrow-up":{regular:"M205.66,117.66a8,8,0,0,1-11.32,0L136,59.31V216a8,8,0,0,1-16,0V59.31L61.66,117.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0l72,72A8,8,0,0,1,205.66,117.66Z",bold:"M208.49,120.49a12,12,0,0,1-17,0L140,69V216a12,12,0,0,1-24,0V69L64.49,120.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0l72,72A12,12,0,0,1,208.49,120.49Z"},"arrows-clockwise":{regular:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"},"arrows-horizontal":{regular:"M237.66,133.66l-32,32a8,8,0,0,1-11.32-11.32L212.69,136H43.31l18.35,18.34a8,8,0,0,1-11.32,11.32l-32-32a8,8,0,0,1,0-11.32l32-32a8,8,0,0,1,11.32,11.32L43.31,120H212.69l-18.35-18.34a8,8,0,0,1,11.32-11.32l32,32A8,8,0,0,1,237.66,133.66Z"},"arrows-in-line-horizontal":{regular:"M136,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM69.66,90.34a8,8,0,0,0-11.32,11.32L76.69,120H16a8,8,0,0,0,0,16H76.69L58.34,154.34a8,8,0,0,0,11.32,11.32l32-32a8,8,0,0,0,0-11.32ZM240,120H179.31l18.35-18.34a8,8,0,0,0-11.32-11.32l-32,32a8,8,0,0,0,0,11.32l32,32a8,8,0,0,0,11.32-11.32L179.31,136H240a8,8,0,0,0,0-16Z"},"arrows-out":{regular:"M216,48V96a8,8,0,0,1-16,0V67.31l-42.34,42.35a8,8,0,0,1-11.32-11.32L188.69,56H160a8,8,0,0,1,0-16h48A8,8,0,0,1,216,48ZM98.34,146.34,56,188.69V160a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8H96a8,8,0,0,0,0-16H67.31l42.35-42.34a8,8,0,0,0-11.32-11.32ZM208,152a8,8,0,0,0-8,8v28.69l-42.34-42.35a8,8,0,0,0-11.32,11.32L188.69,200H160a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V160A8,8,0,0,0,208,152ZM67.31,56H96a8,8,0,0,0,0-16H48a8,8,0,0,0-8,8V96a8,8,0,0,0,16,0V67.31l42.34,42.35a8,8,0,0,0,11.32-11.32Z"},"arrows-out-line-horizontal":{regular:"M136,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM96,120H35.31l18.35-18.34A8,8,0,0,0,42.34,90.34l-32,32a8,8,0,0,0,0,11.32l32,32a8,8,0,0,0,11.32-11.32L35.31,136H96a8,8,0,0,0,0-16Zm149.66,2.34-32-32a8,8,0,0,0-11.32,11.32L220.69,120H160a8,8,0,0,0,0,16h60.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,122.34Z"},"arrows-out-line-vertical":{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM101.66,53.66,120,35.31V96a8,8,0,0,0,16,0V35.31l18.34,18.35a8,8,0,0,0,11.32-11.32l-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32Zm52.68,148.68L136,220.69V160a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z"},"arrows-vertical":{regular:"M165.66,194.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L120,212.69V43.31L101.66,61.66A8,8,0,0,1,90.34,50.34l32-32a8,8,0,0,1,11.32,0l32,32a8,8,0,0,1-11.32,11.32L136,43.31V212.69l18.34-18.35A8,8,0,0,1,165.66,194.34Z"},"brackets-curly":{regular:"M43.18,128a29.78,29.78,0,0,1,8,10.26c4.8,9.9,4.8,22,4.8,33.74,0,24.31,1,36,24,36a8,8,0,0,1,0,16c-17.48,0-29.32-6.14-35.2-18.26-4.8-9.9-4.8-22-4.8-33.74,0-24.31-1-36-24-36a8,8,0,0,1,0-16c23,0,24-11.69,24-36,0-11.72,0-23.84,4.8-33.74C50.68,38.14,62.52,32,80,32a8,8,0,0,1,0,16C57,48,56,59.69,56,84c0,11.72,0,23.84-4.8,33.74A29.78,29.78,0,0,1,43.18,128ZM240,120c-23,0-24-11.69-24-36,0-11.72,0-23.84-4.8-33.74C205.32,38.14,193.48,32,176,32a8,8,0,0,0,0,16c23,0,24,11.69,24,36,0,11.72,0,23.84,4.8,33.74a29.78,29.78,0,0,0,8,10.26,29.78,29.78,0,0,0-8,10.26c-4.8,9.9-4.8,22-4.8,33.74,0,24.31-1,36-24,36a8,8,0,0,0,0,16c17.48,0,29.32-6.14,35.2-18.26,4.8-9.9,4.8-22,4.8-33.74,0-24.31,1-36,24-36a8,8,0,0,0,0-16Z"},browser:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V88H40V56Zm0,144H40V104H216v96Z"},"caret-down":{regular:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z",bold:"M216.49,104.49l-80,80a12,12,0,0,1-17,0l-80-80a12,12,0,0,1,17-17L128,159l71.51-71.52a12,12,0,0,1,17,17Z"},"caret-left":{regular:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z",bold:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},"caret-right":{regular:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z",bold:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},"caret-up":{regular:"M213.66,165.66a8,8,0,0,1-11.32,0L128,91.31,53.66,165.66a8,8,0,0,1-11.32-11.32l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,213.66,165.66Z",bold:"M216.49,168.49a12,12,0,0,1-17,0L128,97,56.49,168.49a12,12,0,0,1-17-17l80-80a12,12,0,0,1,17,0l80,80A12,12,0,0,1,216.49,168.49Z"},"chat-circle":{regular:"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24Zm0,192a87.87,87.87,0,0,1-44.06-11.81,8,8,0,0,0-6.54-.67L40,216,52.47,178.6a8,8,0,0,0-.66-6.54A88,88,0,1,1,128,216Z",fill:"M232,128A104,104,0,0,1,79.12,219.82L45.07,231.17a16,16,0,0,1-20.24-20.24l11.35-34.05A104,104,0,1,1,232,128Z"},check:{regular:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z",bold:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},clipboard:{regular:"M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"},"clock-counter-clockwise":{regular:"M136,80v43.47l36.12,21.67a8,8,0,0,1-8.24,13.72l-40-24A8,8,0,0,1,120,128V80a8,8,0,0,1,16,0Zm-8-48A95.44,95.44,0,0,0,60.08,60.15C52.81,67.51,46.35,74.59,40,82V64a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16H49c7.15-8.42,14.27-16.35,22.39-24.57a80,80,0,1,1,1.66,114.75,8,8,0,1,0-11,11.64A96,96,0,1,0,128,32Z"},code:{regular:"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z"},columns:{regular:"M104,32H64A16,16,0,0,0,48,48V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,104,32Zm0,176H64V48h40ZM192,32H152a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,192,32Zm0,176H152V48h40Z"},copy:{regular:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"},cube:{regular:"M223.68,66.15,135.68,18h0a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32h0l80.34,44L128,120,47.66,76ZM40,90l80,43.78v85.79L40,175.82Zm96,129.57V133.82L216,90v85.78Z",fill:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,120,47.65,76,128,32l80.35,44Zm8,99.64V133.83l80-43.78v85.76Z"},database:{regular:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z",fill:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64Zm-21.61,74.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"},"dots-three":{regular:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z",bold:"M144,128a16,16,0,1,1-16-16A16,16,0,0,1,144,128ZM60,112a16,16,0,1,0,16,16A16,16,0,0,0,60,112Zm136,0a16,16,0,1,0,16,16A16,16,0,0,0,196,112Z"},"dots-three-vertical":{regular:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM128,72a12,12,0,1,0-12-12A12,12,0,0,0,128,72Zm0,112a12,12,0,1,0,12,12A12,12,0,0,0,128,184Z",bold:"M112,60a16,16,0,1,1,16,16A16,16,0,0,1,112,60Zm16,52a16,16,0,1,0,16,16A16,16,0,0,0,128,112Zm0,68a16,16,0,1,0,16,16A16,16,0,0,0,128,180Z"},"download-simple":{regular:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"},export:{regular:"M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96H80a8,8,0,0,1,0,16H56v96H200V112H176a8,8,0,0,1,0-16h24A16,16,0,0,1,216,112ZM93.66,69.66,120,43.31V136a8,8,0,0,0,16,0V43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66Z"},eye:{regular:"M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,192c-30.78,0-57.67-11.19-79.93-33.25A133.47,133.47,0,0,1,25,128,133.33,133.33,0,0,1,48.07,97.25C70.33,75.19,97.22,64,128,64s57.67,11.19,79.93,33.25A133.46,133.46,0,0,1,231.05,128C223.84,141.46,192.43,192,128,192Zm0-112a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Z",fill:"M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"},"eye-slash":{regular:"M53.92,34.62A8,8,0,1,0,42.08,45.38L61.32,66.55C25,88.84,9.38,123.2,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208a127.11,127.11,0,0,0,52.07-10.83l22,24.21a8,8,0,1,0,11.84-10.76Zm47.33,75.84,41.67,45.85a32,32,0,0,1-41.67-45.85ZM128,192c-30.78,0-57.67-11.19-79.93-33.25A133.16,133.16,0,0,1,25,128c4.69-8.79,19.66-33.39,47.35-49.38l18,19.75a48,48,0,0,0,63.66,70l14.73,16.2A112,112,0,0,1,128,192Zm6-95.43a8,8,0,0,1,3-15.72,48.16,48.16,0,0,1,38.77,42.64,8,8,0,0,1-7.22,8.71,6.39,6.39,0,0,1-.75,0,8,8,0,0,1-8-7.26A32.09,32.09,0,0,0,134,96.57Zm113.28,34.69c-.42.94-10.55,23.37-33.36,43.8a8,8,0,1,1-10.67-11.92A132.77,132.77,0,0,0,231.05,128a133.15,133.15,0,0,0-23.12-30.77C185.67,75.19,158.78,64,128,64a118.37,118.37,0,0,0-19.36,1.57A8,8,0,1,1,106,49.79,134,134,0,0,1,128,48c34.88,0,66.57,13.26,91.66,38.35,18.83,18.83,27.3,37.62,27.65,38.41A8,8,0,0,1,247.31,131.26Z"},eyedropper:{regular:"M224,67.3a35.79,35.79,0,0,0-11.26-25.66c-14-13.28-36.72-12.78-50.62,1.13L142.8,62.2a24,24,0,0,0-33.14.77l-9,9a16,16,0,0,0,0,22.64l2,2.06-51,51a39.75,39.75,0,0,0-10.53,38l-8,18.41A13.68,13.68,0,0,0,36,219.3a15.92,15.92,0,0,0,17.71,3.35L71.23,215a39.89,39.89,0,0,0,37.06-10.75l51-51,2.06,2.06a16,16,0,0,0,22.62,0l9-9a24,24,0,0,0,.74-33.18l19.75-19.87A35.75,35.75,0,0,0,224,67.3ZM97,193a24,24,0,0,1-24,6,8,8,0,0,0-5.55.31l-18.1,7.91L57,189.41a8,8,0,0,0,.25-5.75A23.88,23.88,0,0,1,63,159l51-51,33.94,34ZM202.13,82l-25.37,25.52a8,8,0,0,0,0,11.3l4.89,4.89a8,8,0,0,1,0,11.32l-9,9L112,83.26l9-9a8,8,0,0,1,11.31,0l4.89,4.89a8,8,0,0,0,11.33,0l24.94-25.09c7.81-7.82,20.5-8.18,28.29-.81a20,20,0,0,1,.39,28.7Z"},file:{regular:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z",fill:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z"},"file-code":{regular:"M181.66,146.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L164.69,152l-18.35-18.34a8,8,0,0,1,11.32-11.32Zm-72-24a8,8,0,0,0-11.32,0l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L91.31,152l18.35-18.34A8,8,0,0,0,109.66,122.34ZM216,88V216a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V40A16,16,0,0,1,56,24h96a8,8,0,0,1,5.66,2.34l56,56A8,8,0,0,1,216,88Zm-56-8h28.69L160,51.31Zm40,136V96H152a8,8,0,0,1-8-8V40H56V216H200Z"},"file-text":{regular:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-32-80a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,136Zm0,32a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,168Z"},"flip-vertical":{regular:"M56,120H216a16,16,0,0,0,6.23-30.74l-.14-.06-159.93-64A16,16,0,0,0,40,40v64A16,16,0,0,0,56,120Zm0-80,.15.06L216,104H56l0-64Zm160,96H56a16,16,0,0,0-16,16v64a16,16,0,0,0,22.15,14.78l159.93-64,.14-.06A16,16,0,0,0,216,136ZM56.15,215.93,56,216V152H216Z"},"floppy-disk":{regular:"M219.31,72,184,36.69A15.86,15.86,0,0,0,172.69,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V83.31A15.86,15.86,0,0,0,219.31,72ZM168,208H88V152h80Zm40,0H184V152a16,16,0,0,0-16-16H88a16,16,0,0,0-16,16v56H48V48H172.69L208,83.31ZM160,72a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h56A8,8,0,0,1,160,72Z"},folder:{regular:"M216,72H131.31L104,44.69A15.86,15.86,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.4,15.4,0,0,0,39.38,216H216.89A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40ZM216,200H40V88H216Z",fill:"M216,72H131.31L104,44.69A15.88,15.88,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.41,15.41,0,0,0,39.39,216h177.5A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40Z"},"folder-open":{regular:"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z",fill:"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Z"},"frame-corners":{regular:"M200,80v32a8,8,0,0,1-16,0V88H160a8,8,0,0,1,0-16h32A8,8,0,0,1,200,80ZM96,168H72V144a8,8,0,0,0-16,0v32a8,8,0,0,0,8,8H96a8,8,0,0,0,0-16ZM232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z"},gear:{regular:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z",fill:"M216,130.16q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"},"gear-six":{regular:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm109.94-52.79a8,8,0,0,0-3.89-5.4l-29.83-17-.12-33.62a8,8,0,0,0-2.83-6.08,111.91,111.91,0,0,0-36.72-20.67,8,8,0,0,0-6.46.59L128,41.85,97.88,25a8,8,0,0,0-6.47-.6A112.1,112.1,0,0,0,54.73,45.15a8,8,0,0,0-2.83,6.07l-.15,33.65-29.83,17a8,8,0,0,0-3.89,5.4,106.47,106.47,0,0,0,0,41.56,8,8,0,0,0,3.89,5.4l29.83,17,.12,33.62a8,8,0,0,0,2.83,6.08,111.91,111.91,0,0,0,36.72,20.67,8,8,0,0,0,6.46-.59L128,214.15,158.12,231a7.91,7.91,0,0,0,3.9,1,8.09,8.09,0,0,0,2.57-.42,112.1,112.1,0,0,0,36.68-20.73,8,8,0,0,0,2.83-6.07l.15-33.65,29.83-17a8,8,0,0,0,3.89-5.4A106.47,106.47,0,0,0,237.94,107.21Zm-15,34.91-28.57,16.25a8,8,0,0,0-3,3c-.58,1-1.19,2.06-1.81,3.06a7.94,7.94,0,0,0-1.22,4.21l-.15,32.25a95.89,95.89,0,0,1-25.37,14.3L134,199.13a8,8,0,0,0-3.91-1h-.19c-1.21,0-2.43,0-3.64,0a8.08,8.08,0,0,0-4.1,1l-28.84,16.1A96,96,0,0,1,67.88,201l-.11-32.2a8,8,0,0,0-1.22-4.22c-.62-1-1.23-2-1.8-3.06a8.09,8.09,0,0,0-3-3.06l-28.6-16.29a90.49,90.49,0,0,1,0-28.26L61.67,97.63a8,8,0,0,0,3-3c.58-1,1.19-2.06,1.81-3.06a7.94,7.94,0,0,0,1.22-4.21l.15-32.25a95.89,95.89,0,0,1,25.37-14.3L122,56.87a8,8,0,0,0,4.1,1c1.21,0,2.43,0,3.64,0a8.08,8.08,0,0,0,4.1-1l28.84-16.1A96,96,0,0,1,188.12,55l.11,32.2a8,8,0,0,0,1.22,4.22c.62,1,1.23,2,1.8,3.06a8.09,8.09,0,0,0,3,3.06l28.6,16.29A90.49,90.49,0,0,1,222.9,142.12Z"},"git-branch":{regular:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"},globe:{regular:"M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm88,104a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48ZM40,128a87.61,87.61,0,0,1,3.33-24H81.84a157.44,157.44,0,0,0,0,48H43.33A87.61,87.61,0,0,1,40,128ZM154,88H102a115.11,115.11,0,0,1,26-45A115.27,115.27,0,0,1,154,88Zm52.33,0H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM107.59,42.4A135.28,135.28,0,0,0,85.29,88H49.63A88.29,88.29,0,0,1,107.59,42.4ZM49.63,168H85.29a135.28,135.28,0,0,0,22.3,45.6A88.29,88.29,0,0,1,49.63,168Zm98.78,45.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z"},"grid-four":{regular:"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z",fill:"M216,56v60a4,4,0,0,1-4,4H136V44a4,4,0,0,1,4-4h60A16,16,0,0,1,216,56ZM116,40H56A16,16,0,0,0,40,56v60a4,4,0,0,0,4,4h76V44A4,4,0,0,0,116,40Zm96,96H136v76a4,4,0,0,0,4,4h60a16,16,0,0,0,16-16V140A4,4,0,0,0,212,136ZM40,140v60a16,16,0,0,0,16,16h60a4,4,0,0,0,4-4V136H44A4,4,0,0,0,40,140Z"},image:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z",fill:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM156,88a12,12,0,1,1-12,12A12,12,0,0,1,156,88Zm60,112H40V160.69l46.34-46.35a8,8,0,0,1,11.32,0h0L165,181.66a8,8,0,0,0,11.32-11.32l-17.66-17.65L173,138.34a8,8,0,0,1,11.31,0L216,170.07V200Z"},info:{regular:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"},lightning:{regular:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z",fill:"M213.85,125.46l-112,120a8,8,0,0,1-13.69-7l14.66-73.33L45.19,143.49a8,8,0,0,1-3-13l112-120a8,8,0,0,1,13.69,7L153.18,90.9l57.63,21.61a8,8,0,0,1,3,12.95Z"},link:{regular:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"},list:{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"list-bullets":{regular:"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z"},"lock-simple":{regular:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Z"},"magnifying-glass":{regular:"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"},minus:{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},"paint-brush":{regular:"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM92,208H34.63C41.38,198.41,48,183.92,48,164a44,44,0,1,1,44,44Zm32.42-94.45q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z",fill:"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM124.42,113.55q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z"},"paper-plane-tilt":{regular:"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14,0-.07-40.06-82.3,48-48a8,8,0,0,0-11.31-11.31l-48,48L24.08,98.25l-.07,0,.14,0L216,40Z",fill:"M231.4,44.34s0,.1,0,.15l-58.2,191.94a15.88,15.88,0,0,1-14,11.51q-.69.06-1.38.06a15.86,15.86,0,0,1-14.42-9.15L107,164.15a4,4,0,0,1,.77-4.58l57.92-57.92a8,8,0,0,0-11.31-11.31L96.43,148.26a4,4,0,0,1-4.58.77L17.08,112.64a16,16,0,0,1,2.49-29.8l191.94-58.2.15,0A16,16,0,0,1,231.4,44.34Z"},paperclip:{regular:"M209.66,122.34a8,8,0,0,1,0,11.32l-82.05,82a56,56,0,0,1-79.2-79.21L147.67,35.73a40,40,0,1,1,56.61,56.55L105,193A24,24,0,1,1,71,159L154.3,74.38A8,8,0,1,1,165.7,85.6L82.39,170.31a8,8,0,1,0,11.27,11.36L192.93,81A24,24,0,1,0,159,47L59.76,147.68a40,40,0,1,0,56.53,56.62l82.06-82A8,8,0,0,1,209.66,122.34Z"},"pencil-simple":{regular:"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM92.69,208H48V163.31l88-88L180.69,120ZM192,108.68,147.31,64l24-24L216,84.68Z",fill:"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM192,108.68,147.31,64l24-24L216,84.68Z"},play:{regular:"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z",fill:"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z"},plus:{regular:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},question:{regular:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,168a12,12,0,1,1,12-12A12,12,0,0,1,128,192Zm8-48.72V144a8,8,0,0,1-16,0v-8a8,8,0,0,1,8-8c13.23,0,24-9,24-20s-10.77-20-24-20-24,9-24,20v4a8,8,0,0,1-16,0v-4c0-19.85,17.94-36,40-36s40,16.15,40,36C168,125.38,154.24,139.93,136,143.28Z"},rectangle:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H40V56H216V200Z",fill:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z"},rows:{regular:"M208,136H48a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V152A16,16,0,0,0,208,136Zm0,56H48V152H208v40Zm0-144H48A16,16,0,0,0,32,64v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V64A16,16,0,0,0,208,48Zm0,56H48V64H208v40Z",fill:"M224,152v40a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H208A16,16,0,0,1,224,152ZM208,48H48A16,16,0,0,0,32,64v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V64A16,16,0,0,0,208,48Z"},"share-network":{regular:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"},"sidebar-simple":{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z",fill:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H88V56H216V200Z"},"sliders-horizontal":{regular:"M40,88H73a32,32,0,0,0,62,0h81a8,8,0,0,0,0-16H135a32,32,0,0,0-62,0H40a8,8,0,0,0,0,16Zm64-24A16,16,0,1,1,88,80,16,16,0,0,1,104,64ZM216,168H199a32,32,0,0,0-62,0H40a8,8,0,0,0,0,16h97a32,32,0,0,0,62,0h17a8,8,0,0,0,0-16Zm-48,24a16,16,0,1,1,16-16A16,16,0,0,1,168,192Z"},sparkle:{regular:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z",fill:"M208,144a15.78,15.78,0,0,1-10.42,14.94L146,178l-19,51.62a15.92,15.92,0,0,1-29.88,0L78,178l-51.62-19a15.92,15.92,0,0,1,0-29.88L78,110l19-51.62a15.92,15.92,0,0,1,29.88,0L146,110l51.62,19A15.78,15.78,0,0,1,208,144ZM152,48h16V64a8,8,0,0,0,16,0V48h16a8,8,0,0,0,0-16H184V16a8,8,0,0,0-16,0V32H152a8,8,0,0,0,0,16Zm88,32h-8V72a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0V96h8a8,8,0,0,0,0-16Z"},spinner:{regular:"M136,32V64a8,8,0,0,1-16,0V32a8,8,0,0,1,16,0Zm37.25,58.75a8,8,0,0,0,5.66-2.35l22.63-22.62a8,8,0,0,0-11.32-11.32L167.6,77.09a8,8,0,0,0,5.65,13.66ZM224,120H192a8,8,0,0,0,0,16h32a8,8,0,0,0,0-16Zm-45.09,47.6a8,8,0,0,0-11.31,11.31l22.62,22.63a8,8,0,0,0,11.32-11.32ZM128,184a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V192A8,8,0,0,0,128,184ZM77.09,167.6,54.46,190.22a8,8,0,0,0,11.32,11.32L88.4,178.91A8,8,0,0,0,77.09,167.6ZM72,128a8,8,0,0,0-8-8H32a8,8,0,0,0,0,16H64A8,8,0,0,0,72,128ZM65.78,54.46A8,8,0,0,0,54.46,65.78L77.09,88.4A8,8,0,0,0,88.4,77.09Z",bold:"M140,32V64a12,12,0,0,1-24,0V32a12,12,0,0,1,24,0Zm33.25,62.75a12,12,0,0,0,8.49-3.52L204.37,68.6a12,12,0,0,0-17-17L164.77,74.26a12,12,0,0,0,8.48,20.49ZM224,116H192a12,12,0,0,0,0,24h32a12,12,0,0,0,0-24Zm-42.26,48.77a12,12,0,1,0-17,17l22.63,22.63a12,12,0,0,0,17-17ZM128,180a12,12,0,0,0-12,12v32a12,12,0,0,0,24,0V192A12,12,0,0,0,128,180ZM74.26,164.77,51.63,187.4a12,12,0,0,0,17,17l22.63-22.63a12,12,0,1,0-17-17ZM76,128a12,12,0,0,0-12-12H32a12,12,0,0,0,0,24H64A12,12,0,0,0,76,128ZM68.6,51.63a12,12,0,1,0-17,17L74.26,91.23a12,12,0,0,0,17-17Z"},square:{regular:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H48V48H208V208Z",fill:"M224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Z"},stack:{regular:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z",fill:"M220,169.09l-92,53.65L36,169.09A8,8,0,0,0,28,182.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,169.09Z M220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09Z M28,86.91l96,56a8,8,0,0,0,8.06,0l96-56a8,8,0,0,0,0-13.82l-96-56a8,8,0,0,0-8.06,0l-96,56a8,8,0,0,0,0,13.82Z"},stop:{regular:"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,160H56V56H200V200Z",fill:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z"},tag:{regular:"M243.31,136,144,36.69A15.86,15.86,0,0,0,132.69,32H40a8,8,0,0,0-8,8v92.69A15.86,15.86,0,0,0,36.69,144L136,243.31a16,16,0,0,0,22.63,0l84.68-84.68a16,16,0,0,0,0-22.63Zm-96,96L48,132.69V48h84.69L232,147.31ZM96,84A12,12,0,1,1,84,72,12,12,0,0,1,96,84Z",fill:"M243.31,136,144,36.69A15.86,15.86,0,0,0,132.69,32H40a8,8,0,0,0-8,8v92.69A15.86,15.86,0,0,0,36.69,144L136,243.31a16,16,0,0,0,22.63,0l84.68-84.68a16,16,0,0,0,0-22.63ZM84,96A12,12,0,1,1,96,84,12,12,0,0,1,84,96Z"},"text-a-underline":{regular:"M60.59,175.24a8,8,0,0,0,10.65-3.83L87.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,60.59,175.24ZM128,50.79,160.57,120H95.43ZM224,216a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,216Z"},"text-aa":{regular:"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z"},"text-align-center":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z"},"text-align-justify":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"text-align-left":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z"},"text-align-right":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"text-b":{regular:"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z",bold:"M185.08,114.46A48,48,0,0,0,148,36H80A12,12,0,0,0,68,48V200a12,12,0,0,0,12,12h80a52,52,0,0,0,25.08-97.54ZM92,60h56a24,24,0,0,1,0,48H92Zm68,128H92V132h68a28,28,0,0,1,0,56Z"},"text-italic":{regular:"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z"},"text-strikethrough":{regular:"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z"},"text-subscript":{regular:"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.56a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.34,32.18,32.18,0,0,1,4.63-8.59,32,32,0,0,1,51.11,38.52L208,200h32A8,8,0,0,1,248,208ZM149.24,50a8,8,0,0,0-11.29.81L92,103.78l-45.95-53A8,8,0,0,0,34,61.24L81.41,116,34,170.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,116l47.46-54.76A8,8,0,0,0,149.24,50Z"},"text-superscript":{regular:"M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z"},"text-t":{regular:"M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z"},"text-underline":{regular:"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z"},translate:{regular:"M247.15,212.42l-56-112a8,8,0,0,0-14.31,0l-21.71,43.43A88,88,0,0,1,108,126.93,103.65,103.65,0,0,0,135.69,64H160a8,8,0,0,0,0-16H104V32a8,8,0,0,0-16,0V48H32a8,8,0,0,0,0,16h87.63A87.76,87.76,0,0,1,96,116.35a87.74,87.74,0,0,1-19-31,8,8,0,1,0-15.08,5.34A103.63,103.63,0,0,0,84,127a87.55,87.55,0,0,1-52,17,8,8,0,0,0,0,16,103.46,103.46,0,0,0,64-22.08,104.18,104.18,0,0,0,51.44,21.31l-26.6,53.19a8,8,0,0,0,14.31,7.16L148.94,192h70.11l13.79,27.58A8,8,0,0,0,240,224a8,8,0,0,0,7.15-11.58ZM156.94,176,184,121.89,211.05,176Z"},trash:{regular:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"},"upload-simple":{regular:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0ZM93.66,77.66,120,51.31V144a8,8,0,0,0,16,0V51.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,77.66Z"},warning:{regular:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z",fill:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"},"warning-circle":{regular:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,56a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm8,104a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z"},x:{regular:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z",bold:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}},viewBox:"0 0 256 256"};var _e=["regular","bold","fill"],Tt="0 0 256 256";var{icons:fa}=pa,Vi=Object.keys(fa);function Wi(e,t){let n=fa[e];if(!n)return!1;return t===void 0||t in n}var Ji=new Set;function _i(e,t){let n=typeof e==="string"?e:"",a=fa[n];if(!a){if(n&&!Ji.has(n))Ji.add(n),console.warn(`jx-icon: no icon named "${n}"`);return""}let o=_e.includes(String(t))?t:"regular";return a[o]??a.regular??""}var Bi=pa.viewBox||Tt;var qi={name:"Jx UI Kit",url:"https://jxsuite.com/ui",defaults:{lang:"en"},$media:{"--md":"(max-width: 768px)","--sm":"(max-width: 640px)"},style:{"@layer jx-ui":{"--jx-gray-50":"#f7f7f9","--jx-gray-100":"#eeeef2","--jx-gray-200":"#e1e1e7","--jx-gray-300":"#c9c9d2","--jx-gray-400":"#a2a2af","--jx-gray-500":"#7c7c8b","--jx-gray-600":"#5e5e6c","--jx-gray-700":"#45454f","--jx-gray-800":"#2f2f36","--jx-gray-850":"#26262c","--jx-gray-900":"#1d1d22","--jx-gray-925":"#17171b","--jx-gray-950":"#111114","--jx-gray-975":"#0b0b0d","--jx-blue-50":"#eef4ff","--jx-blue-100":"#dbe7fe","--jx-blue-200":"#bcd3fd","--jx-blue-300":"#8fb5fb","--jx-blue-400":"#5f95f7","--jx-blue-500":"#3b82f6","--jx-blue-600":"#2563eb","--jx-blue-700":"#1d4ed8","--jx-blue-800":"#1e40af","--jx-blue-900":"#172554","--jx-blue-950":"#0f172e","--jx-red-50":"#fdeeee","--jx-red-100":"#fbd9d9","--jx-red-200":"#f5b3b3","--jx-red-300":"#ee8a8a","--jx-red-400":"#e86460","--jx-red-500":"#dc3f3b","--jx-red-600":"#c22e2b","--jx-red-700":"#a12522","--jx-red-800":"#7d1e1c","--jx-red-900":"#5a1614","--jx-red-950":"#3a0f0e","--jx-green-50":"#e9f7ee","--jx-green-100":"#cdeedb","--jx-green-200":"#a6dfbd","--jx-green-300":"#74c996","--jx-green-400":"#4fb27a","--jx-green-500":"#2f9a5f","--jx-green-600":"#22804e","--jx-green-700":"#1a6640","--jx-green-800":"#144e32","--jx-green-900":"#0f3a26","--jx-green-950":"#0a2719","--jx-amber-50":"#fdf3e1","--jx-amber-100":"#fae4b5","--jx-amber-200":"#f2cc7c","--jx-amber-300":"#e5ae4a","--jx-amber-400":"#d59429","--jx-amber-500":"#b8791a","--jx-amber-600":"#96600f","--jx-amber-700":"#764b0b","--jx-amber-800":"#5a3908","--jx-amber-900":"#3f2806","--jx-amber-950":"#2a1a04","--jx-bg":"light-dark(var(--jx-gray-50), var(--jx-gray-950))","--jx-bg-panel":"light-dark(#ffffff, var(--jx-gray-925))","--jx-bg-input":"light-dark(#ffffff, var(--jx-gray-900))","--jx-bg-overlay":"light-dark(#ffffff, var(--jx-gray-850))","--jx-border":"light-dark(var(--jx-gray-200), var(--jx-gray-800))","--jx-border-strong":"light-dark(var(--jx-gray-300), var(--jx-gray-700))","--jx-fg":"light-dark(var(--jx-gray-900), var(--jx-gray-100))","--jx-fg-dim":"light-dark(var(--jx-gray-600), var(--jx-gray-400))","--jx-fg-muted":"var(--jx-gray-500)","--jx-accent":"light-dark(var(--jx-blue-600), var(--jx-blue-500))","--jx-accent-solid":"var(--jx-blue-600)","--jx-accent-hover":"light-dark(var(--jx-blue-700), var(--jx-blue-400))","--jx-accent-fg":"#ffffff","--jx-accent-8":"color-mix(in oklab, var(--jx-accent) 8%, transparent)","--jx-accent-10":"color-mix(in oklab, var(--jx-accent) 10%, transparent)","--jx-accent-15":"color-mix(in oklab, var(--jx-accent) 15%, transparent)","--jx-accent-20":"color-mix(in oklab, var(--jx-accent) 20%, transparent)","--jx-accent-50":"color-mix(in oklab, var(--jx-accent) 50%, transparent)","--jx-hover-bg":"color-mix(in oklab, var(--jx-fg) 6%, transparent)","--jx-danger":"light-dark(var(--jx-red-600), var(--jx-red-400))","--jx-success":"light-dark(var(--jx-green-600), var(--jx-green-400))","--jx-warning":"light-dark(var(--jx-amber-600), var(--jx-amber-300))","--jx-tag":"light-dark(var(--jx-blue-700), var(--jx-blue-300))","--jx-signal":"light-dark(var(--jx-amber-700), var(--jx-amber-200))","--jx-handler":"light-dark(#7c3aed, #c8a2e0)","--jx-map":"light-dark(#4f46b5, #8b83e6)","--jx-switch-c":"var(--jx-danger)","--jx-switch-track":"var(--jx-gray-500)","--jx-switch-thumb":"light-dark(#ffffff, var(--jx-gray-100))","--jx-font-sans":'"Inter Variable", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif',"--jx-font-mono":'"JetBrains Mono", "SF Mono", "Fira Code", monospace',"--jx-text-xs":"10px","--jx-text-sm":"11px","--jx-text-md":"12px","--jx-text-lg":"14px","--jx-leading-xs":"14px","--jx-leading-sm":"16px","--jx-leading-md":"18px","--jx-leading-lg":"20px","--jx-space-1":"2px","--jx-space-2":"4px","--jx-space-3":"8px","--jx-space-4":"12px","--jx-space-5":"16px","--jx-space-6":"24px","--jx-space-7":"32px","--jx-control-h":"24px","--jx-field-label-w":"80px","--jx-icon-size":"16px","--jx-popover-offset":"4px","--jx-radius-xs":"2px","--jx-radius-sm":"4px","--jx-radius-md":"6px","--jx-radius-lg":"10px","--jx-focus-ring":"2px solid var(--jx-accent)","--jx-shadow-popover":"0 0 0 1px var(--jx-border-strong), 0 8px 24px -8px rgb(0 0 0 / 0.6), 0 2px 6px rgb(0 0 0 / 0.3)","--jx-shadow-dialog":"0 0 0 1px var(--jx-border-strong), 0 24px 64px -16px rgb(0 0 0 / 0.7)","--jx-dur-1":"150ms","--jx-dur-2":"200ms","--jx-ease-out":"cubic-bezier(0.2, 0, 0, 1)","--jx-ease-in":"cubic-bezier(0.4, 0, 1, 1)",colorScheme:"light dark",'&[data-theme="light"]':{colorScheme:"light","--jx-shadow-popover":"0 0 0 1px var(--jx-border-strong), 0 8px 24px -8px rgb(0 0 0 / 0.18), 0 2px 6px rgb(0 0 0 / 0.1)","--jx-shadow-dialog":"0 0 0 1px var(--jx-border-strong), 0 24px 64px -16px rgb(0 0 0 / 0.25)"},'&[data-theme="dark"]':{colorScheme:"dark"},'&[data-density="compact"]':{"--jx-control-h":"24px","--jx-text-md":"11px","--jx-leading-md":"16px"},'&[data-density="comfortable"]':{"--jx-control-h":"28px"},"@(prefers-reduced-motion: reduce)":{"--jx-dur-1":"0ms","--jx-dur-2":"0ms"},"@(forced-colors: active)":{"--jx-focus-ring":"2px solid Highlight"},"@property --jx-accent":{syntax:'"<color>"',inherits:"true",initialValue:"#3b82f6"},"@property --jx-dur-1":{syntax:'"<time>"',inherits:"true",initialValue:"150ms"},"@property --jx-dur-2":{syntax:'"<time>"',inherits:"true",initialValue:"200ms"}}},$elements:[{$ref:"./components/jx-icon.json"}]};var wa="jx-ui",Ki=qi.style,mu=Ki[`@layer ${wa}`]??{};function Ui(){return`${je(Ki,{scope:":root"}).map((e)=>e.text).join(`
8
+ `):d.body??"";if(d.role==="accessor"){let u={};if(d.getter)u.get=Function(d.getter.body??"");if(d.setter){let p=(d.setter.parameters??[]).map((g)=>g.$ref?.split("/").pop()??"v");u.set=Function(...p,d.setter.body??"")}Object.defineProperty(r.prototype,l,{...u,configurable:!0})}else if(d.scope==="static")r[l]=Function(...h,c);else r.prototype[l]=Function(...h,c)}return Object.defineProperty(r,"name",{configurable:!0,value:e.title}),r}async function Qe(e,t,n,a){let o={};for(let[d,l]of Object.entries(e))if(!en.has(d))o[d]=l;let r=Object.values(o).some((d)=>Ks(d)),i=(d)=>fetch(ko("/__jx_resolve__"),{body:JSON.stringify({$base:a,$export:e.$export,$prototype:e.$prototype,$src:e.$src,...d}),headers:{"Content-Type":"application/json"},method:"POST"}).then((l)=>{if(!l.ok)throw Error(`Jx dev proxy ${l.status} for "${n}"`);return l.json()}),s=Qa(null);if(r)Q(()=>{let d={};for(let[l,h]of Object.entries(o))d[l]=Ks(h)?J(h,t):h;i(d).then((l)=>{s.value=l}).catch((l)=>console.error("Jx dev proxy:",l))});else i(o).then((d)=>{s.value=d}).catch((d)=>console.error("Jx dev proxy:",d));return s}async function Cl(e,t,n,a){let{$src:o,$export:r}=e,i,s=Ut(o);if(s instanceof Promise)i=await s;else if(s)i=s;else{try{i=await import(o)}catch{if(a)try{i=await import(new URL(o,a).href)}catch{return fo(e,t,n,a)}else return fo(e,t,n,a)}X.set(o,i)}let d=i[r]??i.default?.[r];if(!d)throw Error(`Jx: export "${r}" not found in "${o}" for "${n}"`);if(typeof d!=="function")throw TypeError(`Jx: "${r}" from "${o}" is not a function`);let l=d,h=e.arguments??{},c=Object.values(h).some((g)=>N(g)),u=()=>{let g={};for(let[b,f]of Object.entries(h))g[b]=N(f)?O(f.$ref,t):f;return g},p=Qa(null);if(c)Q(()=>{let g=u();Ux(()=>{}),l(g).then((b)=>{p.value=b}).catch(()=>{})});else p.value=await l(u());return p}async function fo(e,t,n,a){let o=e.arguments??{},r=Object.values(o).some((l)=>N(l)),i=()=>{let l={};for(let[h,c]of Object.entries(o))l[h]=N(c)?O(c.$ref,t):c;return l},s=(l)=>fetch(ko("/__jx_server__"),{body:JSON.stringify({$base:a,$export:e.$export,$src:e.$src,arguments:l}),headers:{"Content-Type":"application/json"},method:"POST"}).then((h)=>{if(!h.ok)throw Error(`Jx server proxy ${h.status} for "${n}"`);return h.json()}),d=Qa(null);if(r)Q(()=>{let l=i();Ux(()=>{}),s(l).then((h)=>{d.value=h}).catch((h)=>console.error("Jx server proxy:",h))});else s(i()).then((l)=>{d.value=l}).catch((l)=>console.error("Jx server proxy:",l));return d}function O(e,t){if(typeof e!=="string")return e;if(e.startsWith("$map/")||e.startsWith("#/$map/")){let n=(e.startsWith("#/")?e.slice(2):e).split("/"),[,a]=n,r=t.$map?.[a]??t[`$map/${a}`];return n.length>2?zt(r,n.slice(2).join("/")):r}if(e.startsWith("#/state/"))return P(t,e.slice(8));if(e.startsWith("parent#/"))return P(t,e.slice(8));if(e.startsWith("window#/"))return zt(globalThis.window,e.slice(8));if(e.startsWith("document#/"))return zt(globalThis.document,e.slice(10));return P(t,e)??null}function N(e){return Ot(e)}function zt(e,t){return P(e,t)}function mo(e,t,n,a){let o=t.replaceAll(/-([a-z])/g,(i,s)=>s.toUpperCase()),r=e[o];if(typeof r==="boolean"){e[o]=n!==null&&n!=="false";return}if(n===null){let i=a?.get(o);e[o]=i===void 0?typeof r==="number"?0:"":i;return}e[o]=typeof r==="number"?Number(n):n}function Ol(e){let t=new Map;for(let[n,a]of Object.entries(e.state??{})){if(a!==null&&typeof a==="object"){let o=a;if("default"in o){t.set(n,o.default);continue}if(Rl.some((r)=>(r in o)))continue}t.set(n,a)}return t}var Rl=["$expression","$prototype","$ref","$src"],bo=new Set;function Dl(e,t){if(Object.hasOwn(e,t))return!0;if(e.hasAttribute(t))return!0;let n=t.replaceAll(/[A-Z]/gu,(a)=>`-${a.toLowerCase()}`);return n!==t&&e.hasAttribute(n)}function tt(e,t){if(!Mp(e))return!1;let n=t===void 0?e:`${t}:${e}`;if(!bo.has(n))bo.add(n),console.warn(`Jx: "${e}" is private state (spec.md §5.6) and cannot be set through $props`+`${t===void 0?"":` (${t})`}. The write was ignored; rename the entry without the leading # to make it part of the component's interface.`);return!0}function Pl(e,t){let n=Object.create(t);for(let[a,o]of Object.entries(e.$props??{})){if(tt(a,"$props"))continue;n[a]=N(o)?O(o.$ref,t):o}return n}var Fl={},Te=new Map;async function yI(e,t){let n=t??location.href,{tagName:a}=e;if(!a||!a.includes("-"))throw Error(`Jx redefineElement: tagName "${a}" must contain a hyphen`);if(!customElements.get(a)){await Mm(e,n);return}if(e.$elements)await st(e.$elements,n);let o=Te.get(a)?.doc.observedAttributes??[],r=e.observedAttributes??[];if(JSON.stringify(o)!==JSON.stringify(r))console.warn(`Jx redefineElement: <${a}> keeps observedAttributes [${o.join(", ")}] as first defined; [${r.join(", ")}] takes effect only in a fresh realm`);Te.set(a,{base:n,doc:e})}async function st(e,t,n){for(let a of e){if(typeof a==="string"){try{await import(a.startsWith("/")||a.startsWith(".")?a:`/node_modules/${a}`)}catch(i){console.warn(`Jx: failed to import package "${a}"`,i)}continue}if(!N(a))continue;let{href:o}=new URL(a.$ref,t),r=await Kt(o,n);if(!r.tagName||!r.tagName.includes("-"))continue;if(customElements.get(r.tagName))continue;if(r.$elements)await st(r.$elements,o,n);await Mm(r,o)}}function Zl(e,t){for(let n of e){if(!n||!n.tagName)continue;let a=n.tagName.toLowerCase(),o={...n.attributes};for(let s of["href","src"]){let d=o[s];if(typeof d!=="string"||d==="")continue;if(!d.startsWith("/")&&!d.startsWith(".")&&!d.startsWith("http")){o[s]=`/node_modules/${d}`;continue}o[s]=ot(a.toUpperCase(),s,d)}let r=`${a}${o.href?`[href="${o.href}"]`:""}${o.src?`[src="${o.src}"]`:""}`;if(r!==a&&document.head.querySelector(r))continue;let i=document.createElement(a);for(let[s,d]of Object.entries(o))i.setAttribute(s,String(d));if(n.textContent)i.textContent=typeof n.textContent==="object"?JSON.stringify(n.textContent,null,2):n.textContent;document.head.append(i)}}var go=32,Jl={expansion:0,frames:[]},ce=Jl;function at(e,t){let n=ce;ce=e;try{return t()}finally{ce=n}}function qt(e){return{expansion:e.frames.length,frames:e.frames}}function Vl(e,t){if(Object.is(e,t))return!0;if(!wo(e)||!wo(t))return!1;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}function wo(e){if(typeof e!=="object"||e===null)return!1;let t=re(e);if(Array.isArray(t))return!0;let n=Object.getPrototypeOf(t);return n===Object.prototype||n===null}function _l(e,t){if(e.tag!==t.tag)return!1;let n=Object.keys(e.props);if(n.length!==Object.keys(t.props).length)return!1;return n.every((a)=>Object.hasOwn(t.props,a)&&Vl(e.props[a],t.props[a]))}function Bl(e,t){let n=[...e.frames.map((a)=>a.tag),t.tag].join(" → ");if(e.frames.slice(e.expansion).some((a)=>_l(a,t)))throw Error(`Component <${t.tag}> renders itself: ${n}. A component cannot appear inside its own `+"definition with the same props — the expansion would never end.");if(e.frames.length>=go)throw Error(`Component nesting exceeds ${go} levels: ${n}. A component that renders itself with changing props needs a case that stops.`);return{expansion:e.expansion,frames:[...e.frames,t]}}var xo=new Set;async function Mm(e,t){let n=t,a=e;if(typeof e==="string"){if(n=new URL(e,n??location.href).href,xo.has(n))return;xo.add(n),a=await Kt(e)}n??=location.href;let o=a,{tagName:r}=o;if(!r||!r.includes("-"))throw Error(`Jx defineElement: tagName "${r}" must contain a hyphen`);if(customElements.get(r))return;if(o.$elements)await st(o.$elements,n);Te.set(r,{base:n,doc:o});let i=o,s=n,d=i.observedAttributes??[],l=class extends HTMLElement{_jxInitialized=!1;_state=null;static get observedAttributes(){return d}async connectedCallback(){if(this.dataset.jxDefinitionRoot!==void 0)return;if(this._jxInitialized)return;this._jxInitialized=!0;let h=ce,c={},u=Te.get(r)??{base:s,doc:i},{doc:p,base:g}=u,b=await Dp(p,{},g,{base:g,media:null,root:this});for(let w of d)if(this.hasAttribute(w))mo(b,w,this.getAttribute(w)),c[w]=this.getAttribute(w);let f=this.dataset.jxProps;if(f){try{let w=JSON.parse(f);for(let[M,S]of Object.entries(w)){if(tt(M,"data-jx-props"))continue;if(M in(p.state??{}))b[M]=S,c[M]=S}}catch{}delete this.dataset.jxProps}let m=this.getAttributeNames().filter((w)=>w.startsWith("props.")&&w.length>6);for(let w of m){let M=w.slice(6);if(tt(M,"props.* attribute")){this.removeAttribute(w);continue}if(M in(p.state??{}))b[M]=this.getAttribute(w),c[M]=this.getAttribute(w),this.removeAttribute(w)}for(let w of Object.keys(p.state??{})){if(Mp(w))continue;if(w in this&&this[w]!==void 0&&Dl(this,w))b[w]=this[w],c[w]=this[w]}let x;try{x=Bl(h,{props:c,tag:r})}catch(w){if(this.replaceChildren(),!this.isConnected)return;console.error(`Jx: <${r}> was not rendered:`,w),this.dispatchEvent(new ErrorEvent("jx-error",{bubbles:!0,composed:!0,error:w,message:w instanceof Error?w.message:String(w)}));return}for(let w of Object.keys(p.state??{})){if(Mp(w))continue;if(!(w in HTMLElement.prototype))Object.defineProperty(this,w,{configurable:!0,get:()=>b[w],set:(M)=>{b[w]=M}})}this._state=b;let y=[...this.childNodes];this.replaceChildren();let k=$l(p.style)?p.style:{display:"block",...p.style},T=Ho(k,Xt.get(this));if(rt(this,T,b.$media??{},b),it(this,p.attributes??{},b),vl(this,p,b),!Array.isArray(p.children)&&p.textContent!==void 0)Eo(this,"textContent",p.textContent,b);let I=Array.isArray(p.children)?p.children:[],j=et;et||=this.dataset.jxPath!==void 0;try{at(x,()=>{for(let w of I)this.append(Ja(w,b))})}finally{et=j}ql(this,y);let{onMount:C}=b;if(typeof C==="function")queueMicrotask(()=>C(b,this))}disconnectedCallback(){if(typeof this._state?.onUnmount==="function")this._state.onUnmount(this._state)}adoptedCallback(){if(typeof this._state?.onAdopted==="function")this._state.onAdopted(this._state)}attributeChangedCallback(h,c,u){if(!this._state||c===u)return;mo(this._state,h,u,Ol(Te.get(r)?.doc??i))}};customElements.define(r,l)}function vo(e,t,n,a){let o=document.createElement(Qt(e.tagName,t));if(n?.onNodeCreated)n.onNodeCreated(o,a??[],e,t);for(let[i,s]of Object.entries(e.$props??{})){if(tt(i,"$props"))continue;let d=(l)=>{o[i]=typeof l==="string"?ot(o.tagName,i,l):l};if(N(s)){let l=s;d(O(l.$ref,t)),Q(()=>{d(O(l.$ref,t))})}else if(Ks(s))Q(()=>{d(J(s,t))});else d(s)}if(e.style)Xt.set(o,e.style);rt(o,e.style??{},t.$media??{},t),it(o,e.attributes??{},t),Yt(o,e,t);let r=Array.isArray(e.children)?e.children:[];for(let i=0;i<r.length;i++){let s=r[i],d=n&&a?{...n,_path:[...a,"children",i]}:void 0;if(Vx(s))Bt(o,s,t,d);else o.append(Ja(s,t,d))}return o}function ql(e,t){let n=e.querySelectorAll("slot");if(n.length===0)return;let a=new Map,o=[];for(let r of t)if(r.nodeType===Node.ELEMENT_NODE&&r.getAttribute("slot")){let i=r.getAttribute("slot");if(!a.has(i))a.set(i,[]);a.get(i).push(r)}else o.push(r);for(let r of n){let i=r.getAttribute("name"),s=i?a.get(i)??[]:o;r.replaceWith(...s.length>0?s:[...r.childNodes])}}var tn={};$i(tn,{close:()=>rn,onCancelClick:()=>ed,onCommand:()=>Yl,onConfirm:()=>Xl,onNativeCancel:()=>Ul,onNativeClose:()=>Gl,onSecondary:()=>Ql,onToggle:()=>Kl,showModal:()=>un});function he(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-dialog"):null}function Lo(e){return e.querySelector('dialog[part="dialog"]')}function Ee(e,t){e?.dispatchEvent(new CustomEvent(t,{bubbles:!0}))}function No(e,t){if(typeof ToggleEvent<"u")return;let n=new Event("toggle",{bubbles:!1});Object.assign(n,{newState:t,oldState:t==="open"?"closed":"open"}),e.dispatchEvent(n)}function un(e){let t=Lo(e);if(!t||t.open)return;t.showModal(),No(t,"open")}function rn(e,t){let n=Lo(e);if(!n?.open)return;n.close(t),No(n,"closed")}function Kl(e,t){e.open=t.newState==="open"}function Ul(e,t){e.open=!1,Ee(he(t),"cancel")}function Gl(e,t){e.open=!1,Ee(he(t),"close")}function Yl(e,t){let n=he(t),a=t.command??"";if(!n)return;if(a==="--show")un(n);else if(a==="--close")rn(n)}function Xl(e,t){Ee(he(t),"confirm")}function Ql(e,t){Ee(he(t),"secondary")}function ed(e,t){let n=he(t);if(Ee(n,"cancel"),n)rn(n,"cancel")}var on={};$i(on,{focusItem:()=>Ap,itemsOf:()=>Ae,onGroupKeydown:()=>id,onGroupReady:()=>sd,syncRoving:()=>an});function Co(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-action-group"?t:null}function td(e,t){return t instanceof Element&&t.closest("jx-action-group")===e}function Ae(e){return[...e.querySelectorAll("jx-action-button")].filter((t)=>t.closest("jx-action-group")===e)}function nn(e){return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function nd(e){if(e.selected===void 0&&e.checked===void 0)return e.hasAttribute("selected")||e.getAttribute("checked")==="true";return e.selected===!0||e.checked==="true"}function ad(e){(e.querySelector('[part="control"]')??e).focus()}function Oo(e,t){for(let n of e)n.tabindex=n===t?"0":"-1"}function Ro(e){let t=e.filter((a)=>!nn(a));return t.find((a)=>a.tabindex==="0")??t.find((a)=>nd(a))??t[0]??null}function Ap(e,t){let n=Ae(e),a=n.filter((i)=>!nn(i));if(a.length===0)return null;let o=(t%a.length+a.length)%a.length,r=a[o];return Oo(n,r),ad(r),r}function an(e){let t=Ae(e);Oo(t,Ro(t))}function od(e){let t=Ae(e),n=Ro(t);return t.every((a)=>a.tabindex===(a===n?"0":"-1"))}var Io=new WeakSet;function rd(e){if(Io.has(e))return;Io.add(e),new MutationObserver(()=>{if(!od(e))an(e)}).observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["disabled"]})}function id(e,t){let n=Co(t);if(!n||!td(n,t.target))return;let a=e.orientation==="vertical",r=Ae(n).filter((s)=>!nn(s)).findIndex((s)=>s===t.target||t.target instanceof Node&&s.contains(t.target)),i=null;if(t.key===(a?"ArrowDown":"ArrowRight"))i=Ap(n,r+1);else if(t.key===(a?"ArrowUp":"ArrowLeft"))i=Ap(n,r===-1?-1:r-1);else if(t.key==="Home")i=Ap(n,0);else if(t.key==="End")i=Ap(n,-1);else return;if(t.preventDefault(),t.stopPropagation(),i&&e.selects==="single")i.click()}function sd(e,t){let n=Co(t);if(n)an(n),rd(n)}var cn={};$i(cn,{onSplitDoubleClick:()=>fd,onSplitKeydown:()=>pd,onSplitPointerDown:()=>cd,onSplitPointerMove:()=>hd,onSplitPointerUp:()=>ud,splitModifiersOf:()=>Ck,trackOf:()=>Av});var ld=Object.freeze({altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1});function Me(e){let t=e;return{altKey:t.altKey===!0,ctrlKey:t.ctrlKey===!0,metaKey:t.metaKey===!0,shiftKey:t.shiftKey===!0}}function Ck(e){let{detail:t}=e;return t!==null&&typeof t==="object"?Me(t):{...ld}}var sn=new WeakMap;function He(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-split"?t:null}function lt(e,t,...n){for(let a of n)e.dispatchEvent(new CustomEvent(a,{bubbles:!0,composed:!0,detail:t}))}function ue(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function Do(e,t){let n=Number(e);return Number.isFinite(n)&&n>0?n:t}function dt(e){return String(e.orientation)!=="horizontal"}function Fo(e,t){return e?t.clientX:t.clientY}var Po=new WeakMap;function Av(e,t){let n=Po.get(e);if(n&&n.vertical===t&&n.element.isConnected&&e.isConnected&&n.element.contains(e)){let a=n.element.getBoundingClientRect(),o=t?a.width:a.height;if(o>0)return o}for(let a=e.parentElement;a;a=a.parentElement){if(globalThis.getComputedStyle(a).display==="contents")continue;let o=a.getBoundingClientRect(),r=t?o.width:o.height;if(r>0)return Po.set(e,{element:a,vertical:t}),r}return 0}function ln(e,t){let n=Av(t,dt(e)),a=ue(e.min,0),o=ue(e.max,1),r=n>0?Math.max(0,ue(e.gap,0))/n:0,i=Math.max(a,r),s=Math.min(o,1-r);if(i>s){let d=(i+s)/2;i=d,s=d}return{hi:s,length:n,lo:i}}function dn(e,t,n,a){let o=Math.min(a,Math.max(n,t));if(!Number.isFinite(o)||o===Number(e.value))return!1;return e.value=o,!0}function Zo(e,t,n){let a=Math.min(n,Math.max(t,ue(e.collapse,t))),o=Number(e.value);if(Math.abs(o-a)>0.000001)return e.restore=o,a;let r=ue(e.restore,-1);return r>=0&&Math.abs(r-a)>0.000001?r:(t+n)/2}function dd(e,t){if(e)return t==="ArrowLeft"?-1:t==="ArrowRight"?1:0;return t==="ArrowUp"?-1:t==="ArrowDown"?1:0}function cd(e,t){let n=He(t);if(!n||e.disabled===!0||ue(t.button,0)!==0)return;let{hi:a,length:o,lo:r}=ln(e,n);if(o<=0)return;if(t.preventDefault(),n.focus(),sn.set(n,{hi:a,length:o,lo:r,origin:Fo(dt(e),t),start:Number(e.value)}),typeof n.setPointerCapture==="function")try{n.setPointerCapture(t.pointerId)}catch{}e.dragging=!0}function hd(e,t){let n=He(t),a=n?sn.get(n):void 0;if(!n||!a)return;let o=Fo(dt(e),t)-a.origin;if(dn(e,a.start+o/a.length,a.lo,a.hi))lt(n,Me(t),"input")}function ud(e,t){let n=He(t);if(!n||!sn.delete(n))return;if(e.dragging=!1,typeof n.releasePointerCapture==="function"&&n.hasPointerCapture?.(t.pointerId))n.releasePointerCapture(t.pointerId);lt(n,Me(t),"change")}function pd(e,t){let n=He(t);if(!n||e.disabled===!0)return;let{hi:a,lo:o}=ln(e,n),r;if(t.key==="Home")r=o;else if(t.key==="End")r=a;else if(t.key==="Enter")r=Zo(e,o,a);else{let i=dd(dt(e),t.key);if(i===0)return;let s=t.shiftKey?Do(e.largeStep,0.1):Do(e.step,0.02);r=Number(e.value)+i*s}if(t.preventDefault(),dn(e,r,o,a))lt(n,Me(t),"input","change")}function fd(e,t){let n=He(t);if(!n||e.disabled===!0)return;let{hi:a,lo:o}=ln(e,n);if(dn(e,Zo(e,o,a),o,a))lt(n,Me(t),"input","change")}var hn={};$i(hn,{clearField:()=>bd,focusField:()=>Wo,mintFieldId:()=>gd,nameFieldControl:()=>xd,selectValue:()=>Pm});function Vo(e){return e.querySelector('[part="input"]')}function Pm(e,t="all"){let n=Vo(e);if(!n)return;if(n.focus(),t==="none")return;if(t==="stem"){let a=n.value.lastIndexOf(".");n.setSelectionRange(0,a>0?a:n.value.length);return}n.select()}function Wo(e){Vo(e)?.focus()}function md(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-textfield"):null}function bd(e,t){let n=md(t);if(!n)return;e.value="",Wo(n),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}))}var zo=0;function gd(e){zo+=1,e.uid=`jx-tf-${zo}`}var Jo=0;function wd(e){return customElements.get(e.localName)?.observedAttributes?.includes("labelledby")===!0}function xd(e,t){Jo+=1;let n=`jx-field-${Jo}`;e.uid=n;let a=(s)=>[...t.children].find((d)=>d.getAttribute("part")===s),o=a("control")?.firstElementChild;if(!o||!wd(o))return;let r=o;r.labelledby||=`${n}-label`;let i=a("help");if(i&&(i.firstElementChild!==null||i.textContent!==""))r.describedby||=`${n}-help`}var _o={$schema:"https://jxsuite.com/schema/v1",$id:"JxAccordion",tagName:"jx-accordion",observedAttributes:["multiple"],state:{multiple:{type:"boolean",default:!0,attribute:"multiple",description:`Whether more than one section may stand open at once, which is what an un-named details already is and what all six shipped Studio panels want. It is ADVISORY: the container declares the intent and reflects it as data-exclusive, and it does NOT enforce it, because the platform's own switch for exclusivity is the name attribute on each details and that attribute belongs to the item. A container that reached into its slotted children to write one would be the foreign-attribute write §2 principle 5 forbids, and there is no declarative channel from a container to light-DOM children it did not author — a slot leaves no node and projects no props. So multiple="false" is a statement a consumer makes true by giving every item the same name; the element is the place that statement is written down and read back, not the place it is imposed. The marker is spelled for the NOTABLE state rather than for the prop: every other boolean reflection in the kit (quiet, compact, checked, disabled, open, loading, stepper, selected, stacked, determinate, destructive, badInput, indeterminate) defaults false and marks attribute-present, so a marker named data-multiple would have been present on every default stack and absent exactly where the intent was declared, and styling the exclusive case would read :not([data-multiple]).`}},attributes:{"data-exclusive":"${state.multiple ? null : ''}"},style:{display:"flex","&[hidden]":{display:"none"},flexDirection:"column",minWidth:"0","& > :not([hidden]) ~ *":{borderBlockStart:"1px solid var(--jx-border)"}},children:[{tagName:"slot"}]};var Bo={$schema:"https://jxsuite.com/schema/v1",$id:"JxAccordionItem",tagName:"jx-accordion-item",observedAttributes:["label","open","name","level"],$elements:[{$ref:"./jx-icon.json"}],state:{label:{type:"string",default:"",attribute:"label",description:`The section's title, printed in the summary row, and the disclosure control's accessible name — it is written as aria-label on the summary rather than left to name-from-content, because the actions row lives inside the summary and would otherwise be read as part of the section's name (measured in Chrome: "Typography Clear typography overrides"). It is not optional: with no label the summary is a control a reader hears as "collapsed, button" and nothing else, and no lint asks for it, so the element's own test pins it instead.`},open:{type:"boolean",default:!1,attribute:"open",description:"Whether the section is disclosed. It is a two-way value: the platform writes it when the reader opens the section, and a host may write it to open or close one. Written as a property it does NOT reflect back onto the host's own open attribute, so read it as a property (or from the toggle event) rather than with getAttribute."},name:{type:"string",default:"",attribute:"name",description:"Forwarded to the inner details as its name, which is how the platform makes a group of sections mutually exclusive: every item carrying the same name closes the others when it opens. Empty means the item is independent, which is what every shipped accordion in Studio wants."},level:{type:"string",default:"",attribute:"level",description:`Opt in to heading semantics: a number here exposes the section's label as a heading at that level, so a long settings panel can be skimmed by heading navigation. It is a visually hidden [part="heading"] carrying the label, NOT a role on the summary — measured in Chrome, role=heading on a summary REPLACES the disclosure, which loses expandable and the expanded state, and a heading nested inside the summary is pruned out of the tree entirely. The cost of the shape that works is that the label text is announced twice when reading linearly, once as the heading and once as the disclosure; that is the trade, and it is why the prop is opt-in.`},onToggle:{$prototype:"Function",body:[{if:{operator:"!==",target:{$ref:"event#/detail"},value:{$ref:"event#/target/open"}},then:[{operator:"=",target:{$ref:"#/state/open"},value:{$ref:"event#/target/open"}},{dispatchEvent:"toggle",detail:{$ref:"#/state/open"},bubbles:!0}]}],emits:[{name:"toggle",description:"The section opened or closed; detail is the new open state. The PLATFORM's event name, so a host that already reads e.target.open off a native details toggle changes nothing but the element it listens on — e.target is the inner details element, not the host, and details.open is the state that just changed. It bubbles out of the details as far as the host and stops there (see onHostToggle), so bind it ON the jx-accordion-item rather than on a container."}],description:"Mirrors the platform's own toggle into open and re-announces it as an event that reaches the host, because a native toggle does not bubble and would never leave the inner details. The guard is what makes that safe: the re-announcement is dispatched from the same details the handler listens on, so an unguarded body would hear its own event and recurse forever. A toggle whose detail already equals the details' own open state is that echo and is dropped."},onHostToggle:{$prototype:"Function",body:[{stopPropagation:!0}],description:"Stops the re-announced toggle at the element's own boundary. The platform's toggle never bubbles, and the kit's overlays rely on that: jx-popover, jx-menu, jx-tooltip and jx-dialog all bind ontoggle on their own root and read event.newState with no target guard, so a toggle arriving from a descendant would be read as the overlay's own. Measured in Chrome before this existed: opening a section inside a shown jx-popover flipped the panel's open to false and dropped its data-open styling while it was still in the top layer. Listeners bound on this element still run — stopPropagation does not stop the other listeners on the node it is called from — so a host's ontoggle on the jx-accordion-item is unaffected; only ancestors stop hearing it."},onActions:{$prototype:"Function",body:[{stopPropagation:!0},{if:{operator:"===",target:{$ref:"event#/target"},value:{$ref:"event#/currentTarget"}},then:[{preventDefault:!0}]}],description:`The actions row sits INSIDE the summary, so that it stays visible while the section is closed — a sibling of summary inside details is hidden by the UA whenever the section is shut. The cost is that a click on the row's own space would also toggle the section, so the row cancels the activation, and a click on the row that reached nothing else toggles nothing: that is the intended trade. It cancels ONLY that click. A slotted control does not need cancelling — it is the click's own activation target, so the summary never toggles for it (measured: a button inside a summary leaves details.open alone) — and cancelling there would kill the control's own default, which is exactly what it did before this guard: a slotted link did not navigate and a popovertarget invoker did not open its popover. The residue is a non-interactive element slotted into the actions row, which still toggles the section; inert marks belong in [slot="heading"], which is what that slot is for.`}},ontoggle:{$ref:"#/state/onHostToggle"},style:{display:"block","&[hidden]":{display:"none"},fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",'& > [part="heading"]':{position:"absolute",width:"1px",height:"1px",margin:"-1px",overflow:"hidden",clipPath:"inset(50%)",whiteSpace:"nowrap"},'& > [part="details"] > [part="summary"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-2)",borderRadius:"var(--jx-radius-sm)",cursor:"default",userSelect:"none",outline:"none",listStyle:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},"&::-webkit-details-marker":{display:"none"}},'& > [part="details"] > [part="summary"] > [part="marker"]':{display:"inline-flex",flex:"none",color:"var(--jx-fg-dim)",transition:"transform var(--jx-dur-1) var(--jx-ease-out)"},'& > [part="details"][open] > [part="summary"] > [part="marker"]':{transform:"rotate(90deg)"},'& > [part="details"] > [part="summary"] > [part="label"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontWeight:"500"},'& > [part="details"] > [part="summary"] > [part="actions"]':{display:"inline-flex",flex:"none",alignItems:"center",gap:"var(--jx-space-1)"},'& > [part="details"] > [part="body"]':{padding:"var(--jx-space-2)"},'& > [part="details"] > [part="summary"] > [part="actions"]:empty':{display:"none"}},children:[{tagName:"span",attributes:{part:"heading",role:"${state.level ? 'heading' : null}","aria-level":"${state.level || null}",hidden:"${state.level ? null : ''}"},textContent:"${state.label}"},{tagName:"details",attributes:{part:"details",open:{$ref:"#/state/open"},name:"${state.name || null}"},ontoggle:{$ref:"#/state/onToggle"},children:[{tagName:"summary",attributes:{part:"summary","aria-label":"${state.label || null}"},children:[{tagName:"span",attributes:{part:"marker","aria-hidden":"true"},children:[{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"marker-icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"slot",attributes:{name:"heading"}},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]}]},{tagName:"div",attributes:{part:"body"},children:[{tagName:"slot"}]}]}]};var qo={$schema:"https://jxsuite.com/schema/v1",$id:"JxActionButton",tagName:"jx-action-button",observedAttributes:["label","hint","icon","mirror","weight","toggles","selected","quiet","emphasized","size","disabled","popovertarget","popovertargetaction","command","commandfor","stacked","haspopup","expanded","badge","loading","labelledby","describedby","checked"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-spinner.json"},{$ref:"./jx-tooltip.json"}],state:{label:{type:"string",default:"",attribute:"label",description:"The accessible name, required: an action button is icon-first, so its name is not on screen. It is NOT also the tooltip — see hint."},hint:{type:"string",default:"",attribute:"hint",description:"The tooltip, and the whole of it. While the button is ENABLED it is drawn as a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — and the control names it in aria-describedby, so it is a description beside the name and never the name itself. While the button is DISABLED it is the control's native title instead, because a disabled control receives no focus and no pointer event and could never open a tip, while the platform still shows a title on hover: that is the one affordance a button whose hint says why it cannot act still has. Never both at once. It used to fall back to label, so EVERY button got a tooltip whether or not its name was already on screen and a reader heard the name twice. Now each call site decides: pass hint on an icon-only button or one whose visible label ellipses, where a tooltip carrying the name is the standard affordance and hint equal to label is the right answer; leave it empty wherever the text is already fully visible."},icon:{type:"string",default:"",attribute:"icon",description:"The glyph, by its name in the kit's manifest. Empty for a text-only action button, which the host reflects as data-no-icon so a sheet outside the element can tell the two apart: the icon PART is hidden while a glyph button is loading as well, the spinner having taken its place, so a compact group keyed on that span widened an icon segment by 4px for the length of a verb."},mirror:{type:"boolean",default:!1,attribute:"mirror",description:"Draw the glyph flipped horizontally: one shipped glyph serves both sides of a pair."},weight:{type:"string",default:"regular",attribute:"weight",description:"The glyph's weight: regular, bold or fill. A selected toggle draws fill by convention."},toggles:{type:"boolean",default:!1,attribute:"toggles",description:"A two-state button: selected flips on activation and aria-pressed says which state it is in."},selected:{type:"boolean",default:!1,attribute:"selected",description:"The pressed or chosen state, and the ONLY thing the selected drawing follows — whoever wrote it. A host that owns the selection sets it with toggles off and the button draws selected without flipping itself or emitting change; with toggles on the button also flips it on activation. What selected does NOT do is announce anything by itself: aria-pressed comes from toggles and aria-checked from checked, so a host-owned segment that must be announced is a checked radio (and setting checked also draws it selected, so the two never disagree)."},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain button; true or false for one segment of a radio group, which then carries role=radio and aria-checked on its control, is drawn selected while it is true, and puts role=none on the HOST so the radio is the radiogroup's own child rather than a grandchild behind a generic. It is the ALTERNATIVE to toggles, not a companion: a button that is one of several mutually exclusive choices is a radio, a button that is independently on or off is a toggle. Setting both is not a second opinion but a refusal — checked wins, so no aria-pressed is written on a radio (it is not a state of that role) and the button does not flip itself either."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the button inside, not the host, so a group moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. Write tabindex on the host and you get the platform's meaning — the host is the tab stop and nothing reaches the control.`},quiet:{type:"boolean",default:!0,attribute:"quiet",description:"No fill and no border until hovered, which is what a toolbar wants. Off for a standalone tool button. It has no effect on a member of a compact jx-action-group, which draws the segmented frame itself; a row of quiet tools is a group with compact=false."},emphasized:{type:"boolean",default:!1,attribute:"emphasized",description:"Draws the selected state in the accent rather than a neutral fill."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot act. Disabled, never absent, and the hint moves from the tip to the control's title while it is: a disabled control cannot open a tip, and the reason it cannot act is exactly what the reader hovers to find out."},loading:{type:"boolean",default:!1,attribute:"loading",description:"Working on the last activation: the click is swallowed, the glyph gives way to a spinner, and aria-busy says so. An action button draws its icon from a name and has no icon slot, so this is the only way a host can put a spinner where the glyph was."},stacked:{type:"boolean",default:!1,attribute:"stacked",description:"Icon above the label, the label visible and small: the shape of a rail button. The label is then on screen, so it is the accessible name by itself."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby: the id of the visible text that names this button, when something on screen already does."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby: the id of a description beside the name, after the hint's own tip when there is one. A hint needs none of this — the element names its own tip — so it is for a description the host draws elsewhere."},haspopup:{type:"string",default:"",attribute:"haspopup",description:"What the button opens instead of running a command: menu, dialog or listbox. Forwarded to the control as aria-haspopup."},expanded:{type:"boolean",default:!1,attribute:"expanded",description:"Whether what haspopup names is showing. Forwarded to the control as aria-expanded, only when haspopup is set."},badge:{type:"string",default:"",attribute:"badge",description:"A count or a mark drawn over the button's corner; empty for none."},popovertarget:{type:"string",default:"",attribute:"popovertarget",description:"The popover this button invokes; forwarded to the inner control."},popovertargetaction:{type:"string",default:"",attribute:"popovertargetaction",description:"toggle, show or hide; forwarded with popovertarget."},command:{type:"string",default:"",attribute:"command",description:"The invoker command this button sends; forwarded to the inner control."},commandfor:{type:"string",default:"",attribute:"commandfor",description:"The element the command is sent to; forwarded to the inner control."},uid:{type:"string",default:"",description:"This button's own id stem, minted on mount by the tooltip sidecar. The control's id, the tip's id and the three attributes that wire one to the other are all built from it, so a consumer writes none of them and two hinted buttons in one toolbar cannot collide. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},noIcon:{$expression:{operator:"!",target:{$ref:"#/state/icon"}}},notLoading:{$expression:{operator:"!",target:{$ref:"#/state/loading"}}},iconHidden:{$expression:{operator:"||",target:{$ref:"#/state/noIcon"},value:{$ref:"#/state/loading"}}},notRadio:{$expression:{operator:"!",target:{$ref:"#/state/checked"}}},canToggle:{$expression:{operator:"&&",target:{$ref:"#/state/toggles"},value:{operator:"&&",target:{$ref:"#/state/notRadio"},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{$ref:"#/state/notLoading"}}}}},hasBadge:{$expression:{operator:"!==",target:{$ref:"#/state/badge"},value:""}},onSwallow:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The swallow, on the INNER CONTROL rather than the host: stopPropagation halts an event at the node it is called on and every node after it, not the other listeners on that same node — so a swallow on the host cancels the default and then runs the host's own click listeners anyway, which is the one path a consumer actually uses. Called one node earlier, the click never reaches the host at all."},onClick:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]},{if:{$ref:"#/state/canToggle"},then:[{operator:"=",target:{$ref:"#/state/selected"},value:{operator:"!",target:{$ref:"#/state/selected"}}},{dispatchEvent:"change",detail:{$ref:"#/state/selected"},bubbles:!0}]}],emits:[{name:"change",description:"A toggling button flipped; detail is the new selected state."}],description:"A toggling button flips selected and says so with change. A plain one leaves the click to the host, which listens for it on the element. The loading branch is the second half of the swallow: a click dispatched at the HOST never passes the inner control, so this is the only guard that sees it."}},onclick:{$ref:"#/state/onClick"},attributes:{role:"${state.checked ? 'none' : null}","data-size":"${state.size}","data-no-icon":"${state.icon ? null : ''}","data-quiet":"${state.quiet ? '' : null}","data-emphasized":"${state.emphasized ? '' : null}","data-selected":"${state.selected || state.checked === 'true' ? '' : null}","data-stacked":"${state.stacked ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--jx-space-2)",minWidth:"var(--jx-control-h)",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-2)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)",cursor:"pointer",whiteSpace:"nowrap",outline:"none",transition:"background var(--jx-dur-1) var(--jx-ease-out), color var(--jx-dur-1) var(--jx-ease-out)",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"},'&[aria-busy="true"]':{cursor:"progress"},position:"relative"},'&[data-quiet] > [part="control"]':{background:"transparent",borderColor:"transparent",":hover":{background:"var(--jx-hover-bg)"}},'&[data-stacked] > [part="control"]':{flexDirection:"column",gap:"2px",width:"100%",minWidth:"0",padding:"var(--jx-space-2) var(--jx-space-1)",borderRadius:"0",fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-xs)"},'&[data-stacked] > [part="control"] > [part="label"]':{display:"block",maxWidth:"100%",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'&[data-stacked] > [part="control"] > [part="label"]:empty, &[data-stacked] > [part="control"] > [part="label"]:has([part="label-slot"]:empty)':{display:"none"},'&[data-selected] > [part="control"]':{background:"var(--jx-accent-15)",color:"var(--jx-fg)"},'&[data-selected][data-emphasized] > [part="control"]':{background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[data-size="sm"] > [part="control"]':{$description:"The small action button is the kit's most packed control — Studio's toolbars, block action bar and inspector rows declare it some four hundred times — and it draws 4px under the kit's control height, which is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3). The `::before` is the hit area, jx-tab's close-button technique: an empty pseudo-element that reaches 2px past the drawn box on every side, so the region that accepts the pointer is exactly `--jx-control-h` square while the picture stays 20px. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under (jx-tab's close button is borderless, so -4px was exact there). The control is already `position: relative` for the badge, so the pseudo-element needs nothing more. A 4px gap (jx-toolbar's) lets two extended neighbours abut; a compact jx-action-group packs its members touching, and its sheet zeroes the extension on that axis, because an extension over a neighbour's box would take the neighbour's clicks, and the criterion gives an overlapped strip to the target on top rather than to both; a default group's 2px gap leaves every member but the last at 22px on that axis, which ui.md §11 names as a non-claim. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box, as it is on jx-button's small control: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so a small action button whose box touched a scrolling host's edge widened that host's scrollable region by 2px and drew a scrollbar over content that fit (Preferences · Keyboard's `Search by keystroke`, and the `Change` of a row whose title wraps, both did). The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it. A row that holds a small action button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout. The containment also makes the control a stacking context and the containing block of anything fixed inside it; neither moves a pixel here, because the badge is already positioned against the control, nothing fixed lives inside it, and a compact group's later member still paints over an earlier one, both painting in the positioned layer in tree order.",minWidth:"calc(var(--jx-control-h) - 4px)",minHeight:"calc(var(--jx-control-h) - 4px)",padding:"0 var(--jx-space-1)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-3px"}},'&[data-size="lg"] > [part="control"]':{minWidth:"calc(var(--jx-control-h) + 8px)",minHeight:"calc(var(--jx-control-h) + 8px)",padding:"0 var(--jx-space-3)"},'& [part="icon"]':{display:"inline-flex",color:"inherit"},'& [part="icon"][hidden]':{display:"none"},'& [part="label"]':{display:"contents"},'& [part="label-slot"]':{display:"contents"},'& [part="badge-slot"]':{display:"contents"},'& > [part="tooltip"]':{display:"contents"},'& [part="badge"]':{display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:"16px",padding:"0 var(--jx-space-2)",borderRadius:"999px",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)",fontSize:"var(--jx-text-xs)",lineHeight:"16px",fontVariantNumeric:"tabular-nums",position:"absolute",top:"2px",right:"2px",boxSizing:"border-box",pointerEvents:"none"},'& [part="spinner"]':{display:"inline-flex",color:"inherit"},'& [part="spinner"][hidden]':{display:"none"}},children:[{tagName:"button",onclick:{$ref:"#/state/onSwallow"},attributes:{part:"control",type:"button",disabled:{$ref:"#/state/disabled"},id:"${state.uid || null}","aria-label":"${state.label || null}",title:"${state.disabled && state.hint ? state.hint : null}",interestfor:"${state.hasTip ? state.uid + '-tip' : null}",role:"${state.checked ? 'radio' : null}","aria-checked":"${state.checked || null}","aria-pressed":"${state.toggles && !state.checked ? (state.selected ? 'true' : 'false') : null}",tabindex:"${state.tabindex || null}",popovertarget:"${state.popovertarget || null}",popovertargetaction:"${state.popovertargetaction || null}",command:"${state.command || null}",commandfor:"${state.commandfor || null}","aria-haspopup":"${state.haspopup || null}","aria-expanded":"${state.haspopup ? (state.expanded ? 'true' : 'false') : null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-busy":"${state.loading ? 'true' : null}","aria-disabled":"${state.loading ? 'true' : null}"},children:[{tagName:"span",attributes:{part:"icon"},hidden:{$ref:"#/state/iconHidden"},children:[{tagName:"jx-icon",$props:{name:{$ref:"#/state/icon"},weight:{$ref:"#/state/weight"},mirror:{$ref:"#/state/mirror"}},attributes:{part:"icon-glyph"}}]},{tagName:"jx-spinner",attributes:{part:"spinner"},hidden:{$ref:"#/state/notLoading"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"badge-slot"},$switch:{$ref:"#/state/hasBadge"},cases:{true:{tagName:"span",attributes:{part:"badge","aria-hidden":"true"},textContent:"${state.badge}"}}}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var Ko={$schema:"https://jxsuite.com/schema/v1",$id:"JxActionGroup",tagName:"jx-action-group",observedAttributes:["selects","compact","label","orientation"],state:{selects:{type:"string",default:"none",attribute:"selects",description:`Which ARIA pattern the row is: none is a toolbar of unrelated tools, single is a radiogroup of mutually exclusive choices, multiple is a plain group of independent toggles. It chooses the pattern and the keyboard; it does NOT own the selection. Every shipped call site keeps the selected value in the host, so in single the group clicks the child an arrow lands on and lets the host decide what that means. In single the host must also give every child a checked prop of "true" or "false": a radiogroup's required owned element is a radio, and jx-action-button becomes one only when checked is non-empty — a group of bare buttons is announced as a radiogroup with no checked member at all.`},compact:{type:"boolean",default:!0,attribute:"compact",description:`Draw the children joined into one segmented control, sharing their inner borders and rounding only the outer corners. The group draws every member's frame and fill itself, whatever the member's own quiet says: a strong border round an input fill, the selected member in the accent tint with an accent edge (the solid accent with emphasized), 6px of inline padding on a small member that shows text and no glyph, because the small size's 2px ran "Edit" into "Design", and muted ink on a disabled member, because fading it whole would fade its share of the shared frame. A member's quiet has no effect here. The control is one LINE — a segmented frame is written in tree order and no selector can find the ends of a wrapped line — so a row of choices that has to wrap is compact=false too. Off leaves them as separate buttons with a gap, each drawing itself, so a row of borderless tools is compact=false, never a compact group of quiet members. This is the one thing no button can do about itself: joining N of them needs selectors about a child's position among its siblings. The seam is a DIRECT-CHILD rule: it reaches the buttons the group itself owns — a slot leaves no node, so a distributed child is one — and so a nested group keeps its own compact, and a button a surface wraps in a div of its own is roved but not joined.`},label:{type:"string",default:"",attribute:"label",description:"The accessible name of the group, and it is not optional in practice: a toolbar, a radiogroup and a group are all containers a reader is told they have entered, and an unnamed one is announced by its role alone. Nothing lints its absence — a bound role switches the naming rules off — so the element's own test pins it instead."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:`horizontal or vertical. It chooses which arrow pair moves the caret, and it turns both the layout and the segmented seam through 90 degrees off data-orientation. It also sets aria-orientation, but only where ARIA permits one: role=group — what selects="multiple" resolves to — supports neither aria-orientation nor its inheritance, and Chrome drops the attribute there, so writing it anyway would be an aria-allowed-attr violation in a consumer's own axe run.`},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/action-group.ts",$export:"onGroupKeydown",description:"The group keyboard contract: the arrow along its own axis moves the roving caret between enabled children with wrap, Home and End go to the ends, and in selects=single the child that takes the caret is clicked."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/action-group.ts",$export:"onGroupReady",description:"Collapses the group to one tab stop once it has rendered, and keeps it collapsed to one as children come and go. It listens for the element's own jx-ready because onMount is handed the reactive scope alone, and placing a caret needs the host."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The group has rendered and distributed its children, so its caret can be placed."}],description:"Announces that the element has rendered. The group's own onReady listens for it, and a host may too."}},attributes:{role:"${state.selects === 'single' ? 'radiogroup' : (state.selects === 'multiple' ? 'group' : 'toolbar')}","aria-label":"${state.label || null}","aria-orientation":"${state.selects === 'multiple' ? null : state.orientation}","data-orientation":"${state.orientation}","data-compact":"${state.compact ? '' : null}"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle",alignItems:"center",gap:"var(--jx-space-1)",'&[data-orientation="vertical"]':{flexDirection:"column",alignItems:"stretch"},"&[data-compact]":{$description:"A segmented control is ONE line, and this is where it says so. Every seam rule below is written in TREE order — the -1px overlap on `+ jx-action-button`, the rounded ends on `:first-of-type` and `:last-of-type` — and CSS has no selector for the first or last item on a flex LINE, so a group that wrapped put the overlap on a line-start member (1px outside the group's own edge), left both line ends square, and abutted the two lines into a doubled 2px border. Nothing in a sheet can see a line break, so the group refuses one rather than drawing it badly. A row of choices that has to wrap is `compact: false`: there each member draws its own rounded frame and the gap comes back, so every line reads the same (Studio's Size and Features chips are that row).",gap:"0",flexWrap:"nowrap"},'&[data-compact] > jx-action-button > [part="control"]':{borderRadius:"0"},'&[data-compact] > jx-action-button + jx-action-button > [part="control"]':{marginInlineStart:"-1px"},'&[data-compact] > jx-action-button:first-of-type > [part="control"]':{borderStartStartRadius:"var(--jx-radius-sm)",borderEndStartRadius:"var(--jx-radius-sm)"},'&[data-compact] > jx-action-button:last-of-type > [part="control"]':{borderStartEndRadius:"var(--jx-radius-sm)",borderEndEndRadius:"var(--jx-radius-sm)"},'&[data-compact][data-orientation="vertical"] > jx-action-button > [part="control"]':{$description:"A vertical group stretches its member HOSTS to the widest one (`align-items: stretch` above), and a host is an inline-flex row whose control sits inside it at its own content width: so the segments' end edges stepped in and out down the column, one frame per label length, from the moment the group started drawing those frames. The control takes the whole host, as the zoom pod's label does for the same reason, and keeps the control's own centring.",flex:"1"},'&[data-compact][data-orientation="vertical"] > jx-action-button + jx-action-button > [part="control"]':{marginInlineStart:"0",marginBlockStart:"-1px"},'&[data-compact][data-orientation="vertical"] > jx-action-button:first-of-type > [part="control"]':{borderEndStartRadius:"0",borderStartEndRadius:"var(--jx-radius-sm)"},'&[data-compact][data-orientation="vertical"] > jx-action-button:last-of-type > [part="control"]':{borderStartEndRadius:"0",borderEndStartRadius:"var(--jx-radius-sm)"},'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]':{$description:"The frame is the group's, not the member's. Every seam rule above acts on a member's border, and jx-action-button is quiet by default (a transparent border and fill, which is what a toolbar wants), so the shared borders, the rounded ends and the -1px overlap all worked on borders nobody could see, and a compact group drew as a gap-less row of bare words: the Canvas view switch, the Style panel's Display row, Preferences' Theme, the zoom pod and every other group Studio converted from Spectrum, whose sp-action-button was NOT quiet by default, so the conversion dropped the frame without anybody writing it off. So the group draws its members whatever their quiet says, which is what ui.md §5.4 means by `compact` with `single` being the segmented control. This rule and the selected one below are mutually exclusive, so neither depends on sheet order against the member's own; at (0,4,1) under the scope handle each outranks the member's quiet and selected rules at (0,3,0) and quiet's hover at (0,4,0). The ink restates the member's resting colour at this specificity so that only the hover rule below, which leaves a disabled member alone, can raise it: the member's own hover is not gated on disabled, and a disabled segment brightening under the pointer reads as one that can act.",borderColor:"var(--jx-border-strong)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)"},'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]:hover:not(:disabled)':{$description:"The hover wash is LAYERED over the input fill rather than replacing it, as the member's own hover does. `--jx-hover-bg` is 6% of the ink over transparent, so on its own it shows whatever stands behind the group, and on the zoom pod's darkest background that came out a shade from the resting fill: a hover that did not read. As an image over the fill it is always the resting colour plus the wash, in both schemes.",backgroundColor:"var(--jx-bg-input)",backgroundImage:"linear-gradient(var(--jx-hover-bg), var(--jx-hover-bg))",color:"var(--jx-fg)"},'&[data-compact] > jx-action-button[data-selected] > [part="control"]':{$description:"The chosen segment: the accent tint with an accent EDGE. The member's own selected state is a 15% tint and nothing else, which beside a bordered neighbour read as a faint wash rather than as the one that is on. Raised over both neighbours, so the accent edge shows on every side through the -1px overlap, and still under a focus ring. A hovered selected segment stays as it is: this outranks the member's quiet hover.",borderColor:"var(--jx-accent)",background:"var(--jx-accent-20)",color:"var(--jx-fg)",zIndex:"1"},'&[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]':{$description:"The member's emphasized, kept: the solid accent, edge and all.",borderColor:"var(--jx-accent-solid)",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[data-compact] > jx-action-button > [part="control"]:disabled':{$description:"A disabled segment dims its INK and not the frame. jx-action-button fades the whole control (`opacity: 0.5`), which is right where the border is the button's own; in a group the border is one member's share of a frame drawn across all of them, so half-fading it left the outer rectangle bright on one side of a seam and faint on the other — a control that reads as half-broken rather than as half-unavailable. Muted ink is a step below the resting dim, and it carries a selected segment too: the accent fill and edge stay, so the chosen one still reads as chosen while it cannot act. AFTER the selected rules on purpose, because it ties with them at (0,4,1) and has to win the ink.",opacity:"1",color:"var(--jx-fg-muted)"},'&[data-compact] > jx-action-button[data-size="sm"][data-no-icon] > [part="control"]':{$description:'A small member that shows no glyph is a text segment, and the small size\'s inline padding is 2px, which is right for a 20px glyph button and ran the words of a text row together ("flex" into "grid"). A text segment takes 6px: one step between --jx-space-2 and --jx-space-3, because the widest Style panel row measured 220px of its 256px at 4px and --jx-space-3 overflowed it. 6px costs that row 4px — `nowrap`, `wrap-reverse`, `normal` and `auto` are the only values css-meta leaves without a glyph, so no button row draws more than two text segments and the six-segment rows draw one. Keyed on the HOST\'s data-no-icon, not on a hidden icon part: the icon span is hidden while a glyph segment is `loading` too, since the spinner takes its place, so an icon segment grew 4px mid-verb and snapped back when it settled. Scoped to the group rather than made the small size\'s own, because some forty other small text buttons in Studio would widen with it.',paddingInline:"6px"},'&[data-compact] > jx-action-button > [part="control"]:focus-visible':{$description:"Over everything, the selected segment's raised edge included, so a focus ring is never painted under a neighbour.",zIndex:"2"},'&[data-compact] > jx-action-button[data-size="sm"] > [part="control"]::before':{$description:"A small action button carries a `::before` that extends its hit area 2px past its drawn box on every side (an inset of -3px: the button's 1px border, then half the 4px it is under, because an absolutely positioned box is offset from the padding edge), so that a 20px picture accepts the pointer over the kit's 24px control height (WCAG 2.2 SC 2.5.8, ui.md §4.3). In a compact group the boxes TOUCH on the packed axis — no gap, and each border drawn over the last — so an extension there could reach nothing but the neighbour's own box, and the later sibling paints above the earlier one: the last 2px of every button but the last would activate the button after it. The criterion gives an overlapped area to the target on TOP, so the extension would buy the earlier button nothing and cost it a stolen strip. The default 2px gap is the other case: two extensions overlap by 2px there, the later member keeps the strip, and every small member but the last counts 22px on the packed axis, which is under the floor and which ui.md §11 names beside this one. The packed axis is therefore zeroed here — `0` is the padding edge, 1px inside the drawn border, and the button's own box accepts the pointer over that pixel — and the cross axis keeps its 2px past the drawn box, which reaches only the gap around the group: a compact group's small members are 24px tall and as wide as they draw, which ui.md §11 records as the one thing the technique cannot reach. The vertical variant swaps the axes, and its inline value is the button's own -3px for the same reason.",insetInline:"0"},'&[data-compact][data-orientation="vertical"] > jx-action-button[data-size="sm"] > [part="control"]::before':{insetInline:"-3px",insetBlock:"0"},"@(forced-colors: active)":{'&[data-compact] > jx-action-button[data-selected] > [part="control"], &[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]':{$description:"The chosen segment, redrawn. Forced colours replace every author colour with the user's palette, so the accent tint and the accent edge both collapse into the ones around them and the segmented control would say nothing about which segment is on. The system's own selection pair says it instead, as jx-switch does for its checked track. The emphasized selector is spelled out beside the plain one because a media condition adds no specificity: at (0,4,1) this block won `forced-color-adjust: none` and then LOST border, background and colour to the emphasized rule at (0,5,1), which painted the author's blue over the user's palette with adjustment switched off — the one combination where forced colours were worse than none.",forcedColorAdjust:"none",borderColor:"Highlight",background:"Highlight",color:"HighlightText"}}},children:[{tagName:"slot"}]};var Uo={$schema:"https://jxsuite.com/schema/v1",$id:"JxButton",tagName:"jx-button",observedAttributes:["variant","size","quiet","disabled","loading","type","autofocus","label","hint","labelledby","describedby","popovertarget","popovertargetaction","command","commandfor"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-spinner.json"},{$ref:"./jx-tooltip.json"}],state:{variant:{type:"string",default:"secondary",attribute:"variant",description:"How much the button asks for: accent (the one primary action on a surface), primary (a solid neutral), secondary (the default outline) or negative (a destructive action)."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},quiet:{type:"boolean",default:!1,attribute:"quiet",description:"No fill and no border until hovered: a button that sits in a toolbar or beside text."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the control inside, not the host, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot act. Disabled, never absent; a reason belongs in the surrounding text or in hint, which a disabled button draws as the control's native title because a disabled control can open no tip."},loading:{type:"boolean",default:!1,attribute:"loading",description:"Working on the last activation: blocks another one, keeps its width, and says so through aria-busy."},type:{type:"string",default:"button",attribute:"type",description:"The native button type: button, submit or reset."},autofocus:{type:"boolean",default:!1,attribute:"autofocus",description:"Takes focus when the surface it is on opens. Forwarded to the inner control, which is the element the platform reads it from: a dialog's showModal() focuses the first focusable descendant unless one claims autofocus."},label:{type:"string",default:"",attribute:"label",description:"The accessible name when the visible text is not it, or there is none. Forwarded to the inner control as aria-label."},hint:{type:"string",default:"",attribute:"hint",description:"A tooltip beside the name, for a button whose visible text is cut short or whose disabled state needs a reason; empty, the usual case, draws nothing. The same shape as jx-action-button's: while the button is ENABLED it is a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — named on the control in aria-describedby so it describes rather than names; while the button is DISABLED it is the control's native title instead, the one affordance a control that receives no focus and no pointer still has. Never both at once."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the hint's own tip when there is one."},uid:{type:"string",default:"",description:"This button's own id stem, minted on mount by the tooltip sidecar. The control's id, the tip's id and the three attributes that wire one to the other are all built from it, so a consumer writes none of them. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},popovertarget:{type:"string",default:"",attribute:"popovertarget",description:"The popover this button invokes; forwarded to the inner control, which is the element the platform reads it from."},popovertargetaction:{type:"string",default:"",attribute:"popovertargetaction",description:"toggle, show or hide; forwarded with popovertarget."},command:{type:"string",default:"",attribute:"command",description:"The invoker command this button sends; forwarded to the inner control."},commandfor:{type:"string",default:"",attribute:"commandfor",description:"The element the command is sent to; forwarded to the inner control."},notLoading:{$expression:{operator:"!",target:{$ref:"#/state/loading"}}},onSwallow:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The swallow, on the INNER CONTROL rather than the host: stopPropagation halts an event at the node it is called on and every node after it, not the other listeners on that same node — so a swallow on the host cancels the default and then runs the host's own click listeners anyway, which is the one path a consumer actually uses. Called one node earlier, the click never reaches the host at all."},onClick:{$prototype:"Function",body:[{if:{$ref:"#/state/loading"},then:[{stopPropagation:!0},{preventDefault:!0}]}],description:"The second half of the swallow, for a click dispatched AT the host: that one never passes the inner control, so this is the only guard that sees it. Its default (a form submission, a popover, a command) is cancelled either way. A disabled button never gets this far, because its inner control is disabled."}},onclick:{$ref:"#/state/onClick"},attributes:{"data-variant":"${state.variant}","data-size":"${state.size}","data-quiet":"${state.quiet ? '' : null}","data-loading":"${state.loading ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-4)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",cursor:"pointer",whiteSpace:"nowrap",outline:"none",transition:"background var(--jx-dur-1) var(--jx-ease-out), border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"},'&[aria-busy="true"]':{cursor:"progress"}},'&[data-variant="accent"] > [part="control"]':{background:"var(--jx-accent-solid)",borderColor:"transparent",color:"var(--jx-accent-fg)",":hover":{background:"var(--jx-accent-hover)"}},'&[data-variant="primary"] > [part="control"]':{background:"var(--jx-fg)",borderColor:"transparent",color:"var(--jx-bg)",":hover":{background:"var(--jx-fg-dim)"}},'&[data-variant="negative"] > [part="control"]':{background:"var(--jx-danger)",borderColor:"transparent",color:"var(--jx-accent-fg)",":hover":{filter:"brightness(1.1)"}},'&[data-quiet] > [part="control"]':{background:"transparent",borderColor:"transparent",":hover":{background:"var(--jx-hover-bg)"}},'&[data-size="sm"] > [part="control"]':{$description:"A small button draws 4px under the kit's control height, and the control height is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the drawn box alone would be a 20px pointer target at the default density. The `::before` is the hit area: an empty pseudo-element that reaches 2px past the drawn box on every side, so what accepts the pointer is exactly `--jx-control-h` square while the picture stays small — jx-tab's close button's technique, and the criterion measures the region that accepts the pointer, not the paint. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under. jx-tab's close button is borderless, which is why -4px was exact there, and why the number did not carry over unchanged. In a jx-toolbar (a 4px gap) two extended neighbours abut and neither loses a pixel; jx-action-group's own sheet zeroes the packed axis in a compact group, where the boxes touch and an extension could only steal a strip of the neighbour. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so every `sm` button inside a host that scrolls (Preferences · Assistant's `Refresh models` and `Save` both are) was quietly widening and heightening that host's scrollable region by a few px — enough, with jx-textfield's clear button and jx-combobox's toggle doing the same thing beside it, to draw a scrollbar over a panel whose visible content fit. The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it (Welcome's `Recent` header stood 7px taller for it until it centred its `Clear all`). A row that holds a small button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout.",position:"relative",minHeight:"calc(var(--jx-control-h) - 4px)",padding:"0 var(--jx-space-3)",fontSize:"var(--jx-text-sm)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-3px"}},'&[data-size="lg"] > [part="control"]':{minHeight:"calc(var(--jx-control-h) + 8px)",padding:"0 var(--jx-space-5)",fontSize:"var(--jx-text-lg)"},'& > [part="control"] > [part="icon"]':{display:"contents"},'& [part="spinner"]':{display:"inline-flex",color:"inherit"},'& [part="spinner"][hidden]':{display:"none"},'& > [part="tooltip"]':{display:"contents"}},children:[{tagName:"button",onclick:{$ref:"#/state/onSwallow"},attributes:{part:"control",id:"${state.uid || null}",type:"${state.type}",disabled:{$ref:"#/state/disabled"},"aria-disabled":"${state.loading ? 'true' : null}","aria-busy":"${state.loading ? 'true' : null}","aria-label":"${state.label || null}",title:"${state.disabled && state.hint ? state.hint : null}",interestfor:"${state.hasTip ? state.uid + '-tip' : null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}",tabindex:"${state.tabindex || null}",popovertarget:"${state.popovertarget || null}",popovertargetaction:"${state.popovertargetaction || null}",command:"${state.command || null}",commandfor:"${state.commandfor || null}",autofocus:{$ref:"#/state/autofocus"}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"jx-spinner",attributes:{part:"spinner"},hidden:{$ref:"#/state/notLoading"}}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var Go={$schema:"https://jxsuite.com/schema/v1",$id:"JxCheckbox",tagName:"jx-checkbox",observedAttributes:["checked","indeterminate","disabled","label","labelledby","describedby","name","size"],state:{checked:{type:"boolean",default:!1,attribute:"checked",description:"Whether the box is ticked. Bound to the control BOTH ways, and each binding answers a different question. The PROPERTY is the live state: once the reader clicks, the checkedness dirty flag is set and the content attribute stops controlling the box, so a property binding is the only one that keeps tracking a host write after the first click. The content ATTRIBUTE is the control's DEFAULT checkedness, and it is mirrored because this element is not form-associated (specs/ui.md 3.2): it never hears form.reset(), so without the mirror a reset would move the CONTROL to the authored default and leave the element's state where it was, and the two would disagree silently. With it, a reset is a visible no-op, which is a missing feature rather than a lie."},indeterminate:{type:"boolean",default:!1,attribute:"indeterminate",description:"The mixed state: neither ticked nor clear, for a box standing over a set that is partly on. HTML gives it no content attribute at all — it exists only as a property — which is the reason this element exists: written into attributes it would parse, validate and silently do nothing. So there is nothing to mirror and no default for a form reset to return to, and a click clears it in the platform."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be ticked or focused. Disabled, never absent."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Leave it empty when the slotted text is on screen: the empty value REMOVES the attribute so the wrapping label's text names the box, rather than naming it twice."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby, for a visible label the box does not wrap."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, for a help or error sentence the row owns."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The row height is the kit's, so a column of controls lines up."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the input inside, not the host and not the label that wraps it, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/checked"},value:{$ref:"event#/target/checked"}},{operator:"=",target:{$ref:"#/state/indeterminate"},value:{$ref:"event#/target/indeterminate"}}],description:"Mirrors both halves of the control's state back. A click on a mixed box clears indeterminate and toggles checked in the platform; reading only checked would let the next flush re-assert mixed over the reader's own tick. The native change and input events bubble from the control as they always do."}},attributes:{"data-size":"${state.size}","data-checked":"${state.checked ? '' : null}","data-indeterminate":"${state.indeterminate ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",minWidth:"0","&[hidden]":{display:"none"},'& > [part="control"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",minWidth:"0",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",cursor:"pointer"},'& [part="input"]':{accentColor:"var(--jx-accent-solid)",flex:"none",width:"var(--jx-icon-size)",height:"var(--jx-icon-size)",margin:"0",cursor:"inherit",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px",borderRadius:"var(--jx-radius-xs)"}},'& [part="label"]':{minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="label"]:empty':{display:"none"},'&[data-disabled] > [part="control"]':{opacity:"0.5",cursor:"default",color:"var(--jx-fg-dim)"},'&[data-size="sm"] > [part="control"]':{$description:"The control is the `<label>` wrapping the input, and the label is the pointer target: a click anywhere on it toggles the box. At `sm` it draws 4px under the kit's control height, the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the `::before` extends the hit area 2px beyond the box on every side — jx-tab's close-button technique, the same shape jx-button carries — and the region that accepts the pointer is `--jx-control-h` tall while the row stays 20px. -2px is exact here where jx-button needs -3px: an absolutely positioned box is offset from the PADDING edge, and the label draws no border, so its padding edge is its drawn edge. The label needs `position: relative` here for the pseudo-element to measure against; the input inside is 14px and needs nothing of its own, because the label around it is the target. Held by target-size.test.ts and the conformance gate. `contain: layout` keeps the reach LOCAL, as it does on jx-button's and jx-action-button's small controls: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, invisible or not, so a small checkbox touching a scrolling host's edge would add 2px to that host's scrollable region and draw a scrollbar over content that fit. The price is the baseline: a layout-contained label exports none, so a row aligned on `baseline` puts the label's bottom edge on its text baseline, and a row that holds a small checkbox centres it (`align-items: center`) instead.",position:"relative",minHeight:"calc(var(--jx-control-h) - 4px)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",contain:"layout","::before":{content:'""',position:"absolute",inset:"-2px"}},'&[data-size="sm"] [part="input"]':{width:"calc(var(--jx-icon-size) - 2px)",height:"calc(var(--jx-icon-size) - 2px)"},'&[data-size="lg"] > [part="control"]':{minHeight:"calc(var(--jx-control-h) + 8px)",fontSize:"var(--jx-text-lg)",lineHeight:"var(--jx-leading-lg)"},'&[data-size="lg"] [part="input"]':{width:"calc(var(--jx-icon-size) + 2px)",height:"calc(var(--jx-icon-size) + 2px)"}},children:[{tagName:"label",attributes:{part:"control"},children:[{tagName:"input",attributes:{part:"input",type:"checkbox","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${state.describedby || null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},checked:{$ref:"#/state/checked"}},checked:{$ref:"#/state/checked"},indeterminate:{$ref:"#/state/indeterminate"},onchange:{$ref:"#/state/onChange"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]}]};var Yo={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorArea",tagName:"jx-color-area",observedAttributes:["label","x-label","y-label","hue","saturation","brightness","step","disabled"],state:{label:{type:"string",default:"",attribute:"label",description:`The accessible name of the square, which is a role="group" holding two sliders. NOT optional: role="group" is in neither the accessibility lint's content-named roles nor its labelled ones, so an unnamed one is invisible to every gate, and a reader entering it is told they have entered a group and nothing more. "Colour" or the name of the property being edited is the right answer; the two axes carry their own names.`},xLabel:{type:"string",default:"Saturation",attribute:"x-label",description:"The horizontal slider's accessible name. A prop rather than a constant because it is words on a screen reader's lips, and a shell in another language must be able to say them; the default is the English one so a consumer who does not care writes nothing."},yLabel:{type:"string",default:"Brightness",attribute:"y-label",description:"The vertical slider's accessible name, on the same terms as xLabel."},hue:{type:"number",default:0,attribute:"hue",description:"The hue the square is drawn under, 0-360. The element READS it and never writes it: a saturation/brightness field has no hue of its own, and the control that owns the hue is a jx-color-slider beside it. Dragging into the grey corner therefore leaves the hue exactly where the reader put it, which is the whole reason the two are separate elements."},saturation:{type:"number",default:100,attribute:"saturation",description:"The horizontal axis, 0-100. It is the x coordinate of the thumb and the value of the horizontal range, and those are the same number rather than two that must be kept in step."},brightness:{type:"number",default:100,attribute:"brightness",description:"The vertical axis, 0-100, measured UPWARD from the bottom edge — 100 is the top. The thumb's CSS offset is the complement, computed in the document, because a reader's mental model of a colour square is bright at the top and a stylesheet's is zero at the top, and only one of those two should be in a prop."},step:{type:"number",default:1,attribute:"step",description:"The grid both axes move on, for the platform's own arrow keys, for the kit's cross-axis and ten-step keys, and for the snap a pointer drag is put through. One grid for the pointer and the keyboard is what stops the thumb and the announced value disagreeing during a drag."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved or focused. Forwarded to both ranges, so the refusal is the platform's; the pointer and key handlers check it too, because a pointer on the track never reaches a disabled control to be refused by it."},xText:"${Math.round(state.saturation) + '%'}",yText:"${Math.round(state.brightness) + '%'}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaAxisInput",emits:[{name:"input",description:"An axis is moving under the reader's hand. It comes from the ELEMENT, so e.target.saturation and e.target.brightness are the whole answer."}],description:"Mirrors whichever range moved into its axis and re-says input from the host. The native event is stopped: two controls holding half a coordinate each cannot both be e.target for one colour."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaAxisChange",emits:[{name:"change",description:"The reader committed a value; e.target is the element."}],description:"The same mirror and the same re-say, for the commit."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaKeydown",description:"The two keyboard jobs a range cannot do for itself: the arrow across the OTHER axis, and Shift+Arrow for ten steps. An along-axis arrow with no Shift is left entirely to the platform, which already clamps, snaps and announces it."},onPointerDown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerDown",description:"Takes the colour under the pointer, captures the gesture on the track, and puts the caret on the horizontal range so the keyboard carries on from where the pointer stopped. A single press with no movement is a complete gesture, which is what keeps this clear of WCAG 2.5.7."},onPointerMove:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerMove",description:"The drag. Nothing moves without a press first, so a hover across the square changes no colour."},onPointerUp:{$prototype:"Function",$src:"jx-ui:/behaviors/color-area.ts",$export:"onAreaPointerUp",description:"Ends the gesture and commits once. Bound to pointercancel as well as pointerup: a gesture the system takes away is over, and a square left in the dragging state would follow the next pointer that crossed it with no button down."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"},onpointerdown:{$ref:"#/state/onPointerDown"},onpointermove:{$ref:"#/state/onPointerMove"},onpointerup:{$ref:"#/state/onPointerUp"},onpointercancel:{$ref:"#/state/onPointerUp"},attributes:{role:"group","aria-label":"${state.label || null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",inlineSize:"100%","--jx-color-area-size":"160px","--jx-color-area-hue":"hsl(${state.hue} 100% 50%)","--jx-color-area-x":"${state.saturation}%","--jx-color-area-y":"${100 - state.brightness}%","&[data-disabled]":{opacity:"0.5"},'& > [part="track"]':{position:"relative",display:"block",boxSizing:"border-box",inlineSize:"100%",blockSize:"var(--jx-color-area-size)",borderRadius:"var(--jx-radius-sm)",background:"linear-gradient(to bottom, transparent, oklch(0 0 0)), linear-gradient(to right, oklch(1 0 0), var(--jx-color-area-hue))",boxShadow:"inset 0 0 0 1px var(--jx-border-strong)",touchAction:"none",cursor:"crosshair"},'&[data-disabled] > [part="track"]':{cursor:"default"},'& [part="x"], & [part="y"]':{$description:"The two ranges are TRANSPARENT rather than hidden, and that is the whole accessibility of this element. display:none or visibility:hidden would take them out of the accessibility tree and out of the tab order, leaving a square only a pointer can operate — a WCAG 2.1.1 failure with a thumb drawn on it. opacity:0 keeps the role, the name, the announced value and the focus; pointer-events:none hands the gesture to the track, whose own handler owns the two-dimensional maths.",appearance:"none",position:"absolute",insetInline:"0",insetBlock:"0",inlineSize:"100%",blockSize:"100%",margin:"0",padding:"0",border:"0",background:"none",font:"inherit",opacity:"0",pointerEvents:"none"},'& [part="y"]':{writingMode:"vertical-lr",direction:"rtl"},'& [part="thumb"]':{position:"absolute",insetInlineStart:"var(--jx-color-area-x)",insetBlockStart:"var(--jx-color-area-y)",inlineSize:"14px",blockSize:"14px",translate:"-50% -50%",borderRadius:"50%",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",pointerEvents:"none"},'&:has([part="x"]:focus-visible) [part="thumb"], &:has([part="y"]:focus-visible) [part="thumb"]':{outline:"var(--jx-focus-ring)",outlineOffset:"2px"}},children:[{tagName:"div",attributes:{part:"track"},children:[{tagName:"input",attributes:{part:"x",type:"range","aria-label":"${state.xLabel}","aria-valuetext":"${state.xText}",min:"0",max:"100",step:"${state.step}",value:"${state.saturation}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/saturation"}},{tagName:"input",attributes:{part:"y",type:"range","aria-label":"${state.yLabel}","aria-valuetext":"${state.yText}",min:"0",max:"100",step:"${state.step}",value:"${state.brightness}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/brightness"}},{tagName:"span",attributes:{part:"thumb","aria-hidden":"true"}}]}]};var Xo={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorField",tagName:"jx-color-field",observedAttributes:["value","resolved","format","alpha","label","labelledby","size","disabled","system","eyedropper"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-action-button.json"},{$ref:"./jx-textfield.json"},{$ref:"./jx-popover.json"},{$ref:"./jx-color-area.json"},{$ref:"./jx-color-slider.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The colour, spelled as format says. This is what the element HOLDS; the four channels behind the picker are a working copy of it, and the sidecar rewrites that copy only when the two genuinely disagree. The empty string means no colour has been chosen and draws the slashed chip rather than black."},resolved:{type:"string",default:"",attribute:"resolved",description:"The colour behind value, for a value the page cannot resolve: a var() naming a token whose definition lives in the document being EDITED rather than in the one drawing this field, which is what Studio's palette commits. Empty, the chip draws value itself, which is right whenever the browser can resolve it. Set, it is what the chip draws and what the picker opens on, so the first drag starts from the token's own colour rather than from wherever the sliders last were; value is untouched, and the text field still shows the reference. A host that sets it is answering for the value it also set, so it clears it when the value stops being a reference."},format:{type:"string",default:"hex",attribute:"format",description:"hex or oklch: which spelling the element writes when the reader moves anything. It changes what is WRITTEN, never what is read — a reader may type any of hex, rgb() or oklch() into the text field whatever this says, because refusing a colour the element itself could have produced would be a trap."},alpha:{type:"boolean",default:!1,attribute:"alpha",description:"Whether the colour has an opacity at all: it adds the alpha track to the picker and the alpha channel to the value. Off, every value the element writes is opaque, so a field that feeds a property with no alpha cannot be handed one by accident."},label:{type:"string",default:"",attribute:"label",description:'What the colour is FOR — "Background", "Border" — and the stem every control inside the element takes its own name from: the text field is named this, the swatch button is "Pick <label>", the screen picker is "Pick <label> from the screen". Required: five controls named only by their roles is five sliders and two buttons in a row, and a reader has no way to tell this field from the next one.'},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the text field as aria-labelledby, for a visible label the element does not own. The other controls keep their composed names, because a visible label naming the row does not name the button inside it."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg, forwarded to the text field so a row of controls lines up."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be opened or edited. Forwarded to every control inside, and checked again by the handlers that open the picker and the screen picker, because those act on a click rather than on a control's own refusal."},system:{type:"boolean",default:!0,attribute:"system",description:"Offer the operating system's own colour picker, through a native input type=color. It is a DOOR and never the control: it opens the platform's dialog, takes what comes back, and has no part in how the element is operated. Turn it off where a project's colours must come from its own palette."},eyedropper:{type:"boolean",default:!0,attribute:"eyedropper",description:"Offer the screen picker, where the engine has one. The button is drawn only when BOTH this and the EyeDropper API are there, so an engine without it shows no dead control rather than one that does nothing when pressed."},tabindex:{type:"string",default:"",description:`Forwarded to the swatch button as its tabindex, which is what makes a roving caret possible: a jx-toolbar moving focus writes this rather than reaching into the element's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. The swatch is THE stop, and it is named part=control for that reason, which is the kit's name for the node a roving container focuses. It is the opener, so Enter on it reaches the whole picker and a reader parked on it can choose any colour; it is the one control the element always draws; and it is first in the row, so Tab lands where the eye does. While the prop is set the text field, the screen picker and the system door step out of the tab order (tabindex -1): a container that has been told this element is one stop must find exactly one, and those three are then the pointer's. Unset, which is every form, each keeps its own stop.`},hue:{type:"number",default:0,description:"The working hue, 0-360. It is kept across a colour going grey, which is why it is state rather than something derived from value each time: a round trip through the string would send the hue track back to red the moment the reader dragged the saturation to zero."},saturation:{type:"number",default:0,description:"The working saturation, 0-100: the square's horizontal axis."},brightness:{type:"number",default:0,description:"The working brightness, 0-100: the square's vertical axis, measured upward."},opacity:{type:"number",default:100,description:"The working opacity, 0-100, in the alpha track's own units. Only ever written into the value when alpha is on."},text:{type:"string",default:"",description:"What the text field is showing, which is NOT value while the reader is mid-word: a half-typed hex is not a colour and the element must not refuse it or reformat it under the caret. It becomes the value on the commit, and follows the value whenever anything else moves it."},invalid:{type:"boolean",default:!1,description:"Whether the text field is holding something that is not a colour. Raised on the COMMIT rather than on each keystroke, and forwarded to the text field so the refusal is announced there."},expanded:{type:"boolean",default:!1,description:"Whether the picker is showing. It follows the panel's own toggle event, so light dismissal and Escape move it as surely as the button does; writing it opens nothing."},ink:{type:"string",default:"",description:"black or white, whichever can be seen on the current colour. The preview chip's boundary is drawn in it, because a neutral border disappears against a neutral colour and a control whose edge cannot be seen is a WCAG 1.4.11 failure."},solid:{type:"string",default:"",description:"The current colour at full opacity, as hex. Two things need it and neither can compute it: the alpha track fades from it, and a native input type=color accepts the six-digit form and nothing else."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The picker panel takes its id from it and the swatch button names that id in aria-controls, so nothing a consumer writes has to be unique."},dropperAvailable:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"eyeDropperAvailable",parameters:["offered"],description:"Whether the screen picker is both offered here and present in the engine. A capability question, asked by the document rather than assumed by it. It takes the opt-in as an argument because a Function entry with no declared parameters is an event handler rather than a callable, and calling one from a template throws mid-render and takes the element's whole child tree with it."},hasDropper:"${state.dropperAvailable(state.eyedropper)}",preview:"${state.resolved || state.value || 'transparent'}",pickerId:"${state.uid ? state.uid + '-picker' : ''}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldInput",emits:[{name:"input",description:"The colour is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is the colour whichever of the five controls moved it."}],description:"The one listener the whole composed control speaks through: it works out which channel fired from the data-channel beside each part, stops the original, and re-says the platform's own name from the host."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldChange",emits:[{name:"change",description:"The reader committed a colour; e.target is the element."}],description:"The same routing, for the commit. It is also where a typed colour is parsed: a keystroke is not a colour and the refusal waits for this."},onOpen:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onOpenPicker",description:"Positions the panel under the field and shows it, or hides it when it is already showing. The coordinates are written before the panel is shown, which is what jx-popover asks of whoever opens it."},onDropper:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onEyeDropper",description:"Opens the system's screen picker and takes what comes back. A reader who dismisses it has cancelled rather than failed, so the rejection is swallowed and the colour is left where it was."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/color-field.ts",$export:"onFieldMount",description:"Learns the element, mints its id stem, takes the value apart into the working channels, and keeps them in step with value for as long as it lives — through data-value, which is the one thing that moves when a host writes el.value."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The element has rendered, which is how onReady reaches the element itself."}],description:"Announces that the element has rendered. Its own onReady listens for it, and a host may too."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},"onjx-ready":{$ref:"#/state/onReady"},attributes:{"data-value":"${state.value}","data-resolved":"${state.resolved}","data-size":"${state.size}","data-expanded":"${state.expanded ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle",minInlineSize:"0","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px","--jx-color-field-preview":"${state.preview}","--jx-color-field-ink":"${state.ink || 'var(--jx-border-strong)'}",'& > [part="row"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minInlineSize:"0"},'& > [part="row"] > [part="control"]':{appearance:"none",font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"none",inlineSize:"var(--jx-control-h)",blockSize:"var(--jx-control-h)",margin:"0",padding:"var(--jx-space-1)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",cursor:"pointer",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="preview"]':{display:"block",inlineSize:"100%",blockSize:"100%",borderRadius:"var(--jx-radius-xs)",background:"linear-gradient(var(--jx-color-field-preview), var(--jx-color-field-preview)), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-color-field-ink)"},'& [part="text"]':{minInlineSize:"0",inlineSize:"11ch"},'& [part="system-slot"], & [part="dropper-slot"], & [part="opacity-slot"]':{display:"contents"},'& [part="system"]':{appearance:"none",inlineSize:"var(--jx-control-h)",blockSize:"var(--jx-control-h)",flex:"none",margin:"0",padding:"2px",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",cursor:"pointer",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="picker"]':{"--jx-popover-offset":"6px"},'& [part="panel"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",inlineSize:"200px"},'& [part="tokens"]':{display:"block"},'& [part="tokens"]:empty':{display:"none"}},children:[{tagName:"div",attributes:{part:"row"},children:[{tagName:"button",attributes:{part:"control",type:"button","aria-label":"Pick ${state.label}","aria-haspopup":"dialog","aria-expanded":"${state.expanded ? 'true' : 'false'}","aria-controls":"${state.pickerId || null}",tabindex:"${state.tabindex || null}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onOpen"},children:[{tagName:"span",attributes:{part:"preview","aria-hidden":"true"}}]},{tagName:"jx-textfield",attributes:{part:"text","data-jx-channel":"text"},$props:{label:{$ref:"#/state/label"},labelledby:{$ref:"#/state/labelledby"},value:{$ref:"#/state/text"},size:{$ref:"#/state/size"},invalid:{$ref:"#/state/invalid"},disabled:{$ref:"#/state/disabled"},mono:!0,autocomplete:"off",spellcheck:!1,tabindex:"${state.tabindex ? '-1' : ''}"}},{tagName:"span",attributes:{part:"dropper-slot"},$switch:{$ref:"#/state/hasDropper"},cases:{true:{tagName:"jx-action-button",attributes:{part:"dropper"},$props:{icon:"eyedropper",label:"Pick ${state.label} from the screen",hint:"Pick ${state.label} from the screen",quiet:!1,tabindex:"${state.tabindex ? '-1' : ''}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onDropper"}}}},{tagName:"span",attributes:{part:"system-slot"},$switch:{$ref:"#/state/system"},cases:{true:{tagName:"input",attributes:{part:"system","data-jx-channel":"system",type:"color","aria-label":"Choose ${state.label} in the system picker",value:"${state.solid}",tabindex:"${state.tabindex ? '-1' : null}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/solid"}}}}]},{tagName:"jx-popover",attributes:{part:"picker",id:"${state.pickerId || null}"},$props:{label:"${state.label} picker"},children:[{tagName:"div",attributes:{part:"panel"},children:[{tagName:"jx-color-area",attributes:{part:"area","data-jx-channel":"area"},$props:{label:"Saturation and brightness",hue:{$ref:"#/state/hue"},saturation:{$ref:"#/state/saturation"},brightness:{$ref:"#/state/brightness"},disabled:{$ref:"#/state/disabled"}}},{tagName:"jx-color-slider",attributes:{part:"hue","data-jx-channel":"hue"},$props:{label:"Hue",channel:"hue",value:{$ref:"#/state/hue"},disabled:{$ref:"#/state/disabled"}}},{tagName:"span",attributes:{part:"opacity-slot"},$switch:{$ref:"#/state/alpha"},cases:{true:{tagName:"jx-color-slider",attributes:{part:"opacity","data-jx-channel":"opacity"},$props:{label:"Opacity",channel:"alpha",value:{$ref:"#/state/opacity"},color:{$ref:"#/state/solid"},disabled:{$ref:"#/state/disabled"}}}}},{tagName:"div",attributes:{part:"tokens","data-jx-channel":"palette"},children:[{tagName:"slot",attributes:{name:"tokens"}}]}]}]}]};var er={$schema:"https://jxsuite.com/schema/v1",$id:"JxColorSlider",tagName:"jx-color-slider",observedAttributes:["label","labelledby","channel","value","min","max","step","color","disabled"],state:{label:{type:"string",default:"",attribute:"label",description:`The accessible name, forwarded to the inner range as aria-label. Required unless labelledby names a visible one: a slider is in the accessibility lint's LABELLED_ROLES, so it may not take its name from anything it contains, and an unnamed hue track is announced as "slider" and a number.`},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner range as aria-labelledby, for a visible label the element does not own."},channel:{type:"string",default:"hue",attribute:"channel",description:"What the track is made of: hue draws the full spectrum and runs 0-360, alpha draws the colour fading out over a checkerboard and runs 0-100. It chooses the drawing, the default top of the range and the units the value is announced in, so it is the one prop that has to be right; everything else has a sensible answer without it."},value:{type:"number",default:0,attribute:"value",description:"Where the thumb is, in the track's own units — degrees on a hue track, percent on an alpha one. It is bound to the inner range BOTH ways: as the value property, which is the live value once the reader's first drag has set the control's dirty flag, and as the value attribute, which is the control's default and therefore what a form reset returns to."},min:{type:"number",default:0,attribute:"min",description:"The bottom of the range. Zero for both shipped channels, and there so a consumer can cut a track down to a band."},max:{type:"number",default:0,attribute:"max",description:"The top of the range, or 0 to let the channel decide — 360 for hue, 100 for alpha. Zero means unset rather than a top of zero, because a numeric prop coerces a removed attribute through the current value's type and a non-zero default could then never be cleared; a track that genuinely ends at zero has nowhere to move and is not a control."},step:{type:"number",default:1,attribute:"step",description:"The grid the value moves on, for the platform's own arrow keys and for the kit's ten-step Shift+Arrow."},color:{type:"string",default:"",attribute:"color",description:"The colour an alpha track fades from, as any CSS colour. Ignored by a hue track. Empty falls back to currentColor, so a track with nothing told to it still draws something honest rather than nothing at all."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved or focused. Forwarded to the inner range, so the refusal is the platform's rather than a style that only looks like one."},maxValue:"${state.max > 0 ? state.max : (state.channel === 'alpha' ? 100 : 360)}",trackImage:"${state.channel === 'alpha' ? 'linear-gradient(to right, transparent, ' + (state.color || 'currentColor') + ')' : 'linear-gradient(to right, hsl(0 100% 50%), hsl(60 100% 50%), hsl(120 100% 50%), hsl(180 100% 50%), hsl(240 100% 50%), hsl(300 100% 50%), hsl(360 100% 50%))'}",valueText:"${state.channel === 'alpha' ? Math.round(state.value) + '%' : Math.round(state.value) + ' degrees'}",onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderInput",emits:[{name:"input",description:"The value is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is the number in the track's own units."}],description:"Mirrors the inner range into value and re-says the platform's own input from the host, so one e.target answers for every colour element in the kit."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderChange",emits:[{name:"change",description:"The reader committed the value; e.target is the element."}],description:"The same mirror and the same re-say, for the commit."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/color-slider.ts",$export:"onSliderKeydown",description:"Shift+Arrow moves ten steps, which no range has of its own. A plain arrow, Home, End and the Page keys are the platform's and are not touched."}},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-channel":"${state.channel}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",inlineSize:"100%",minInlineSize:"120px","--jx-color-track-h":"16px","--jx-color-track-image":"${state.trackImage}","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px","&[data-disabled]":{opacity:"0.5"},'& > [part="track"]':{position:"relative",display:"block",boxSizing:"border-box",inlineSize:"100%",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-color-track-image), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-border-strong)"},'& [part="input"]':{appearance:"none",position:"absolute",insetInline:"0",insetBlock:"0",inlineSize:"100%",blockSize:"100%",margin:"0",padding:"0",border:"0",background:"none",font:"inherit",cursor:"pointer",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px",borderRadius:"var(--jx-radius-sm)"},":disabled":{cursor:"default"}},'& [part="input"]::-webkit-slider-thumb':{appearance:"none",inlineSize:"12px",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-xs)",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",cursor:"inherit"},'& [part="input"]::-moz-range-thumb':{appearance:"none",inlineSize:"12px",blockSize:"var(--jx-color-track-h)",borderRadius:"var(--jx-radius-xs)",border:"2px solid var(--jx-bg)",boxShadow:"0 0 0 1px var(--jx-fg)",background:"transparent",cursor:"inherit"}},children:[{tagName:"div",attributes:{part:"track"},children:[{tagName:"input",attributes:{part:"input",type:"range","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-valuetext":"${state.valueText}",min:"${state.min}",max:"${state.maxValue}",step:"${state.step}",value:"${state.value}",disabled:{$ref:"#/state/disabled"}},value:{$ref:"#/state/value"}}]}]};var tr={$schema:"https://jxsuite.com/schema/v1",$id:"JxDialog",tagName:"jx-dialog",observedAttributes:["headline","confirm-label","secondary-label","cancel-label","destructive","dismissible","size"],$elements:[{$ref:"./jx-button.json"}],state:{headline:{type:"string",default:"",attribute:"headline",description:"The dialog's title, which is also its accessible name. Empty for a dialog named by its content."},confirmLabel:{type:"string",default:"OK",attribute:"confirm-label",description:"The primary button's text; empty for no primary button."},secondaryLabel:{type:"string",default:"",attribute:"secondary-label",description:"A third answer beside confirm and cancel, such as Discard; empty for none."},cancelLabel:{type:"string",default:"Cancel",attribute:"cancel-label",description:"The cancel button's text; empty for no cancel button."},destructive:{type:"boolean",default:!1,attribute:"destructive",description:"The primary action destroys something: its button draws in the negative variant, and the dialog opens with CANCEL focused instead of it, so a reader who answers with Enter does not destroy anything."},dismissible:{type:"boolean",default:!1,attribute:"dismissible",description:"A click outside the dialog closes it, as Escape always does. Off for an answer the reader must give."},size:{type:"string",default:"sm",attribute:"size",description:"sm, md or lg: the dialog's width."},open:{type:"boolean",default:!1,description:"Whether the dialog is showing. Read-only state, mirrored from the platform: open it with showModal(host) from the behaviours module, or with a --show invoker command aimed at the element."},hasHeadline:{$expression:{operator:"!==",target:{$ref:"#/state/headline"},value:""}},hasConfirm:{$expression:{operator:"!==",target:{$ref:"#/state/confirmLabel"},value:""}},hasSecondary:{$expression:{operator:"!==",target:{$ref:"#/state/secondaryLabel"},value:""}},hasCancel:{$expression:{operator:"!==",target:{$ref:"#/state/cancelLabel"},value:""}},confirmVariant:"${state.destructive ? 'negative' : 'accent'}",closedby:"${state.dismissible ? 'any' : 'closerequest'}",onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onToggle",description:"The platform's toggle on the inner dialog, mirrored into open."},onNativeCancel:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onNativeCancel",description:"Escape or a light dismissal: the platform closes the dialog, and the element dispatches cancel.",emits:[{name:"cancel",description:"The reader declined: Escape, a dismissal, or the cancel button."}]},onNativeClose:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onNativeClose",description:"The platform's close, whatever closed it, dispatched as close.",emits:[{name:"close",description:"The dialog closed, for any reason."}]},onCommand:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onCommand",description:"An invoker command aimed at the element: --show opens it modally, --close closes it."},onConfirm:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onConfirm",description:"The primary button: dispatches confirm and leaves closing to the host, so a refused value can keep the dialog open.",emits:[{name:"confirm",description:"The primary button was activated."}]},onSecondary:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onSecondary",description:"The secondary button: dispatches secondary.",emits:[{name:"secondary",description:"The secondary button was activated."}]},onCancelClick:{$prototype:"Function",$src:"jx-ui:/behaviors/dialog.ts",$export:"onCancelClick",description:"The cancel button: dispatches cancel and closes the dialog."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its native dialog, so a host may open it."}},oncommand:{$ref:"#/state/onCommand"},attributes:{"data-size":"${state.size}","data-open":"${state.open ? '' : null}","data-destructive":"${state.destructive ? '' : null}"},style:{display:"contents","&[hidden]":{display:"none"},'& > [part="dialog"]':{boxSizing:"border-box",width:"min(90vw, 24rem)",maxHeight:"85vh",margin:"auto",padding:"0",border:"1px solid var(--jx-border)",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-dialog)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",overflow:"auto","&::backdrop":{background:"rgba(0, 0, 0, 0.4)"},":focus-visible":{outline:"var(--jx-focus-ring)"}},'&[data-size="md"] > [part="dialog"]':{width:"min(90vw, 32rem)"},'&[data-size="lg"] > [part="dialog"]':{width:"min(90vw, 44rem)"},'& [part="header"]':{padding:"var(--jx-space-5) var(--jx-space-5) 0"},'& [part="header"]:empty':{display:"none"},'& [part="headline"]':{margin:"0",fontSize:"var(--jx-text-lg)",lineHeight:"var(--jx-leading-lg)",fontWeight:"600"},'& [part="body"]':{padding:"var(--jx-space-4) var(--jx-space-5)"},'& [part="footer"]':{display:"flex",justifyContent:"flex-end",alignItems:"center",gap:"var(--jx-space-2)",padding:"0 var(--jx-space-5) var(--jx-space-5)"},'& [part="secondary"]':{marginRight:"auto"},'& [part="secondary-slot"], & [part="cancel-slot"], & [part="confirm-slot"]':{display:"contents"}},children:[{tagName:"dialog",attributes:{part:"dialog",closedby:"${state.closedby}","aria-label":"${state.headline || null}"},ontoggle:{$ref:"#/state/onToggle"},oncancel:{$ref:"#/state/onNativeCancel"},onclose:{$ref:"#/state/onNativeClose"},children:[{tagName:"header",attributes:{part:"header"},$switch:{$ref:"#/state/hasHeadline"},cases:{true:{tagName:"h2",attributes:{part:"headline"},textContent:"${state.headline}"}}},{tagName:"div",attributes:{part:"body"},children:[{tagName:"slot"}]},{tagName:"footer",attributes:{part:"footer"},children:[{tagName:"div",attributes:{role:"none",part:"secondary-slot"},$switch:{$ref:"#/state/hasSecondary"},cases:{true:{tagName:"jx-button",$props:{quiet:!0},attributes:{part:"secondary"},onclick:{$ref:"#/state/onSecondary"},children:[{tagName:"span",textContent:"${state.secondaryLabel}",attributes:{part:"secondary-label"}}]}}},{tagName:"div",attributes:{role:"none",part:"cancel-slot"},$switch:{$ref:"#/state/hasCancel"},cases:{true:{tagName:"jx-button",attributes:{part:"cancel",autofocus:"${state.destructive ? '' : null}"},onclick:{$ref:"#/state/onCancelClick"},children:[{tagName:"span",textContent:"${state.cancelLabel}",attributes:{part:"cancel-label"}}]}}},{tagName:"div",attributes:{role:"none",part:"confirm-slot"},$switch:{$ref:"#/state/hasConfirm"},cases:{true:{tagName:"jx-button",$props:{variant:{$ref:"#/state/confirmVariant"}},attributes:{part:"confirm",autofocus:"${state.destructive ? null : ''}"},onclick:{$ref:"#/state/onConfirm"},children:[{tagName:"span",textContent:"${state.confirmLabel}",attributes:{part:"confirm-label"}}]}}}]},{tagName:"div",attributes:{part:"overlay-slot"}}]}]};var nr={$schema:"https://jxsuite.com/schema/v1",$id:"JxDivider",tagName:"jx-divider",observedAttributes:["orientation"],state:{orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical."}},attributes:{orientation:"${state.orientation}"},style:{display:"block","&[hidden]":{display:"none"},flex:"none",margin:"var(--jx-space-1) 0",'& > [part="rule"]':{margin:"0",border:"0",borderTop:"1px solid var(--jx-border)"},'&[orientation="vertical"]':{display:"flex",alignSelf:"stretch",margin:"0 var(--jx-space-1)"},'&[orientation="vertical"][hidden]':{display:"none"},'&[orientation="vertical"] > [part="rule"]':{borderTop:"0",borderLeft:"1px solid var(--jx-border)"}},children:[{tagName:"hr",attributes:{part:"rule",role:"separator","aria-orientation":"${state.orientation}"}}]};var ar={$schema:"https://jxsuite.com/schema/v1",$id:"JxDot",tagName:"jx-dot",observedAttributes:["tone"],state:{tone:{type:"string",default:"",attribute:"tone",description:"danger, success or warning. Anything else, the empty default included, is the neutral disc."}},attributes:{tone:"${state.tone || null}"},style:{display:"inline-block","&[hidden]":{display:"none"},flex:"none",width:"6px",height:"6px",borderRadius:"50%",background:"var(--jx-fg-muted)",'&[tone="danger"]':{background:"var(--jx-danger)"},'&[tone="success"]':{background:"var(--jx-success)"},'&[tone="warning"]':{background:"var(--jx-warning)"}},children:[]};var or={$schema:"https://jxsuite.com/schema/v1",$id:"JxField",tagName:"jx-field",observedAttributes:["label","description","required","invalid","warning","span"],state:{label:{type:"string",default:"",attribute:"label",description:"The visible label in the left column. It is drawn into the element's own label node, and that node's id is what names the slotted control — so the text is the accessible name without the consumer writing an id anywhere."},description:{type:"string",default:"",attribute:"description",description:'A sentence under the row explaining the control. It is the FALLBACK of the help slot, so slotting richer help replaces it rather than stacking with it, and an empty description leaves the help line with nothing in it — which is exactly what [part="help"]:empty keys on to take the line out of flow. The control is pointed at the sentence only when the line HAS something in it at mount — an empty one would be a reference to an empty paragraph, which the four classes never wrote. A sentence that starts empty and fills later should therefore be SLOTTED into help, whose presence the row can see, rather than passed here.'},required:{type:"boolean",default:!1,attribute:"required",description:"Draws the required mark after the label. The mark is DRAWN, in content with an empty alt string, never appended to the label text: the label is the control's accessible name, and an asterisk inside that name is read out as a word. Marking the row does not make the control required — say so on the control as well, which is the element that validates."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The row's value is refused: the label and the help sentence both draw in the danger colour. This is the whole of the old .jx-help-text--error class, folded in as a state of the row rather than a second class on the sentence. It says nothing to assistive technology — aria-invalid belongs on the control that holds the value."},warning:{type:"boolean",default:!1,attribute:"warning",description:"The row's value is accepted but worth a second look: the label draws in the warning colour. The help sentence is left alone, because a warning is a shade on the name rather than a correction of the sentence under it."},span:{type:"boolean",default:!1,attribute:"span",description:"Collapses the row to ONE column: the label sits above the control and reads from the left. It is the shape a long label, a wide control or a checkbox list needs, and it is a property of the row rather than of anything in it."},uid:{type:"string",default:"",description:"This row's own id stem, minted on mount. The label node and the help sentence take their ids from it, and the slotted control is handed those ids as its labelledby and describedby props."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"nameFieldControl",description:"Mints the row's id stem and names the slotted control with it. A document cannot do either: the closed operator set has no counter, and no body can write a property on an element other than the one whose handler is running. It runs once, over what is slotted then: a control APPENDED to the row afterwards lands outside the control part, unplaced and unnamed. Keep the control in the document and switch its state rather than adding it later."}},attributes:{"data-span":"${state.span ? '' : null}","data-required":"${state.required ? '' : null}","data-invalid":"${state.invalid ? '' : null}","data-warning":"${state.warning ? '' : null}"},style:{display:"grid",gridTemplateColumns:"var(--jx-field-label-w) minmax(0, 1fr)",columnGap:"var(--jx-space-3)",rowGap:"var(--jx-space-1)",alignItems:"center",padding:"var(--jx-space-1) 0",minWidth:"0","&[hidden]":{display:"none"},"&[data-span]":{gridTemplateColumns:"minmax(0, 1fr)"},'& > [part="label"]':{display:"block",width:"var(--jx-field-label-w)",minWidth:"0",textAlign:"right",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'&[data-span] > [part="label"]':{width:"auto",textAlign:"left"},'&[data-invalid] > [part="label"]':{color:"var(--jx-danger)"},'&[data-warning] > [part="label"]':{color:"var(--jx-warning)"},'&[data-required] > [part="label"]':{"::after":{content:'"*" / ""',color:"var(--jx-danger)",marginInlineStart:"var(--jx-space-1)"}},'& > [part="control"]':{display:"contents"},'& > [part="help"]':{gridColumn:"1 / -1",margin:"0",minWidth:"0",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)"},'& > [part="help"]:empty':{display:"none"},'&[data-invalid] > [part="help"]':{color:"var(--jx-danger)"}},children:[{tagName:"label",attributes:{part:"label",id:"${state.uid ? state.uid + '-label' : null}"},textContent:"${state.label}"},{tagName:"div",attributes:{part:"control",role:"none"},children:[{tagName:"slot"}]},{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},children:[{tagName:"slot",attributes:{name:"help"},children:["${state.description}"]}]}]};var rr={$schema:"https://jxsuite.com/schema/v1",$id:"JxKbd",tagName:"jx-kbd",style:{display:"inline-block","&[hidden]":{display:"none"},padding:"0 var(--jx-space-2)",border:"1px solid var(--jx-border)",borderRadius:"var(--jx-radius-xs)",background:"var(--jx-bg-panel)",color:"var(--jx-fg-dim)",fontFamily:"var(--jx-font-mono)",fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-sm)"},children:[{tagName:"slot"}]};var ir={$schema:"https://jxsuite.com/schema/v1",$id:"JxIcon",tagName:"jx-icon",observedAttributes:["name","weight","label","mirror"],state:{name:{type:"string",default:"",attribute:"name",description:"The glyph to draw, by its Phosphor name. Every name the kit ships is in icons/list.json."},weight:{type:"string",default:"regular",attribute:"weight",description:"regular, bold, or fill. fill is the active drawing of the same glyph; a weight the manifest lacks falls back to regular."},label:{type:"string",default:"",attribute:"label",description:"The accessible name. Empty hides the icon from assistive technology, which is right whenever visible text already names the control."},mirror:{type:"boolean",default:!1,attribute:"mirror",description:"Flip horizontally: a directional glyph in a right-to-left layout, or its opposite."},lookup:{$prototype:"Function",$src:"jx-ui:/icons.ts",$export:"iconPath",parameters:["name","weight"],description:"Path data for a name and weight, from the committed manifest."},path:"${state.lookup(state.name, state.weight)}"},style:{display:"inline-flex","&[hidden]":{display:"none"},flex:"none",width:"var(--jx-icon-size, 16px)",height:"var(--jx-icon-size, 16px)",verticalAlign:"middle","& > svg":{display:"block",width:"100%",height:"100%"}},children:[{tagName:"svg",attributes:{part:"svg",viewBox:"0 0 256 256",fill:"currentColor",focusable:"false",role:"img","aria-label":"${state.label}","aria-hidden":"${state.label ? 'false' : 'true'}"},style:{transform:"${state.mirror ? 'scale(-1, 1)' : 'none'}"},children:[{tagName:"path",attributes:{part:"path",d:"${state.path}"}}]}]};var sr={$schema:"https://jxsuite.com/schema/v1",$id:"JxMenu",tagName:"jx-menu",observedAttributes:["label","placement","x","y","floor"],state:{label:{type:"string",default:"Menu",attribute:"label",description:"The accessible name of the menu."},placement:{type:"string",default:"",attribute:"placement",description:"Where the menu sits relative to the element it was opened from, as a CSS position-area value, or empty. Empty is the default and means placement by x and y, because a menu's usual opening is at a POINTER — a context menu — where the source it was shown from is what gets the keyboard back and not where the panel hangs. A menu that hangs from a button sets it (block-end span-inline-end, below and leading-aligned; block-end span-inline-start for a trailing edge) and is then placed by the platform against that button, followed through scroll and resize, and flipped when it would overflow; a submenu is placed inline-end span-block-end of its row without being asked. The value is passed to the property as written. A stack with a floor is never anchored: a floor is a limit the platform's fallbacks cannot express, so it keeps the coordinate placement the clamp honours."},x:{type:"number",default:0,attribute:"x",description:"Where the panel's inline-start edge sits, in viewport pixels. A root menu is placed at the pointer or beside its opener; a submenu is placed beside its row by the menu behaviour."},y:{type:"number",default:0,attribute:"y",description:"Where the panel's block-start edge sits, in viewport pixels."},floor:{type:"number",default:0,attribute:"floor",description:"The lowest edge this panel and its submenus may reach, in viewport pixels; 0 means the viewport. A menu opened from a rail that abuts a status bar sets it to the rail's bottom, so a tall submenu never runs down over the bar."},anchored:{type:"boolean",default:!1,description:"Whether this panel is placed by the platform against the element it was shown from: an opening with a source, an area to use (placement, or the submenu default), and no floor on the stack's root. Written by the behaviour on beforetoggle, before layout, so the first frame is already in place; cleared on close; mirrored as data-anchored for the anchored rule. Not an attribute, because it is the platform's fact."},area:{type:"string",default:"",description:"The position-area the anchored rule reads: placement when it is set, else the submenu default for a menu inside a row, else empty. Derived by the behaviour on beforetoggle rather than by the document, because only the behaviour can see whether this menu is a submenu."},open:{type:"boolean",default:!1,description:"Whether the panel is showing. Follows the platform's toggle event; write it through showPopover() and hidePopover(), not directly."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuKeydown",description:"The menu keyboard contract: Arrow keys, Home, End and typeahead move; Enter and Space activate; ArrowRight opens a submenu and ArrowLeft leaves it; Escape closes one level; Tab closes the whole stack."},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuBeforeToggle",description:"Decides anchored and area before the panel is laid out (see the two)."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuToggle",description:"Mirrors the platform's toggle event into open, clamps a freshly shown panel into the viewport, and moves focus to the first row."},onPointerOver:{$prototype:"Function",$src:"jx-ui:/behaviors/menu.ts",$export:"onMenuPointerOver",description:"Opens the submenu of the row under the pointer and closes any sibling's."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it. A menu is always an auto popover: light dismiss and Escape are the platform's."}},attributes:{role:"menu","aria-label":"${state.label}",popover:"auto",tabindex:"-1","data-anchored":"${state.anchored ? '' : null}"},onkeydown:{$ref:"#/state/onKeydown"},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},onpointerover:{$ref:"#/state/onPointerOver"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",margin:"0",padding:"var(--jx-space-2)",minWidth:"180px",maxWidth:"min(360px, calc(100vw - 8px))",maxHeight:"calc(100vh - 8px)",overflowY:"auto",boxSizing:"border-box",flexDirection:"column",gap:"var(--jx-space-1)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-md)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",pointerEvents:"auto",outline:"none",":popover-open":{display:"flex"},"&[hidden]:popover-open":{display:"none"},"@supports (position-area: block-end)":{$description:"The anchored placement, for a menu that hangs from a button and for every submenu: the platform puts it against its IMPLICIT anchor — the element it was shown from — follows that element through scroll and resize, and flips it when the first placement would overflow, which for a submenu is the flip to its parent's inline-start the clamp used to compute by hand. No anchor-name is involved; a popover's invoker is its implicit anchor by the platform's own rule (ui.md 5.2, 6). The insets are released so x and y stop mattering. Outside this block, and for a menu at a pointer or on a stack with a floor, the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",positionArea:"${state.area}",positionTryFallbacks:"flip-block, flip-inline, flip-block flip-inline"}},"& hr":{border:"0",borderTop:"1px solid var(--jx-border)",margin:"var(--jx-space-1) 0"}},children:[{tagName:"slot"}]};var lr={$schema:"https://jxsuite.com/schema/v1",$id:"JxMenuItem",tagName:"jx-menu-item",observedAttributes:["value","disabled","destructive","requires","checked","haspopup"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for; the detail of the select event it dispatches."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot act is disabled, never absent; it stays reachable and explains itself through requires."},destructive:{type:"boolean",default:!1,attribute:"destructive",description:"Draws the row in the danger colour. Derived from the command record, never decided per menu."},requires:{type:"string",default:"",attribute:"requires",description:"The one-sentence reason a DISABLED row cannot act, drawn as the row's native title while it is disabled and nowhere at all while it is not. The title is the whole contract here, and deliberately not the tooltip hybrid jx-button, jx-action-button and jx-switch ship: a disabled row can open no tip, so the hybrid collapses to its disabled half, and an ENABLED row never carries a requires — every Studio projection fills it from the registry's disabledReason, which is undefined for a command that can run, and a reason on a row that can act is a contradiction rather than a hint. Studio's menu surface also prints the same sentence as the row's visible description (`Needs …`), so a keyboard reader hears it without the title."},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain item; true or false for a checkbox item, which then carries aria-checked."},haspopup:{type:"boolean",default:!1,attribute:"haspopup",description:"The row owns a submenu, slotted as submenu. It still runs its own command; the submenu opens on hover, ArrowRight or the chevron."},expanded:{type:"boolean",default:!1,description:"Whether the row's submenu is showing. Written by the menu behaviour."},noPopup:{$expression:{operator:"!",target:{$ref:"#/state/haspopup"}}},onClick:{$prototype:"Function",body:[{stopPropagation:!0},{if:{operator:"!",target:{$ref:"#/state/disabled"}},then:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0}]}],emits:[{name:"select",description:"The row was activated; detail is its value."}],description:"Activation dispatches select unless the row is disabled. The click stops here: a row inside a submenu is a descendant of the row that owns it, and a click that kept bubbling would activate both."}},attributes:{role:"${state.checked ? 'menuitemcheckbox' : 'menuitem'}",tabindex:"-1","aria-disabled":"${state.disabled ? 'true' : 'false'}","aria-checked":"${state.checked || null}","aria-haspopup":"${state.haspopup ? 'menu' : null}","aria-expanded":"${state.haspopup ? (state.expanded ? 'true' : 'false') : null}",title:"${state.disabled && state.requires ? state.requires : null}"},onclick:{$ref:"#/state/onClick"},style:{display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-3)",borderRadius:"var(--jx-radius-sm)",cursor:"default",userSelect:"none",outline:"none",color:"${state.destructive && !state.disabled ? 'var(--jx-danger)' : 'inherit'}",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-disabled="true"]':{opacity:"0.5"},'& > [part="icon"]':{display:"inline-flex",color:"var(--jx-fg-dim)"},'& > [part="text"]':{display:"flex",flexDirection:"column",flex:"1",minWidth:"0"},'& > [part="text"] > [part="label"]':{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},'& > [part="text"] > [part="description"]':{fontSize:"var(--jx-text-xs)",lineHeight:"var(--jx-leading-xs)",color:"var(--jx-fg-muted)"},'& > [part="value"]':{color:"var(--jx-fg-dim)",fontSize:"var(--jx-text-sm)",whiteSpace:"nowrap"},'& > [part="value"] kbd':{fontFamily:"var(--jx-font-mono)",fontSize:"var(--jx-text-xs)",color:"var(--jx-fg-dim)"},'& > [part="chevron"]':{display:"inline-flex",color:"var(--jx-fg-dim)"},'& > [part="chevron"][hidden]':{display:"none"}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"text"},children:[{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"description"},children:[{tagName:"slot",attributes:{name:"description"}}]}]},{tagName:"span",attributes:{part:"value"},children:[{tagName:"slot",attributes:{name:"value"}}]},{tagName:"span",attributes:{part:"chevron"},hidden:{$ref:"#/state/noPopup"},children:[{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"chevron-icon"}}]},{tagName:"slot",attributes:{name:"submenu"}}]};var dr={$schema:"https://jxsuite.com/schema/v1",$id:"JxPopover",tagName:"jx-popover",observedAttributes:["label","arrow","match-width","placement","x","y","floor"],state:{label:{type:"string",default:"",attribute:"label",description:`The panel's accessible name. Set, the panel becomes a named role="group"; empty, it carries no role at all. A PANEL HOLDING CONTROLS MUST SET IT: role="group" is in neither the accessibility lint's content-named roles nor its labelled roles, so an unnamed one is invisible to every gate, and a non-modal group of form controls with no role and no name announces no boundary on entry. A panel holding only a jx-menu leaves it empty, because the menu carries its own name.`},arrow:{type:"boolean",default:!1,attribute:"arrow",description:`Draw a pointer at the panel's block-start edge. Decorative and aria-hidden; off by default, because a panel placed by measured coordinates cannot promise the arrow lands on its anchor. THE PANEL ITSELF NEVER SCROLLS: the scroll box is [part="content"], because a scroll container clips whatever hangs outside its padding box and the arrow hangs 5px above it; with overflow on the host the arrow paints nothing at all.`},matchWidth:{type:"boolean",default:!1,attribute:"match-width",description:"Make the panel at least as wide as the element it was opened from, the way a select's list matches its trigger. The width is re-measured on each toggle and never continuously, from whatever the toggle names as its source: a raw <button popovertarget>, a kit button forwarding popovertarget, and openAt(panel, trigger) all measure the trigger."},placement:{type:"string",default:"block-end span-inline-end",attribute:"placement",description:"Where the panel sits relative to the element it was opened from, as a CSS position-area value: block-end span-inline-end (below, its inline-start edge on the trigger's) by default; block-end span-inline-start for a panel that hangs from a trigger's trailing edge; block-start for one that opens above. It applies only while the panel is ANCHORED, which is whenever it was shown from a source, and only on an engine with CSS anchor positioning: the trigger becomes the popover's implicit anchor the moment it is passed to showPopover({ source }) or names the panel with popovertarget, so no anchor-name is ever written on a consumer's element (specs/ui.md 2, 6). Everywhere else the panel stands at x and y. The value is passed to the property as written and is not validated here, because the platform's own grammar is the contract and a value it refuses computes to none, which is the coordinate placement again."},x:{type:"number",default:0,attribute:"x",description:"Where the panel's inline-start edge sits, in viewport pixels, whenever the panel is NOT anchored: shown with no source, given a floor, or on an engine without CSS anchor positioning. A panel shown from a source is placed by the platform against that source (see placement) and ignores x and y, though an opener may still write them, because they are exactly the fallback the anchored rule stands on."},y:{type:"number",default:0,attribute:"y",description:`Where the panel's block-start edge sits, in viewport pixels, under the same condition as x. The gap between that edge and the anchor is the --jx-popover-offset token, not a prop: a numeric prop with a non-zero default cannot express "unset", because removing its attribute coerces through the current value's type and writes 0. Anchored, the same margin is the gap below the trigger.`},floor:{type:"number",default:0,attribute:"floor",description:"The lowest edge the panel may reach, in viewport pixels; 0 means the viewport's bottom. A panel opened from a rail that abuts a status bar sets it to the rail's bottom, so a tall panel never runs down over the bar."},open:{type:"boolean",default:!1,description:"Whether the panel is showing. THIS IS NOT A DOOR: writing el.open = true shows nothing. It follows the platform's toggle event; write it through showPopover() and hidePopover(), or through the openAt() and close() helpers in the behaviours module, not directly."},settling:{type:"boolean",default:!1,description:"Whether a discrete open or close transition is still running. Mirrored as data-jx-settling, so a host can wait for the panel to come to rest before measuring it."},anchorWidth:{type:"number",default:0,description:"The measured border-box width of the element the panel was opened from, in pixels. Written by the behaviour under matchWidth and read by the panel's own min-width; 0 when nothing has been measured."},anchored:{type:"boolean",default:!1,description:"Whether the panel is showing from a source the platform knows, and therefore positioned by anchor rather than by x and y. Written by the behaviour on beforetoggle, before the panel is laid out, so the first frame is already in the right place; cleared when it closes. Mirrored as data-anchored, which the anchored rule keys on. Not an attribute, because it is the platform's fact and never a consumer's to set. A panel given a floor is never anchored: a floor is a limit the platform's fallbacks cannot express, so it keeps the coordinate placement the clamp honours."},panelWidth:"${state.matchWidth && state.anchorWidth > 0 ? state.anchorWidth + 'px' : '180px'}",noArrow:{$expression:{operator:"===",target:{$ref:"#/state/arrow"},value:!1}},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onBeforeToggle",description:"Decides anchored before the panel is laid out: an opening toggle whose source the platform names, on a panel with no floor, is anchored; everything else is not. On beforetoggle rather than toggle because toggle is queued after the show and a panel that learned it was anchored one frame late would paint once at its coordinates and then jump."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onToggle",description:"Mirrors the platform's toggle event into open, raises settling for the transition, measures the anchor under matchWidth, and clamps a freshly shown panel into the viewport when it is not anchored; an anchored panel is placed and flipped by the platform and is left alone."},onTransitionEnd:{$prototype:"Function",$src:"jx-ui:/behaviors/popover.ts",$export:"onTransitionEnd",description:"Clears settling when the panel's own transition finishes. A transition on a child is not the panel coming to rest, so only an event whose target is the host counts."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it. A panel is always an auto popover: light dismiss, Escape and focus restoration are the platform's."}},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},ontransitionend:{$ref:"#/state/onTransitionEnd"},attributes:{popover:"auto",role:"${state.label ? 'group' : null}","aria-label":"${state.label || null}","data-open":"${state.open ? '' : null}","data-jx-settling":"${state.settling ? '' : null}","data-anchored":"${state.anchored ? '' : null}"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",margin:"0",marginBlockStart:"var(--jx-popover-offset, 4px)",padding:"var(--jx-space-2)",minWidth:"${state.panelWidth}",maxWidth:"min(360px, calc(100vw - 8px))",maxHeight:"calc(100vh - 8px)",overflow:"visible",boxSizing:"border-box",flexDirection:"column",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-md)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",pointerEvents:"auto",outline:"none",opacity:"0",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete, overlay var(--jx-dur-1) allow-discrete",":popover-open":{display:"flex",opacity:"1"},"&[hidden]:popover-open":{display:"none"},"&:focus-visible":{outline:"var(--jx-focus-ring)"},"@supports (position-area: block-end)":{$description:"The anchored placement, and the whole of what CSS anchor positioning gives a panel: the platform puts it against its IMPLICIT anchor — the element it was shown from — follows that element through scroll and resize, and flips it to the other side when the first placement would overflow, none of which a measured coordinate can do without a listener per cause. No anchor-name is involved: a popover's invoker is its implicit anchor by the platform's own rule, which is what makes this reachable under ui.md 2 (an element writes no style on a consumer's trigger). The insets are released so x and y stop mattering, and matchWidth becomes anchor-size, which follows the trigger as it resizes where the measured width could not. Outside this block, and on a panel shown from nothing or with a floor, the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",positionArea:"${state.placement}",positionTryFallbacks:"flip-block, flip-inline, flip-block flip-inline",minWidth:"${state.matchWidth ? 'anchor-size(width)' : '180px'}"}},"@starting-style":{"&:popover-open":{opacity:"0"}},'& > [part="content"]':{display:"flex",flexDirection:"column",gap:"var(--jx-space-2)",minHeight:"0",overflow:"auto"},'& > [part="arrow"]':{display:"block",position:"absolute",insetBlockStart:"-5px",insetInlineStart:"var(--jx-space-4)",width:"8px",height:"8px",rotate:"45deg",background:"var(--jx-bg-overlay)",borderTop:"1px solid var(--jx-border-strong)",borderInlineStart:"1px solid var(--jx-border-strong)"},'& > [part="arrow"][hidden]':{display:"none"}},children:[{tagName:"div",attributes:{part:"content"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"arrow","aria-hidden":"true"},hidden:{$ref:"#/state/noArrow"}}]};var cr={$schema:"https://jxsuite.com/schema/v1",$id:"JxCombobox",tagName:"jx-combobox",observedAttributes:["value","placeholder","label","labelledby","describedby","invalid","disabled","readonly","required","size","name","autocomplete","allows-custom-value","error","help"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-popover.json"},{$ref:"./jx-option.json"},{$ref:"./jx-listbox.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The text in the field, which IS the value. A row's label is what it draws and its value is what it commits, and for a combobox those are normally one string: a picker whose rows carry a hidden key is a jx-select. Written by the reader as they type, by a pick, and by the host."},options:{type:"array",default:[],description:"The rows to draw, as { value, label?, description?, disabled?, face?, swatch?, line?, weight?, slant?, variant?, transform?, decoration? } — the last eight being jx-option's drawing channels, passed through as they are. THE ELEMENT FILTERS NOTHING: this is the list that will be shown, not a corpus to match against. Every consumer already owns its own matching — a fuzzy ranker that knows about modes and recents, a catalogue fetched from a provider — so a second opinion here would be one more thing for each of them to defeat. A host re-answers it on input. It carries no attribute key, because a list cannot be one. Empty, there is nothing to open: the chevron is not drawn (data-empty) and neither typing nor an arrow shows the panel, so a field whose catalogue has not arrived is a text field until it does."},allowsCustomValue:{type:"boolean",default:!1,attribute:"allows-custom-value",description:"Whether a value no row holds is kept. Set, the rows are a set of SUGGESTIONS and anything typed stands — which is the reported gap: a model id field whose catalogue is what a provider happens to list, not what the field will accept. Unset, the list is closed and a value no row holds is refused on the COMMIT, putting back the last one that was accepted."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless labelledby names a visible label. The list takes its own name from it too, so a reader entering the popup hears which field it belongs to."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the element's own error and help sentences."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},autocomplete:{type:"string",default:"off",attribute:"autocomplete",description:"The browser's own autofill, forwarded to the control. It defaults to off rather than to nothing, because the UA's own dropdown over a listbox the element is already drawing is two panels answering one question."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited, opened or focused."},readonly:{type:"boolean",default:!1,attribute:"readonly",description:"Can be focused and selected, not edited — and the list never opens, because every row is an edit."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the field and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the field."},open:{type:"boolean",default:!1,description:"Whether the list is showing. THIS IS NOT A DOOR: it follows the panel's own toggle event, so a light dismiss and an Escape move it as surely as the chevron does. Writing it opens nothing."},activeIndex:{type:"number",default:-1,description:"Which row the caret is on, or -1 for none — and -1 is where a keystroke leaves it, so Enter commits what the READER typed until they arrow onto a row. A list opened by a GESTURE lands on the row the field's value already names: the chevron and Alt+ArrowDown put the caret there, so a catalogue that arrived after the reader typed an id shows it as theirs rather than as a list with nothing chosen. It is kept apart from the rows on purpose: a key moves the highlight without the row list reconciling, and the id it computes is the one string the field and the listbox are both told."},committed:{type:"string",default:"",description:"The last value the element accepted, which is what a closed list puts back when it refuses one. Written by the sidecar at mount and on every accepted commit."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The panel, the listbox, each row and the two sentences take their ids from it, so a consumer writes none of them and two comboboxes on one surface cannot collide."},listId:"${state.uid ? state.uid + '-list' : ''}",panelId:"${state.uid ? state.uid + '-panel' : ''}",activeId:"${state.uid && state.activeIndex >= 0 ? state.uid + '-o' + state.activeIndex : ''}",hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"mountCombobox",description:"Mints the id stem and records the value the element starts out holding, so a refused edit has something to be put back to."},onInput:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxInput",description:"Mirrors what the reader types into value, clears the highlight and opens the list — if there is anything to list. The control's own input event goes on to bubble out of the element unchanged, which is how a host knows to re-answer options."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxKeydown",description:"The editable-combobox keyboard: ArrowDown and ArrowUp open the list and move the caret through it with wrap, Alt+ArrowDown opens without moving and Alt+ArrowUp closes, Enter takes the highlighted row, Tab takes it on the way out, and Escape closes the list and is stopped so it does not also close a dialog around the field. Home and End are left to the text caret."},onCommit:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxCommit",emits:[{name:"change",description:"A refused value was put back; e.target is the element. An accepted one lets the control's own change bubble instead, so exactly one change reaches a host per edit."}],description:"The commit, on the control's own change. An accepted value stands in the row's spelling; a value a closed list does not hold is put back, the control's change is stopped at the control, and the element says change once for itself."},onPick:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxPick",emits:[{name:"input",description:"A row was taken; e.target is the element."},{name:"change",description:"The edit the pick made is finished; e.target is the element."}],description:"A row's own bubbling select: its value into the field, the list closed, the caret back in the control, and one input then change from the element rather than from the row."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxToggle",description:"Mirrors the panel's toggle into open, and drops the highlight when the list closes."},onButton:{$prototype:"Function",$src:"jx-ui:/behaviors/combobox.ts",$export:"onComboboxButton",description:"The chevron: shows the list under the field with the caret on the row the field already holds, and puts the text caret in the control — or hides a list that is already showing. Not drawn while there are no rows."},onRowsPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps the caret in the control while the panel's own gutter is pressed. jx-option cancels the press on a row; this is the same cancellation for the space around the rows, so a press that lands between two of them does not blur the field and fire a change for an edit the reader has not finished."}},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-size":"${state.size}","data-open":"${state.open ? '' : null}","data-empty":"${Array.isArray(state.options) && state.options.length > 0 ? null : ''}","data-invalid":"${state.invalid ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-combobox-h":"var(--jx-control-h)","--jx-combobox-pad":"var(--jx-space-3)",'&[data-size="sm"]':{"--jx-combobox-h":"calc(var(--jx-control-h) - 4px)","--jx-combobox-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-combobox-h":"calc(var(--jx-control-h) + 8px)"},'& [part="field"]':{display:"flex",alignItems:"center",boxSizing:"border-box",width:"100%",minHeight:"var(--jx-combobox-h)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{borderColor:"var(--jx-fg-muted)"},":focus-within":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-invalid] [part="field"]':{borderColor:"var(--jx-danger)"},'&[data-disabled] [part="field"]':{opacity:"0.5"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",flex:"1 1 auto",minWidth:"0",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-combobox-pad) var(--jx-space-1)",border:"0",background:"none",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",outline:"none","::placeholder":{color:"var(--jx-fg-muted)"},":disabled":{cursor:"default"}},'&[data-size="sm"] [part="input"]':{fontSize:"var(--jx-text-sm)"},'&[data-size="lg"] [part="input"]':{fontSize:"var(--jx-text-lg)"},'& [part="toggle"]':{$description:"The toggle sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3), the same shape as jx-textfield's clear button: an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the caret and its box stay where they were; on a large field the inset is positive and the pseudo-element is an invisible box inside a button already over the floor. `position: relative` is what the pseudo-element measures against, and it is new here: the toggle is a flex item of the field, not an absolutely placed one. The rotation the open state applies turns the pseudo-element with the button, which a square does not mind. `contain: layout` keeps that invisible expansion a LOCAL fact: an absolutely positioned box still contributes to the SCROLLABLE overflow of the nearest ancestor whose own `overflow` is not `visible`, even though nothing clips it and nothing paints there, so a form host that scrolls (Preferences · Assistant does, at `overflow: auto`) picked up a couple of phantom pixels on every axis from these `::before`s alone and drew scrollbars over content that fit.",position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",flex:"0 0 auto",width:"calc(var(--jx-combobox-h) - 2px)",height:"calc(var(--jx-combobox-h) - 2px)",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",outline:"none",contain:"layout",transition:"rotate var(--jx-dur-1) var(--jx-ease-out)","::before":{content:'""',position:"absolute",inset:"calc((var(--jx-combobox-h) - 2px - var(--jx-control-h)) / 2)"},":hover":{color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-open] [part="toggle"]':{rotate:"180deg"},'&[data-empty] [part="toggle"]':{display:"none"},'&[data-empty] [part="input"]':{paddingInlineEnd:"var(--jx-combobox-pad)"},'& [part="list"]':{"--jx-listbox-max-block-size":"min(320px, 50vh)",minWidth:"0"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border, which is how a surface's banner rule drew a small painted box over a field's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="help-slot"]':{display:"contents"}},children:[{tagName:"div",attributes:{part:"field",role:"none"},children:[{tagName:"input",attributes:{part:"input",type:"text",role:"combobox",autocomplete:"${state.autocomplete}","aria-autocomplete":"list","aria-controls":"${state.listId || null}","aria-expanded":"${state.open ? 'true' : 'false'}","aria-activedescendant":"${state.open && state.activeId ? state.activeId : null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",placeholder:"${state.placeholder || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onCommit"}},{tagName:"button",attributes:{part:"toggle",type:"button",tabindex:"-1","aria-label":"Show suggestions",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onButton"},children:[{tagName:"jx-icon",$props:{name:"caret-down"},attributes:{part:"toggle-icon"}}]}]},{$description:"match-width, because a list narrower than its field reads as belonging to something else: the panel measures the HOST the sidecar names as its source, so the rows are as wide as the text box plus the chevron beside it.",tagName:"jx-popover",attributes:{part:"popup","match-width":"",id:"${state.panelId || null}"},ontoggle:{$ref:"#/state/onToggle"},children:[{tagName:"jx-listbox",attributes:{part:"list",id:"${state.listId || null}"},$props:{label:"${state.label || 'Suggestions'}",active:"${state.activeId}"},onselect:{$ref:"#/state/onPick"},onpointerdown:{$ref:"#/state/onRowsPointerDown"},children:[{$prototype:"Array",items:{$ref:"#/state/options"},key:{$ref:"$map/item/value"},map:{tagName:"jx-option",attributes:{part:"option",id:"${state.uid}-o${$map.index}",value:"${$map.item.value}",label:"${$map.item.label || $map.item.value}",description:"${$map.item.description || ''}",face:"${$map.item.face || ''}",swatch:"${$map.item.swatch || ''}",line:"${$map.item.line || ''}",weight:"${$map.item.weight || ''}",slant:"${$map.item.slant || ''}",variant:"${$map.item.variant || ''}",transform:"${$map.item.transform || ''}",decoration:"${$map.item.decoration || ''}",disabled:"${!!$map.item.disabled}"}}}]}]},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var hr={$schema:"https://jxsuite.com/schema/v1",$id:"JxListbox",tagName:"jx-listbox",observedAttributes:["label","labelledby","active"],state:{label:{type:"string",default:"",attribute:"label",description:`The list's accessible name, forwarded as aria-label. REQUIRED unless labelledby names a visible heading: listbox takes its name from a label rather than from its rows, so an unnamed one is announced as "listbox" and nothing else. Nothing lints it — a bound role makes the naming rules stand down — so the element's own test is what holds it.`},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded as aria-labelledby, naming the element that already says what this list is."},active:{type:"string",default:"",attribute:"active",description:"The ID of the row the caret is on; the empty string when none is. THIS IS THE ONE STRING A CONSUMER WRITES: the same id its owning field points aria-activedescendant at, so the field and the row are told the same thing once instead of the question being re-decided per row. The sidecar turns it into each row's selected and scrolls the new one back into view."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/listbox.ts",$export:"mountListbox",description:"Keeps every row's selected in step with active for as long as the element lives, and scrolls the active row into view. Both are things a document body cannot say: the flag lives on a foreign element, and scrolling is a measurement."}},attributes:{role:"listbox","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","data-active":"${state.active}"},style:{$description:"There is deliberately NO tabindex here, and no rule that draws a focus ring: the element never takes DOM focus. One of its two owners is a field that must keep the caret, and the other is nothing at all — a panel filtering for a caret in another realm. A listbox that is operated from somewhere else is exactly the shape ARIA's aria-activedescendant exists for.",display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",minHeight:"0",maxBlockSize:"var(--jx-listbox-max-block-size, none)",overflowY:"auto",margin:"0",padding:"0",color:"var(--jx-fg)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",'& [part="group-heading"]':{$description:`A furniture part a CONSUMER writes, styled from here because this is the definition that owns the box it sits in (ui.md 3.1). A grouped list is a role="group" wrapper holding a heading and its rows — the formula palette's shape — and in a light DOM the container's own rule reaches it without a class, which is the whole point of the cascade being one.`,display:"block",padding:"var(--jx-space-3) var(--jx-space-3) var(--jx-space-1)",fontSize:"var(--jx-text-xs)",textTransform:"uppercase",letterSpacing:"0.5px",color:"var(--jx-fg-muted)"},'& [part="empty"]':{$description:'The other furniture part: the sentence a consumer draws when its own filter matched nothing. What that sentence SAYS belongs to the surface — "No matches", "Nothing here yet", a hint about the mode — so the element draws it and never writes it.',display:"block",padding:"var(--jx-space-4) var(--jx-space-3)",textAlign:"center",color:"var(--jx-fg-muted)"}},children:[{tagName:"slot"}]};var ur={$schema:"https://jxsuite.com/schema/v1",$id:"JxOption",tagName:"jx-option",observedAttributes:["value","label","description","selected","disabled","face","swatch","line","weight","slant","variant","transform","decoration"],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for; the detail of the select event it dispatches. The empty string is a LEGAL value — a row meaning inherit or none — and never absence."},label:{type:"string",default:"",attribute:"label",description:"The row's words, and its accessible name. There is deliberately no default slot, which is jx-tab's answer to the same question: option takes its name from its contents, so unnamed content in the row would join the name, and a row whose only content was a badge would be announced as the badge."},description:{type:"string",default:"",attribute:"description",description:"A muted note drawn at the end of the row — a path, a category, a return type. It is TEXT and part of the row's name rather than a slot, exactly as jx-select's row description is, so a reader hears what they can see and the row keeps one accessible name. Absent draws no box."},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether this is the row the caret is on. THE LISTBOX IS ITS SINGLE WRITER, exactly as jx-tabs is of every tab's: a consumer moves the highlight by writing the listbox's active id — the same id its owning field already points aria-activedescendant at — and never a row's flag. In this listbox the active descendant and the selection are ONE row, because selection follows the caret; a multi-select listbox, which would need them apart, is not offered."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot be picked is disabled, never absent: it stays in the list, stays announced, and dispatches nothing when clicked."},face:{type:"string",default:"",attribute:"face",description:"The font family the label draws in, for a row that IS its own preview. It reaches the label as a custom property set inline on that span, so seventy rows intern the rules two rows do (spec.md 9.1) — the same channel jx-select's rows carry, under the same token name."},swatch:{type:"string",default:"",attribute:"swatch",description:"A colour chip drawn before the label, as any CSS colour. Absent by default, so a row that is not about a colour pays no box for one."},line:{type:"string",default:"",attribute:"line",description:"A border-style keyword drawn as a short rule before the label: solid, dashed, dotted, double. Absent by default."},weight:{type:"string",default:"",attribute:"weight",description:"The font weight the label draws in, for a row that IS its own preview: 700, bold, lighter. It reaches the label the way face does, as a custom property set inline on that span, so a list of nine weights interns one rule. Absent draws the row's own weight."},slant:{type:"string",default:"",attribute:"slant",description:"The font style the label draws in: italic or oblique. Named slant rather than style because style is the attribute every element already has. Absent draws upright."},variant:{type:"string",default:"",attribute:"variant",description:"The font variant the label draws in: small-caps. Absent draws the row's own."},transform:{type:"string",default:"",attribute:"transform",description:"The text transform the label draws with: uppercase, lowercase, capitalize. The label's WORDS are unchanged, so a reader hears the row's name and sees what choosing it would do. Absent draws the words as written."},decoration:{type:"string",default:"",attribute:"decoration",description:"The text decoration the label draws with, as any text-decoration value: underline, line-through, underline wavy. Absent draws none."},noSwatch:{$expression:{operator:"!",target:{$ref:"#/state/swatch"}}},noLine:{$expression:{operator:"!",target:{$ref:"#/state/line"}}},noDescription:{$expression:{operator:"!",target:{$ref:"#/state/description"}}},onClick:{$prototype:"Function",body:[{if:{operator:"!",target:{$ref:"#/state/disabled"}},then:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0,composed:!0}]}],emits:[{name:"select",description:"The row was picked; detail is its value. It bubbles, so the listbox's owner hears every row through one handler rather than one per row."}],description:"Activation dispatches select unless the row is disabled. The click is NOT stopped, which is where this differs from jx-menu-item: a menu row can contain another menu row and would activate both, and a listbox row can contain nothing, so stopping the click here would only take the gesture away from the panel's own handler."},onPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps the caret where it was while a row is pressed. A listbox row is not focusable, so the press would otherwise move focus to the nearest focusable ancestor — off the field that owns the keyboard, and out of the canvas the slash menu is filtering for — and a combobox would fire a change for a value the reader was in the middle of replacing. The same fix jx-textfield's clear button makes, for the same reason."}},attributes:{role:"option","aria-selected":"${state.selected ? 'true' : 'false'}","aria-disabled":"${state.disabled ? 'true' : null}"},onclick:{$ref:"#/state/onClick"},onpointerdown:{$ref:"#/state/onPointerDown"},style:{display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-control-h)",padding:"var(--jx-space-1) var(--jx-space-3)",borderRadius:"var(--jx-radius-sm)",color:"var(--jx-fg)",cursor:"pointer",userSelect:"none",scrollMarginBlock:"var(--jx-space-1)",":hover":{background:"var(--jx-hover-bg)"},'&[aria-selected="true"]':{$description:"The highlight is keyed on aria-selected rather than on a second data attribute, so the state a reader hears and the state a reader sees cannot come apart — and :hover is left as its own weaker rule, because the pointer moving over a row is a suggestion and the caret is the answer.",background:"var(--jx-accent-solid)",color:"var(--jx-accent-fg)"},'&[aria-disabled="true"]':{opacity:"0.45",cursor:"default"},'& [part="swatch"]':{display:"block",flex:"0 0 auto",inlineSize:"16px",blockSize:"16px",borderRadius:"var(--jx-radius-xs)",background:"var(--jx-row-swatch, transparent)",boxShadow:"inset 0 0 0 1px var(--jx-border)"},'& [part="line"]':{display:"block",flex:"0 0 auto",inlineSize:"32px",blockSize:"0",borderBlockStart:"2px var(--jx-row-line, none) currentColor"},'& [part="icon"]':{display:"inline-flex",flex:"0 0 auto",color:"var(--jx-fg-dim)"},'& [part="label"]':{display:"block",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",fontFamily:"var(--jx-row-face, inherit)",fontWeight:"var(--jx-row-weight, inherit)",fontStyle:"var(--jx-row-slant, inherit)",fontVariant:"var(--jx-row-variant, inherit)",textTransform:"var(--jx-row-transform, inherit)",textDecoration:"var(--jx-row-decoration, inherit)"},'& [part="description"]':{display:"block",minWidth:"0",marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-4)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="end"]':{display:"inline-flex",alignItems:"center",flex:"0 0 auto",paddingInlineStart:"var(--jx-space-3)",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="swatch"][hidden], & [part="line"][hidden], & [part="description"][hidden]':{display:"none"},'& [part="icon"]:empty, & [part="end"]:empty':{$description:"A slot leaves NO node once its content is distributed (spec.md 16.6), so a container that received nothing is genuinely empty and asking it is how an element finds out (ui.md 3.2). Without this, a row using neither channel still pays two boxes and the one gap between its label and its end becomes three.",display:"none"},'& [part="description"][hidden] + [part="end"], & [part="description"]:empty + [part="end"]':{$description:"The auto margin that pushes the end of the row to the end of the row lives on the description, which is where it belongs when there is one. With no description there is nothing holding that space open, so it moves here — and a display:none sibling still matches +, which is what makes one rule enough.",marginInlineStart:"auto"},'&[aria-selected="true"] [part="description"], &[aria-selected="true"] [part="end"], &[aria-selected="true"] [part="icon"]':{$description:"A highlighted row draws on the accent, and a muted grey on an accent fails SC 1.4.3. Every channel takes the row's own ink instead of keeping its own.",color:"inherit"}},children:[{tagName:"span",attributes:{part:"swatch","aria-hidden":"true"},style:{"--jx-row-swatch":"${state.swatch || 'transparent'}"},hidden:{$ref:"#/state/noSwatch"}},{tagName:"span",attributes:{part:"line","aria-hidden":"true"},style:{"--jx-row-line":"${state.line || 'none'}"},hidden:{$ref:"#/state/noLine"}},{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},style:{"--jx-row-face":"${state.face || 'inherit'}","--jx-row-weight":"${state.weight || 'inherit'}","--jx-row-slant":"${state.slant || 'inherit'}","--jx-row-variant":"${state.variant || 'inherit'}","--jx-row-transform":"${state.transform || 'inherit'}","--jx-row-decoration":"${state.decoration || 'inherit'}"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"description"},hidden:{$ref:"#/state/noDescription"},textContent:"${state.description}"},{tagName:"span",attributes:{part:"end"},children:[{tagName:"slot",attributes:{name:"end"}}]}]};var pr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSelect",tagName:"jx-select",observedAttributes:["label","labelledby","describedby","value","name","disabled","required","size","invalid","error","help"],state:{value:{type:"string",default:"",attribute:"value",description:"The chosen row's value. The empty string is a LEGAL value here — it is the inherit row, an option a reader can arrow to — and never means unset, so nothing in this element treats it as absence. It is written into the control as a PROPERTY and re-asserted by the sidecar whenever the option list changes; the selected content attribute is never written, because the first real keyboard pick makes an option dirty and the attribute stops moving selectedness from that moment on."},options:{type:"array",default:[],description:"Ungrouped rows, drawn above every group. A row is { value, label, description?, disabled?, face?, swatch?, line?, weight?, slant?, variant?, transform?, decoration? }: value and label are what the control is made of, and the rest are the drawing channels — a font face, a colour, a border style, and the five typographic axes the label can draw itself in (font weight, font style, font variant, text transform, text decoration), each arriving as a custom property on its own span so seventy rows still cost zero rules."},groups:{type:"array",default:[],description:"Grouped rows, as { id, label, rows }. Each group draws BOTH halves of its delimiter: the optgroup's label is what names the group in the accessibility tree, and the legend inside it is what draws the heading. Neither half substitutes for the other — strip the legend and the group keeps its name with nothing to look at, an 18px empty band above its first row."},unlisted:{type:"array",default:[],description:'Zero rows or one: the stand-in row for a value no group holds. A select whose value matches no option falls silently to index 0, so the sidecar synthesises the row rather than letting the element lie about what it holds. The sidecar computes it and this document renders it — the sidecar never builds DOM — and the row it renders carries part="unlisted", which is how the same computation tells its own row apart from the listed ones and does not loop.'},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the element's own error and help sentences."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control. It is also the answer to the one HTML-validity issue a page carrying this element otherwise raises: a form field element should have an id or a name."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be opened or focused, and submits nothing."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the control and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the control."},uid:{type:"string",default:"",description:"This element's own id stem, minted on mount. The error and help sentences take their ids from it, and the control names those ids in aria-describedby."},hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/select.ts",$export:"mountSelect",description:"Mints the id stem, then keeps the control's selectedness and its stand-in row in step with state.value as the option list changes. Both are things a document body cannot say: the value property binding runs before the first option exists, its write is refused, and it never re-runs because nothing it read changed."},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}}],description:"Writes what the reader picked into value, and NOTHING else. The control's own input and change already bubble out of the element with e.target being the inner select, which is the contract jx-textfield has; a body that dispatched change as well would hear its own event and re-enter — one pick measured 43 change events before this said only the one thing."}},attributes:{"data-size":"${state.size}","data-invalid":"${state.invalid ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-select-h":"var(--jx-control-h)","--jx-select-pad":"var(--jx-space-3)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-select-h":"calc(var(--jx-control-h) - 4px)","--jx-select-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-select-h":"calc(var(--jx-control-h) + 8px)"},"& select":{appearance:"base-select",boxSizing:"border-box",display:"flex",alignItems:"center",width:"100%",minHeight:"var(--jx-select-h)",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-select-pad)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",textAlign:"start",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)",":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"},"&::picker(select)":{appearance:"base-select",boxSizing:"border-box",margin:"0",padding:"var(--jx-space-1)",border:"0",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-popover)",maxHeight:"min(320px, 60vh)",overflowY:"auto",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)"},"&::picker-icon":{marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-2)",color:"var(--jx-fg-muted)",transition:"rotate var(--jx-dur-1) var(--jx-ease-out)"},"&:open::picker-icon":{rotate:"180deg"},"& optgroup":{margin:"0",padding:"0",font:"inherit",color:"inherit",background:"none"},"& hr":{margin:"var(--jx-space-1) var(--jx-space-2)",border:"0",borderBlockStart:"1px solid var(--jx-border)"},"& option":{boxSizing:"border-box",display:"flex",alignItems:"center",gap:"var(--jx-space-3)",minHeight:"var(--jx-select-h)",paddingBlock:"var(--jx-space-1)",paddingInline:"var(--jx-space-2)",borderRadius:"var(--jx-radius-xs)",color:"var(--jx-fg)",":hover":{background:"var(--jx-hover-bg)"},":disabled":{opacity:"0.45"},"&::checkmark":{order:"1",marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-3)"},"&:checked::checkmark":{color:"var(--jx-accent)"}},"& option[hidden]":{display:"none"}},"&[data-invalid] select":{borderColor:"var(--jx-danger)"},'& [part="trigger"]':{display:"flex",alignItems:"center",flex:"1 1 auto",minWidth:"0",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"0",background:"none",color:"inherit",font:"inherit",textAlign:"start",outline:"none"},'& [part="preview"]':{display:"flex",alignItems:"center",gap:"var(--jx-space-3)",minWidth:"0",overflow:"hidden",whiteSpace:"nowrap"},'& [part="preview"] [part="description"]':{display:"none"},'& [part="group-heading"]':{display:"block",padding:"var(--jx-space-2) var(--jx-space-2) var(--jx-space-1)",fontSize:"var(--jx-text-sm)",fontWeight:"600",color:"var(--jx-fg-muted)"},'& [part="text"]':{fontFamily:"var(--jx-row-face, inherit)",fontWeight:"var(--jx-row-weight, inherit)",fontStyle:"var(--jx-row-slant, inherit)",fontVariant:"var(--jx-row-variant, inherit)",textTransform:"var(--jx-row-transform, inherit)",textDecoration:"var(--jx-row-decoration, inherit)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="swatch"]':{background:"var(--jx-row-swatch, transparent)",inlineSize:"16px",blockSize:"16px",flex:"0 0 auto",borderRadius:"var(--jx-radius-xs)",boxShadow:"inset 0 0 0 1px var(--jx-border)"},'& [part="line"]':{borderBlockStart:"2px var(--jx-row-line, none) currentColor",inlineSize:"32px",blockSize:"0",flex:"0 0 auto"},'& [part="description"]':{marginInlineStart:"auto",paddingInlineStart:"var(--jx-space-4)",color:"var(--jx-fg-muted)",fontSize:"var(--jx-text-sm)"},'& [part="swatch"][hidden], & [part="line"][hidden], & [part="description"][hidden]':{display:"none"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border: Studio's Source Control banner rule drew a 16×13 box over the branch picker's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="help-slot"]':{display:"contents"}},children:[{tagName:"select",attributes:{part:"control","data-value":"${state.value}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},required:{$ref:"#/state/required"}},value:{$ref:"#/state/value"},onchange:{$ref:"#/state/onChange"},children:[{tagName:"button",attributes:{part:"trigger",type:"button",tabindex:"-1",role:"none"},children:[{tagName:"selectedcontent",attributes:{part:"preview"}}]},{$prototype:"Array",items:{$ref:"#/state/unlisted"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"unlisted",value:"${$map.item.value}"},children:[{tagName:"span",attributes:{part:"text"},textContent:"${$map.item.label}"}]}},{$prototype:"Array",items:{$ref:"#/state/options"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"option",value:"${$map.item.value}",disabled:"${!!$map.item.disabled}"},children:[{tagName:"span",attributes:{part:"swatch",hidden:"${!$map.item.swatch}"},style:{"--jx-row-swatch":{$ref:"$map/item/swatch"}}},{tagName:"span",attributes:{part:"line",hidden:"${!$map.item.line}"},style:{"--jx-row-line":{$ref:"$map/item/line"}}},{tagName:"span",attributes:{part:"text"},style:{"--jx-row-face":{$ref:"$map/item/face"},"--jx-row-weight":{$ref:"$map/item/weight"},"--jx-row-slant":{$ref:"$map/item/slant"},"--jx-row-variant":{$ref:"$map/item/variant"},"--jx-row-transform":{$ref:"$map/item/transform"},"--jx-row-decoration":{$ref:"$map/item/decoration"}},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"description",hidden:"${!$map.item.description}"},textContent:"${$map.item.description || ''}"}]}},{$prototype:"Array",items:{$ref:"#/state/groups"},key:{$ref:"$map/item/id"},map:{tagName:"optgroup",attributes:{part:"group",label:"${$map.item.label}"},children:[{tagName:"legend",attributes:{part:"group-heading"},textContent:"${$map.item.label}"},{$prototype:"Array",items:{$ref:"$map/item/rows"},key:{$ref:"$map/item/value"},map:{tagName:"option",attributes:{part:"option",value:"${$map.item.value}",disabled:"${!!$map.item.disabled}"},children:[{tagName:"span",attributes:{part:"swatch",hidden:"${!$map.item.swatch}"},style:{"--jx-row-swatch":{$ref:"$map/item/swatch"}}},{tagName:"span",attributes:{part:"line",hidden:"${!$map.item.line}"},style:{"--jx-row-line":{$ref:"$map/item/line"}}},{tagName:"span",attributes:{part:"text"},style:{"--jx-row-face":{$ref:"$map/item/face"},"--jx-row-weight":{$ref:"$map/item/weight"},"--jx-row-slant":{$ref:"$map/item/slant"},"--jx-row-variant":{$ref:"$map/item/variant"},"--jx-row-transform":{$ref:"$map/item/transform"},"--jx-row-decoration":{$ref:"$map/item/decoration"}},textContent:"${$map.item.label}"},{tagName:"span",attributes:{part:"description",hidden:"${!$map.item.description}"},textContent:"${$map.item.description || ''}"}]}}]}},{tagName:"slot"}]},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var fr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSpinner",tagName:"jx-spinner",observedAttributes:["value","label","size"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"How far along, 0 to 100. Empty is the indeterminate state: an ARIA progressbar with no aria-valuenow IS indeterminate, so an empty value writes none of the value attributes and the ring spins instead of filling. A string, never a number, because a numeric state entry turns a removed attribute into 0 and could never say empty. A host that writes a number through the property door anyway is read through #/state/progress, which is the ONE predicate the whole element renders from."},label:{type:"string",default:"",attribute:"label",description:'What is being waited for, announced. Empty hides the spinner from assistive technology, which is right whenever the surrounding text already says the app is busy; a bare "progressbar" announcement is not.'},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. md matches the kit's icon size, so a spinner swapped in for an icon does not move the row."},progress:"${state.value === '' || state.value === null || state.value === undefined ? '' : '' + state.value}",isDeterminate:{$expression:{operator:"!==",target:{$ref:"#/state/progress"},value:""}},ring:"${state.progress === '' ? 'none' : 'conic-gradient(var(--jx-spin-color) ' + state.progress + '%, var(--jx-spin-track-color) 0)'}"},attributes:{role:"progressbar","aria-label":"${state.label || null}","aria-hidden":"${state.label ? null : 'true'}","aria-valuenow":"${state.progress || null}","aria-valuemin":"${state.progress ? '0' : null}","aria-valuemax":"${state.progress ? '100' : null}","data-size":"${state.size}","data-determinate":"${state.progress ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",flex:"none","--jx-spin-size":"var(--jx-icon-size, 16px)","--jx-spin-track":"2px","--jx-spin-dur":"900ms","--jx-spin-color":"currentColor","--jx-spin-track-color":"var(--jx-border)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-spin-size":"12px"},'&[data-size="lg"]':{"--jx-spin-size":"20px"},'& [part="glyph"]':{display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",width:"var(--jx-spin-size)",height:"var(--jx-spin-size)",borderRadius:"50%",color:"var(--jx-spin-color)",animation:"jx-spin var(--jx-spin-dur) linear infinite"},'& [part="glyph-icon"]':{"--jx-icon-size":"var(--jx-spin-size)"},'&[data-determinate] [part="glyph"]':{animation:"none",mask:"radial-gradient(farthest-side, transparent calc(100% - var(--jx-spin-track)), black 0)"},"@(prefers-reduced-motion: reduce)":{"--jx-spin-dur":"2400ms"},"@(forced-colors: active)":{"--jx-spin-track":"3px"},"@keyframes jx-spin":{from:{rotate:"0deg"},to:{rotate:"360deg"}}},children:[{tagName:"span",attributes:{part:"glyph"},style:{background:"${state.ring}"},children:[{tagName:"jx-icon",attributes:{part:"glyph-icon"},hidden:{$ref:"#/state/isDeterminate"},$props:{name:"spinner",weight:"bold"}}]}]};var mr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSplit",tagName:"jx-split",observedAttributes:["orientation","label","value","min","max","gap","step","large-step","collapse","disabled"],state:{orientation:{type:"string",default:"vertical",attribute:"orientation",description:`vertical or horizontal — the separator's OWN orientation, which is ARIA's meaning and the opposite of the axis it moves on: a vertical splitter is the upright line between two side-by-side panes, dragged left and right. Only "horizontal" turns it; every other value, the default included, is the upright one.`},label:{type:"string",default:"Split",attribute:"label",description:"The accessible name. A separator is in neither the accessibility lint's content-named roles nor its labelled ones, so an unnamed one is invisible to every gate and a reader arriving on it is told they have landed on a separator and nothing more. Name every splitter after the thing it divides."},value:{type:"number",default:0.5,attribute:"value",description:"Where the splitter sits: the LEADING side's share of the box it divides, 0-1. A fraction rather than pixels because a splitter has no size of its own to report, and because the same stored number survives a window resize. It is aria-valuenow, and the element is its own writer during a gesture — a host reads it back off the input and change events."},min:{type:"number",default:0,attribute:"min",description:"The smallest share the leading side may have, and aria-valuemin. A policy about the split, which is why it is a constant a host declares rather than something derived: gap answers the other question, and the two are intersected."},max:{type:"number",default:1,attribute:"max",description:"The largest share, and aria-valuemax."},gap:{type:"number",default:0,attribute:"gap",description:"The smallest EITHER side may be, in pixels of the measured track. Converted into the value's own units at gesture time, so it needs no listener and cannot go stale when the window resizes — which a fractional floor computed from a width by a host always does. A track too narrow for two gaps has no legal position, and the splitter goes to the middle of its crossed bounds."},step:{type:"number",default:0.02,attribute:"step",description:"What one arrow key moves the value by. Two per cent of the track is a nudge a reader can aim with; a value that is not a positive number falls back to it."},largeStep:{type:"number",default:0.1,attribute:"large-step",description:"What Shift+Arrow moves it by — the same coarse gesture jx-number-field and jx-color-slider add, and one the platform has on nothing."},collapse:{type:"number",default:-1,attribute:"collapse",description:"The value Enter and a double click move to, and back from. The default is below every legal share, so it clamps to min: collapsing means going to the floor unless a host says otherwise. A splitter whose two sides are both real panes points it wherever its double click has always gone."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be moved, by pointer or by key, and drops out of the tab order. aria-disabled rather than removal, because a splitter a reader cannot find is a layout they cannot explain."},dragging:{type:"boolean",default:!1,description:"Whether a pointer gesture is live. Written by the behaviour and mirrored as data-dragging, so the splitter stays lit for the length of a drag that has left it — which is the whole point of the pointer capture."},restore:{type:"number",default:-1,description:"Where the collapse toggle returns to, recorded on the way down. Negative until a collapse has recorded one, which is a value no share can be."},valueText:"${Math.round(((state.value - state.min) / ((state.max - state.min) || 1)) * 100) + '%'}",onPointerDown:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerDown",description:"Measures the track once, captures the gesture on the element and takes the focus, so the arrow keys carry on from where the pointer stopped. The value does not jump: the splitter is already the thing under the cursor."},onPointerMove:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerMove",description:"The drag, against the length measured at pointerdown. Nothing moves without a press first, so a hover moves no split.",emits:[{name:"input",description:"The splitter is moving under the reader's hand. It comes from the ELEMENT, so e.target.value is where it is — and detail is the modifiers this step was made with, { altKey, ctrlKey, metaKey, shiftKey }, for a host whose own snap needs a way through. The element gives none of them a meaning here; what a breakpoint is, and which key skips it, is the host's to say."}]},onPointerUp:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitPointerUp",description:"Ends the gesture and commits once. Bound to pointercancel and lostpointercapture as well as pointerup: a capture lost any other way is still a gesture that is over, and a splitter left in the dragging state would follow the next pointer that crossed it with no button down.",emits:[{name:"change",description:"The reader let go; e.target is the element, and detail is the modifiers the release carried. Dispatched even when the last move changed nothing, because the commit is about the gesture ending."}]},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitKeydown",description:"The splitter keyboard: the arrows of its own axis with Shift for the larger step, Home and End for the extremes, and Enter for the collapse toggle. A keystroke is a move AND a commit. Every other key reaches the host untouched.",emits:[{name:"input",description:"A key moved the splitter; detail is the modifiers it was pressed with. Shift is reported even though the element spent it on the large step: what a host makes of a modifier is the host's business."},{name:"change",description:"The same key committed it, with the same detail."}]},onDoubleClick:{$prototype:"Function",$src:"jx-ui:/behaviors/split.ts",$export:"onSplitDoubleClick",description:"Collapses the split, and restores it on the next one. This is the SC 2.5.7 door — a single-pointer alternative to dragging — and it is deliberately the same function Enter runs, so the two cannot drift.",emits:[{name:"input",description:"The toggle moved the splitter; detail is the click's modifiers."},{name:"change",description:"And committed it, with the same detail."}]}},attributes:{role:"separator",tabindex:"${state.disabled ? '-1' : '0'}","aria-label":"${state.label}","aria-orientation":"${state.orientation}","aria-valuenow":"${state.value}","aria-valuemin":"${state.min}","aria-valuemax":"${state.max}","aria-valuetext":"${state.valueText}","aria-disabled":"${state.disabled ? 'true' : null}",orientation:"${state.orientation}","data-dragging":"${state.dragging ? '' : null}"},onpointerdown:{$ref:"#/state/onPointerDown"},onpointermove:{$ref:"#/state/onPointerMove"},onpointerup:{$ref:"#/state/onPointerUp"},onpointercancel:{$ref:"#/state/onPointerUp"},onlostpointercapture:{$ref:"#/state/onPointerUp"},onkeydown:{$ref:"#/state/onKeydown"},ondblclick:{$ref:"#/state/onDoubleClick"},style:{$description:"`z-index: 3` is not decoration: a Navigator/Inspector split sits at the shell level, a sibling of the pane grid rather than a descendant of it, so where its box happens to meet a pane's own edge is decided by whichever stacking context wins — not by DOM order. `panels/pane-context.ts`'s floating toolbar band (`surfaces/pane-context.json`'s `[part=\"chrome\"]`) is `position: relative; z-index: 2` so it can float over the canvas stage, and that band's own edge sits flush against this splitter's box at the pane boundary. At `z-index: 1` the band won the last couple of pixels of the splitter's own 5px width, so a drag started right at that edge grabbed the toolbar instead of the handle — the reader-visible shape of that was `elementFromPoint` returning the band's `[part=\"bar\"]` for x inside the splitter's own rect. `3` clears every floating band in the shell (the chrome band's `2`, `diff-toolbar`'s `2`) without touching their own stacking, which still does its job of floating over the stage.",display:"block","&[hidden]":{display:"none"},flex:"none",position:"relative",zIndex:"3",touchAction:"none",background:"var(--jx-border)",cursor:"col-resize",inlineSize:"5px",outline:"none",'&[orientation="horizontal"]':{cursor:"row-resize",inlineSize:"auto",blockSize:"5px"},"&:hover, &[data-dragging]":{background:"var(--jx-accent)",opacity:"0.5"},"&:focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-disabled="true"]':{cursor:"default"},'&[aria-disabled="true"]:hover':{background:"var(--jx-border)",opacity:"1"}},children:[]};var br={$schema:"https://jxsuite.com/schema/v1",$id:"JxTooltip",tagName:"jx-tooltip",observedAttributes:["delay","for","placement","x","y","arrow"],state:{delay:{type:"number",default:500,attribute:"delay",description:"How long the pointer must rest on the control before the tip appears, in milliseconds. Keyboard focus never waits: a reader who tabbed to the control has already committed. Read only on the FALLBACK path — where the engine implements interest invokers and the control carries interestfor, the wait is the platform's own interest-delay-start and this number is not consulted, so set the CSS property on the control if you need to change it there."},for:{type:"string",default:"",attribute:"for",description:"The id of the control this tip describes, in the same root. The declarative wiring is the other way round and is preferred — interestfor on the control, naming this tip's id, and this prop left unset — and it works on every engine: where interest invokers are missing the tip binds an interestfor control's pointer and focus events itself, exactly as it does for a control this prop names. Either way the listeners come off again when the tip leaves the document. It is read once, at mount; a host that wires a tip up later calls bindTooltip from jx-ui:/behaviors/tooltip.ts itself."},placement:{type:"string",default:"block-end span-inline-end",attribute:"placement",description:"Where the tip sits relative to its control, as a CSS position-area value: below it with leading edges aligned by default, which is where the arrow points from. It applies while the tip is anchored — shown from a control the platform knows, by interestfor or by the element's own binding — on an engine with CSS anchor positioning; the platform then follows the control through scroll and resize and flips the tip above it when it would overflow (the --jx-tooltip-above try option, which keeps the gap on the right side). Elsewhere the tip stands at x and y, placed and flipped by the element itself."},x:{type:"number",default:0,attribute:"x",description:"Where the tip's inline-start edge sits, in viewport pixels, whenever the tip is NOT anchored: on an engine without CSS anchor positioning, or shown from nothing. Written by the element when it opens, from the box of the control it describes; a host that places the tip itself sets it and names no control."},y:{type:"number",default:0,attribute:"y",description:"Where the tip's block-start edge sits, in viewport pixels. The tip is placed under its control, or above it when there is no room below — never over it, because a tip that covers the control it describes hides what the reader is pointing at."},arrow:{type:"boolean",default:!1,attribute:"arrow",description:"Draws a pointer at the edge of the tip that faces its control — the block-start edge for a tip below it, the block-end edge for one that flipped above. Decorative, and aria-hidden: it says nothing the tip's own text does not."},flipped:{type:"boolean",default:!1,description:"Whether the tip landed ABOVE its control because there was no room below. Written by the element when it opens, and read by nothing but the arrow: a pointer pinned to the block-start edge of a tip that flipped points away from the control it belongs to. A host that places the tip itself sets x and y, and sets this to say which way its arrow faces. Anchored, the flip is the platform's and this is MEASURED — the tip's box above its control's — a frame after the tip shows and again, at most once per frame, whenever the page scrolls, the window resizes or either box changes size, until the tip closes, so the arrow follows a flip the element did not make, including one the platform makes while the tip is up."},anchored:{type:"boolean",default:!1,description:"Whether the platform is placing the tip against the control it was shown from. Written by the behaviour on beforetoggle, before layout, so the first frame is already in place; cleared on close; mirrored as data-anchored for the anchored rule. Not an attribute, because it is the platform's fact."},open:{type:"boolean",default:!1,description:"Whether the tip is showing. Follows the platform's toggle event; write it through showPopover() and hidePopover(), not directly."},noArrow:{$expression:{operator:"!",target:{$ref:"#/state/arrow"}}},onBeforeToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipBeforeToggle",description:"Decides anchored before the tip is laid out: an opening shown from a control the platform or the binding names is anchored; a closing clears it. Before layout, so a tip that learned it was anchored a frame late would not paint once at its coordinates and jump."},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipToggle",description:"Mirrors the platform's toggle into open, and places a freshly shown tip under the control it describes — or, when the platform is placing it by anchor, only reads back which side of the control it is on — a frame later and then on every scroll, resize and size change while it shows — so the arrow can follow; the closing toggle stops that reading. Placing here rather than on the gesture is what lets the declarative path work: an interestfor control shows the tip without telling the element anything, and the toggle is the first the element hears of it."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipReady",description:"Binds the control the tip is wired to — the one for names, or the one declaring interestfor at this tip — on the fallback path. Nothing is bound where the engine implements interest invokers and the control declares one, because there the platform owns the pair."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"onTooltipUnmount",description:"Takes the fallback listeners off the control again, one microtask after the tip left the document and only if it is still out by then. They sit on an element the kit does not own and which outlives the tip, so without this a removed tip keeps answering its control's pointer; but a tip that is MOVED, by a keyed $map reordering its rows or a host re-parenting the control, is disconnected and reconnected in one step and never mounts again, so an unmount that disposed at once would leave it silent for good."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the element has rendered and carries its popover attribute, so a host may show it — and gives the element its own first sight of itself, which is how onReady reaches the control that for names."}},onbeforetoggle:{$ref:"#/state/onBeforeToggle"},ontoggle:{$ref:"#/state/onToggle"},"onjx-ready":{$ref:"#/state/onReady"},attributes:{role:"tooltip",popover:"hint","data-open":"${state.open ? '' : null}","data-flipped":"${state.flipped ? '' : null}","data-anchored":"${state.anchored ? '' : null}"},style:{display:"revert-layer","&[hidden]":{display:"none"},position:"fixed",insetInlineStart:"${state.x}px",insetBlockStart:"${state.y}px",insetInlineEnd:"auto",insetBlockEnd:"auto",boxSizing:"border-box",margin:"0",padding:"var(--jx-space-1) var(--jx-space-3)",maxWidth:"min(280px, calc(100vw - 8px))",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",textAlign:"start",opacity:"1",pointerEvents:"auto",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete, overlay var(--jx-dur-1) allow-discrete",":popover-open":{display:"block"},"&[hidden]:popover-open":{display:"none"},"@position-try --jx-tooltip-above":{positionArea:"block-start span-inline-end",marginBlockStart:"0",marginBlockEnd:"6px"},"@supports (position-area: block-end)":{$description:"The anchored placement: the platform puts the tip against its IMPLICIT anchor — the control it was shown from, by interestfor or by the binding's showPopover({ source }) — follows that control through scroll and resize, and flips the tip above it when it would overflow, through the --jx-tooltip-above try option rather than a bare flip-block so the 6px gap the arrow fills moves to the other side with it. No anchor-name is involved (ui.md 5.2, 6). The insets are released so x and y stop mattering. Outside this block the coordinate placement above is the answer, unchanged.","&[data-anchored]":{insetInlineStart:"auto",insetBlockStart:"auto",marginBlockStart:"6px",positionArea:"${state.placement}",positionTryFallbacks:"--jx-tooltip-above, flip-inline, --jx-tooltip-above flip-inline"}},"@starting-style":{"&:popover-open":{opacity:"0"}},'& > [part="arrow"]':{position:"absolute",insetBlockEnd:"100%",insetInlineStart:"var(--jx-space-4)",width:"8px",height:"8px",marginBlockEnd:"-5px",background:"var(--jx-bg-overlay)",borderInlineStart:"1px solid var(--jx-border-strong)",borderBlockStart:"1px solid var(--jx-border-strong)",transform:"rotate(45deg)"},'&[data-flipped] > [part="arrow"]':{insetBlockEnd:"auto",insetBlockStart:"100%",marginBlockEnd:"0",marginBlockStart:"-5px",borderInlineStart:"none",borderBlockStart:"none",borderInlineEnd:"1px solid var(--jx-border-strong)",borderBlockEnd:"1px solid var(--jx-border-strong)"}},children:[{tagName:"slot"},{tagName:"div",attributes:{part:"arrow","aria-hidden":"true"},hidden:{$ref:"#/state/noArrow"}}]};var gr={$schema:"https://jxsuite.com/schema/v1",$id:"JxNumberField",tagName:"jx-number-field",$elements:[{$ref:"./jx-icon.json"}],observedAttributes:["value","min","max","step","placeholder","label","labelledby","describedby","disabled","stepper","step-up-label","step-down-label","name","size"],state:{value:{type:"string",default:"",attribute:"value",description:"The field's text, as a string rather than a number. An empty value means empty: a numeric entry would read a removed attribute as 0, so clearing a numeric key would write 0 into the document instead of deleting it. It is bound twice, as the control's value property AND as its value content attribute: the property is what tracks state once the reader has typed (typing sets the control's dirty value flag, after which the attribute no longer moves the live value), and the attribute keeps the control's DEFAULT value equal to its current one. The price of that mirror is that form.reset() is a no-op here, and it is deliberate: the element is not form-associated (specs/ui.md §3.2), so it never hears the reset, and an unmirrored default would move the control while leaving this state where it was — the element and its control disagreeing silently, which is worse than a reset that does nothing."},min:{type:"string",default:"",attribute:"min",description:"The smallest value the control accepts, as a string. Empty removes the attribute rather than setting an empty one, and the step grid is measured from it."},max:{type:"string",default:"",attribute:"max",description:"The largest value the control accepts, as a string. Empty removes the attribute."},step:{type:"string",default:"",attribute:"step",description:"The stepping interval, as a string. Empty removes the attribute, leaving the platform's default of 1."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby. The help sentence under a row is the row's, not the field's."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited, stepped or focused."},stepper:{type:"boolean",default:!1,attribute:"stepper",description:"Draw the two stepping buttons. The Arrow keys step whether or not they are drawn; the buttons are for a pointer."},stepUpLabel:{type:"string",default:"Increase",attribute:"step-up-label",description:"The step-up button's accessible name. It is a real name rather than aria-hidden: a button with no name is reported as unnamed whether or not it is hidden from assistive technology."},stepDownLabel:{type:"string",default:"Decrease",attribute:"step-down-label",description:"The step-down button's accessible name."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},badInput:{type:"boolean",default:!1,description:"Mirrored from the control, never authored: the reader has typed something that is not a number, so the sanitized value reads empty while an edit is still in progress. A host that deletes a key on an empty value must not delete on this one, and it reads the case off the ELEMENT rather than off an event — this prop, or the data-bad-input attribute it mirrors, reached from a handler as event.target.closest('jx-number-field')."},onInput:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}},{operator:"=",target:{$ref:"#/state/badInput"},value:{$ref:"event#/target/validity/badInput"}}],description:"Mirrors what the reader types, and whether the control could parse it. The platform's own input event is left alone and goes on bubbling from the control, so a host's event.target is the live input."},onChange:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onNumberChange",description:"The reader committed an edit: reads the control back into state. The platform's own change event is neither stopped nor re-sent, so a host still reaches event.target.valueAsNumber (NaN when empty), .validity and .form on the live control; the sanitization case is read off the element as badInput, not off a detail."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onNumberKeydown",description:"Shift and an Arrow move ten steps, through the control's own stepping API.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepUp:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onStepUp",description:"The step-up button: one step up.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepDown:{$prototype:"Function",$src:"jx-ui:/behaviors/number-field.ts",$export:"onStepDown",description:"The step-down button: one step down.",emits:[{name:"input",description:"The value moved. Dispatched from the element, because the platform fires nothing for a value the element wrote itself. No detail: event.target is the element, whose own value is the same string."},{name:"change",description:"The value was committed. Dispatched from the element for the same reason, with no detail; the sanitization case is the element's own badInput."}]},onStepperPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps focus in the field while a stepping button is pressed. Without it the blur that follows the press fires a second change for the same edit."}},attributes:{"data-size":"${state.size}","data-disabled":"${state.disabled ? '' : null}","data-stepper":"${state.stepper ? '' : null}","data-bad-input":"${state.badInput ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle",minWidth:"0","&[hidden]":{display:"none"},'& [part="field"]':{display:"flex",alignItems:"stretch",minWidth:"0",width:"100%"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",flex:"1 1 auto",width:"100%",minWidth:"0",minHeight:"var(--jx-control-h)",margin:"0",padding:"0 var(--jx-space-3)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",fontVariantNumeric:"tabular-nums",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)","::placeholder":{color:"var(--jx-fg-muted)"},"::-webkit-inner-spin-button":{appearance:"none",margin:"0"},"::-webkit-outer-spin-button":{appearance:"none",margin:"0"},":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="stepper-slot"]':{display:"contents"},'& [part="stepper"]':{display:"flex",flexDirection:"column",marginInlineStart:"var(--jx-space-1)"},'& [part="step-up"], & [part="step-down"]':{appearance:"none",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"1 1 0",width:"var(--jx-space-5)",padding:"0",margin:"0",border:"1px solid var(--jx-border-strong)",background:"var(--jx-bg-input)",color:"var(--jx-fg-dim)",cursor:"default","--jx-icon-size":"10px",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5"}},'& [part="step-up"]':{borderRadius:"var(--jx-radius-sm) var(--jx-radius-sm) 0 0",borderBottom:"0"},'& [part="step-down"]':{borderRadius:"0 0 var(--jx-radius-sm) var(--jx-radius-sm)"},'&[data-size="sm"] [part="input"]':{minHeight:"calc(var(--jx-control-h) - 4px)",fontSize:"var(--jx-text-sm)",padding:"0 var(--jx-space-2)"},'&[data-size="lg"] [part="input"]':{minHeight:"calc(var(--jx-control-h) + 8px)",fontSize:"var(--jx-text-lg)"}},children:[{tagName:"div",attributes:{part:"field",role:"none"},children:[{tagName:"input",attributes:{part:"input",type:"number",inputmode:"decimal",placeholder:"${state.placeholder || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${state.describedby || null}",name:"${state.name || null}",min:"${state.min || null}",max:"${state.max || null}",step:"${state.step || null}",disabled:{$ref:"#/state/disabled"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"},onchange:{$ref:"#/state/onChange"},onkeydown:{$ref:"#/state/onKeydown"}},{tagName:"div",attributes:{part:"stepper-slot",role:"none"},$switch:{$ref:"#/state/stepper"},cases:{true:{tagName:"div",attributes:{part:"stepper",role:"none"},children:[{tagName:"button",attributes:{part:"step-up",type:"button",tabindex:"-1","aria-label":"${state.stepUpLabel}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onStepUp"},onpointerdown:{$ref:"#/state/onStepperPointerDown"},children:[{tagName:"jx-icon",$props:{name:"caret-up",weight:"bold"},attributes:{part:"step-up-icon"}}]},{tagName:"button",attributes:{part:"step-down",type:"button",tabindex:"-1","aria-label":"${state.stepDownLabel}",disabled:{$ref:"#/state/disabled"}},onclick:{$ref:"#/state/onStepDown"},onpointerdown:{$ref:"#/state/onStepperPointerDown"},children:[{tagName:"jx-icon",$props:{name:"caret-down",weight:"bold"},attributes:{part:"step-down-icon"}}]}]}}}]}]};var wr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwatch",tagName:"jx-swatch",observedAttributes:["color","value","label","checked","selected","disabled","size"],$elements:[{$ref:"./jx-icon.json"}],state:{color:{type:"string",default:"",attribute:"color",description:"The colour the chip draws, as any CSS colour the page can resolve. Empty is a legal value and is the NO COLOUR chip: it draws a slashed square rather than nothing, because a blank square in a palette reads as a white swatch and picking it would be picking white."},value:{type:"string",default:"",attribute:"value",description:"What the swatch stands for: the detail of the select it dispatches, and what a swatch group compares its own value against. Empty falls back to color, so a palette of literal colours needs no second attribute; set it when the swatch stands for a TOKEN whose colour is only how it looks, which is the case a project's palette is made of."},label:{type:"string",default:"",attribute:"label",description:`The swatch's name, and its accessible name: it is written to aria-label, so it wins over anything slotted beside the chip. A COLOUR IS NOT A NAME. Without this the element falls back to the value and then to the colour, which announces "#3b82f6" one character at a time — legible, technically a name, and useless. Give every swatch in a palette the word a reader would use for it.`},checked:{type:"string",default:"",attribute:"checked",description:"Empty for a plain button; true or false for one member of a swatch group, which then carries role=radio and aria-checked on its control and puts role=none on the HOST so the radio is the group's own child rather than a grandchild behind a generic. jx-swatch-group is the single writer of this on its children, exactly as jx-tabs is of a tab's selected, so a host moves the selection by writing the group's value."},selected:{type:"boolean",default:!1,attribute:"selected",description:"Draws the chosen ring and the tick without announcing anything, for a swatch a host has chosen outside a radio group. It is the drawing alone: checked is what a reader is TOLD, and setting one never sets the other."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be chosen or focused. Disabled, never absent."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The chip grows; the button's target does not shrink below the kit's control height, so a small swatch is still a target a finger can hit."},tabindex:{type:"string",default:"",description:"Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the button inside, not the host, so a group moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so one control would become two tab stops."},inkOf:{$prototype:"Function",$src:"jx-ui:/color.ts",$export:"inkOn",parameters:["color"],description:"Black or white, whichever can be seen on the swatch's own colour, or the empty string for a colour only the browser can resolve. Pure: it takes the colour and returns a word."},ink:"${state.inkOf(state.color)}",token:"${state.value || state.color}",name:"${state.label || state.value || state.color || 'Colour'}",isChecked:{$expression:{operator:"===",target:{$ref:"#/state/checked"},value:"true"}},chosen:{$expression:{operator:"||",target:{$ref:"#/state/isChecked"},value:{$ref:"#/state/selected"}}},onClick:{$prototype:"Function",body:[{dispatchEvent:"select",detail:{$ref:"#/state/token"},bubbles:!0}],emits:[{name:"select",description:"The swatch was activated; detail is what it stands for. A swatch group listens for it and answers with its own change."}],description:"Activation says what the swatch stands for and nothing else. It does not write its own checked: inside a group the group owns that, and outside one the host does, and an element that chose itself would disagree with both."}},onclick:{$ref:"#/state/onClick"},attributes:{role:"${state.checked ? 'none' : null}","data-size":"${state.size}","data-chosen":"${state.chosen ? '' : null}","data-empty":"${state.color ? null : ''}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex","&[hidden]":{display:"none"},verticalAlign:"middle","--jx-swatch-size":"20px","--jx-swatch-color":"${state.color || 'transparent'}","--jx-swatch-ink":"${state.ink || 'var(--jx-border-strong)'}","--jx-color-checkerboard":"repeating-conic-gradient(var(--jx-gray-300) 0% 25%, var(--jx-bg-input) 0% 50%) 50% / 8px 8px",'&[data-size="sm"]':{"--jx-swatch-size":"14px"},'&[data-size="lg"]':{"--jx-swatch-size":"28px"},'& > [part="control"]':{appearance:"none",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minInlineSize:"var(--jx-control-h)",minBlockSize:"var(--jx-control-h)",margin:"0",padding:"var(--jx-space-1)",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg)",cursor:"pointer",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},":disabled":{opacity:"0.5",cursor:"default"}},'& [part="chip"]':{$description:"The ring is drawn with the ink the element worked out from its own colour rather than with a neutral border token, because a mid-grey boundary disappears against a mid-grey swatch and a control whose edge cannot be seen is a WCAG 1.4.11 failure. The checkerboard behind it is what makes a translucent colour read as translucent instead of as a paler opaque one.",position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",flex:"none",inlineSize:"var(--jx-swatch-size)",blockSize:"var(--jx-swatch-size)",borderRadius:"var(--jx-radius-xs)",background:"linear-gradient(var(--jx-swatch-color), var(--jx-swatch-color)), var(--jx-color-checkerboard)",boxShadow:"inset 0 0 0 1px var(--jx-swatch-ink)",color:"var(--jx-swatch-ink)"},'&[data-empty] [part="chip"]':{background:"linear-gradient(to bottom right, transparent calc(50% - 1px), var(--jx-danger) calc(50% - 1px), var(--jx-danger) calc(50% + 1px), transparent calc(50% + 1px)), var(--jx-bg-input)"},'&[data-chosen] [part="chip"]':{outline:"2px solid var(--jx-fg)",outlineOffset:"2px"},'& [part="mark"]':{display:"inline-flex",color:"inherit"},'& [part="label"]':{minInlineSize:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="label"]:empty':{display:"none"},'& [part="mark-slot"]':{display:"contents"}},children:[{tagName:"button",attributes:{part:"control",type:"button",role:"${state.checked ? 'radio' : null}","aria-checked":"${state.checked || null}","aria-label":"${state.name}",tabindex:"${state.tabindex || null}",disabled:{$ref:"#/state/disabled"}},children:[{tagName:"span",attributes:{part:"chip","aria-hidden":"true"},children:[{tagName:"span",attributes:{part:"mark-slot"},$switch:{$ref:"#/state/chosen"},cases:{true:{tagName:"jx-icon",$props:{name:"check",weight:"bold"},attributes:{part:"mark"}}}}]},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]}]};var xr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwatchGroup",tagName:"jx-swatch-group",observedAttributes:["value","label","columns"],state:{value:{type:"string",default:"",attribute:"value",description:"What the chosen swatch stands for; the empty string when none is. The group is the one writer of its children's checked state and of the roving caret, so a host owns this and nothing else — writing a child's checked directly puts the two into a disagreement only a re-render can settle."},label:{type:"string",default:"Colours",attribute:"label",description:'The accessible name of the group. A radiogroup is named by nothing else — it takes no name from its members — and no lint can say so, because a bound role switches the naming rules off. Name every group: "Theme palette" and "Recent colours" are two different questions and a reader hears only this.'},columns:{type:"number",default:0,attribute:"columns",description:"How many swatches to a row, or 0 to let them wrap on their own. A fixed grid is what makes a palette's rows line up when the swatches carry labels of different lengths; zero means unset rather than a grid of no columns, because a numeric prop coerces a removed attribute through the current value's type."},applySelection:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"applySwatchSelection",parameters:["scope"],description:"Writes the selection onto the swatches and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applySelection(state)}",onSelect:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupSelect",emits:[{name:"change",description:"The selection moved; detail is what the newly chosen swatch stands for, and e.target.value is the same string."}],description:"A swatch was activated: value is written first, then change is dispatched, so a listener reading e.target.value sees the new one. Re-choosing the swatch that is already chosen says nothing."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupKeydown",description:"The radio group's keyboard contract: either arrow pair moves the caret between enabled swatches with wrap, Home and End go to the ends, and the swatch the caret lands on is chosen. Both pairs move, because a palette wraps into rows and Down on a grid means the next one."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/swatch-group.ts",$export:"onSwatchGroupMount",description:"Gives the group its first sight of itself, syncs the swatches, and watches the set. Not optional: applyAttributes runs before distributeSlots, so no swatch exists when the root's bindings first evaluate."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The group has rendered and taken its slotted swatches, which is how onReady reaches the element itself."}],description:"Announces that the group has rendered. Its own onReady listens for it, and a host may too."}},attributes:{role:"radiogroup","aria-label":"${state.label}","data-selection":"${state.sync}","data-columns":"${state.columns > 0 ? '' : null}"},onselect:{$ref:"#/state/onSelect"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},flexWrap:"wrap",alignItems:"center",gap:"var(--jx-space-1)","&[data-columns]":{display:"grid",gridTemplateColumns:"repeat(${state.columns}, minmax(0, 1fr))"}},children:[{tagName:"slot"}]};var vr={$schema:"https://jxsuite.com/schema/v1",$id:"JxSwitch",tagName:"jx-switch",observedAttributes:["checked","disabled","hint","label","labelledby","describedby","name","size"],$elements:[{$ref:"./jx-tooltip.json"}],state:{checked:{type:"boolean",default:!1,attribute:"checked",description:"Whether the setting is on. Bound to the control BOTH ways, and the two halves do different jobs. The PROPERTY is what keeps tracking: once the reader flips the box the checkedness dirty flag is set and the content attribute stops controlling the live state, so an attribute binding alone would look right until the first click and then silently stop. The ATTRIBUTE is written as well so the control's defaultChecked can never disagree with the element's state — the same shape jx-textfield ships for value. The cost is that defaultChecked is also the form-reset default, so until the element is form-associated (specs/ui.md §3.2) form.reset() moves this switch nowhere. That is the deliberate half of the trade: with no form association the element never hears the reset, so a working reset would move the CONTROL to the authored default and leave the element's checked state behind it, and a control that silently disagrees with its own element is worse than a reset that does nothing."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be flipped or focused. Disabled, never absent, and the hint moves from the tip to the row's title while it is: a disabled control cannot open a tip, and why the setting cannot be changed is exactly what the reader hovers to find out."},hint:{type:"string",default:"",attribute:"hint",description:"The tooltip on the row: what turning the setting on does, or why it cannot be changed. The same hybrid jx-button and jx-action-button ship. While the switch is ENABLED it is drawn as a jx-tooltip child of this element — shown on keyboard focus at once and on hover after the tip's delay, hoverable and dismissible with Escape (SC 1.4.13) — and the control names it in aria-describedby, so it is a description beside the name and never the name itself. While the switch is DISABLED it is the native title of the wrapping label instead, because a disabled control receives no focus and no pointer event and could never open a tip, while the platform still shows a title on hover. Never both at once; empty draws neither. ONE difference from the buttons, and it is the platform's rather than the kit's: the tip is wired by `for` alone and the row declares NO `interestfor`. Interest invokers are supported on `a`, `area` and `button` only — never on a label or an input — so the attribute here would show nothing on Chrome 152 while telling the tooltip sidecar the platform had the pair, which is the one combination that draws no tip on any engine. The sidecar binds the label on every engine instead, and that is what the switch pays for a tooltip: six listeners on the row and two on the tip, always, where a button pays them only where the platform lacks the attribute."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Leave it empty when the slotted text is on screen: the wrapping label is then the name, and a second one would be read twice."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby, for a visible label the element does not own."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, for the help or error sentence on the row."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The track scales with it so a row of controls lines up."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the input inside, not the host and not the label that wraps it, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops.`},uid:{type:"string",default:"",description:"This row's own id stem, minted on mount by the tooltip sidecar. The label's id, the tip's id and the two attributes that wire one to the other are all built from it, so a consumer writes none of them and two hinted switches on one panel cannot collide. Empty until the mount microtask, which is why every binding that reads it guards on it."},hasTip:{$expression:{operator:"&&",target:{operator:"!",target:{operator:"!",target:{$ref:"#/state/hint"}}},value:{operator:"&&",target:{operator:"!",target:{$ref:"#/state/disabled"}},value:{operator:"!==",target:{$ref:"#/state/uid"},value:""}}}},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/tooltip.ts",$export:"mintHintId",description:"Mints the id stem the hint's tooltip is wired by. A document cannot: the closed operator set has no counter and no identity."},onChange:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/checked"},value:{$ref:"event#/target/checked"}}],description:"Mirrors the reader's flip into checked. The native change and input events bubble from the control as they always do, so a host reads e.target.checked exactly as it would from a bare input."}},attributes:{"data-size":"${state.size}","data-checked":"${state.checked ? '' : null}","data-disabled":"${state.disabled ? '' : null}"},style:{display:"inline-flex",verticalAlign:"middle","&[hidden]":{display:"none"},'& > [part="control"]':{display:"inline-flex",alignItems:"center",gap:"var(--jx-space-2)",minHeight:"var(--jx-control-h)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",cursor:"pointer"},'&[data-disabled] > [part="control"]':{cursor:"default",color:"var(--jx-fg-muted)"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",position:"relative",flex:"0 0 auto",width:"28px",height:"16px",margin:"0",padding:"0",border:"1px solid var(--jx-switch-track)",borderRadius:"999px",background:"var(--jx-switch-track)",cursor:"inherit",outline:"none","--jx-switch-travel":"12px",transition:"background var(--jx-dur-1) var(--jx-ease-out), border-color var(--jx-dur-1) var(--jx-ease-out)","::before":{content:'""',position:"absolute",insetBlockStart:"1px",insetInlineStart:"1px",width:"12px",height:"12px",borderRadius:"50%",background:"var(--jx-switch-thumb)",transition:"translate var(--jx-dur-1) var(--jx-ease-out)"},":checked":{background:"var(--jx-accent-solid)",borderColor:"var(--jx-accent-solid)","::before":{translate:"var(--jx-switch-travel) 0"}},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"2px"},":disabled":{opacity:"0.5",cursor:"default"}},'&:dir(rtl) [part="input"]:checked::before':{translate:"calc(-1 * var(--jx-switch-travel)) 0"},'&[data-size="sm"] [part="input"]':{width:"22px",height:"12px","--jx-switch-travel":"10px","::before":{width:"8px",height:"8px"}},'&[data-size="lg"] [part="input"]':{width:"34px",height:"20px","--jx-switch-travel":"14px","::before":{width:"16px",height:"16px"}},'& [part="label"]':{minWidth:"0"},'& [part="label"]:empty':{display:"none"},'& > [part="tooltip"]':{display:"contents"},"@(forced-colors: active)":{'& [part="input"]':{forcedColorAdjust:"none",background:"ButtonFace",borderColor:"ButtonText","::before":{background:"ButtonText"},":checked":{background:"Highlight",borderColor:"Highlight","::before":{background:"ButtonFace"}},":disabled":{borderColor:"GrayText",opacity:"1","::before":{background:"GrayText"}}}}},children:[{tagName:"label",attributes:{part:"control",id:"${state.uid || null}",title:"${state.disabled && state.hint ? state.hint : null}"},children:[{tagName:"input",attributes:{part:"input",type:"checkbox",role:"switch","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasTip ? state.uid + '-tip' : null, state.describedby || null].filter(Boolean).join(' ') || null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",disabled:{$ref:"#/state/disabled"},checked:{$ref:"#/state/checked"}},checked:{$ref:"#/state/checked"},onchange:{$ref:"#/state/onChange"}},{tagName:"span",attributes:{part:"label"},children:[{tagName:"slot"}]}]},{tagName:"span",attributes:{part:"tooltip"},$switch:{$ref:"#/state/hasTip"},cases:{true:{tagName:"jx-tooltip",attributes:{part:"tip",id:"${state.uid}-tip",for:"${state.uid}"},children:[{tagName:"span",attributes:{part:"tip-text"},textContent:"${state.hint}"}]}}}]};var yr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTab",tagName:"jx-tab",observedAttributes:["value","label","selected","panel","closable","dirty"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the tab stands for: the detail of the events it dispatches, and what the strip's selected is compared against."},label:{type:"string",default:"",attribute:"label",description:`The words on the tab, and its accessible name — written to aria-label as well as drawn, because a tab naming itself from its content would swallow the close button's own name and announce the label twice. That is also what makes the slots safe: aria-label wins over name-from-content, so nothing a consumer slots in — a marker, a pill, a pin — ever joins the tab's name, and each slotted control keeps announcing its own. The corollary is that label is REQUIRED once anything is slotted: with none there is no aria-label, name-from-content comes back, and a tab whose only content is a pin button is announced "Pin". Write it as an ATTRIBUTE: the runtime does not reflect a property write back to an attribute, so a host that sets el.label breaks every getAttribute("label") selector aimed at the strip while looking correct. A count belongs in this string, not in a badge of its own.`},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether this is the current tab. The strip writes it — jx-tabs is the single writer of every child's selected — so a host moves the selection by writing the strip's selected, never a tab's."},panel:{type:"string",default:"",attribute:"panel",description:"The id of the jx-tab-panel this tab controls, announced as aria-controls. Nothing checks the pairing: both ids live in the consumer's document, so mint the tab's id and this one from one key."},closable:{type:"boolean",default:!1,attribute:"closable",description:"Draws a close button on the tab, which dispatches close with this tab's value. It is a real button: Enter and Space on it close, Delete on the focused tab is the same path, and its target is 24px square though it draws 16. It carries its own name, and the tab carries its own, so neither is heard twice."},dirty:{type:"boolean",default:!1,attribute:"dirty",description:"Marks the tab as holding unsaved work. Purely visual, and hidden from assistive technology: a reader is told about unsaved work by the page, not by a dot."},onClick:{$prototype:"Function",body:[{dispatchEvent:"select",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"select",description:"The tab was activated; detail is its value. The strip listens for it and answers with change."}],description:"Activation dispatches select, which the tablist turns into its own selection and one change. A click that started on the close button never reaches here."},onClose:{$prototype:"Function",body:[{stopPropagation:!0},{dispatchEvent:"close",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"close",description:"The tab was asked to close; detail is its value. Closing is the host's to do."}],description:"The click stops at the close button, so closing a tab does not also select it."},onActions:{$prototype:"Function",body:[{stopPropagation:!0}],description:"A click inside the actions slot stops there, so activating a control a consumer put on the tab never ALSO selects the tab — the same judgement onClose makes for the close button, which is the one such control the element ships itself. It stops at the CONTAINER rather than at the host: stopPropagation halts an event at the node it is called on and every node after it, never the other listeners on that node or the ones already run below it, so the slotted control's own handler has fired (it is the target) and only the tab's onclick is cut off. Nothing is stopped for icon or status: those hold marks rather than controls, and a click on a mark is a click on the tab."}},attributes:{role:"tab",tabindex:"-1","aria-label":"${state.label || null}","aria-selected":"${state.selected ? 'true' : 'false'}","aria-controls":"${state.panel || null}"},onclick:{$ref:"#/state/onClick"},style:{display:"inline-flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-2)",boxSizing:"border-box",minHeight:"var(--jx-control-h)",maxWidth:"220px",padding:"var(--jx-space-1) var(--jx-space-3)",marginBlockEnd:"-1px",borderBlockEnd:"2px solid transparent",color:"inherit",cursor:"default",userSelect:"none",whiteSpace:"nowrap",outline:"none",":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-selected="true"]':{color:"var(--jx-fg)",borderBlockEndColor:"var(--jx-accent-solid)"},'& > [part="label"]':{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="icon"], & [part="status"], & [part="actions"]':{$description:`The three consumer zones, and they generate no box of their own. display: contents is what makes an EMPTY one cost nothing: as ordinary flex items three unused containers would each take the tab's gap, which is dead space on every tab that slotted nothing — the same measurement (8px of trailing gap, the label visibly off-centre) that gave [part="dirty-slot"] its own contents. It is also what puts slotted content in the TAB's flex row rather than one box deeper, so a marker, a pill and a pin line up with the label, the dot and the close button on one gap rather than on two.`,display:"contents"},'& [part="dirty-slot"], & [part="close-slot"]':{display:"contents"},'& [part="dirty"]':{display:"inline-block",width:"6px",height:"6px",borderRadius:"50%",background:"var(--jx-accent-solid)"},'& [part="close"]':{appearance:"none",font:"inherit",display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",width:"16px",height:"16px",padding:"0",border:"0",borderRadius:"var(--jx-radius-xs)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",contain:"layout","::before":{$description:"The hit area, and the technique every `sm` control in the kit borrows (ui.md §4.3): an empty pseudo-element, absolutely positioned and inset 4px past a borderless 16px box, so the region that accepts the pointer is the 24px SC 2.5.8 asks for while the × stays 16px. The containment above is the other half of it, and it was missing while §4.3 claimed every outset hit area had it: an absolutely positioned box counts toward the SCROLLABLE overflow of the nearest ancestor whose overflow is not visible, painted or not, so a scrolling tab strip counted 4px it could not see. Nothing here pays the containment's price — the tab is a centred flex row, so no baseline is asked of the ×, and the 4px reaches only the tab's own inline padding.",content:'""',position:"absolute",insetBlock:"-4px",insetInline:"-4px"},":hover":{background:"var(--jx-hover-bg)",color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"1px"}}},children:[{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"status"},children:[{tagName:"slot",attributes:{name:"status"}}]},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]},{tagName:"span",attributes:{part:"dirty-slot"},$switch:{$ref:"#/state/dirty"},cases:{true:{tagName:"span",attributes:{part:"dirty","aria-hidden":"true"}}}},{tagName:"span",attributes:{part:"close-slot"},$switch:{$ref:"#/state/closable"},cases:{true:{tagName:"button",attributes:{part:"close",type:"button","aria-label":"Close ${state.label}",tabindex:"${state.selected ? '0' : '-1'}"},onclick:{$ref:"#/state/onClose"},children:[{tagName:"jx-icon",$props:{name:"x",weight:"bold"},attributes:{part:"close-icon"}}]}}}]};var kr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTabPanel",tagName:"jx-tab-panel",observedAttributes:["active","labelledby"],state:{active:{type:"boolean",default:!1,attribute:"active",description:"Whether this panel is the showing one. Every other panel is hidden, not absent, so the ids its tab names stay resolvable."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"The id of the tab that controls this panel, announced as aria-labelledby. Nothing checks the pairing: mint this id and the tab's aria-controls from one key."},notActive:{$expression:{operator:"!",target:{$ref:"#/state/active"}}}},attributes:{role:"tabpanel",tabindex:"0","aria-labelledby":"${state.labelledby || null}",hidden:{$ref:"#/state/notActive"}},style:{display:"block","&[hidden]":{display:"none"},boxSizing:"border-box",padding:"var(--jx-space-3)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",outline:"none",":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"}},children:[{tagName:"slot"}]};var $r={$schema:"https://jxsuite.com/schema/v1",$id:"JxTabs",tagName:"jx-tabs",observedAttributes:["selected","label","activation","orientation"],state:{selected:{type:"string",default:"",attribute:"selected",description:"The value of the tab whose panel is showing. The strip is the one writer of its children's selected state, so a host owns this and nothing else."},label:{type:"string",default:"Tabs",attribute:"label",description:"The accessible name of the strip. A tablist is named by nothing else — it takes no name from its tabs — and no lint can say so, because a bound role switches the naming rules off. Name every strip."},activation:{type:"string",default:"auto",attribute:"activation",description:"auto selects a tab as the caret lands on it; manual moves the caret alone and waits for Enter or Space. auto is right for a strip whose panels are already built, manual for one whose panels cost something to show."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical. It chooses which arrow keys move the caret, and which edge carries both the strip's rule and the selected tab's mark on it — a tab cannot see the strip's orientation from its own sheet, so the strip draws that mark."},applySelection:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"applySelection",parameters:["scope"],description:"Writes the selection onto the tabs and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applySelection(state)}",onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsKeydown",description:"The tab keyboard contract: the arrows of the strip's orientation move the caret with wrap, Home and End go to the ends, Enter and Space activate under manual activation, and Delete closes a closable tab."},onSelect:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsSelect",description:"A tab was activated: selected is written first, then change is dispatched, so a listener reading e.target.selected sees the new value.",emits:[{name:"change",description:"The selection moved; detail is the newly selected tab's value."}]},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tabs.ts",$export:"onTabsMount",description:"Gives the strip its first sight of itself and syncs the tabs. Not optional: applyAttributes runs before distributeSlots, so no tab exists when the root's bindings first evaluate."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the strip has rendered and taken its slotted tabs, which is how onReady reaches the element itself."}},attributes:{role:"tablist","aria-label":"${state.label}","aria-orientation":"${state.orientation}",tabindex:"-1","data-selection":"${state.sync}"},onkeydown:{$ref:"#/state/onKeydown"},onselect:{$ref:"#/state/onSelect"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},boxSizing:"border-box",alignItems:"stretch",gap:"var(--jx-space-1)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg-dim)",borderBlockEnd:"1px solid var(--jx-border)",outline:"none",'&[aria-orientation="vertical"]':{flexDirection:"column",borderBlockEnd:"0",borderInlineEnd:"1px solid var(--jx-border)","& > jx-tab":{marginBlockEnd:"0",marginInlineEnd:"-1px",borderBlockEnd:"0",borderInlineEnd:"2px solid transparent"},'& > jx-tab[aria-selected="true"]':{borderInlineEndColor:"var(--jx-accent-solid)"}}},children:[{tagName:"slot"}]};var jr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTextfield",tagName:"jx-textfield",observedAttributes:["value","placeholder","type","label","labelledby","describedby","invalid","disabled","readonly","required","mono","multiline","grows","rows","clearable","size","name","autocomplete","error","help"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"The field's text. Written by the reader as they type, and by the host; a write equal to what is there never moves the caret. It is written to the control's value CONTENT attribute as well as its property, which makes the control's default value whatever the field currently says. That is deliberate: the element is not form-associated (specs/ui.md §3.2), so it never hears form.reset(), and a control whose default was the authored one would snap back while the element still said something else — an element and its own control disagreeing in silence. The cost is named rather than hidden: reset() is a no-op on this field until form association lands."},placeholder:{type:"string",default:"",attribute:"placeholder",description:"Shown while the field is empty. Not a label."},type:{type:"string",default:"text",attribute:"type",description:"The native input type: text, search, email, url, password, number or tel."},label:{type:"string",default:"",attribute:"label",description:"The accessible name, forwarded to the control as aria-label. Required unless a visible label points at the control."},labelledby:{type:"string",default:"",attribute:"labelledby",description:"Forwarded to the inner control as aria-labelledby."},describedby:{type:"string",default:"",attribute:"describedby",description:"Forwarded to the inner control as aria-describedby, after the field's own error and help sentences."},invalid:{type:"boolean",default:!1,attribute:"invalid",description:"The value is refused: the control says aria-invalid and draws in the danger colour."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"Cannot be edited or focused. Clearing is an edit, so a disabled field draws no clear button and Escape empties nothing: a host that switched the control off hears no input or change from it."},readonly:{type:"boolean",default:!1,attribute:"readonly",description:"Can be focused and selected, not edited. Clearing is an edit, so a read-only field draws no clear button and Escape empties nothing."},required:{type:"boolean",default:!1,attribute:"required",description:"Forwarded to the control, for the form it sits in."},mono:{type:"boolean",default:!1,attribute:"mono",description:"Draws the value in the monospace face: a path, a selector, a colour."},multiline:{type:"boolean",default:!1,attribute:"multiline",description:"A textarea rather than an input."},grows:{type:"boolean",default:!1,attribute:"grows",description:"A multiline field takes the height of its text instead of scrolling inside a fixed box. field-sizing does the work, so nothing is measured and no handler runs per keystroke. Where the engine does not support it the field keeps the height rows asks for, and a growing field with no rows keeps the three-row box a fixed one gets — opting into growth never makes a field shorter than not opting in."},rows:{type:"string",default:"",attribute:"rows",description:"How many lines a multiline field is tall before it grows. Forwarded to the textarea, and it is what a growing field falls back to on an engine without field-sizing."},clearable:{type:"boolean",default:!1,attribute:"clearable",description:"Draws a button inside the field that empties it, shown only while there is something to clear and the field is neither disabled nor read-only. Escape empties the field on exactly the same terms. Firefox draws no clear affordance of its own for type=search, so this is the field's own rather than the platform's."},size:{type:"string",default:"md",attribute:"size",description:"sm, md or lg. The control height is the kit's, so a row of controls lines up."},name:{type:"string",default:"",attribute:"name",description:"The form field name, forwarded to the control."},autocomplete:{type:"string",default:"",attribute:"autocomplete",description:"The autocomplete purpose, forwarded to the control."},tabindex:{type:"string",default:"",description:`Forwarded to the inner control as its tabindex, which is what makes a roving caret possible: the focusable node is the control inside, not the host, so a jx-toolbar moving focus writes this rather than reaching into a child's internals. It is a PROPERTY ONLY (el.tabindex = "0") and deliberately not an observed attribute: written as an attribute it would land on the host as well, and a host carrying tabindex is itself focusable, so the one control would become two tab stops. The clear button is NOT given it: it is already tabindex="-1" by construction, so the field is one stop whatever the toolbar writes.`},error:{type:"string",default:"",attribute:"error",description:"The sentence explaining a refused value, drawn under the field and announced as it changes. Its region is permanent and empty until there is something to say, so the first refusal is announced rather than only a later one; the empty region is taken out of flow rather than hidden, so it costs no layout and stays in the accessibility tree."},help:{type:"string",default:"",attribute:"help",description:"A sentence of guidance under the field."},hasError:{$expression:{operator:"!==",target:{$ref:"#/state/error"},value:""}},hasHelp:{$expression:{operator:"!==",target:{$ref:"#/state/help"},value:""}},isEmpty:{$expression:{operator:"===",target:{$ref:"#/state/value"},value:""}},isLocked:{$expression:{operator:"||",target:{$ref:"#/state/disabled"},value:{$ref:"#/state/readonly"}}},showClear:{$expression:{operator:"&&",target:{operator:"&&",target:{$ref:"#/state/clearable"},value:{operator:"!",target:{$ref:"#/state/isEmpty"}}},value:{operator:"!",target:{$ref:"#/state/isLocked"}}}},uid:{type:"string",default:"",description:"This field's own id stem, minted on mount. The error and help sentences take their ids from it, and the control names those ids in aria-describedby."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"mintFieldId",description:"Mints the field's id stem, so the sentences under it can describe the control rather than only being announced once as they change."},onInput:{$prototype:"Function",body:[{operator:"=",target:{$ref:"#/state/value"},value:{$ref:"event#/target/value"}}],description:"Mirrors what the reader types into value. The native input and change events bubble from the control as they always do."},onClear:{$prototype:"Function",$src:"jx-ui:/behaviors/textfield.ts",$export:"clearField",emits:[{name:"input",description:"The value was emptied by the clear button; e.target is the field."},{name:"change",description:"The edit the clear button made is finished; e.target is the field."}],description:"The clear button empties the value, puts focus back on the control the reader was in, and says so with input and then change. Both come from the element rather than from the button, so a host reading e.target.value reads the field."},onClearPointerDown:{$prototype:"Function",body:[{preventDefault:!0}],description:"Keeps focus in the control while the clear button is pressed. Without it the press moves focus to the button, the control blurs and fires its own native change carrying the value the reader is about to delete, and the clear then fires a second one: two committed edits, and two undo entries, for one gesture."},onKeydown:{$prototype:"Function",body:[{$switch:{$ref:"event#/key"},cases:{Escape:[{if:{$ref:"#/state/showClear"},then:[{preventDefault:!0},{operator:"=",target:{$ref:"#/state/value"},value:""},{dispatchEvent:"input",bubbles:!0},{dispatchEvent:"change",bubbles:!0}]}],Enter:[{if:{operator:"&&",target:{operator:"===",target:{$ref:"#/state/type"},value:"search"},value:{operator:"!",target:{$ref:"#/state/multiline"}}},then:[{preventDefault:!0}]}]}}],emits:[{name:"input",description:"Escape emptied a clearable field; e.target is the field."},{name:"change",description:"Escape finished emptying a clearable field; e.target is the field."}],description:"Two keys, and nothing else. Escape empties a clearable field that has something in it, and cancels so the key does not also close whatever the field sits in. Enter is cancelled on a single-line search field: a search input inside a form submits it, and a search field is the one kind that never means to — the element owns no form, so the guard lives here rather than at every call site. A textarea never submits on Enter, so a multiline field keeps the key and the reader keeps the newline."}},onkeydown:{$ref:"#/state/onKeydown"},attributes:{"data-size":"${state.size}","data-invalid":"${state.invalid ? '' : null}","data-mono":"${state.mono ? '' : null}","data-disabled":"${state.disabled ? '' : null}","data-clearable":"${state.clearable ? '' : null}","data-multiline":"${state.multiline ? '' : null}","data-grows":"${state.grows ? '' : null}","data-rows":"${state.rows || null}"},style:{display:"inline-flex",position:"relative",flexDirection:"column",gap:"var(--jx-space-1)",verticalAlign:"middle",minWidth:"0","--jx-textfield-h":"var(--jx-control-h)","--jx-textfield-pad":"var(--jx-space-3)","--jx-textfield-pad-end":"var(--jx-textfield-pad)","&[hidden]":{display:"none"},'&[data-size="sm"]':{"--jx-textfield-h":"calc(var(--jx-control-h) - 4px)","--jx-textfield-pad":"var(--jx-space-2)"},'&[data-size="lg"]':{"--jx-textfield-h":"calc(var(--jx-control-h) + 8px)"},"&[data-clearable]":{"--jx-textfield-pad-end":"var(--jx-textfield-h)"},'& [part="input"]':{appearance:"none",boxSizing:"border-box",width:"100%",minHeight:"var(--jx-textfield-h)",margin:"0",paddingBlock:"0",paddingInline:"var(--jx-textfield-pad) var(--jx-textfield-pad-end)",border:"1px solid var(--jx-border-strong)",borderRadius:"var(--jx-radius-sm)",background:"var(--jx-bg-input)",color:"var(--jx-fg)",font:"inherit",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",outline:"none",transition:"border-color var(--jx-dur-1) var(--jx-ease-out)","::placeholder":{color:"var(--jx-fg-muted)"},":hover":{borderColor:"var(--jx-fg-muted)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"},":disabled":{opacity:"0.5",cursor:"default"}},'& textarea[part="input"]':{minHeight:"calc(var(--jx-textfield-h) * 3)",paddingBlock:"var(--jx-space-2)",resize:"vertical"},'&[data-grows] textarea[part="input"]':{fieldSizing:"content",resize:"none"},'&[data-grows][data-rows] textarea[part="input"]':{minHeight:"0"},"@supports (field-sizing: content)":{'&[data-grows] textarea[part="input"]':{minHeight:"0"}},'&[data-mono] [part="input"]':{fontFamily:"var(--jx-font-mono)"},'&[data-invalid] [part="input"]':{borderColor:"var(--jx-danger)"},'&[data-clearable] [part="input"]':{"::-webkit-search-cancel-button":{appearance:"none"}},'&[data-size="sm"] [part="input"]':{fontSize:"var(--jx-text-sm)"},'&[data-size="lg"] [part="input"]':{fontSize:"var(--jx-text-lg)"},'& [part="clear"]':{$description:"The clear button sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, and 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3): an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, which is -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the glyph and its hover box stay where they were. On a large field the difference is positive and the pseudo-element is an invisible box INSIDE a button that is already over the floor, which changes nothing. jx-tab's close button is the technique; the button is absolutely positioned already, so it is its own containing block. The extension lies over the input it clears, which was true of the drawn button too, and 2px past the field's edge at `sm`, where a neighbour at the kit's 4px gap extends 2px back and the two abut. `contain: layout` keeps the expansion LOCAL: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` is not `visible`, invisible or not, so a host that scrolls picks up a couple of phantom pixels from every `::before` like this one between it and the field, and draws a scrollbar over content that already fit.",position:"absolute",insetBlockStart:"1px",insetInlineEnd:"1px","::before":{content:'""',position:"absolute",inset:"calc((var(--jx-textfield-h) - 2px - var(--jx-control-h)) / 2)"},display:"inline-flex",alignItems:"center",justifyContent:"center",boxSizing:"border-box",width:"calc(var(--jx-textfield-h) - 2px)",height:"calc(var(--jx-textfield-h) - 2px)",margin:"0",padding:"0",appearance:"none",border:"0",borderRadius:"var(--jx-radius-sm)",background:"transparent",color:"var(--jx-fg-muted)",cursor:"pointer",outline:"none",contain:"layout",":hover":{color:"var(--jx-fg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-1px"}},'&[data-multiline] [part="clear"]':{insetBlockStart:"calc(var(--jx-space-2) + 1px)"},'& [part="error"], & [part="help"]':{margin:"0",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",color:"var(--jx-fg-dim)"},'& [part="error"]':{color:"var(--jx-danger)"},'& [part="error"]:empty':{$description:"The region is permanent and empty until it has something to say, and while it is empty it must draw nothing and take no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` (a surface's own banner, a site's stylesheet) lands on this paragraph as well — and under `box-sizing: border-box` a `width`/`height` of 0 floors at padding plus border, which is how a Studio banner's `padding: 6px 8px` and 1px rule drew a 16×13 box at the field's top-left corner that also took the click meant for the control. Pinning the size was never enough on its own; the box model is therefore reset here, and `clip-path: inset(50%)` (the kit's visually-hidden idiom, as `jx-accordion-item.json`'s heading uses it) with `pointer-events: none` removes the paint and the hit area of anything a reset does not name, such as a shadow or an outline. Its `:empty` makes the selector one pseudo-class heavier than the `X [part=\"error\"]` a consumer writes, so it wins in whichever order the sheets land. It is never `display: none` or `visibility: hidden`: a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). When text arrives `:empty` stops matching and the sentence draws in flow exactly as the two rules above say. `jx-select.json` and `jx-combobox.json` carry the same rule, for the same reason.",position:"absolute",top:"0",left:"0",width:"0",height:"0",overflow:"hidden",margin:"0",padding:"0",border:"0",background:"none",clipPath:"inset(50%)",pointerEvents:"none"},'& > [part="control-slot"], & > [part="clear-slot"], & > [part="help-slot"]':{display:"contents"}},children:[{tagName:"div",attributes:{role:"none",part:"control-slot"},$switch:{$ref:"#/state/multiline"},cases:{false:{tagName:"input",attributes:{part:"input",type:"${state.type}",placeholder:"${state.placeholder || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",autocomplete:"${state.autocomplete || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"},value:"${state.value}"},value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"}},true:{tagName:"textarea",attributes:{part:"input",placeholder:"${state.placeholder || null}",rows:"${state.rows || null}","aria-label":"${state.label || null}","aria-labelledby":"${state.labelledby || null}","aria-describedby":"${[state.hasError && state.uid ? state.uid + '-error' : null, state.hasHelp && state.uid ? state.uid + '-help' : null, state.describedby || null].filter(Boolean).join(' ') || null}","aria-invalid":"${state.invalid ? 'true' : null}",tabindex:"${state.tabindex || null}",name:"${state.name || null}",autocomplete:"${state.autocomplete || null}",disabled:{$ref:"#/state/disabled"},readonly:{$ref:"#/state/readonly"},required:{$ref:"#/state/required"}},textContent:"${state.value}",value:{$ref:"#/state/value"},oninput:{$ref:"#/state/onInput"}}}},{tagName:"div",attributes:{role:"none",part:"clear-slot"},$switch:{$ref:"#/state/showClear"},cases:{true:{tagName:"button",attributes:{part:"clear",type:"button",tabindex:"-1","aria-label":"Clear"},onclick:{$ref:"#/state/onClear"},onpointerdown:{$ref:"#/state/onClearPointerDown"},children:[{tagName:"jx-icon",$props:{name:"x"},attributes:{part:"clear-icon"}}]}}},{tagName:"p",attributes:{part:"error",id:"${state.uid ? state.uid + '-error' : null}",role:"status","aria-live":"polite"},textContent:"${state.error}"},{tagName:"div",attributes:{role:"none",part:"help-slot"},$switch:{$ref:"#/state/hasHelp"},cases:{true:{tagName:"p",attributes:{part:"help",id:"${state.uid ? state.uid + '-help' : null}"},textContent:"${state.help}"}}}]};var Sr={$schema:"https://jxsuite.com/schema/v1",$id:"JxToast",tagName:"jx-toast",observedAttributes:["variant","open","timeout","dismiss-label"],$elements:[{$ref:"./jx-icon.json"},{$ref:"./jx-action-button.json"}],state:{variant:{type:"string",default:"info",attribute:"variant",description:"info, positive, negative or warning: what kind of outcome this is. It picks the accent along the toast's leading edge AND the glyph beside the message, so the severity survives greyscale, a colour-blind reader and a forced-colours theme — colour alone would be a WCAG 1.4.1 failure. It is not announced: the glyph is decorative and the toast carries no role of its own, so what a screen reader hears is the message, which is why the message has to SAY what happened rather than lean on the colour to say it."},open:{type:"boolean",default:!1,attribute:"open",description:"Whether the toast is showing. It is the host's to write — a toast appended with no open attribute draws nothing, deliberately, so that arriving and appearing are two decisions rather than one — and the element writes it back to false when it retires itself. It is also what runs the clock: opening starts timeout, and closing stops it."},timeout:{type:"number",default:0,attribute:"timeout",description:"How long the toast rests before retiring itself, in milliseconds. 0 is sticky and is the DEFAULT, which is what makes the number safe as a number: a removed attribute coerces through Number() to 0 (ui.md §5.3), and here that lands on the reading a numeric prop can never spell otherwise — nothing disappears unless a host asked for it to. The clock is suspended while the pointer is on the toast, while focus is inside it, and while the stack it belongs to is being read, and resumes with what was LEFT, so a reader who reaches the recovery control cannot have it expire under their hand."},dismissLabel:{type:"string",default:"Dismiss",attribute:"dismiss-label",description:`The name of the dismiss button, which is always drawn: a toast that can only be waited out is one a reader cannot get rid of, and a sticky one would then be permanent. Write what is being dismissed where a page raises several kinds ("Dismiss notification"), because the button is named by this alone — the message beside it is a consumer's slotted content and cannot be read into a name.`},icon:"${state.variant === 'positive' ? 'check' : state.variant === 'negative' ? 'warning-circle' : state.variant === 'warning' ? 'warning' : 'info'}",onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastMount",emits:[{name:"close",description:"The toast closed itself; detail.reason is timeout when the clock ran out."}],description:"Learns the element and starts the clock, then follows open through data-open for the rest of the toast's life."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastUnmount",description:"Stops the clock when the toast leaves the document, so a toast the host has already taken away cannot retire itself afterwards."},onHold:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastHold",description:"The pointer arrived, focus arrived, or the stack said to wait: the clock is suspended with its remaining time kept. Three separate reasons, held together, because a pointer leaving a toast the reader has tabbed into must not restart a clock the focus is still holding."},onRelease:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastRelease",description:"The last of those reasons went away, so the clock runs again for what was left of it. A focusout whose focus landed on another control inside this same toast is not a departure and releases nothing."},onDismiss:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastDismiss",emits:[{name:"close",description:"The reader dismissed the toast; detail.reason is dismissed."}],description:"The dismiss button closes the toast and says who closed it."},onAction:{$prototype:"Function",$src:"jx-ui:/behaviors/toast.ts",$export:"onToastAction",emits:[{name:"close",description:"The recovery control was used; detail.reason is action."}],description:"A click on the control slotted into action closes the toast, without stopping the click: the control is the target, so its own handler has already run and a host listening above the toast is entitled to hear it. An answer that has been given is not still being asked."}},onpointerenter:{$ref:"#/state/onHold"},onpointerleave:{$ref:"#/state/onRelease"},onfocusin:{$ref:"#/state/onHold"},onfocusout:{$ref:"#/state/onRelease"},"onjx-toast-pause":{$ref:"#/state/onHold"},"onjx-toast-resume":{$ref:"#/state/onRelease"},attributes:{"data-variant":"${state.variant}","data-open":"${state.open ? '' : null}"},style:{$description:"The toast carries NO live region and no role of its own, which is the one decision in this block that is about sound rather than about pixels: jx-toast-host owns the region, and a role here would announce every toast twice in the one arrangement the kit exists to serve. A toast used without a host is drawn and not announced, and the answer to that is a host.",display:"none",boxSizing:"border-box",alignItems:"center",gap:"var(--jx-space-3)",maxInlineSize:"min(420px, calc(100vw - 2 * var(--jx-space-4)))",padding:"var(--jx-space-3)",border:"1px solid var(--jx-border)",borderInlineStartWidth:"3px",borderInlineStartColor:"var(--jx-toast-accent)",borderRadius:"var(--jx-radius-md)",background:"var(--jx-bg-overlay)",color:"var(--jx-fg)",boxShadow:"var(--jx-shadow-popover)",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-sm)",lineHeight:"var(--jx-leading-sm)",textAlign:"start",pointerEvents:"auto",opacity:"0",translate:"0 var(--jx-space-3)",transition:"opacity var(--jx-dur-1) var(--jx-ease-out), translate var(--jx-dur-1) var(--jx-ease-out), display var(--jx-dur-1) allow-discrete","--jx-toast-accent":"var(--jx-accent)",'&[data-variant="positive"]':{"--jx-toast-accent":"var(--jx-success)"},'&[data-variant="negative"]':{"--jx-toast-accent":"var(--jx-danger)"},'&[data-variant="warning"]':{"--jx-toast-accent":"var(--jx-warning)"},"&[data-open]":{display:"flex",opacity:"1",translate:"0 0"},"@starting-style":{"&[data-open]":{opacity:"0",translate:"0 var(--jx-space-3)"}},"&[hidden]":{$description:"AFTER the open rule, and only because of it: [data-jx][hidden] and [data-jx][data-open] weigh the same, so the later one wins and a hidden open toast would otherwise still be drawn. The UA's own [hidden] rule cannot settle it either, since the element's own display beats it at any specificity.",display:"none"},'& [part="icon"]':{display:"inline-flex",flex:"none",alignSelf:"flex-start",color:"var(--jx-toast-accent)"},'& [part="message"]':{flex:"1",minInlineSize:"0",overflowWrap:"anywhere"},'& [part="action-slot"]':{display:"contents"},'& [part="dismiss"]':{flex:"none",alignSelf:"flex-start"}},children:[{tagName:"span",attributes:{part:"icon","aria-hidden":"true"},children:[{tagName:"jx-icon",attributes:{part:"glyph"},$props:{name:{$ref:"#/state/icon"},weight:"bold"}}]},{tagName:"div",attributes:{part:"message"},children:[{tagName:"slot"}]},{tagName:"span",attributes:{part:"action-slot",role:"none"},onclick:{$ref:"#/state/onAction"},children:[{tagName:"slot",attributes:{name:"action"}}]},{tagName:"jx-action-button",attributes:{part:"dismiss"},$props:{icon:"x",size:"sm",label:{$ref:"#/state/dismissLabel"},hint:{$ref:"#/state/dismissLabel"}},onclick:{$ref:"#/state/onDismiss"}}]};var Tr={$schema:"https://jxsuite.com/schema/v1",$id:"JxTree",tagName:"jx-tree",$description:'The `role="tree"` itself, over a FLAT list of `jx-tree-item` rows. Four decisions are the whole design, and each of them is forced by the same fact: a Studio tree windows, so the DOM holds a SLICE and the element must never mistake it for the model. (1) THE HOST OWNS THE ROW SET. The element takes a flat projection — one row per drawn line, each carrying its own `level`, `posinset`, `setsize` and `expanded` — rather than a nested structure, because a nested one cannot be windowed at all: a subtree is a variable number of lines and a viewport is a fixed number of them. Both Studio trees already project flat rows for exactly this reason, and neither can go back. (2) THE COUNTS DESCRIBE THE FULL SET. `aria-setsize` and `aria-posinset` are the row\'s props and are never derived from `items.length`, which is how a reader ends up told a directory holds eleven files when it holds ten thousand. (3) MULTI-SELECT IS AN INTENT, NOT A SET. The tree owns the ANCHOR and dispatches `select` with a mode — `replace`, `toggle` or `range` — and the HOST resolves it, because resolving a range means naming every row between two of them and the rows between are precisely the ones the drawn slice does not have. (4) DRAG AND DROP IS AN ISLAND. Pragmatic-drag-and-drop attaches through the host (studio-ui-guidelines.md §9.4); the element\'s job is to make every row addressable (`data-value` on each) and to keep the non-drag alternative alive, which means the roving caret reaches every row and every chord the tree does not own — cut, paste, delete, rename, select-all — passes straight through to the host (WCAG 2.2 SC 2.5.7, guidelines §8.2). The windowing contract is `padtop` and `padbottom` plus the `move` and `typeahead` events, and it is deliberately NOT a second geometry engine: the pads are the element\'s only knowledge of what it cannot see, and a caret move past one — or a letter the slice cannot honestly answer — is dispatched rather than performed.',observedAttributes:["label","multiple","current","padtop","padbottom"],state:{label:{type:"string",default:"Tree",attribute:"label",description:'The accessible name of the tree. A `tree` takes no name from its rows and nothing lints a missing one — a bound role switches the naming rules off — so name every tree. "Document outline", "Project files": what this tree is OF, since a window may hold two.'},multiple:{type:"boolean",default:!1,attribute:"multiple",description:'Whether more than one row may be selected, announced as `aria-multiselectable`. It is also the gate on the modifiers: with it off, every `select` the element dispatches is `replace` however many keys the reader is holding, so a host that never asked for multi-select cannot be handed a `toggle` it has no code for. This is where the multi answer lives rather than on the rows, because a `aria-selected="false"` on every row is the OTHER way to say it and a row cannot see its tree.'},current:{type:"string",default:"",attribute:"current",description:"The `value` of the row holding the roving caret. The tree is the single writer of every drawn row's `caret`, derived from this, so a host moves the caret by writing HERE and never a row's own state. Under windowing the row it names is routinely not drawn; the tab stop then falls back to the first drawn row so the tree cannot drop out of the tab order, and `current` itself is left exactly as the host wrote it."},anchor:{type:"string",default:"",description:"The row a `Shift` range extends from. The tree owns it — it is a fact about the reader's gesture rather than about the document — and writes it on every `replace` and `toggle`. A host may seed it to restore a session; it never has to."},padtop:{type:"number",default:0,attribute:"padtop",description:"The height, in pixels, of the rows the window left ABOVE the drawn slice, reserved as a spacer so the scrollbar stays the length of the whole model. It is also the element's only knowledge that those rows exist: a caret move off the top of the slice dispatches `move` when this is non-zero and clamps when it is zero, which is how one code path serves a windowed tree and a small one that draws every row."},padbottom:{type:"number",default:0,attribute:"padbottom",description:"The same, below. Zero at both ends means the slice IS the model, and the ends of the drawn rows are the ends of the tree."},applyCurrent:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"applyCurrent",parameters:["scope"],description:"Writes the caret onto the rows and returns it. Idempotent: it runs inside a render effect."},sync:"${state.applyCurrent(state)}",onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeKeydown",description:"The ARIA tree keyboard contract: the arrows walk the drawn rows without wrapping, Home and End go to the ends, ArrowRight opens a closed row and steps into an open one, ArrowLeft closes an open row and steps out of a closed one, Enter activates, Space is a selection verb, and a printable character is typeahead — resolved over the drawn rows when they are the whole model and dispatched as `typeahead` when a pad says they are not. Shift extends from the anchor and Ctrl or Cmd moves the caret alone. Every other key is left alone, which is what keeps the host's cut, paste, delete and rename chords reachable from a focused row.",emits:[{name:"change",description:"The caret moved to a drawn row; detail is that row's value. `current` is written before this is dispatched, so a listener reading `e.target.current` sees the new value."},{name:"select",description:"The reader meant something by landing there; detail is `{ value, mode, anchor }` where mode is `replace`, `toggle` or `range`. An INTENT: the host owns the selection set and resolves the range."},{name:"move",description:"The caret must reach a row the drawn slice does not have; detail is `{ from, key }`. The host scrolls, repaints and writes `current`. Dispatched only when a pad says there are rows that way."},{name:"typeahead",description:"A printable character, on a tree whose drawn slice is not the whole model; detail is `{ from, char }` and the host answers it against the model exactly as it answers `move`. Dispatched for EVERY such character rather than only when the slice holds no match: a move off the end of the slice announces itself, and a letter never does — a search over a slice always answers, and the answer is simply the wrong row. Not dispatched at all when both pads are zero, where the drawn rows ARE the tree and the element resolves the letter itself."},{name:"expand",description:"A row should be opened or closed; detail is `{ value, expanded }`, and `expanded` is the state it should be PUT INTO rather than the state it is in."},{name:"activate",description:"A row was activated with Enter; detail is its value. What that means — open the file, start the rename — is the host's."}]},onClick:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeClick",description:"A pointer landed on a row: the caret follows it and the modifiers say what it meant. Delegated on the TREE rather than dispatched by each row, which is the one place the kit departs from its own child-dispatches-select idiom — a selection intent IS the modifier state, and a row would have to copy three booleans out of the mouse event for the tree to read them back.",emits:[{name:"change",description:"The caret moved to the clicked row; detail is its value."},{name:"select",description:"The selection intent the click carried; detail is `{ value, mode, anchor }`."}]},onDblClick:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeDblClick",description:"A double click means what Enter means. One verb for both, so a pointer-only reader and a keyboard-only reader reach the same thing.",emits:[{name:"activate",description:"A row was activated with a double click; detail is its value."}]},onToggle:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeToggle",description:"A row's twisty was pressed. The row says only which row it was; the tree works out which way it should go and answers with its own `expand`, so that event has ONE dispatcher and `e.target` is the element the host wrote whether the reader used the twisty or ArrowLeft.",emits:[{name:"expand",description:"The row should be opened or closed; detail is `{ value, expanded }`."}]},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/tree.ts",$export:"onTreeMount",description:"Gives the tree its first sight of itself, syncs the caret and starts watching the row set. Not optional: `applyAttributes` runs before `distributeSlots`, so no row exists when the root's bindings first evaluate — and a scroll replaces the whole slice, so the watch is what keeps one tab stop alive afterwards."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],description:"Announces that the tree has rendered and taken its slotted rows, which is how onReady reaches the element itself."}},attributes:{role:"tree","aria-label":"${state.label}","aria-multiselectable":"${state.multiple ? 'true' : null}",tabindex:"-1","data-current":"${state.sync}"},onkeydown:{$ref:"#/state/onKeydown"},onclick:{$ref:"#/state/onClick"},ondblclick:{$ref:"#/state/onDblClick"},ontoggle:{$ref:"#/state/onToggle"},"onjx-ready":{$ref:"#/state/onReady"},style:{$description:"The tree declares no `overflow` and owns no scrollbar, which is a decision rather than an omission: one Studio tree scrolls inside itself and the other scrolls inside the panel that also holds its toolbar, and a windowing observer resolves the nearest scrolling ancestor either way. Declaring one here would settle that question wrongly for one of them. The indent is a custom property on the CONTAINER so it inherits to every row and a consumer can retune the whole tree with one declaration.",display:"block","&[hidden]":{display:"none"},boxSizing:"border-box","--jx-tree-indent":"16px",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",lineHeight:"var(--jx-leading-md)",color:"var(--jx-fg)",outline:"none",'& [part="pad-top"], & [part="pad-bottom"]':{$description:'The rows the window left out, as the height they would have occupied, so the scrollbar stays the length of the whole model. `aria-hidden` because a `role="tree"` owns `treeitem`s and a div that exists to be four thousand pixels tall is not one.',display:"block",flex:"none"}},children:[{tagName:"div",attributes:{part:"pad-top","aria-hidden":"true",style:"block-size: ${state.padtop}px"}},{tagName:"slot"},{tagName:"div",attributes:{part:"pad-bottom","aria-hidden":"true",style:"block-size: ${state.padbottom}px"}}]};var Er={$schema:"https://jxsuite.com/schema/v1",$id:"JxTreeItem",tagName:"jx-tree-item",$description:"One row of a `jx-tree`, and a row is ALL it is: it draws itself, announces itself, and knows nothing about the rows either side of it. THE HOST OWNS THE ROW SET AND THE COUNTS. `level`, `posinset` and `setsize` are props rather than anything derived, because a windowed tree's DOM holds one screen of a model that may be four thousand rows long: a row that counted its own siblings would count the ones that happen to be drawn, and a reader would be told there are eleven items in a directory holding ten thousand. So `aria-setsize` and `aria-posinset` describe the FULL set, they are the host's to supply, and this element will never invent them — a row given neither writes neither, which is ARIA's own way of saying \"ask the tree\", and is right for the one case where the DOM is the whole model. `aria-selected` is written only when the row IS selected: a `false` on every row is what tells assistive technology a tree supports multiple selection, the row cannot see whether its tree does, and `aria-multiselectable` on `jx-tree` is where that answer actually lives. The three `data-` attributes it styles but does not write — `data-dragging`, `data-drop` and the drag island generally — are the pointer half of moving a row, and they are deliberately not props: pragmatic-drag-and-drop attaches through the HOST (studio-ui-guidelines.md §9.4) and writes them directly, so a binding here would be a second writer that clobbers the island on the next repaint. What the element owes the non-drag half is `cut`, which draws a row already lifted, and a keyboard that lets go of every chord it does not own.",observedAttributes:["value","label","level","posinset","setsize","expanded","selected","disabled","cut","grip"],$elements:[{$ref:"./jx-icon.json"}],state:{value:{type:"string",default:"",attribute:"value",description:"What the row stands for: the detail of every event it provokes, and what the tree's `current` is matched against. A path, an id, a `JxPath` key — whatever the host's model already calls this row, because the tree hands it straight back and never parses it."},label:{type:"string",default:"",attribute:"label",description:"The words on the row, its accessible name, and what typeahead matches. Written to `aria-label` as well as drawn, for the reason `jx-tab` gives: a `treeitem` names itself from its content, so a badge, a status pill and a row action would all join the row's name and a reader would hear \"div Hero More actions\". `aria-label` wins over name-from-content in accname's precedence order, so the name stays exactly the string the row draws and each slotted control keeps announcing its own. It is therefore REQUIRED once anything is slotted, and a consumer whose row is a badge PLUS a name composes both into this one string rather than hoping the concatenation comes out right."},level:{type:"number",default:1,attribute:"level",description:"How deep the row sits, one-based, exactly as `aria-level` counts. It is also the indent: the row's inline padding is `--jx-tree-indent` times one less than this, so the arithmetic that decides what a level LOOKS like lives with the declarations rather than being composed per row in a host's TypeScript. A flat projection is what makes this a prop at all — under windowing there is no ancestor in the DOM to count."},posinset:{type:"number",default:0,attribute:"posinset",description:'Which of its siblings this row is, one-based, IN THE MODEL. Zero writes no `aria-posinset` at all, which is how a small tree that draws every row says "count me from the DOM". A windowed tree must supply it: the drawn slice is not the set, and a position computed from it is a number a reader can act on and be wrong about.'},setsize:{type:"number",default:0,attribute:"setsize",description:'How many siblings the row has, IN THE MODEL — the total under its parent, not the number drawn. Zero writes no `aria-setsize`, the same "ask the DOM" as `posinset`. The pair is what keeps ARIA true while the tree windows, and it is the whole reason the counts are the host\'s.'},expanded:{type:"string",default:"",attribute:"expanded",description:'Empty for a LEAF, which owns no `aria-expanded` and no twisty; `true` or `false` for a row that has children. Three values rather than a boolean because "closed" and "cannot open" are different things to a reader and to the keyboard: `ArrowRight` opens a closed row and steps into an open one, and does nothing at all on a leaf. The same string spelling `jx-menu-item`\'s `checked` uses, for the same reason.'},selected:{type:"boolean",default:!1,attribute:"selected",description:"Whether the row is in the selection. The HOST writes it, and it is the one row prop the tree is NOT the single writer of: a selection is a set, a windowed tree draws part of it, and an element that owned it would forget every row it scrolled past. Written to `aria-selected` only when true — see the element's description."},disabled:{type:"boolean",default:!1,attribute:"disabled",description:"A row that cannot be acted on. It stays DRAWN and stays counted, because a row that vanished would renumber its siblings, but the caret steps over it, a click on it does nothing, and it never takes the tree's tab stop."},cut:{type:"boolean",default:!1,attribute:"cut",description:"The row is on the clipboard, waiting for a paste to land it somewhere. Drawn faded, and deliberately invisible to assistive technology: cut and paste are the keyboard alternative to dragging (WCAG 2.2 SC 2.5.7, studio-ui-guidelines.md §8.2), both are host commands, and the host announces the move through its own live region — a reader is told what happened by the page, not by an opacity."},grip:{type:"boolean",default:!1,attribute:"grip",description:"Draws the drag handle. A plain `aria-hidden` span rather than a control, because it is the grab affordance for a pointer drag the drag island owns and NOT a second way to move the row: the keyboard path is cut and paste, and a focusable handle with no keyboard operation of its own would be an SC 2.1.1 failure dressed as an affordance."},caret:{type:"boolean",default:!1,description:"Whether this row holds the tree's one tab stop. `jx-tree` is the single writer of it — a host moves the caret by writing the TREE's `current`, never a row's. It is a prop rather than a `tabindex` the sidecar writes directly so that a repaint cannot lose it: the attribute is derived from state, so re-rendering the row restores the caret instead of quietly resetting it to -1."},onTwisty:{$prototype:"Function",body:[{stopPropagation:!0},{dispatchEvent:"toggle",detail:{$ref:"#/state/value"},bubbles:!0}],emits:[{name:"toggle",description:"The row's twisty was pressed; detail is its value. The TREE's internal protocol: `jx-tree` catches it, works out which way the row should go, and answers with its own `expand`."}],description:"The click stops at the twisty, so opening a row does not also select it — the judgement `jx-menu-item` makes for a submenu chevron and `jx-tab` for its close button."},onActions:{$prototype:"Function",body:[{stopPropagation:!0}],description:"A click inside the actions slot stops there, so pressing a control a consumer put on the row never ALSO moves the selection. It stops at the CONTAINER rather than at the host: `stopPropagation` halts an event at the node it is called on and every node after it, never the listeners already run below it, so the slotted control's own handler has fired and only the TREE's delegated click is cut off. Nothing is stopped for `icon` or `status`: those hold marks rather than controls, and a click on a mark is a click on the row."}},attributes:{role:"treeitem",tabindex:"${state.caret ? '0' : '-1'}","aria-label":"${state.label || null}","aria-level":"${state.level}","aria-posinset":"${state.posinset > 0 ? state.posinset : null}","aria-setsize":"${state.setsize > 0 ? state.setsize : null}","aria-expanded":"${state.expanded || null}","aria-selected":"${state.selected ? 'true' : null}","aria-disabled":"${state.disabled ? 'true' : null}","data-value":"${state.value}","data-cut":"${state.cut ? '' : null}"},style:{$description:"The row's block size is a CONTRACT rather than a look: a tree windows, and a window can only reserve the right amount of scroll for the rows it did not draw if every row is exactly one row tall. `--jx-control-h` follows the density setting, which a hard-coded 24px could not. The indent is padding rather than a margin or a spacer element for the same reason — a row whose HEIGHT depended on its depth would make the scrollbar a lie.",display:"flex","&[hidden]":{display:"none"},alignItems:"center",gap:"var(--jx-space-2)",boxSizing:"border-box",blockSize:"var(--jx-control-h)",paddingInline:"calc(var(--jx-space-3) + var(--jx-tree-indent, 16px) * ${state.level - 1}) var(--jx-space-3)",borderInlineStart:"2px solid transparent",color:"inherit",cursor:"default",userSelect:"none",whiteSpace:"nowrap",outline:"none",":hover":{background:"var(--jx-hover-bg)"},":focus-visible":{outline:"var(--jx-focus-ring)",outlineOffset:"-2px"},'&[aria-selected="true"]':{background:"var(--jx-accent-20)",borderInlineStartColor:"var(--jx-accent-solid)"},'&[aria-disabled="true"]':{opacity:"0.5"},"&[data-cut]":{opacity:"0.5"},"&[data-dragging]":{$description:"The two attributes the DRAG ISLAND writes, styled here and bound nowhere. Pragmatic-drag-and-drop attaches to the rows through the host and sets them imperatively for the length of a gesture; a prop mirroring either would be a second writer, and the repaint that cleared it mid-drag is exactly the stale affordance a cancelled drag used to leave on screen.",opacity:"0.4"},"&[data-drop]":{background:"var(--jx-accent-15)",outline:"1px dashed var(--jx-accent-solid)",outlineOffset:"-1px"},'& [part="twisty"]':{$description:"A leaf draws no chevron and still occupies the box, which is what lines every name in the tree up whether or not its row can be opened. It is `aria-hidden` and not a button: the row itself carries `aria-expanded`, `ArrowRight` and `ArrowLeft` operate it, and a focusable control inside a composite would put a second tab stop on every row.",display:"inline-flex",alignItems:"center",justifyContent:"center",inlineSize:"14px",flex:"none",color:"var(--jx-fg-dim)","--jx-icon-size":"12px"},'& [part="label"]':{flex:"1",minWidth:"0",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},'& [part="icon"], & [part="status"], & [part="actions"], & [part="grip-slot"]':{$description:"The four consumer zones generate no box of their own. `display: contents` is what makes an EMPTY one cost nothing — as ordinary flex items they would each take the row's gap, which is dead space on every row that slotted nothing — and it is what puts slotted content in the ROW's flex line rather than one box deeper, so an icon, a language chip and a pin button line up with the name on one gap rather than on three.",display:"contents"},'& [part="grip"]':{$description:"Revealed on hover, on the selected row, and whenever anything inside the row has focus. The third is what keeps it visible for a reader who arrived by keyboard, even though they will move the row with cut and paste rather than with this.",display:"none",flex:"none",color:"var(--jx-fg-dim)",fontSize:"var(--jx-text-sm)",cursor:"grab"},'&:hover [part="grip"], &[aria-selected="true"] [part="grip"], &:focus-within [part="grip"]':{display:"inline-block"},"@(forced-colors: active)":{'&[aria-selected="true"]':{$description:"The selected row, redrawn. Every author colour is replaced by one from the user's palette in forced colours, so the accent wash behind the row collapses into the page and the inline-start edge is the only marker left.",borderInlineStartColor:"Highlight"}}},children:[{tagName:"span",attributes:{part:"twisty","aria-hidden":"true"},onclick:{$ref:"#/state/onTwisty"},$switch:{$ref:"#/state/expanded"},cases:{true:{tagName:"jx-icon",$props:{name:"caret-down",weight:"bold"},attributes:{part:"twisty-icon"}},false:{tagName:"jx-icon",$props:{name:"caret-right",weight:"bold"},attributes:{part:"twisty-icon"}}}},{tagName:"span",attributes:{part:"icon"},children:[{tagName:"slot",attributes:{name:"icon"}}]},{tagName:"span",attributes:{part:"label"},textContent:"${state.label}"},{tagName:"span",attributes:{part:"status"},children:[{tagName:"slot",attributes:{name:"status"}}]},{tagName:"span",attributes:{part:"grip-slot"},$switch:{$ref:"#/state/grip"},cases:{true:{tagName:"span",attributes:{part:"grip","aria-hidden":"true",title:"Drag to reorder"},textContent:"⠿"}}},{tagName:"span",attributes:{part:"actions"},onclick:{$ref:"#/state/onActions"},children:[{tagName:"slot",attributes:{name:"actions"}}]}]};var Ar={$schema:"https://jxsuite.com/schema/v1",$id:"JxToastHost",tagName:"jx-toast-host",observedAttributes:["label","live","placement","hotkey"],state:{label:{type:"string",default:"Notifications",attribute:"label",description:"The region's accessible name, so a reader who lands in it is told what it is rather than hearing a message with no provenance. It names the STACK and never a toast: the messages inside it change, and a region renamed on every arrival is a region announced on every arrival."},live:{type:"string",default:"polite",attribute:"live",description:"polite, assertive or off: how the stack is announced. polite waits for a pause and is right for an outcome; assertive interrupts and is for the rare message that cannot wait. off is for a host that already says these things somewhere else — Jx Studio announces through its own single announcer, and a region here as well would say every notification twice. Role and attribute move together: polite writes role=status, assertive writes role=alert, off writes neither, so an assistive technology reading the role and one reading the attribute agree."},placement:{type:"string",default:"bottom-end",attribute:"placement",description:"bottom-end, bottom-start, top-end or top-start: which corner the stack is pinned to. It moves the box and NOT the order — the toasts are drawn in the order they are written, whichever corner they are in, so the order a reader hears, the order they tab through and the order they see stay one order. A host that wants the stack in the flow of its own layout overrides position in its own stylesheet; nothing here depends on the fixed box."},hotkey:{type:"string",default:"F8",attribute:"hotkey",description:"The key that moves focus to the first control in the stack. It is what makes a recovery control reachable at all: the stack is at the end of the document and a toast may expire before a reader could Tab to it, so the reader asks for it in one press instead — and arriving suspends every clock in the stack, so nothing then expires under their hand. Escape gives focus back to where it came from, and so does a toast closing while the reader is in it. A press carrying Ctrl, Alt or Meta is left alone. Empty turns the gesture off, for an application that owns a command of its own for this."},onMount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onHostMount",description:"Registers the stack's key on the document. It has to be the document: a key that only worked once focus was already in the stack would answer the question it exists to answer with itself."},onUnmount:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onHostUnmount",description:"Takes the key back when the stack leaves the document, so a removed host cannot go on answering a press for a stack it can no longer show."},onHold:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackHold",description:"Pointer or focus arrived anywhere in the stack: every toast in it is told to suspend its clock, not only the one underneath. An older toast retiring while the reader answers a newer one would move the very control they were reaching for."},onRelease:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackRelease",description:"The pointer or the focus left the stack for something outside it, so the clocks run again. A move between two toasts of one stack is not a departure and releases nothing."},onClose:{$prototype:"Function",$src:"jx-ui:/behaviors/toast-host.ts",$export:"onStackClose",description:"A toast closed. If it took the reader's focus with it, focus goes back to where the hotkey found it; if the reader was somewhere else entirely, nothing moves."}},onpointerover:{$ref:"#/state/onHold"},onpointerout:{$ref:"#/state/onRelease"},onfocusin:{$ref:"#/state/onHold"},onfocusout:{$ref:"#/state/onRelease"},onclose:{$ref:"#/state/onClose"},attributes:{role:"${state.live === 'off' ? null : state.live === 'assertive' ? 'alert' : 'status'}","aria-live":"${state.live}","aria-atomic":"false","aria-label":"${state.label || null}","data-placement":"${state.placement}"},style:{$description:"aria-atomic is false and written out rather than left to the role, which supplies true: a stack re-read whole on every arrival would announce three old messages to deliver one new one. pointer-events is none on the box and auto on each toast, so the empty corner the stack reserves is not a hole the page cannot be clicked through.",display:"flex",flexDirection:"column",gap:"var(--jx-space-3)",position:"fixed",zIndex:"1000",insetBlockEnd:"var(--jx-space-4)",insetInlineEnd:"var(--jx-space-4)",alignItems:"flex-end",maxInlineSize:"min(420px, calc(100vw - 2 * var(--jx-space-4)))",pointerEvents:"none","&[hidden]":{display:"none"},'&[data-placement="top-end"]':{insetBlockStart:"var(--jx-space-4)",insetBlockEnd:"auto"},'&[data-placement="bottom-start"]':{insetInlineStart:"var(--jx-space-4)",insetInlineEnd:"auto",alignItems:"flex-start"},'&[data-placement="top-start"]':{insetBlockStart:"var(--jx-space-4)",insetBlockEnd:"auto",insetInlineStart:"var(--jx-space-4)",insetInlineEnd:"auto",alignItems:"flex-start"}},children:[{tagName:"slot"}]};var Mr={$schema:"https://jxsuite.com/schema/v1",$id:"JxToolbar",tagName:"jx-toolbar",observedAttributes:["label","orientation"],state:{label:{type:"string",default:"",attribute:"label",description:"The accessible name of the toolbar, and it is not optional in practice: a toolbar is a container a reader is told they have entered, and an unnamed one is announced by its role alone. toolbar is in neither of the accessibility lint's named-role sets, so nothing lints its absence — the element's own test pins it instead, and so does every surface that mounts one."},orientation:{type:"string",default:"horizontal",attribute:"orientation",description:"horizontal or vertical. It chooses which arrow pair moves the caret between controls, and it turns the row through 90 degrees off aria-orientation — which role=toolbar both supports and defaults to horizontal, so unlike jx-action-group there is no second data- attribute to key the layout on."},onKeydown:{$prototype:"Function",$src:"jx-ui:/behaviors/toolbar.ts",$export:"onToolbarKeydown",description:"The toolbar keyboard contract: the arrow pair of its own axis moves the roving caret between reachable controls with wrap, Home and End go to the ends, and a control that answers the key itself keeps it — a text field holds the arrows while its caret has text left to walk in that direction, and holds Home and End always."},onReady:{$prototype:"Function",$src:"jx-ui:/behaviors/toolbar.ts",$export:"onToolbarReady",description:"Collapses the toolbar to one tab stop once it has rendered, and keeps it collapsed to one as controls come and go. It listens for the element's own jx-ready because onMount is handed the reactive scope alone, and placing a caret needs the host."},onMount:{$prototype:"Function",body:[{dispatchEvent:"jx-ready",bubbles:!0}],emits:[{name:"jx-ready",description:"The toolbar has rendered and distributed its children, so its caret can be placed."}],description:"Announces that the element has rendered. The toolbar's own onReady listens for it, and a host may too."}},attributes:{role:"toolbar","aria-label":"${state.label || null}","aria-orientation":"${state.orientation}"},onkeydown:{$ref:"#/state/onKeydown"},"onjx-ready":{$ref:"#/state/onReady"},style:{display:"flex","&[hidden]":{display:"none"},boxSizing:"border-box",alignItems:"center",gap:"var(--jx-space-2)",minWidth:"0",fontFamily:"var(--jx-font-sans)",fontSize:"var(--jx-text-md)",color:"var(--jx-fg)",'&[aria-orientation="vertical"]':{flexDirection:"column",alignItems:"stretch"}},children:[{tagName:"slot"}]};var pe={"jx-icon":ir,"jx-spinner":fr,"jx-tooltip":br,"jx-button":Uo,"jx-action-button":qo,"jx-menu-item":lr,"jx-menu":sr,"jx-popover":dr,"jx-textfield":jr,"jx-checkbox":Go,"jx-switch":vr,"jx-number-field":gr,"jx-select":pr,"jx-option":ur,"jx-listbox":hr,"jx-combobox":cr,"jx-action-group":Ko,"jx-toolbar":Mr,"jx-tab":yr,"jx-tab-panel":kr,"jx-tabs":$r,"jx-tree-item":Er,"jx-tree":Tr,"jx-accordion-item":Bo,"jx-accordion":_o,"jx-divider":nr,"jx-split":mr,"jx-kbd":rr,"jx-dot":ar,"jx-field":or,"jx-dialog":tr,"jx-toast":Sr,"jx-toast-host":Ar,"jx-color-area":Yo,"jx-color-slider":er,"jx-swatch":wr,"jx-swatch-group":xr,"jx-color-field":Xo},dc=Object.keys(pe),Hr=Aa(Object.values(pe)),jd=Hr.popoverTags??new Set,jm=Hr.invokerTags??new Set;var xn={};$i(xn,{clamp:()=>A,contrastRatio:()=>mn,formatHex:()=>me,formatOklch:()=>wn,hsvToRgb:()=>bn,inkOn:()=>uc,oklchToSrgb:()=>Ir,parseColor:()=>B,parseHex:()=>Nr,preferredInk:()=>ut,relativeLuminance:()=>fn,rgbToHsv:()=>ht,snapToStep:()=>Le,srgbToOklch:()=>gn});function A(e,t,n){if(!Number.isFinite(e))return t;return e<t?t:e>n?n:e}function Le(e,t,n,a){let o=A(e,n,a);if(!Number.isFinite(t)||t<=0)return o;let r=n+Math.round((o-n)/t)*t;if(r>a)r-=t;return A(Number(r.toFixed(6)),n,a)}function ct(e){return Math.round(A(e,0,255)).toString(16).padStart(2,"0")}function Nr(e){let t=e.trim().replace(/^#/,"");if(!/^[0-9a-f]+$/i.test(t))return null;let n=t.length===6||t.length===8,a=t.length===3||t.length===4;if(!n&&!a)return null;let o=n?2:1,r=(s)=>{let d=t.slice(s*o,s*o+o);return Number.parseInt(o===1?d+d:d,16)};return{a:t.length===4||t.length===8?r(3)/255:1,b:r(2),g:r(1),r:r(0)}}function ee(e,t){if(e.endsWith("%"))return Number(e.slice(0,-1))/100*t;return Number(e)}function Lr(e,t){let n=new RegExp(`^${t}a?\\(([^)]*)\\)$`,"i").exec(e.trim());if(!n)return null;return n[1].trim().split(/[\s,/]+/).filter(Boolean)}function B(e){let t=e.trim(),n=Lr(t,"rgb");if(n&&n.length>=3){let o=[ee(n[0],255),ee(n[1],255),ee(n[2],255)],r=n.length>3?ee(n[3],1):1;if(o.some((i)=>Number.isNaN(i))||Number.isNaN(r))return null;return{a:A(r,0,1),b:A(o[2],0,255),g:A(o[1],0,255),r:A(o[0],0,255)}}let a=Lr(t,"oklch");if(a&&a.length>=3){let o=ee(a[0],1),r=ee(a[1],0.4),i=Number(a[2].replace(/deg$/i,"")),s=a.length>3?ee(a[3],1):1;if([o,r,i,s].some((d)=>Number.isNaN(d)))return null;return Ir({a:A(s,0,1),c:r,h:i,l:o})}return Nr(t)}function me(e){let t=`#${ct(e.r)}${ct(e.g)}${ct(e.b)}`;return e.a>=1?t:`${t}${ct(A(e.a,0,1)*255)}`}function ht(e){let t=A(e.r,0,255)/255,n=A(e.g,0,255)/255,a=A(e.b,0,255)/255,o=Math.max(t,n,a),r=Math.min(t,n,a),i=o-r,s=0;if(i!==0)if(o===t)s=60*((n-a)/i%6);else if(o===n)s=60*((a-t)/i+2);else s=60*((t-n)/i+4);return{a:A(e.a,0,1),h:(s+360)%360,s:o===0?0:i/o*100,v:o*100}}function bn(e){let t=(e.h%360+360)%360,n=A(e.s,0,100)/100,a=A(e.v,0,100)/100,o=a*n,r=o*(1-Math.abs(t/60%2-1)),i=a-o,s=Math.floor(t/60)%6,d=[[o,r,0],[r,o,0],[0,o,r],[0,r,o],[r,0,o],[o,0,r]],[l,h,c]=d[s];return{a:A(e.a,0,1),b:(c+i)*255,g:(h+i)*255,r:(l+i)*255}}function fe(e){return e<=0.04045?e/12.92:((e+0.055)/1.055)**2.4}function pn(e){return e<=0.0031308?e*12.92:1.055*e**0.4166666666666667-0.055}function gn(e){let t=fe(A(e.r,0,255)/255),n=fe(A(e.g,0,255)/255),a=fe(A(e.b,0,255)/255),o=Math.cbrt(0.4122214708*t+0.5363325363*n+0.0514459929*a),r=Math.cbrt(0.2119034982*t+0.6806995451*n+0.1073969566*a),i=Math.cbrt(0.0883024619*t+0.2817188376*n+0.6299787005*a),s=0.2104542553*o+0.793617785*r-0.0040720468*i,d=1.9779984951*o-2.428592205*r+0.4505937099*i,l=0.0259040371*o+0.7827717662*r-0.808675766*i,h=Math.hypot(d,l);return{a:A(e.a,0,1),c:h,h:h<0.000001?0:(Math.atan2(l,d)*180/Math.PI+360)%360,l:s}}function Ir(e){let t=(e.h%360+360)%360*(Math.PI/180),n=e.c*Math.cos(t),a=e.c*Math.sin(t),o=(e.l+0.3963377774*n+0.2158037573*a)**3,r=(e.l-0.1055613458*n-0.0638541728*a)**3,i=(e.l-0.0894841775*n-1.291485548*a)**3,s=4.0767416621*o-3.3077115913*r+0.2309699292*i,d=-1.2684380046*o+2.6097574011*r-0.3413193965*i,l=-0.0041960863*o-0.7034186147*r+1.707614701*i;return{a:A(e.a,0,1),b:A(pn(l)*255,0,255),g:A(pn(d)*255,0,255),r:A(pn(s)*255,0,255)}}function wn(e){let t=`${(e.l*100).toFixed(1)}% ${e.c.toFixed(3)} ${e.h.toFixed(1)}`;return e.a>=1?`oklch(${t})`:`oklch(${t} / ${Number(e.a.toFixed(3))})`}function fn(e){let t=fe(A(e.r,0,255)/255),n=fe(A(e.g,0,255)/255),a=fe(A(e.b,0,255)/255);return 0.2126*t+0.7152*n+0.0722*a}function mn(e,t){let n=fn(e),a=fn(t);return(Math.max(n,a)+0.05)/(Math.min(n,a)+0.05)}var cc={a:1,b:0,g:0,r:0},hc={a:1,b:255,g:255,r:255};function ut(e){return mn(e,cc)>=mn(e,hc)?"black":"white"}function uc(e){let t=typeof e==="string"?B(e):null;return t?ut({...t,a:1}):""}var $n={};$i($n,{onAreaAxisChange:()=>gc,onAreaAxisInput:()=>bc,onAreaKeydown:()=>wc,onAreaPointerDown:()=>xc,onAreaPointerMove:()=>vc,onAreaPointerUp:()=>yc});var pc="jx-color-area",Cr={x:"saturation",y:"brightness"},fc={ArrowDown:"y",ArrowLeft:"x",ArrowRight:"x",ArrowUp:"y"},mc={ArrowDown:-1,ArrowLeft:-1,ArrowRight:1,ArrowUp:1},vn=new WeakSet;function be(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===pc?t:null}function yn(e){return e.querySelector('[part="track"]')}function kn(e){if(!(e instanceof Element))return null;let t=e.getAttribute("part");return t==="x"||t==="y"?t:null}function Or(e){let t=Number(e.step);return Number.isFinite(t)&&t>0?t:1}function we(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Ne(e,t,n){let a=Cr[t],o=Le(n,Or(e),0,100);if(e[a]===o)return!1;return e[a]=o,!0}function bc(e,t){let n=be(t),a=kn(t.target);if(!n||!a)return;t.stopPropagation(),Ne(e,a,Number(t.target.value)),we(n,"input")}function gc(e,t){let n=be(t),a=kn(t.target);if(!n||!a)return;t.stopPropagation(),Ne(e,a,Number(t.target.value)),we(n,"change")}function wc(e,t){let n=be(t),a=kn(t.target);if(!n||!a||e.disabled===!0)return;let o=fc[t.key];if(!o)return;if(o===a&&!t.shiftKey)return;t.preventDefault(),t.stopPropagation();let r=Or(e)*(t.shiftKey?10:1)*(mc[t.key]??0);if(Ne(e,o,Number(e[Cr[o]])+r))we(n,"input","change")}function Rr(e,t,n){let a=yn(t);if(!a)return!1;let o=a.getBoundingClientRect();if(o.width<=0||o.height<=0)return!1;let r=Ne(e,"x",(n.clientX-o.left)/o.width*100),i=Ne(e,"y",(1-(n.clientY-o.top)/o.height)*100);return r||i}function xc(e,t){let n=be(t);if(!n||e.disabled===!0)return;t.preventDefault(),vn.add(n);let a=yn(n);if(a&&typeof a.setPointerCapture==="function")try{a.setPointerCapture(t.pointerId)}catch{}if(n.querySelector('[part="x"]')?.focus(),Rr(e,n,t))we(n,"input")}function vc(e,t){let n=be(t);if(!n||!vn.has(n))return;if(Rr(e,n,t))we(n,"input")}function yc(e,t){let n=be(t);if(!n||!vn.delete(n))return;let a=yn(n);if(a&&typeof a.releasePointerCapture==="function"&&a.hasPointerCapture?.(t.pointerId))a.releasePointerCapture(t.pointerId);we(n,"change")}var An={};$i(An,{eyeDropperAvailable:()=>Ac,onEyeDropper:()=>Mc,onFieldChange:()=>Tc,onFieldInput:()=>Sc,onFieldMount:()=>Hc,onOpenPicker:()=>Ec,syncFromValue:()=>Tn});var Pr="jx-color-field",Dr=0,kc=new WeakMap;function Fr(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===Pr?t:null}function Zr(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest(Pr):null}function zr(e){return e.querySelector('[part="picker"]')}function Vr(e){return bn({a:e.alpha===!0?Number(e.opacity)/100:1,h:Number(e.hue),s:Number(e.saturation),v:Number(e.brightness)})}function jn(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Wr(e,t){let n={...t,a:1};e.solid=me(n),e.ink=ut(n)}function Sn(e){let t=Vr(e);e.value=e.format==="oklch"?wn(gn(t)):me(t),e.text=e.value,e.invalid=!1,Wr(e,t)}function Tn(e){let t=B(String(e.value??""))??B(String(e.resolved??""));if(e.invalid=!1,e.text=String(e.value??""),!t)return;if(Wr(e,t),me(t)===me(Vr(e)))return;let n=ht(t);if(e.saturation=Number(n.s.toFixed(2)),e.brightness=Number(n.v.toFixed(2)),e.opacity=Number((n.a*100).toFixed(2)),n.s>0&&n.v>0)e.hue=Number(n.h.toFixed(2))}var $c="[data-jx-channel]";function jc(e){let{target:t}=e;return t instanceof Element?t.closest($c):null}function _r(e,t,n){let a=Fr(t);if(!a||t.target===a)return;let o=jc(t),r=o?.dataset.jxChannel;if(!o||!r)return;if(t.stopPropagation(),r==="text"){let i=String(t.target.value??"");e.text=i;let s=B(i);if(n==="input"){e.invalid=!1;return}if(!s){e.invalid=i!=="";return}En(e,s),Sn(e),jn(a,"input","change");return}if(r==="system"||r==="palette"){let i=B(String(t.target.value??""));if(!i)return;En(e,{...i,a:e.alpha===!0?Number(e.opacity)/100:1})}else if(r==="area")e.saturation=Number(o.saturation),e.brightness=Number(o.brightness);else if(r==="hue")e.hue=Number(o.value);else if(r==="opacity")e.opacity=Number(o.value);else return;Sn(e),jn(a,n)}function En(e,t){let n=ht(t);if(e.saturation=Number(n.s.toFixed(2)),e.brightness=Number(n.v.toFixed(2)),e.alpha===!0)e.opacity=Number((n.a*100).toFixed(2));if(n.s>0&&n.v>0)e.hue=Number(n.h.toFixed(2))}function Sc(e,t){_r(e,t,"input")}function Tc(e,t){_r(e,t,"change")}function Ec(e,t){let n=Zr(t),a=n?zr(n):null;if(!n||!a||e.disabled===!0)return;if(e.expanded===!0){Fd(a);return}let o=n.getBoundingClientRect();a.x=Math.round(o.left),a.y=Math.round(o.bottom),zl(a,t.currentTarget instanceof Element?t.currentTarget:n)}function Ac(e){return e===!0&&typeof globalThis.EyeDropper==="function"}function Mc(e,t){let n=Zr(t),a=globalThis.EyeDropper;if(!n||!a||e.disabled===!0)return Promise.resolve();return new a().open().then((o)=>{let r=B(String(o?.sRGBHex??""));if(!r)return;En(e,r),Sn(e),jn(n,"input","change")}).catch(()=>{})}function Hc(e,t){let n=Fr(t);if(!n)return;kc.set(e,n),Dr+=1,e.uid=`jx-color-field-${Dr}`,Tn(e),new MutationObserver(()=>{Tn(e)}).observe(n,{attributeFilter:["data-resolved","data-value"],attributes:!0});let o=zr(n);if(o)o.addEventListener("toggle",(r)=>{e.expanded=r.newState==="open"})}var Ln={};$i(Ln,{onSliderChange:()=>Rc,onSliderInput:()=>Oc,onSliderKeydown:()=>Dc});var Lc="jx-color-slider",Nc={ArrowDown:-1,ArrowLeft:-1,ArrowRight:1,ArrowUp:1};function Mn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName===Lc?t:null}function Ic(e){return e.querySelector('input[part="input"]')}function Hn(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function Cc(e){let t=Number.isFinite(Number(e.min))?Number(e.min):0,n=Number(e.maxValue),a=Number(e.step);return{max:Number.isFinite(n)&&n>t?n:360,min:t,step:Number.isFinite(a)&&a>0?a:1}}function Oc(e,t){let n=Mn(t);if(!n||t.target===n)return;t.stopPropagation(),e.value=Number(t.target.value),Hn(n,"input")}function Rc(e,t){let n=Mn(t);if(!n||t.target===n)return;t.stopPropagation(),e.value=Number(t.target.value),Hn(n,"change")}function Dc(e,t){let n=Mn(t),a=Nc[t.key];if(!n||!a||!t.shiftKey||e.disabled===!0)return;t.preventDefault();let{max:o,min:r,step:i}=Cc(e),s=Le(Number(e.value)+a*i*10,i,r,o);if(s===Number(e.value))return;e.value=s;let d=Ic(n);if(d)d.value=String(s);Hn(n,"input","change")}var On={};$i(On,{closeList:()=>q,inputOf:()=>In,landingIndex:()=>Cn,mountCombobox:()=>Fc,nextIndex:()=>Ie,onComboboxButton:()=>Jc,onComboboxCommit:()=>Wc,onComboboxInput:()=>Zc,onComboboxKeydown:()=>_c,onComboboxPick:()=>Vc,onComboboxToggle:()=>zc,openList:()=>Gr,rowFor:()=>mt});var Pc="jx-combobox",Br=0;function Ce(e){let t=e.currentTarget;return t instanceof Element?t.closest(Pc):null}function In(e){return e.querySelector('input[part="input"]')}function qr(e){return e.querySelector('[part="popup"]')}function Oe(e){return Array.isArray(e.options)?e.options:[]}function Ur(e,...t){for(let n of t)e.dispatchEvent(new Event(n,{bubbles:!0}))}function pt(e){return e.disabled!==!0&&e.readonly!==!0}function Gr(e){let t=qr(e);if(!t)return;let n=e.getBoundingClientRect(),a=t;a.x=Math.round(n.left),a.y=Math.round(n.bottom),zl(t,e)}function q(e){let t=qr(e);if(t)Fd(t)}function ft(e,t){if(!pt(e)||Oe(e).length===0)return!1;return Gr(t),!0}function Cn(e){let t=Oe(e),n=mt(t,String(e.value??""));return n&&n.disabled!==!0?t.indexOf(n):-1}function Ie(e,t,n){let a=t<0?n>0?-1:0:t;for(let o of e.keys()){let r=((a+n*(o+1))%e.length+e.length)%e.length;if(e[r]?.disabled!==!0)return r}return-1}function mt(e,t){let n=t.toLowerCase();return e.find((a)=>String(a.value).toLowerCase()===n)??null}function Nn(e,t,n){let a=String(n.value);e.value=a,e.committed=a,e.activeIndex=-1,q(t),In(t)?.focus(),Ur(t,"input","change")}function Fc(e,t){Br+=1,e.uid=`jx-combobox-${Br}`,e.committed=String(e.value??"")}function Zc(e,t){let n=Ce(t),a=t.target;if(!n||!(a instanceof HTMLInputElement))return;e.value=a.value,e.activeIndex=-1,ft(e,n)}function zc(e,t){let n=t.newState==="open";if(e.open=n,!n)e.activeIndex=-1}function Jc(e,t){let n=Ce(t);if(!n||!pt(e))return;if(e.open===!0){q(n);return}if(ft(e,n))e.activeIndex=Cn(e);In(n)?.focus()}function Vc(e,t){let n=Ce(t),a=String(t.detail??""),o=mt(Oe(e),a);if(!n||!o)return;Nn(e,n,o)}function Wc(e,t){let n=Ce(t);if(!n)return;let a=t.target instanceof HTMLInputElement?t.target:null,o=a?a.value:String(e.value??""),r=mt(Oe(e),o);if(e.allowsCustomValue===!0||o===""||r){e.value=r?String(r.value):o,e.committed=String(e.value),q(n);return}t.stopPropagation(),e.value=String(e.committed??""),Ur(n,"change")}function _c(e,t){let n=Ce(t);if(!n||t.ctrlKey||t.metaKey)return;let a=Oe(e),o=Number(e.activeIndex??-1);switch(t.key){case"ArrowDown":{if(!pt(e))return;if(e.open!==!0){if(!ft(e,n))return;e.activeIndex=t.altKey?Cn(e):Ie(a,-1,1)}else if(!t.altKey)e.activeIndex=Ie(a,o,1);break}case"ArrowUp":{if(!pt(e))return;if(t.altKey){q(n);break}if(e.open!==!0){if(!ft(e,n))return;e.activeIndex=Ie(a,-1,-1)}else e.activeIndex=Ie(a,o,-1);break}case"Enter":{let r=e.open===!0&&o>=0?a[o]:void 0;if(!r){if(e.open===!0)q(n);return}Nn(e,n,r);break}case"Tab":{let r=e.open===!0&&o>=0?a[o]:void 0;if(r)Nn(e,n,r);else q(n);return}case"Escape":{if(e.open!==!0)return;q(n),t.stopPropagation();break}default:return}t.preventDefault()}var Rn={};$i(Rn,{mountListbox:()=>Bc,optionsOf:()=>Yr,syncListbox:()=>bt});function Yr(e){return[...e.querySelectorAll("jx-option")].filter((t)=>t.closest("jx-listbox")===e)}function bt(e,t){let n=null,a=!1;for(let o of Yr(e)){let r=t!==""&&o.id===t;if(r)n=o,a=o.selected!==!0;if(o.selected!==r)o.selected=r}if(n&&a&&typeof n.scrollIntoView==="function")n.scrollIntoView({block:"nearest"});return n}function Bc(e,t){bt(t,String(e.active??""));let n=null,a=()=>{if(n!==null)return;n=requestAnimationFrame(()=>{if(n=null,t.isConnected)bt(t,String(e.active??""))})};new MutationObserver(()=>{if(typeof requestAnimationFrame==="function")a();else bt(t,String(e.active??""))}).observe(t,{attributeFilter:["data-active"],attributes:!0,childList:!0,subtree:!0})}var Dn={};$i(Dn,{onNumberChange:()=>Yc,onNumberKeydown:()=>Kc,onStepDown:()=>Gc,onStepUp:()=>Uc,stepBy:()=>Re});function Xr(e){let t=e.currentTarget;return t instanceof Element?t.closest("jx-number-field"):null}function Qr(e){return e.querySelector('input[part="input"]')}function ei(e,t){e.value=t.value,e.badInput=t.validity?.badInput===!0}function qc(e){e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function Re(e,t,n){let a=Xr(t),o=a?Qr(a):null;if(!a||!o)return;try{if(n<0)o.stepDown(-n);else o.stepUp(n)}catch{return}ei(e,o),qc(a)}function Kc(e,t){let n=t;if(!n.shiftKey)return;if(n.key==="ArrowUp")n.preventDefault(),Re(e,t,10);else if(n.key==="ArrowDown")n.preventDefault(),Re(e,t,-10)}function Uc(e,t){Re(e,t,1)}function Gc(e,t){Re(e,t,-1)}function Yc(e,t){let n=Xr(t),a=n?Qr(n):null;if(!n||!a)return;ei(e,a)}var Fn={};$i(Fn,{mountSelect:()=>eh,syncSelect:()=>Pn});var ti=0;function Xc(e){return e.querySelector('select[part="control"]')}function Qc(e,t){return[...e.options].some((n)=>n.getAttribute("part")!=="unlisted"&&n.value===t)}function Pn(e,t){let n=String(e.value??""),a=e.unlisted??[];if(n!==""&&!Qc(t,n)){if(a.length!==1||a[0]?.value!==n)e.unlisted=[{label:n,value:n}]}else if(a.length>0)e.unlisted=[];if([...t.options].some((o)=>o.value===n)){if(t.value!==n||t.selectedIndex<0)t.value=n}else if(t.selectedIndex>=0)t.selectedIndex=-1}function eh(e,t){ti+=1,e.uid=`jx-select-${ti}`;let n=Xc(t);if(!n)return;Pn(e,n),new MutationObserver(()=>Pn(e,n)).observe(n,{attributeFilter:["data-value"],attributes:!0,childList:!0,subtree:!0})}var Jn={};$i(Jn,{applySwatchSelection:()=>rh,focusSwatch:()=>ii,onSwatchGroupKeydown:()=>ch,onSwatchGroupMount:()=>lh,onSwatchGroupSelect:()=>dh,swatchesOf:()=>gt,syncSwatches:()=>wt});var oi=new WeakMap,ni=new WeakMap;function Zn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-swatch-group"?t:null}function ri(e,t){return t instanceof Element&&t.closest("jx-swatch-group")===e}function gt(e){return[...e.querySelectorAll("jx-swatch")].filter((t)=>t.closest("jx-swatch-group")===e)}function ai(e){return String(e.value||e.color||"")}function zn(e){return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function th(e){(e.querySelector('[part="control"]')??e).focus()}function ii(e,t){let n=gt(e).filter((r)=>!zn(r));if(n.length===0)return null;let a=(t%n.length+n.length)%n.length,o=n[a];return th(o),o}function wt(e){let t=gt(e);if(t.length===0)return;let n=String(e.value??""),a=t.filter((i)=>!zn(i)),r=a.find((i)=>ai(i)===n)??a[0]??null;for(let i of t)i.checked=ai(i)===n?"true":"false",i.tabindex=i===r?"0":"-1"}function oh(e){if(ni.has(e))return;let t=new MutationObserver(()=>{wt(e)});t.observe(e,{childList:!0,subtree:!0}),ni.set(e,t)}function rh(e){let t=String(e.value??""),n=oi.get(e);if(n)wt(n);return t}function lh(e,t){let n=Zn(t);if(!n)return;oi.set(e,n),wt(n),oh(n)}function dh(e,t){let n=Zn(t);if(!n||!ri(n,t.target))return;t.stopPropagation();let a=String(t.detail??"");if(a===String(e.value??""))return;e.value=a,n.dispatchEvent(new CustomEvent("change",{bubbles:!0,detail:a}))}function ch(e,t){let n=Zn(t);if(!n||!ri(n,t.target))return;let a=gt(n).filter((i)=>!zn(i));if(a.length===0)return;let o=a.findIndex((i)=>i===t.target||t.target instanceof Node&&i.contains(t.target)),r;switch(t.key){case"ArrowDown":case"ArrowRight":{r=o+1;break}case"ArrowLeft":case"ArrowUp":{r=o===-1?-1:o-1;break}case"Home":{r=0;break}case"End":{r=-1;break}default:return}t.preventDefault(),t.stopPropagation(),ii(n,r)?.click()}var _n={};$i(_n,{applySelection:()=>uh,focusTab:()=>hi,onTabsKeydown:()=>mh,onTabsMount:()=>ph,onTabsSelect:()=>fh,syncTabs:()=>xt,tabsOf:()=>Wn});var di=new WeakMap,si=new WeakMap;function hh(e){if(si.has(e))return;let t=new MutationObserver(()=>{xt(e)});t.observe(e,{childList:!0,subtree:!0}),si.set(e,t)}function Vn(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-tabs"?t:null}function ci(e,t){return t instanceof Element&&t.closest("jx-tabs")===e}function Wn(e){return[...e.querySelectorAll("jx-tab")].filter((t)=>t.closest("jx-tabs")===e)}function li(e){return String(e.value??"")}function hi(e,t){if(e.length===0)return null;let n=(t%e.length+e.length)%e.length;for(let[o,r]of e.entries())r.tabIndex=o===n?0:-1;let a=e[n];return a.focus(),a}function xt(e){let t=Wn(e);if(t.length===0)return;let n=String(e.selected??""),a=t.findIndex((r)=>li(r)===n),o=a===-1?0:a;for(let[r,i]of t.entries())i.selected=li(i)===n,i.tabIndex=r===o?0:-1}function uh(e){let t=String(e.selected??""),n=di.get(e);if(n)xt(n);return t}function ph(e,t){let n=Vn(t);if(!n)return;di.set(e,n),xt(n),hh(n)}function fh(e,t){let n=Vn(t);if(!n||!ci(n,t.target))return;t.stopPropagation();let a=String(t.detail??"");if(a===String(e.selected??""))return;e.selected=a,n.dispatchEvent(new CustomEvent("change",{bubbles:!0,detail:a}))}function mh(e,t){let n=Vn(t);if(!n||!ci(n,t.target))return;let a=Wn(n);if(a.length===0)return;let o=a.findIndex((l)=>l===t.target||t.target instanceof Node&&l.contains(t.target)),r=String(e.orientation??"horizontal")==="vertical",i=r?"ArrowDown":"ArrowRight",s=r?"ArrowUp":"ArrowLeft",d=null;switch(t.key){case i:{d=o+1;break}case s:{d=o===-1?-1:o-1;break}case"Home":{d=0;break}case"End":{d=a.length-1;break}case"Enter":case" ":{let l=a[o];if(!l||t.target!==l)return;l.click();break}case"Delete":{let l=a[o]?.querySelector('[part="close"]');if(!l)return;l.click();break}default:return}if(d!==null){let l=hi(a,d);if(l&&String(e.activation??"auto")!=="manual")l.click()}t.preventDefault(),t.stopPropagation()}var Un={};$i(Un,{cedesKey:()=>wi,controlOf:()=>Bn,focusItem:()=>gi,itemsOf:()=>De,onToolbarKeydown:()=>jh,onToolbarReady:()=>Sh,syncRoving:()=>Kn});var bh=new Set(["","text","search","url","tel","password","email"]);function pi(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-toolbar"?t:null}function gh(e,t){return t instanceof Element&&t.closest("jx-toolbar")===e}function wh(e,t){let n=t;for(let a=t.parentElement;a&&a!==e;a=a.parentElement)if(a.localName.includes("-"))n=a;return n}function Bn(e){if(e.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))return e;return[...e.querySelectorAll('[part="control"], [part="input"]')].find((n)=>n.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))??e.querySelector("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']")??e}function De(e){let t=[];for(let n of e.querySelectorAll("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']")){if(n.closest("jx-toolbar")!==e)continue;let a=n.closest("jx-action-group, jx-tabs, jx-tree, jx-swatch-group, jx-listbox, jx-menu");if(a&&e.contains(a))continue;let o=wh(e,n);if(!t.includes(o)&&!Bn(o).matches("select, input[type='range'], input[type='number'], [role='spinbutton'], [role='slider'], [role='combobox']"))t.push(o)}return t}function qn(e){if(e.hidden)return!0;return e.disabled===void 0?e.hasAttribute("disabled"):e.disabled===!0}function fi(e){return"tabindex"in e?String(e.tabindex??""):e.getAttribute("tabindex")??""}function xh(e,t){if("tabindex"in e)e.tabindex=t;else if(e.matches("button, input, select, textarea, a[href], [contenteditable=''], [contenteditable='true']"))e.tabIndex=Number(t)}function mi(e,t){for(let n of e)xh(n,n===t?"0":"-1")}function bi(e){let t=e.filter((n)=>!qn(n));return t.find((n)=>fi(n)==="0")??t[0]??null}function gi(e,t){let n=De(e),a=n.filter((i)=>!qn(i));if(a.length===0)return null;let o=(t%a.length+a.length)%a.length,r=a[o];return mi(n,r),Bn(r).focus(),r}function vh(e,t){let n=null,a=null;try{n=e.selectionStart,a=e.selectionEnd}catch{return!0}if(n===null||a===null)return!0;if(n!==a)return!1;return t?n>=String(e.value??"").length:n<=0}function yh(e){if(e.localName==="textarea")return!0;return e.localName==="input"&&bh.has((e.getAttribute("type")??"").toLowerCase())}function wi(e,t,n){if(!(e instanceof HTMLElement)||!yh(e))return!1;if(t==="Home"||t==="End")return!0;return!vh(e,t===n)}function Kn(e){let t=De(e);mi(t,bi(t))}function kh(e){let t=De(e),n=bi(t);return t.every((a)=>fi(a)===(a===n?"0":"-1"))}var ui=new WeakSet;function $h(e){if(ui.has(e))return;ui.add(e),new MutationObserver(()=>{if(!kh(e))Kn(e)}).observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["disabled","hidden"]})}function jh(e,t){let n=pi(t);if(!n||!gh(n,t.target))return;let a=e.orientation==="vertical",o=a?"ArrowDown":"ArrowRight",r=a?"ArrowUp":"ArrowLeft";if(t.key!==o&&t.key!==r&&t.key!=="Home"&&t.key!=="End")return;if(wi(t.target,t.key,o))return;let i=De(n).filter((l)=>!qn(l));if(i.length===0)return;let s=i.findIndex((l)=>l===t.target||t.target instanceof Node&&l.contains(t.target)),d;if(t.key===o)d=s+1;else if(t.key===r)d=s===-1?-1:s-1;else if(t.key==="Home")d=0;else d=-1;gi(n,d),t.preventDefault(),t.stopPropagation()}function Sh(e,t){let n=pi(t);if(n)Kn(n),$h(n)}var ta={};$i(ta,{applyCurrent:()=>Hh,itemsOf:()=>ea,onTreeClick:()=>Fh,onTreeDblClick:()=>Zh,onTreeKeydown:()=>Ph,onTreeMount:()=>Lh,onTreeToggle:()=>zh,syncTree:()=>ze});var yi=new WeakMap,xi=new WeakMap,vt=new WeakMap;function Fe(e){let t=e.currentTarget;return t instanceof HTMLElement&&t.localName==="jx-tree"?t:null}function ki(e,t){return t instanceof Element&&t.closest("jx-tree")===e}function yt(e,t,n){let a=e[t];return a===void 0?e.getAttribute(n)??"":String(a)}function D(e){return yt(e,"value","value")}function Pe(e){let t=Number(yt(e,"level","aria-level"));return Number.isFinite(t)&&t>=1?Math.trunc(t):1}function Gn(e){let t=yt(e,"expanded","aria-expanded");return t==="true"||t==="false"?t:""}function Ze(e){return e.disabled===void 0?e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true":e.disabled===!0}function Th(e){let t=yt(e,"label","label");return t===""?e.textContent??"":t}function ea(e,t={}){let n=[...e.querySelectorAll("jx-tree-item")].filter((a)=>a.closest("jx-tree")===e);return t.includeDisabled?n:n.filter((a)=>!Ze(a))}function ze(e){let t=ea(e,{includeDisabled:!0});if(t.length===0)return;let n=String(e.current??""),a=t.filter((r)=>!Ze(r)),o=a.find((r)=>D(r)===n)??a[0]??null;for(let r of t)r.caret=r===o;Ah(e,n,o)}function Eh(e,t){let n=e.ownerDocument,a=n.activeElement;if(a instanceof Node&&e.contains(a))return!0;return(a===null||a===n.body)&&t.held!==null&&!t.held.isConnected}function Ah(e,t,n){let a=vt.get(e);if(!a)return;if(!Eh(e,a)){vt.delete(e);return}if(t===a.from||n===null||D(n)!==t)return;if(n.focus(),e.ownerDocument.activeElement===n)vt.delete(e)}function Mh(e){if(xi.has(e))return;let t=new MutationObserver(()=>{ze(e)});t.observe(e,{attributeFilter:["tabindex"],attributes:!0,childList:!0,subtree:!0}),xi.set(e,t)}function Hh(e){let t=String(e.current??""),n=yi.get(e);if(n)ze(n);return t}function Lh(e,t){let n=Fe(t);if(!n)return;yi.set(e,n),ze(n),Mh(n)}function Nh(e,t){return e.findIndex((n)=>n===t||t instanceof Node&&n.contains(t))}function V(e,t,n){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}))}function ji(e,t,n){if(t.current=D(n),ze(e),n.focus(),typeof n.scrollIntoView==="function")n.scrollIntoView({block:"nearest"});V(e,"change",D(n))}function Yn(e){return Number(e.padtop??0)>0}function Xn(e){return Number(e.padbottom??0)>0}function Si(e,t){vt.set(e,{from:String(t.current??""),held:e.ownerDocument.activeElement})}function vi(e,t,n){Si(e,t),V(e,"move",{from:String(t.current??""),key:n})}function Ih(e){return Yn(e)||Xn(e)}function Ch(e,t,n){Si(e,t),V(e,"typeahead",{char:n,from:String(t.current??"")})}function Qn(e,t,n,a,o){let r=t.multiple===!0?a:"replace",i=String(t.anchor??""),s=r==="range"?i===""?o||n:i:n;t.anchor=s,V(e,"select",{anchor:s,mode:r,value:n})}function Ti(e){if(e.shiftKey)return"range";return e.ctrlKey||e.metaKey?"toggle":"replace"}function Oh(e){return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?e.key.toLowerCase():null}function Rh(e,t,n){let a=e.map((o)=>Th(o).trim().toLowerCase());for(let o=1;o<=a.length;o++){let r=(t+o)%a.length;if(a[r].startsWith(n))return r}return-1}function Dh(e,t){let n=Pe(e[t]);for(let a=t-1;a>=0;a--)if(Pe(e[a])<n)return a;return-1}function Ph(e,t){let n=Fe(t);if(!n||!ki(n,t.target))return;let a=ea(n);if(a.length===0)return;let o=Nh(a,t.target),r=String(e.current??""),i=t.ctrlKey||t.metaKey,s=a[o],d=null;switch(t.key){case"ArrowDown":{d={key:t.key,select:!i,to:o===-1?0:o+1};break}case"ArrowUp":{d={key:t.key,select:!i,to:o===-1?a.length-1:o-1};break}case"Home":case"End":{if(t.key==="Home"?Yn(e):Xn(e)){t.preventDefault(),t.stopPropagation(),vi(n,e,t.key);return}d={key:t.key,select:!0,to:t.key==="Home"?0:a.length-1};break}case"ArrowRight":{if(!s)return;let h=Gn(s);if(h==="")return;if(h==="false"){t.preventDefault(),t.stopPropagation(),V(n,"expand",{expanded:!0,value:D(s)});return}let c=a[o+1];if(c&&Pe(c)<=Pe(s))return;d={key:t.key,select:!0,to:o+1};break}case"ArrowLeft":{if(!s)return;if(Gn(s)==="true"){t.preventDefault(),t.stopPropagation(),V(n,"expand",{expanded:!1,value:D(s)});return}let h=Dh(a,o);if(h===-1&&Pe(s)===1)return;d={key:t.key,select:!0,to:h};break}case"Enter":{if(!s)return;t.preventDefault(),t.stopPropagation(),V(n,"activate",D(s));return}case" ":{if(!s)return;t.preventDefault(),t.stopPropagation(),Qn(n,e,D(s),e.multiple===!0?"toggle":"replace",r);return}default:{let h=Oh(t);if(h===null)return;if(Ih(e)){t.preventDefault(),t.stopPropagation(),Ch(n,e,h);return}let c=Rh(a,o,h);if(c===-1)return;d={key:t.key,select:!0,to:c}}}t.preventDefault(),t.stopPropagation();let l=a[d.to];if(!l){if(d.to<0?Yn(e):Xn(e))vi(n,e,d.key);return}if(ji(n,e,l),d.select)Qn(n,e,D(l),Ti(t),r)}function Fh(e,t){let n=Fe(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest("jx-tree-item");if(!a||a.closest("jx-tree")!==n||Ze(a))return;let o=String(e.current??"");ji(n,e,a),Qn(n,e,D(a),Ti(t),o)}function Zh(e,t){let n=Fe(t);if(!n||!(t.target instanceof Element))return;let a=t.target.closest("jx-tree-item");if(!a||a.closest("jx-tree")!==n||Ze(a))return;V(n,"activate",D(a))}function zh(e,t){let n=Fe(t);if(!n||!ki(n,t.target)||!(t.target instanceof Element))return;t.stopPropagation();let a=t.target.closest("jx-tree-item");if(!a||Ze(a))return;V(n,"expand",{expanded:Gn(a)!=="true",value:D(a)})}var aa={};$i(aa,{TOOLTIP_HIDE_GRACE_MS:()=>Mi,bindTooltip:()=>Li,measureAnchoredFlip:()=>Ci,mintHintId:()=>Xh,onTooltipBeforeToggle:()=>Kh,onTooltipReady:()=>Gh,onTooltipToggle:()=>Uh,onTooltipUnmount:()=>Yh,placeTooltip:()=>Ii,supportsInterestInvokers:()=>Hi});var Mi=150,Ei=6,Je=4,Ve=new WeakMap,kt=new WeakMap;function Jh(e,t){let n=kt.get(e);if(!n){let r=new Set,i=(s)=>{if(s.key!=="Escape")return;for(let d of r)d()};e.addEventListener("keydown",i,!0),n={dismiss:r,listener:i},kt.set(e,n)}let{dismiss:a,listener:o}=n;return a.add(t),()=>{if(a.delete(t),a.size===0&&kt.get(e)?.listener===o)e.removeEventListener("keydown",o,!0),kt.delete(e)}}function Vh(e){try{return e.matches(":popover-open")}catch{return!1}}function Wh(e,t){if(t)return!1;if(!(e instanceof Element))return!0;try{return e.matches(":focus-visible")}catch{return!0}}var xe=new WeakMap;function Hi(){return typeof HTMLButtonElement==="function"&&"interestForElement"in HTMLButtonElement.prototype}function _h(e,t){return Hi()&&e.id!==""&&t.getAttribute("interestfor")===e.id}function Bh(e,t){zl(e,t)}function qh(e){Fd(e)}function Li(e,t){if(_h(e,t))return()=>{};let n=e.getRootNode(),a=null,o=null,r=!1,i=!1,s=!1,d=!1,l=!1,h=()=>{if(a!==null)clearTimeout(a),a=null;if(o!==null)clearTimeout(o),o=null},c=()=>{h(),l=!0,Bh(e,t)},u=()=>{l=!1,qh(e)},p=()=>{if(h(),r||i||s)return;u()},g=()=>{h();let S=Number(e.delay)||0;a=setTimeout(c,S)},b=()=>{h(),o=setTimeout(p,Mi)},f=()=>{r=!0,g()},m=()=>{r=!1,d=!1,b()},x=()=>{d=!0},y=()=>{d=!1},k=(S)=>{let E=Wh(S.target,d);if(d=!1,!E)return;s=!0,c()},T=()=>{s=!1,p()},I=()=>{i=!0,h()},j=()=>{i=!1,b()},C=()=>{if(!l&&!Vh(e))return;h(),u()},w=[[t,"pointerenter",f],[t,"pointerleave",m],[t,"pointerdown",x],[t,"pointerup",y],[t,"focusin",k],[t,"focusout",T],[e,"pointerenter",I],[e,"pointerleave",j]];for(let[S,E,F]of w)S.addEventListener(E,F,!0);let M=Jh(n,C);return()=>{h(),M();for(let[S,E,F]of w)S.removeEventListener(E,F,!0)}}function Ni(e,t){let n=t.getRootNode(),a=typeof e.for==="string"?e.for:"",o=a===""?null:n.getElementById?.(a)??null;if(o)return o;let r=t.id;if(!/^[\w-]+$/.test(r))return null;return n.querySelector(`[interestfor="${r}"]`)}function na(e,t){let n=Ni(e,t);if(n)return n;let a=t.getRootNode(),o=t.id;if(!/^[\w-]+$/.test(o))return null;return a.querySelector(`[aria-describedby~="${o}"]`)}function Ii(e,t){let n=na(e,t);if(!n)return;let a=n.getBoundingClientRect();if(a.width===0&&a.height===0)return;e.x=Math.round(a.left),e.y=Math.round(a.bottom+Ei),e.flipped=!1;let o=()=>{let r=t.getBoundingClientRect();if(r.width===0&&r.height===0)return;if(r.right>window.innerWidth-Je)e.x=Math.max(Je,Math.round(window.innerWidth-r.width-Je));if(r.bottom>window.innerHeight-Je)e.y=Math.max(Je,Math.round(a.top-r.height-Ei)),e.flipped=!0};if(typeof requestAnimationFrame==="function")requestAnimationFrame(o);else o()}function Ci(e,t){xe.get(e)?.();let n=na(e,t),a=()=>{if(!n||e.anchored!==!0)return;let l=t.getBoundingClientRect(),h=n.getBoundingClientRect();if(l.width===0&&l.height===0)return;e.flipped=l.bottom<=h.top};if(!n||typeof requestAnimationFrame!=="function")return a(),()=>{};let o=null,r=()=>{o=null,a()},i=()=>{if(o===null)o=requestAnimationFrame(r)};window.addEventListener("scroll",i,{capture:!0,passive:!0}),window.addEventListener("resize",i);let s=typeof ResizeObserver==="function"?new ResizeObserver(i):null;if(s)s.observe(t),s.observe(n);let d=()=>{if(o!==null)cancelAnimationFrame(o),o=null;if(window.removeEventListener("scroll",i,{capture:!0}),window.removeEventListener("resize",i),s?.disconnect(),xe.get(e)===d)xe.delete(e)};return xe.set(e,d),i(),d}function Kh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=t.newState==="open",{source:o}=t,r=o instanceof Element?o:na(e,n);if(e.anchored=a&&r!==null,!a)e.flipped=!1}function Uh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=t.newState==="open";if(e.open=a,!a){xe.get(e)?.();return}if(e.anchored===!0&&te())Ci(e,n);else Ii(e,n)}function Gh(e,t){let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let a=Ni(e,n);if(!a)return;Ve.get(e)?.dispose(),Ve.set(e,{dispose:Li(n,a),tip:n})}function Yh(e){xe.get(e)?.();let t=Ve.get(e);if(!t)return;queueMicrotask(()=>{if(Ve.get(e)!==t)return;if(t.tip.isConnected)return;t.dispose(),Ve.delete(e)})}var Ai=0;function Xh(e,t){Ai+=1,e.uid=`${t.localName}-${Ai}`}var sa={};$i(sa,{TOAST_PAUSE:()=>ra,TOAST_RESUME:()=>ia,closeToast:()=>St,onToastAction:()=>ou,onToastDismiss:()=>au,onToastHold:()=>tu,onToastMount:()=>Qh,onToastRelease:()=>nu,onToastUnmount:()=>eu,staysInside:()=>$t});var ra="jx-toast-pause",ia="jx-toast-resume",Ri={focusin:"focus",focusout:"focus",["jx-toast-pause"]:"stack",["jx-toast-resume"]:"stack",pointerenter:"pointer",pointerleave:"pointer",pointerout:"pointer",pointerover:"pointer"},Oi=new WeakMap,Di=new WeakMap;function We(e){let t=Oi.get(e);if(t)return t;let n={holds:new Set,remaining:0,startedAt:0,timer:null};return Oi.set(e,n),n}function Pi(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest("jx-toast"):null}function $t(e){let{relatedTarget:t,currentTarget:n}=e;return t instanceof Node&&n instanceof Node&&n.contains(t)}function jt(e){if(e.timer!==null)clearTimeout(e.timer),e.timer=null}function oa(e){let t=We(e);if(jt(t),e.open!==!0||t.holds.size>0||t.remaining<=0)return;t.startedAt=Date.now(),t.timer=setTimeout(()=>{t.timer=null;let n=Di.get(e);if(n)St(n,"timeout")},t.remaining)}function St(e,t){let n=e;if(n.open!==!0)return;n.open=!1,e.dispatchEvent(new CustomEvent("close",{bubbles:!0,detail:{reason:t}}))}function Qh(e,t){Di.set(e,t);let n=We(e);n.remaining=Number(e.timeout)||0,oa(e),new MutationObserver(()=>{if(e.open===!0){n.remaining=Number(e.timeout)||0,oa(e);return}jt(n)}).observe(t,{attributeFilter:["data-open"],attributes:!0})}function eu(e){jt(We(e))}function tu(e,t){let n=We(e),a=Ri[t.type]??t.type;if(n.timer!==null)n.remaining=Math.max(1,n.remaining-(Date.now()-n.startedAt));n.holds.add(a),jt(n)}function nu(e,t){if($t(t))return;We(e).holds.delete(Ri[t.type]??t.type),oa(e)}function au(e,t){let n=Pi(t);if(n)St(n,"dismissed")}function ou(e,t){let n=Pi(t);if(n)St(n,"action")}var ua={};$i(ua,{focusStack:()=>Zi,focusablesIn:()=>Fi,onHostMount:()=>hu,onHostUnmount:()=>uu,onStackClose:()=>cu,onStackHold:()=>lu,onStackRelease:()=>du,returnFocus:()=>ha});var ru="jx-toast-host",iu='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',la=new WeakMap,da=new WeakMap;function ca(e){let t=e.currentTarget??e.target;return t instanceof Element?t.closest(ru):null}function Fi(e){return[...e.querySelectorAll(iu)].filter((t)=>t.closest("jx-toast")?.dataset.open!==void 0)}function su(e){let t=e.ownerDocument.activeElement;return t instanceof Node&&e.contains(t)}function Zi(e){let[t]=Fi(e);if(!t)return!1;let n=e.ownerDocument.activeElement;if(n instanceof HTMLElement&&!e.contains(n))la.set(e,n);return t.focus(),!0}function ha(e){let t=la.get(e);if(la.delete(e),t?.isConnected===!0)return t.focus(),!0;let n=e.ownerDocument.activeElement;if(n instanceof HTMLElement&&e.contains(n))n.blur();return!1}function zi(e,t){for(let n of e.querySelectorAll("jx-toast"))n.dispatchEvent(new Event(t))}function lu(e,t){let n=ca(t);if(n)zi(n,ra)}function du(e,t){let n=ca(t);if(n&&!$t(t))zi(n,ia)}function cu(e,t){let n=ca(t);if(!n)return;let a=n.ownerDocument.activeElement,o=t.target,r=a===null||a===n.ownerDocument.body,i=o instanceof Node&&a instanceof Node&&o.contains(a);if(r||i)ha(n)}function hu(e,t){let n=t.getRootNode(),a=(o)=>{let r=o;if(r.altKey||r.ctrlKey||r.metaKey)return;let i=typeof e.hotkey==="string"?e.hotkey:"";if(i!==""&&r.key===i){if(Zi(t))r.preventDefault();return}if(r.key==="Escape"&&su(t))ha(t),r.preventDefault()};n.addEventListener("keydown",a),da.set(e,()=>n.removeEventListener("keydown",a))}function uu(e){da.get(e)?.(),da.delete(e)}var ma={};$i(ma,{ICON_NAMES:()=>Vi,ICON_VIEW_BOX:()=>Tt,ICON_WEIGHTS:()=>_e,hasIcon:()=>Wi,iconPath:()=>_i,iconViewBox:()=>Bi});var pa={icons:{"align-bottom":{regular:"M224,216a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,216Zm-88-40V80a16,16,0,0,1,16-16h40a16,16,0,0,1,16,16v96a16,16,0,0,1-16,16H152A16,16,0,0,1,136,176Zm16,0h40V80H152ZM48,176V40A16,16,0,0,1,64,24h40a16,16,0,0,1,16,16V176a16,16,0,0,1-16,16H64A16,16,0,0,1,48,176Zm16,0h40V40H64Z"},"align-bottom-simple":{regular:"M208,232a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,232ZM80,192V40A16,16,0,0,1,96,24h64a16,16,0,0,1,16,16V192a16,16,0,0,1-16,16H96A16,16,0,0,1,80,192Zm16,0h64V40H96Z"},"align-center-horizontal":{regular:"M208,136H136V120h48a16,16,0,0,0,16-16V64a16,16,0,0,0-16-16H136V32a8,8,0,0,0-16,0V48H72A16,16,0,0,0,56,64v40a16,16,0,0,0,16,16h48v16H48a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16h72v16a8,8,0,0,0,16,0V208h72a16,16,0,0,0,16-16V152A16,16,0,0,0,208,136ZM72,64H184v40H72ZM208,192H48V152H208v40Z"},"align-center-horizontal-simple":{regular:"M208,80H136V48a8,8,0,0,0-16,0V80H48A16,16,0,0,0,32,96v64a16,16,0,0,0,16,16h72v32a8,8,0,0,0,16,0V176h72a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80Zm0,80H48V96H208v64Z"},"align-center-vertical":{regular:"M224,120H208V72a16,16,0,0,0-16-16H152a16,16,0,0,0-16,16v48H120V48a16,16,0,0,0-16-16H64A16,16,0,0,0,48,48v72H32a8,8,0,0,0,0,16H48v72a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V136h16v48a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V136h16a8,8,0,0,0,0-16ZM104,208H64V48h40Zm88-24H152V72h40Z"},"align-left":{regular:"M48,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0Zm16,64V64A16,16,0,0,1,80,48h96a16,16,0,0,1,16,16v40a16,16,0,0,1-16,16H80A16,16,0,0,1,64,104Zm16,0h96V64H80Zm152,48v40a16,16,0,0,1-16,16H80a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H216A16,16,0,0,1,232,152Zm-16,40V152H80v40H216Z"},"align-right":{regular:"M224,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM192,64v40a16,16,0,0,1-16,16H80a16,16,0,0,1-16-16V64A16,16,0,0,1,80,48h96A16,16,0,0,1,192,64Zm-16,0H80v40h96Zm16,88v40a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H176A16,16,0,0,1,192,152Zm-16,0H40v40H176Z"},"align-top":{regular:"M224,40a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,40ZM208,80v96a16,16,0,0,1-16,16H152a16,16,0,0,1-16-16V80a16,16,0,0,1,16-16h40A16,16,0,0,1,208,80Zm-16,0H152v96h40Zm-72,0V216a16,16,0,0,1-16,16H64a16,16,0,0,1-16-16V80A16,16,0,0,1,64,64h40A16,16,0,0,1,120,80Zm-16,0H64V216h40Z"},"align-top-simple":{regular:"M208,32a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,32ZM176,72V224a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16V72A16,16,0,0,1,96,56h64A16,16,0,0,1,176,72Zm-16,0H96V224h64Z"},"arrow-down":{regular:"M205.66,149.66l-72,72a8,8,0,0,1-11.32,0l-72-72a8,8,0,0,1,11.32-11.32L120,196.69V40a8,8,0,0,1,16,0V196.69l58.34-58.35a8,8,0,0,1,11.32,11.32Z",bold:"M208.49,152.49l-72,72a12,12,0,0,1-17,0l-72-72a12,12,0,0,1,17-17L116,187V40a12,12,0,0,1,24,0V187l51.51-51.52a12,12,0,0,1,17,17Z"},"arrow-elbow-left-up":{regular:"M240,192a8,8,0,0,1-8,8H88a8,8,0,0,1-8-8V67.31L45.66,101.66A8,8,0,0,1,34.34,90.34l48-48a8,8,0,0,1,11.32,0l48,48a8,8,0,0,1-11.32,11.32L96,67.31V184H232A8,8,0,0,1,240,192Z"},"arrow-left":{regular:"M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z"},"arrow-right":{regular:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z",bold:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"},"arrow-square-out":{regular:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},"arrow-u-down-left":{regular:"M232,112a64.07,64.07,0,0,1-64,64H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48a8,8,0,0,1,11.32,11.32L51.31,160H168a48,48,0,0,0,0-96H80a8,8,0,0,1,0-16h88A64.07,64.07,0,0,1,232,112Z"},"arrow-u-up-left":{regular:"M232,144a64.07,64.07,0,0,1-64,64H80a8,8,0,0,1,0-16h88a48,48,0,0,0,0-96H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48A8,8,0,0,1,85.66,45.66L51.31,80H168A64.07,64.07,0,0,1,232,144Z"},"arrow-u-up-right":{regular:"M170.34,130.34,204.69,96H88a48,48,0,0,0,0,96h88a8,8,0,0,1,0,16H88A64,64,0,0,1,88,80H204.69L170.34,45.66a8,8,0,0,1,11.32-11.32l48,48a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32-11.32Z"},"arrow-up":{regular:"M205.66,117.66a8,8,0,0,1-11.32,0L136,59.31V216a8,8,0,0,1-16,0V59.31L61.66,117.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0l72,72A8,8,0,0,1,205.66,117.66Z",bold:"M208.49,120.49a12,12,0,0,1-17,0L140,69V216a12,12,0,0,1-24,0V69L64.49,120.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0l72,72A12,12,0,0,1,208.49,120.49Z"},"arrows-clockwise":{regular:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"},"arrows-horizontal":{regular:"M237.66,133.66l-32,32a8,8,0,0,1-11.32-11.32L212.69,136H43.31l18.35,18.34a8,8,0,0,1-11.32,11.32l-32-32a8,8,0,0,1,0-11.32l32-32a8,8,0,0,1,11.32,11.32L43.31,120H212.69l-18.35-18.34a8,8,0,0,1,11.32-11.32l32,32A8,8,0,0,1,237.66,133.66Z"},"arrows-in-line-horizontal":{regular:"M136,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM69.66,90.34a8,8,0,0,0-11.32,11.32L76.69,120H16a8,8,0,0,0,0,16H76.69L58.34,154.34a8,8,0,0,0,11.32,11.32l32-32a8,8,0,0,0,0-11.32ZM240,120H179.31l18.35-18.34a8,8,0,0,0-11.32-11.32l-32,32a8,8,0,0,0,0,11.32l32,32a8,8,0,0,0,11.32-11.32L179.31,136H240a8,8,0,0,0,0-16Z"},"arrows-out":{regular:"M216,48V96a8,8,0,0,1-16,0V67.31l-42.34,42.35a8,8,0,0,1-11.32-11.32L188.69,56H160a8,8,0,0,1,0-16h48A8,8,0,0,1,216,48ZM98.34,146.34,56,188.69V160a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8H96a8,8,0,0,0,0-16H67.31l42.35-42.34a8,8,0,0,0-11.32-11.32ZM208,152a8,8,0,0,0-8,8v28.69l-42.34-42.35a8,8,0,0,0-11.32,11.32L188.69,200H160a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V160A8,8,0,0,0,208,152ZM67.31,56H96a8,8,0,0,0,0-16H48a8,8,0,0,0-8,8V96a8,8,0,0,0,16,0V67.31l42.34,42.35a8,8,0,0,0,11.32-11.32Z"},"arrows-out-line-horizontal":{regular:"M136,40V216a8,8,0,0,1-16,0V40a8,8,0,0,1,16,0ZM96,120H35.31l18.35-18.34A8,8,0,0,0,42.34,90.34l-32,32a8,8,0,0,0,0,11.32l32,32a8,8,0,0,0,11.32-11.32L35.31,136H96a8,8,0,0,0,0-16Zm149.66,2.34-32-32a8,8,0,0,0-11.32,11.32L220.69,120H160a8,8,0,0,0,0,16h60.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,122.34Z"},"arrows-out-line-vertical":{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM101.66,53.66,120,35.31V96a8,8,0,0,0,16,0V35.31l18.34,18.35a8,8,0,0,0,11.32-11.32l-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32Zm52.68,148.68L136,220.69V160a8,8,0,0,0-16,0v60.69l-18.34-18.35a8,8,0,0,0-11.32,11.32l32,32a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0-11.32-11.32Z"},"arrows-vertical":{regular:"M165.66,194.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L120,212.69V43.31L101.66,61.66A8,8,0,0,1,90.34,50.34l32-32a8,8,0,0,1,11.32,0l32,32a8,8,0,0,1-11.32,11.32L136,43.31V212.69l18.34-18.35A8,8,0,0,1,165.66,194.34Z"},"brackets-curly":{regular:"M43.18,128a29.78,29.78,0,0,1,8,10.26c4.8,9.9,4.8,22,4.8,33.74,0,24.31,1,36,24,36a8,8,0,0,1,0,16c-17.48,0-29.32-6.14-35.2-18.26-4.8-9.9-4.8-22-4.8-33.74,0-24.31-1-36-24-36a8,8,0,0,1,0-16c23,0,24-11.69,24-36,0-11.72,0-23.84,4.8-33.74C50.68,38.14,62.52,32,80,32a8,8,0,0,1,0,16C57,48,56,59.69,56,84c0,11.72,0,23.84-4.8,33.74A29.78,29.78,0,0,1,43.18,128ZM240,120c-23,0-24-11.69-24-36,0-11.72,0-23.84-4.8-33.74C205.32,38.14,193.48,32,176,32a8,8,0,0,0,0,16c23,0,24,11.69,24,36,0,11.72,0,23.84,4.8,33.74a29.78,29.78,0,0,0,8,10.26,29.78,29.78,0,0,0-8,10.26c-4.8,9.9-4.8,22-4.8,33.74,0,24.31-1,36-24,36a8,8,0,0,0,0,16c17.48,0,29.32-6.14,35.2-18.26,4.8-9.9,4.8-22,4.8-33.74,0-24.31,1-36,24-36a8,8,0,0,0,0-16Z"},browser:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V88H40V56Zm0,144H40V104H216v96Z"},"caret-down":{regular:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z",bold:"M216.49,104.49l-80,80a12,12,0,0,1-17,0l-80-80a12,12,0,0,1,17-17L128,159l71.51-71.52a12,12,0,0,1,17,17Z"},"caret-left":{regular:"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z",bold:"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z"},"caret-right":{regular:"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z",bold:"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z"},"caret-up":{regular:"M213.66,165.66a8,8,0,0,1-11.32,0L128,91.31,53.66,165.66a8,8,0,0,1-11.32-11.32l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,213.66,165.66Z",bold:"M216.49,168.49a12,12,0,0,1-17,0L128,97,56.49,168.49a12,12,0,0,1-17-17l80-80a12,12,0,0,1,17,0l80,80A12,12,0,0,1,216.49,168.49Z"},"chat-circle":{regular:"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24Zm0,192a87.87,87.87,0,0,1-44.06-11.81,8,8,0,0,0-6.54-.67L40,216,52.47,178.6a8,8,0,0,0-.66-6.54A88,88,0,1,1,128,216Z",fill:"M232,128A104,104,0,0,1,79.12,219.82L45.07,231.17a16,16,0,0,1-20.24-20.24l11.35-34.05A104,104,0,1,1,232,128Z"},check:{regular:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z",bold:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"},clipboard:{regular:"M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"},"clock-counter-clockwise":{regular:"M136,80v43.47l36.12,21.67a8,8,0,0,1-8.24,13.72l-40-24A8,8,0,0,1,120,128V80a8,8,0,0,1,16,0Zm-8-48A95.44,95.44,0,0,0,60.08,60.15C52.81,67.51,46.35,74.59,40,82V64a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16H49c7.15-8.42,14.27-16.35,22.39-24.57a80,80,0,1,1,1.66,114.75,8,8,0,1,0-11,11.64A96,96,0,1,0,128,32Z"},code:{regular:"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z"},columns:{regular:"M104,32H64A16,16,0,0,0,48,48V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,104,32Zm0,176H64V48h40ZM192,32H152a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,192,32Zm0,176H152V48h40Z"},copy:{regular:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"},cube:{regular:"M223.68,66.15,135.68,18h0a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32h0l80.34,44L128,120,47.66,76ZM40,90l80,43.78v85.79L40,175.82Zm96,129.57V133.82L216,90v85.78Z",fill:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,120,47.65,76,128,32l80.35,44Zm8,99.64V133.83l80-43.78v85.76Z"},database:{regular:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z",fill:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64Zm-21.61,74.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"},"dots-three":{regular:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z",bold:"M144,128a16,16,0,1,1-16-16A16,16,0,0,1,144,128ZM60,112a16,16,0,1,0,16,16A16,16,0,0,0,60,112Zm136,0a16,16,0,1,0,16,16A16,16,0,0,0,196,112Z"},"dots-three-vertical":{regular:"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM128,72a12,12,0,1,0-12-12A12,12,0,0,0,128,72Zm0,112a12,12,0,1,0,12,12A12,12,0,0,0,128,184Z",bold:"M112,60a16,16,0,1,1,16,16A16,16,0,0,1,112,60Zm16,52a16,16,0,1,0,16,16A16,16,0,0,0,128,112Zm0,68a16,16,0,1,0,16,16A16,16,0,0,0,128,180Z"},"download-simple":{regular:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"},export:{regular:"M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96H80a8,8,0,0,1,0,16H56v96H200V112H176a8,8,0,0,1,0-16h24A16,16,0,0,1,216,112ZM93.66,69.66,120,43.31V136a8,8,0,0,0,16,0V43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66Z"},eye:{regular:"M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,192c-30.78,0-57.67-11.19-79.93-33.25A133.47,133.47,0,0,1,25,128,133.33,133.33,0,0,1,48.07,97.25C70.33,75.19,97.22,64,128,64s57.67,11.19,79.93,33.25A133.46,133.46,0,0,1,231.05,128C223.84,141.46,192.43,192,128,192Zm0-112a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Z",fill:"M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"},"eye-slash":{regular:"M53.92,34.62A8,8,0,1,0,42.08,45.38L61.32,66.55C25,88.84,9.38,123.2,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208a127.11,127.11,0,0,0,52.07-10.83l22,24.21a8,8,0,1,0,11.84-10.76Zm47.33,75.84,41.67,45.85a32,32,0,0,1-41.67-45.85ZM128,192c-30.78,0-57.67-11.19-79.93-33.25A133.16,133.16,0,0,1,25,128c4.69-8.79,19.66-33.39,47.35-49.38l18,19.75a48,48,0,0,0,63.66,70l14.73,16.2A112,112,0,0,1,128,192Zm6-95.43a8,8,0,0,1,3-15.72,48.16,48.16,0,0,1,38.77,42.64,8,8,0,0,1-7.22,8.71,6.39,6.39,0,0,1-.75,0,8,8,0,0,1-8-7.26A32.09,32.09,0,0,0,134,96.57Zm113.28,34.69c-.42.94-10.55,23.37-33.36,43.8a8,8,0,1,1-10.67-11.92A132.77,132.77,0,0,0,231.05,128a133.15,133.15,0,0,0-23.12-30.77C185.67,75.19,158.78,64,128,64a118.37,118.37,0,0,0-19.36,1.57A8,8,0,1,1,106,49.79,134,134,0,0,1,128,48c34.88,0,66.57,13.26,91.66,38.35,18.83,18.83,27.3,37.62,27.65,38.41A8,8,0,0,1,247.31,131.26Z"},eyedropper:{regular:"M224,67.3a35.79,35.79,0,0,0-11.26-25.66c-14-13.28-36.72-12.78-50.62,1.13L142.8,62.2a24,24,0,0,0-33.14.77l-9,9a16,16,0,0,0,0,22.64l2,2.06-51,51a39.75,39.75,0,0,0-10.53,38l-8,18.41A13.68,13.68,0,0,0,36,219.3a15.92,15.92,0,0,0,17.71,3.35L71.23,215a39.89,39.89,0,0,0,37.06-10.75l51-51,2.06,2.06a16,16,0,0,0,22.62,0l9-9a24,24,0,0,0,.74-33.18l19.75-19.87A35.75,35.75,0,0,0,224,67.3ZM97,193a24,24,0,0,1-24,6,8,8,0,0,0-5.55.31l-18.1,7.91L57,189.41a8,8,0,0,0,.25-5.75A23.88,23.88,0,0,1,63,159l51-51,33.94,34ZM202.13,82l-25.37,25.52a8,8,0,0,0,0,11.3l4.89,4.89a8,8,0,0,1,0,11.32l-9,9L112,83.26l9-9a8,8,0,0,1,11.31,0l4.89,4.89a8,8,0,0,0,11.33,0l24.94-25.09c7.81-7.82,20.5-8.18,28.29-.81a20,20,0,0,1,.39,28.7Z"},file:{regular:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z",fill:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z"},"file-code":{regular:"M181.66,146.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L164.69,152l-18.35-18.34a8,8,0,0,1,11.32-11.32Zm-72-24a8,8,0,0,0-11.32,0l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.32-11.32L91.31,152l18.35-18.34A8,8,0,0,0,109.66,122.34ZM216,88V216a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V40A16,16,0,0,1,56,24h96a8,8,0,0,1,5.66,2.34l56,56A8,8,0,0,1,216,88Zm-56-8h28.69L160,51.31Zm40,136V96H152a8,8,0,0,1-8-8V40H56V216H200Z"},"file-text":{regular:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Zm-32-80a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,136Zm0,32a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,168Z"},"flip-vertical":{regular:"M56,120H216a16,16,0,0,0,6.23-30.74l-.14-.06-159.93-64A16,16,0,0,0,40,40v64A16,16,0,0,0,56,120Zm0-80,.15.06L216,104H56l0-64Zm160,96H56a16,16,0,0,0-16,16v64a16,16,0,0,0,22.15,14.78l159.93-64,.14-.06A16,16,0,0,0,216,136ZM56.15,215.93,56,216V152H216Z"},"floppy-disk":{regular:"M219.31,72,184,36.69A15.86,15.86,0,0,0,172.69,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V83.31A15.86,15.86,0,0,0,219.31,72ZM168,208H88V152h80Zm40,0H184V152a16,16,0,0,0-16-16H88a16,16,0,0,0-16,16v56H48V48H172.69L208,83.31ZM160,72a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h56A8,8,0,0,1,160,72Z"},folder:{regular:"M216,72H131.31L104,44.69A15.86,15.86,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.4,15.4,0,0,0,39.38,216H216.89A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40ZM216,200H40V88H216Z",fill:"M216,72H131.31L104,44.69A15.88,15.88,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.41,15.41,0,0,0,39.39,216h177.5A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40Z"},"folder-open":{regular:"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Zm112,136H43.1l26.67-80H232Z",fill:"M245,110.64A16,16,0,0,0,232,104H216V88a16,16,0,0,0-16-16H130.67L102.94,51.2a16.14,16.14,0,0,0-9.6-3.2H40A16,16,0,0,0,24,64V208h0a8,8,0,0,0,8,8H211.1a8,8,0,0,0,7.59-5.47l28.49-85.47A16.05,16.05,0,0,0,245,110.64ZM93.34,64,123.2,86.4A8,8,0,0,0,128,88h72v16H69.77a16,16,0,0,0-15.18,10.94L40,158.7V64Z"},"frame-corners":{regular:"M200,80v32a8,8,0,0,1-16,0V88H160a8,8,0,0,1,0-16h32A8,8,0,0,1,200,80ZM96,168H72V144a8,8,0,0,0-16,0v32a8,8,0,0,0,8,8H96a8,8,0,0,0,0-16ZM232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z"},gear:{regular:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z",fill:"M216,130.16q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"},"gear-six":{regular:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm109.94-52.79a8,8,0,0,0-3.89-5.4l-29.83-17-.12-33.62a8,8,0,0,0-2.83-6.08,111.91,111.91,0,0,0-36.72-20.67,8,8,0,0,0-6.46.59L128,41.85,97.88,25a8,8,0,0,0-6.47-.6A112.1,112.1,0,0,0,54.73,45.15a8,8,0,0,0-2.83,6.07l-.15,33.65-29.83,17a8,8,0,0,0-3.89,5.4,106.47,106.47,0,0,0,0,41.56,8,8,0,0,0,3.89,5.4l29.83,17,.12,33.62a8,8,0,0,0,2.83,6.08,111.91,111.91,0,0,0,36.72,20.67,8,8,0,0,0,6.46-.59L128,214.15,158.12,231a7.91,7.91,0,0,0,3.9,1,8.09,8.09,0,0,0,2.57-.42,112.1,112.1,0,0,0,36.68-20.73,8,8,0,0,0,2.83-6.07l.15-33.65,29.83-17a8,8,0,0,0,3.89-5.4A106.47,106.47,0,0,0,237.94,107.21Zm-15,34.91-28.57,16.25a8,8,0,0,0-3,3c-.58,1-1.19,2.06-1.81,3.06a7.94,7.94,0,0,0-1.22,4.21l-.15,32.25a95.89,95.89,0,0,1-25.37,14.3L134,199.13a8,8,0,0,0-3.91-1h-.19c-1.21,0-2.43,0-3.64,0a8.08,8.08,0,0,0-4.1,1l-28.84,16.1A96,96,0,0,1,67.88,201l-.11-32.2a8,8,0,0,0-1.22-4.22c-.62-1-1.23-2-1.8-3.06a8.09,8.09,0,0,0-3-3.06l-28.6-16.29a90.49,90.49,0,0,1,0-28.26L61.67,97.63a8,8,0,0,0,3-3c.58-1,1.19-2.06,1.81-3.06a7.94,7.94,0,0,0,1.22-4.21l.15-32.25a95.89,95.89,0,0,1,25.37-14.3L122,56.87a8,8,0,0,0,4.1,1c1.21,0,2.43,0,3.64,0a8.08,8.08,0,0,0,4.1-1l28.84-16.1A96,96,0,0,1,188.12,55l.11,32.2a8,8,0,0,0,1.22,4.22c.62,1,1.23,2,1.8,3.06a8.09,8.09,0,0,0,3,3.06l28.6,16.29A90.49,90.49,0,0,1,222.9,142.12Z"},"git-branch":{regular:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"},globe:{regular:"M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm88,104a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48ZM40,128a87.61,87.61,0,0,1,3.33-24H81.84a157.44,157.44,0,0,0,0,48H43.33A87.61,87.61,0,0,1,40,128ZM154,88H102a115.11,115.11,0,0,1,26-45A115.27,115.27,0,0,1,154,88Zm52.33,0H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM107.59,42.4A135.28,135.28,0,0,0,85.29,88H49.63A88.29,88.29,0,0,1,107.59,42.4ZM49.63,168H85.29a135.28,135.28,0,0,0,22.3,45.6A88.29,88.29,0,0,1,49.63,168Zm98.78,45.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z"},"grid-four":{regular:"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z",fill:"M216,56v60a4,4,0,0,1-4,4H136V44a4,4,0,0,1,4-4h60A16,16,0,0,1,216,56ZM116,40H56A16,16,0,0,0,40,56v60a4,4,0,0,0,4,4h76V44A4,4,0,0,0,116,40Zm96,96H136v76a4,4,0,0,0,4,4h60a16,16,0,0,0,16-16V140A4,4,0,0,0,212,136ZM40,140v60a16,16,0,0,0,16,16h60a4,4,0,0,0,4-4V136H44A4,4,0,0,0,40,140Z"},image:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z",fill:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM156,88a12,12,0,1,1-12,12A12,12,0,0,1,156,88Zm60,112H40V160.69l46.34-46.35a8,8,0,0,1,11.32,0h0L165,181.66a8,8,0,0,0,11.32-11.32l-17.66-17.65L173,138.34a8,8,0,0,1,11.31,0L216,170.07V200Z"},info:{regular:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"},lightning:{regular:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z",fill:"M213.85,125.46l-112,120a8,8,0,0,1-13.69-7l14.66-73.33L45.19,143.49a8,8,0,0,1-3-13l112-120a8,8,0,0,1,13.69,7L153.18,90.9l57.63,21.61a8,8,0,0,1,3,12.95Z"},link:{regular:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"},list:{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"list-bullets":{regular:"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z"},"lock-simple":{regular:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Z"},"magnifying-glass":{regular:"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"},minus:{regular:"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z"},"paint-brush":{regular:"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM92,208H34.63C41.38,198.41,48,183.92,48,164a44,44,0,1,1,44,44Zm32.42-94.45q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z",fill:"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM124.42,113.55q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z"},"paper-plane-tilt":{regular:"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14,0-.07-40.06-82.3,48-48a8,8,0,0,0-11.31-11.31l-48,48L24.08,98.25l-.07,0,.14,0L216,40Z",fill:"M231.4,44.34s0,.1,0,.15l-58.2,191.94a15.88,15.88,0,0,1-14,11.51q-.69.06-1.38.06a15.86,15.86,0,0,1-14.42-9.15L107,164.15a4,4,0,0,1,.77-4.58l57.92-57.92a8,8,0,0,0-11.31-11.31L96.43,148.26a4,4,0,0,1-4.58.77L17.08,112.64a16,16,0,0,1,2.49-29.8l191.94-58.2.15,0A16,16,0,0,1,231.4,44.34Z"},paperclip:{regular:"M209.66,122.34a8,8,0,0,1,0,11.32l-82.05,82a56,56,0,0,1-79.2-79.21L147.67,35.73a40,40,0,1,1,56.61,56.55L105,193A24,24,0,1,1,71,159L154.3,74.38A8,8,0,1,1,165.7,85.6L82.39,170.31a8,8,0,1,0,11.27,11.36L192.93,81A24,24,0,1,0,159,47L59.76,147.68a40,40,0,1,0,56.53,56.62l82.06-82A8,8,0,0,1,209.66,122.34Z"},"pencil-simple":{regular:"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM92.69,208H48V163.31l88-88L180.69,120ZM192,108.68,147.31,64l24-24L216,84.68Z",fill:"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM192,108.68,147.31,64l24-24L216,84.68Z"},play:{regular:"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z",fill:"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z"},plus:{regular:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z",bold:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"},question:{regular:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,168a12,12,0,1,1,12-12A12,12,0,0,1,128,192Zm8-48.72V144a8,8,0,0,1-16,0v-8a8,8,0,0,1,8-8c13.23,0,24-9,24-20s-10.77-20-24-20-24,9-24,20v4a8,8,0,0,1-16,0v-4c0-19.85,17.94-36,40-36s40,16.15,40,36C168,125.38,154.24,139.93,136,143.28Z"},rectangle:{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H40V56H216V200Z",fill:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z"},rows:{regular:"M208,136H48a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V152A16,16,0,0,0,208,136Zm0,56H48V152H208v40Zm0-144H48A16,16,0,0,0,32,64v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V64A16,16,0,0,0,208,48Zm0,56H48V64H208v40Z",fill:"M224,152v40a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V152a16,16,0,0,1,16-16H208A16,16,0,0,1,224,152ZM208,48H48A16,16,0,0,0,32,64v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V64A16,16,0,0,0,208,48Z"},"share-network":{regular:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"},"sidebar-simple":{regular:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z",fill:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H88V56H216V200Z"},"sliders-horizontal":{regular:"M40,88H73a32,32,0,0,0,62,0h81a8,8,0,0,0,0-16H135a32,32,0,0,0-62,0H40a8,8,0,0,0,0,16Zm64-24A16,16,0,1,1,88,80,16,16,0,0,1,104,64ZM216,168H199a32,32,0,0,0-62,0H40a8,8,0,0,0,0,16h97a32,32,0,0,0,62,0h17a8,8,0,0,0,0-16Zm-48,24a16,16,0,1,1,16-16A16,16,0,0,1,168,192Z"},sparkle:{regular:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z",fill:"M208,144a15.78,15.78,0,0,1-10.42,14.94L146,178l-19,51.62a15.92,15.92,0,0,1-29.88,0L78,178l-51.62-19a15.92,15.92,0,0,1,0-29.88L78,110l19-51.62a15.92,15.92,0,0,1,29.88,0L146,110l51.62,19A15.78,15.78,0,0,1,208,144ZM152,48h16V64a8,8,0,0,0,16,0V48h16a8,8,0,0,0,0-16H184V16a8,8,0,0,0-16,0V32H152a8,8,0,0,0,0,16Zm88,32h-8V72a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0V96h8a8,8,0,0,0,0-16Z"},spinner:{regular:"M136,32V64a8,8,0,0,1-16,0V32a8,8,0,0,1,16,0Zm37.25,58.75a8,8,0,0,0,5.66-2.35l22.63-22.62a8,8,0,0,0-11.32-11.32L167.6,77.09a8,8,0,0,0,5.65,13.66ZM224,120H192a8,8,0,0,0,0,16h32a8,8,0,0,0,0-16Zm-45.09,47.6a8,8,0,0,0-11.31,11.31l22.62,22.63a8,8,0,0,0,11.32-11.32ZM128,184a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V192A8,8,0,0,0,128,184ZM77.09,167.6,54.46,190.22a8,8,0,0,0,11.32,11.32L88.4,178.91A8,8,0,0,0,77.09,167.6ZM72,128a8,8,0,0,0-8-8H32a8,8,0,0,0,0,16H64A8,8,0,0,0,72,128ZM65.78,54.46A8,8,0,0,0,54.46,65.78L77.09,88.4A8,8,0,0,0,88.4,77.09Z",bold:"M140,32V64a12,12,0,0,1-24,0V32a12,12,0,0,1,24,0Zm33.25,62.75a12,12,0,0,0,8.49-3.52L204.37,68.6a12,12,0,0,0-17-17L164.77,74.26a12,12,0,0,0,8.48,20.49ZM224,116H192a12,12,0,0,0,0,24h32a12,12,0,0,0,0-24Zm-42.26,48.77a12,12,0,1,0-17,17l22.63,22.63a12,12,0,0,0,17-17ZM128,180a12,12,0,0,0-12,12v32a12,12,0,0,0,24,0V192A12,12,0,0,0,128,180ZM74.26,164.77,51.63,187.4a12,12,0,0,0,17,17l22.63-22.63a12,12,0,1,0-17-17ZM76,128a12,12,0,0,0-12-12H32a12,12,0,0,0,0,24H64A12,12,0,0,0,76,128ZM68.6,51.63a12,12,0,1,0-17,17L74.26,91.23a12,12,0,0,0,17-17Z"},square:{regular:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H48V48H208V208Z",fill:"M224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Z"},stack:{regular:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z",fill:"M220,169.09l-92,53.65L36,169.09A8,8,0,0,0,28,182.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,169.09Z M220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09Z M28,86.91l96,56a8,8,0,0,0,8.06,0l96-56a8,8,0,0,0,0-13.82l-96-56a8,8,0,0,0-8.06,0l-96,56a8,8,0,0,0,0,13.82Z"},stop:{regular:"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,160H56V56H200V200Z",fill:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z"},tag:{regular:"M243.31,136,144,36.69A15.86,15.86,0,0,0,132.69,32H40a8,8,0,0,0-8,8v92.69A15.86,15.86,0,0,0,36.69,144L136,243.31a16,16,0,0,0,22.63,0l84.68-84.68a16,16,0,0,0,0-22.63Zm-96,96L48,132.69V48h84.69L232,147.31ZM96,84A12,12,0,1,1,84,72,12,12,0,0,1,96,84Z",fill:"M243.31,136,144,36.69A15.86,15.86,0,0,0,132.69,32H40a8,8,0,0,0-8,8v92.69A15.86,15.86,0,0,0,36.69,144L136,243.31a16,16,0,0,0,22.63,0l84.68-84.68a16,16,0,0,0,0-22.63ZM84,96A12,12,0,1,1,96,84,12,12,0,0,1,84,96Z"},"text-a-underline":{regular:"M60.59,175.24a8,8,0,0,0,10.65-3.83L87.9,136h80.2l16.66,35.41a8,8,0,1,0,14.48-6.82l-64-136a8,8,0,0,0-14.48,0l-64,136A8,8,0,0,0,60.59,175.24ZM128,50.79,160.57,120H95.43ZM224,216a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,216Z"},"text-aa":{regular:"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z"},"text-align-center":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z"},"text-align-justify":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"text-align-left":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z"},"text-align-right":{regular:"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z"},"text-b":{regular:"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z",bold:"M185.08,114.46A48,48,0,0,0,148,36H80A12,12,0,0,0,68,48V200a12,12,0,0,0,12,12h80a52,52,0,0,0,25.08-97.54ZM92,60h56a24,24,0,0,1,0,48H92Zm68,128H92V132h68a28,28,0,0,1,0,56Z"},"text-italic":{regular:"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z"},"text-strikethrough":{regular:"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z"},"text-subscript":{regular:"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.56a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.34,32.18,32.18,0,0,1,4.63-8.59,32,32,0,0,1,51.11,38.52L208,200h32A8,8,0,0,1,248,208ZM149.24,50a8,8,0,0,0-11.29.81L92,103.78l-45.95-53A8,8,0,0,0,34,61.24L81.41,116,34,170.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,116l47.46-54.76A8,8,0,0,0,149.24,50Z"},"text-superscript":{regular:"M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z"},"text-t":{regular:"M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z"},"text-underline":{regular:"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z"},translate:{regular:"M247.15,212.42l-56-112a8,8,0,0,0-14.31,0l-21.71,43.43A88,88,0,0,1,108,126.93,103.65,103.65,0,0,0,135.69,64H160a8,8,0,0,0,0-16H104V32a8,8,0,0,0-16,0V48H32a8,8,0,0,0,0,16h87.63A87.76,87.76,0,0,1,96,116.35a87.74,87.74,0,0,1-19-31,8,8,0,1,0-15.08,5.34A103.63,103.63,0,0,0,84,127a87.55,87.55,0,0,1-52,17,8,8,0,0,0,0,16,103.46,103.46,0,0,0,64-22.08,104.18,104.18,0,0,0,51.44,21.31l-26.6,53.19a8,8,0,0,0,14.31,7.16L148.94,192h70.11l13.79,27.58A8,8,0,0,0,240,224a8,8,0,0,0,7.15-11.58ZM156.94,176,184,121.89,211.05,176Z"},trash:{regular:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"},"upload-simple":{regular:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0ZM93.66,77.66,120,51.31V144a8,8,0,0,0,16,0V51.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,77.66Z"},warning:{regular:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z",fill:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"},"warning-circle":{regular:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z",fill:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-8,56a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm8,104a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z"},x:{regular:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z",bold:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}},viewBox:"0 0 256 256"};var _e=["regular","bold","fill"],Tt="0 0 256 256";var{icons:fa}=pa,Vi=Object.keys(fa);function Wi(e,t){let n=fa[e];if(!n)return!1;return t===void 0||t in n}var Ji=new Set;function _i(e,t){let n=typeof e==="string"?e:"",a=fa[n];if(!a){if(n&&!Ji.has(n))Ji.add(n),console.warn(`jx-icon: no icon named "${n}"`);return""}let o=_e.includes(String(t))?t:"regular";return a[o]??a.regular??""}var Bi=pa.viewBox||Tt;var qi={name:"Jx UI Kit",url:"https://jxsuite.com/ui",defaults:{lang:"en"},$media:{"--md":"(max-width: 768px)","--sm":"(max-width: 640px)"},style:{"@layer jx-ui":{"--jx-gray-50":"#f7f7f9","--jx-gray-100":"#eeeef2","--jx-gray-200":"#e1e1e7","--jx-gray-300":"#c9c9d2","--jx-gray-400":"#a2a2af","--jx-gray-500":"#7c7c8b","--jx-gray-600":"#5e5e6c","--jx-gray-700":"#45454f","--jx-gray-800":"#2f2f36","--jx-gray-850":"#26262c","--jx-gray-900":"#1d1d22","--jx-gray-925":"#17171b","--jx-gray-950":"#111114","--jx-gray-975":"#0b0b0d","--jx-blue-50":"#eef4ff","--jx-blue-100":"#dbe7fe","--jx-blue-200":"#bcd3fd","--jx-blue-300":"#8fb5fb","--jx-blue-400":"#5f95f7","--jx-blue-500":"#3b82f6","--jx-blue-600":"#2563eb","--jx-blue-700":"#1d4ed8","--jx-blue-800":"#1e40af","--jx-blue-900":"#172554","--jx-blue-950":"#0f172e","--jx-red-50":"#fdeeee","--jx-red-100":"#fbd9d9","--jx-red-200":"#f5b3b3","--jx-red-300":"#ee8a8a","--jx-red-400":"#e86460","--jx-red-500":"#dc3f3b","--jx-red-600":"#c22e2b","--jx-red-700":"#a12522","--jx-red-800":"#7d1e1c","--jx-red-900":"#5a1614","--jx-red-950":"#3a0f0e","--jx-green-50":"#e9f7ee","--jx-green-100":"#cdeedb","--jx-green-200":"#a6dfbd","--jx-green-300":"#74c996","--jx-green-400":"#4fb27a","--jx-green-500":"#2f9a5f","--jx-green-600":"#22804e","--jx-green-700":"#1a6640","--jx-green-800":"#144e32","--jx-green-900":"#0f3a26","--jx-green-950":"#0a2719","--jx-amber-50":"#fdf3e1","--jx-amber-100":"#fae4b5","--jx-amber-200":"#f2cc7c","--jx-amber-300":"#e5ae4a","--jx-amber-400":"#d59429","--jx-amber-500":"#b8791a","--jx-amber-600":"#96600f","--jx-amber-700":"#764b0b","--jx-amber-800":"#5a3908","--jx-amber-900":"#3f2806","--jx-amber-950":"#2a1a04","--jx-bg":"light-dark(var(--jx-gray-50), var(--jx-gray-950))","--jx-bg-panel":"light-dark(#ffffff, var(--jx-gray-925))","--jx-bg-input":"light-dark(#ffffff, var(--jx-gray-900))","--jx-bg-overlay":"light-dark(#ffffff, var(--jx-gray-850))","--jx-border":"light-dark(var(--jx-gray-200), var(--jx-gray-800))","--jx-border-strong":"light-dark(var(--jx-gray-300), var(--jx-gray-700))","--jx-fg":"light-dark(var(--jx-gray-900), var(--jx-gray-100))","--jx-fg-dim":"light-dark(var(--jx-gray-600), var(--jx-gray-400))","--jx-fg-muted":"var(--jx-gray-500)","--jx-accent":"light-dark(var(--jx-blue-600), var(--jx-blue-500))","--jx-accent-solid":"var(--jx-blue-600)","--jx-accent-hover":"light-dark(var(--jx-blue-700), var(--jx-blue-400))","--jx-accent-fg":"#ffffff","--jx-accent-8":"color-mix(in oklab, var(--jx-accent) 8%, transparent)","--jx-accent-10":"color-mix(in oklab, var(--jx-accent) 10%, transparent)","--jx-accent-15":"color-mix(in oklab, var(--jx-accent) 15%, transparent)","--jx-accent-20":"color-mix(in oklab, var(--jx-accent) 20%, transparent)","--jx-accent-50":"color-mix(in oklab, var(--jx-accent) 50%, transparent)","--jx-hover-bg":"color-mix(in oklab, var(--jx-fg) 6%, transparent)","--jx-danger":"light-dark(var(--jx-red-600), var(--jx-red-400))","--jx-success":"light-dark(var(--jx-green-600), var(--jx-green-400))","--jx-warning":"light-dark(var(--jx-amber-600), var(--jx-amber-300))","--jx-tag":"light-dark(var(--jx-blue-700), var(--jx-blue-300))","--jx-signal":"light-dark(var(--jx-amber-700), var(--jx-amber-200))","--jx-handler":"light-dark(#7c3aed, #c8a2e0)","--jx-map":"light-dark(#4f46b5, #8b83e6)","--jx-switch-c":"var(--jx-danger)","--jx-switch-track":"var(--jx-gray-500)","--jx-switch-thumb":"light-dark(#ffffff, var(--jx-gray-100))","--jx-font-sans":'"Inter Variable", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif',"--jx-font-mono":'"JetBrains Mono", "SF Mono", "Fira Code", monospace',"--jx-text-xs":"10px","--jx-text-sm":"11px","--jx-text-md":"12px","--jx-text-lg":"14px","--jx-leading-xs":"14px","--jx-leading-sm":"16px","--jx-leading-md":"18px","--jx-leading-lg":"20px","--jx-space-1":"2px","--jx-space-2":"4px","--jx-space-3":"8px","--jx-space-4":"12px","--jx-space-5":"16px","--jx-space-6":"24px","--jx-space-7":"32px","--jx-control-h":"24px","--jx-field-label-w":"80px","--jx-icon-size":"16px","--jx-popover-offset":"4px","--jx-radius-xs":"2px","--jx-radius-sm":"4px","--jx-radius-md":"6px","--jx-radius-lg":"10px","--jx-focus-ring":"2px solid var(--jx-accent)","--jx-shadow-popover":"0 0 0 1px var(--jx-border-strong), 0 8px 24px -8px rgb(0 0 0 / 0.6), 0 2px 6px rgb(0 0 0 / 0.3)","--jx-shadow-dialog":"0 0 0 1px var(--jx-border-strong), 0 24px 64px -16px rgb(0 0 0 / 0.7)","--jx-dur-1":"150ms","--jx-dur-2":"200ms","--jx-ease-out":"cubic-bezier(0.2, 0, 0, 1)","--jx-ease-in":"cubic-bezier(0.4, 0, 1, 1)",colorScheme:"light dark",'&[data-theme="light"]':{colorScheme:"light","--jx-shadow-popover":"0 0 0 1px var(--jx-border-strong), 0 8px 24px -8px rgb(0 0 0 / 0.18), 0 2px 6px rgb(0 0 0 / 0.1)","--jx-shadow-dialog":"0 0 0 1px var(--jx-border-strong), 0 24px 64px -16px rgb(0 0 0 / 0.25)"},'&[data-theme="dark"]':{colorScheme:"dark"},'&[data-density="compact"]':{"--jx-control-h":"24px","--jx-text-md":"11px","--jx-leading-md":"16px"},'&[data-density="comfortable"]':{"--jx-control-h":"28px"},"@(prefers-reduced-motion: reduce)":{"--jx-dur-1":"0ms","--jx-dur-2":"0ms"},"@(forced-colors: active)":{"--jx-focus-ring":"2px solid Highlight"},"@property --jx-accent":{syntax:'"<color>"',inherits:"true",initialValue:"#3b82f6"},"@property --jx-dur-1":{syntax:'"<time>"',inherits:"true",initialValue:"150ms"},"@property --jx-dur-2":{syntax:'"<time>"',inherits:"true",initialValue:"200ms"}}},$elements:[{$ref:"./components/jx-icon.json"}]};var wa="jx-ui",Ki=qi.style,mu=Ki[`@layer ${wa}`]??{};function Ui(){return`${je(Ki,{scope:":root"}).map((e)=>e.text).join(`
9
9
  `)}
10
- `}var ga=new WeakMap;function xa(e=document){if(ga.has(e))return;let t=Ui();if(typeof CSSStyleSheet==="function"&&"replaceSync"in CSSStyleSheet.prototype){let a=new CSSStyleSheet;a.replaceSync(t),e.adoptedStyleSheets=[...e.adoptedStyleSheets,a],ga.set(e,a);return}let n=e.createElement("style");n.dataset.jxTheme=wa,n.textContent=t,e.head.append(n),ga.set(e,n)}var Vx="jx-ui:/components/",bu={"jx-ui:/behaviors/color-area.ts":$n,"jx-ui:/behaviors/color-field.ts":An,"jx-ui:/behaviors/color-slider.ts":Ln,"jx-ui:/behaviors/combobox.ts":On,"jx-ui:/behaviors/dialog.ts":tn,"jx-ui:/behaviors/listbox.ts":Rn,"jx-ui:/behaviors/menu.ts":Ht,"jx-ui:/behaviors/number-field.ts":Dn,"jx-ui:/behaviors/action-group.ts":on,"jx-ui:/behaviors/popover.ts":Et,"jx-ui:/behaviors/select.ts":Fn,"jx-ui:/behaviors/split.ts":cn,"jx-ui:/behaviors/swatch-group.ts":Jn,"jx-ui:/behaviors/tabs.ts":_n,"jx-ui:/behaviors/toolbar.ts":Un,"jx-ui:/behaviors/tree.ts":ta,"jx-ui:/behaviors/tooltip.ts":aa,"jx-ui:/behaviors/textfield.ts":un,"jx-ui:/behaviors/toast.ts":sa,"jx-ui:/behaviors/toast-host.ts":ua,"jx-ui:/color.ts":xn,"jx-ui:/icons.ts":ma},Gi=null;function II(e={}){if(e.theme!==!1)xa(e.document);return Gi??=(async()=>{for(let[t,n]of Object.entries(bu))So(t,n);for(let[t,n]of Object.entries(pe))Wx(`${Vx}${t}.json`,n);for(let t of Object.values(pe))await jm(t,Vx)})(),Gi}
11
- export{Rv,$v,CI,$p,xS,_S,Fm,qs,SI,Wx,Dp,CS,SS,Ap,Ja,kI,jm,zl,Pd,hn,sn,kS,Np,ES,Dv,Hm,TS,Wl,Gr,ao,Kr,Gs,nh,Ya,Bm,EI,er,TI,LI,Fd,zm,Vx,II,RI,ne};
10
+ `}var ga=new WeakMap;function xa(e=document){if(ga.has(e))return;let t=Ui();if(typeof CSSStyleSheet==="function"&&"replaceSync"in CSSStyleSheet.prototype){let a=new CSSStyleSheet;a.replaceSync(t),e.adoptedStyleSheets=[...e.adoptedStyleSheets,a],ga.set(e,a);return}let n=e.createElement("style");n.dataset.jxTheme=wa,n.textContent=t,e.head.append(n),ga.set(e,n)}var Wx="jx-ui:/components/",bu={"jx-ui:/behaviors/color-area.ts":$n,"jx-ui:/behaviors/color-field.ts":An,"jx-ui:/behaviors/color-slider.ts":Ln,"jx-ui:/behaviors/combobox.ts":On,"jx-ui:/behaviors/dialog.ts":tn,"jx-ui:/behaviors/listbox.ts":Rn,"jx-ui:/behaviors/menu.ts":Ht,"jx-ui:/behaviors/number-field.ts":Dn,"jx-ui:/behaviors/action-group.ts":on,"jx-ui:/behaviors/popover.ts":Et,"jx-ui:/behaviors/select.ts":Fn,"jx-ui:/behaviors/split.ts":cn,"jx-ui:/behaviors/swatch-group.ts":Jn,"jx-ui:/behaviors/tabs.ts":_n,"jx-ui:/behaviors/toolbar.ts":Un,"jx-ui:/behaviors/tree.ts":ta,"jx-ui:/behaviors/tooltip.ts":aa,"jx-ui:/behaviors/textfield.ts":hn,"jx-ui:/behaviors/toast.ts":sa,"jx-ui:/behaviors/toast-host.ts":ua,"jx-ui:/color.ts":xn,"jx-ui:/icons.ts":ma},Gi=null;function CI(e={}){if(e.theme!==!1)xa(e.document);return Gi??=(async()=>{for(let[t,n]of Object.entries(bu))So(t,n);for(let[t,n]of Object.entries(pe))zx(`${Wx}${t}.json`,n);for(let t of Object.values(pe))await Mm(t,Wx)})(),Gi}
11
+ export{$v,Dv,bI,Rp,vk,yk,Om,qs,vI,zx,$p,wk,xk,Dp,Ja,yI,Mm,zl,Fd,un,rn,_k,Ap,Ck,Av,Pm,kk,Wl,Kr,ro,Jr,Gs,nh,Ya,Fm,wI,Qo,xI,_I,jd,jm,Wx,CI,kI,ne};
12
12
 
13
- //# debugId=565B9A062F63CC4464756E2164756E21
14
- //# sourceMappingURL=studio-dknr8m7b.js.map
13
+ //# debugId=8DF7CF213E018EC864756E2164756E21
14
+ //# sourceMappingURL=studio-0k9mvpgj.js.map