@panphora/clayjs 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/entries/sap.js CHANGED
@@ -1,13 +1,13 @@
1
1
  // GENERATED — do not edit. Vendored from sapjs/dist/sap.min.js via sapjs
2
2
  // `npm run copy-to-clayjs`. Edit the sapjs source and re-run.
3
3
  (function () {
4
- var Sap=(()=>{var Ht=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>{for(var n in e)Ht(t,n,{get:e[n],enumerable:!0})},ze=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Fe(e))!Be.call(t,o)&&o!==n&&Ht(t,o,{get:()=>e[o],enumerable:!(r=Pe(e,o))||r.enumerable});return t};var He=t=>ze(Ht({},"__esModule",{value:!0}),t);var zr={};qe(zr,{Sap:()=>I,default:()=>qr,mount:()=>Oe,mountAll:()=>qt,runtime:()=>ut});function ee(t){let e=!1,n=new Set,r=[];function o(f){f&&(r.push(f),r.length>8&&r.shift())}function a(f,w){o(w),!f._broken&&(n.add(f),!e&&(e=!0,queueMicrotask(u)))}function u(){e=!1;let f=[...n];n.clear();for(let w of f)R(w)}function R(f){if(!f._broken){if(f._passes=(f._passes||0)+1,f._passes>50){f._broken=!0,f._breakerRing=r.slice(),t(f,{breaker:!0});return}f._resetArmed||(f._resetArmed=!0,setTimeout(()=>{f._passes=0,f._resetArmed=!1},0)),t(f)}}function k(f,w){o(w),R(f)}function y(f){f._broken=!1,f._passes=0}return{schedule:a,runNow:k,rearm:y,ring:r}}var je=0,re=new WeakMap;function xt(t,e="sap"){let n=t.getAttribute("data-id");if(n)return n;if(t.id)return t.id;let r=re.get(t);return r||(r=`${e}-${(je++).toString(36)}`,re.set(t,r)),r}function kt(t,e="row"){for(;;){let n=`${e}-${Math.random().toString(36).slice(2,8)}`;if(!t.getElementById(n)&&!t.querySelector(`[data-id="${n}"]`))return n}}function Ue(t){return t.hasAttribute("scope")||t.hasAttribute("items")||t.hasAttribute("detail")||t.hasAttribute("each")}function Ve(t){return t.hasAttribute("sap-ignore")||t.hasAttribute("template")}function Y(t,e){for(let r of t.children)n(r);function n(r){if(r.nodeType!==1||Ve(r))return;let o=Ue(r);if(e(r,o),!o)for(let a of r.children)n(a)}}function H(t){let e=t;for(;e;){if(e.hasAttribute("sap")||e.hasAttribute("scope")||e.hasAttribute("item")||e.hasAttribute("detail"))return e;e=e.parentElement}return null}function gt(t){for(let e=t;e&&e.nodeType===1;e=e.parentElement){if(e._sapEachRow)return e;if(e.hasAttribute("item")||e.hasAttribute("sap"))return null}return null}function $t(t){let e=t;for(;e;){if(e.hasAttribute("detail")||e.hasAttribute("item"))return e;e=e.parentElement}return null}function wt(t){let e=t;for(;e;){if(e.hasAttribute("detail"))return e;e=e.parentElement}return null}function ft(t,e){let n=null;return Y(t,r=>{!n&&r.getAttribute("bind")===e&&(n=r)}),n}function bt(t,e){let n=null;return Y(t,r=>{!n&&r.getAttribute("items")===e&&(n=r)}),n}function X(t){return[...t.children].filter(e=>e.hasAttribute("item")&&!e.hasAttribute("template"))}function _t(t){return[...t.children].find(e=>e.hasAttribute("item")&&e.hasAttribute("template"))||null}function q(t){let e=[];if(!t)return e;for(let n of t.trim().split(/\s+/)){if(!n)continue;let r=n,o,a=r.indexOf("=");a>=0&&(o=r.slice(a+1),r=r.slice(0,a));let u=r.split(":"),R=u[0],k="string",y=!1;for(let N of u.slice(1))N==="num"?k="num":N==="bool"?k="bool":N==="transient"&&(y=!0);let f=R,w=f.startsWith("data-")&&f.length>5?f.slice(5).replace(/-([a-z])/g,(N,W)=>W.toUpperCase()):f;e.push({name:w,attr:f,type:k,default:o,transient:y})}return e}function it(t,e){if(e==="num"){if(t==null||t==="")return 0;let n=Number(t);return Number.isNaN(n)?0:n}return e==="bool"?t==="true"||t===""||t==="1":t??""}function Nt(t,e){return e==="bool"?t?"true":"false":t==null?"":String(t)}function Tt(t,e){let n=e.attr||e.name,r=t._sapTransient||(t._sapTransient={});if(!(e.name in r)){let o=t.getAttribute(n);o==null&&(o=e.default!=null?e.default:e.type==="num"?"0":e.type==="bool"?"false":""),r[e.name]=it(o,e.type)}return t.hasAttribute(n)&&t.removeAttribute(n),r[e.name]}function jt(t,e,n){let r=e.attr||e.name;(t._sapTransient||(t._sapTransient={}))[e.name]=n,t.hasAttribute(r)&&t.removeAttribute(r)}function yt(t,e,n){let r=String(n).split("."),o=r[r.length-1];if(r.length===1){let R=Ye(e,o);return R||(t.getAttribute("items")===o?t:t.querySelector(`[items="${o}"]`))}let a=r[r.length-2],u=[...t.querySelectorAll(`[scope="${a}"]`)].find(R=>bt(R,o));return u?bt(u,o):null}function Ye(t,e){let n=H(t);for(;n;){if(n.getAttribute("items")===e)return n;let r=bt(n,e);if(r)return r;n=H(n.parentElement)}return null}function K(t){if(typeof t=="number")return t;if(t==null||t==="")return 0;let e=Number(typeof t=="string"?t.replace(/[$,%\s]/g,""):t);return Number.isNaN(e)?0:e}function Lt(t,e){return Array.isArray(t)?e==null?t:t.map(n=>typeof e=="function"?e(n):n?.[e]):[]}function ne(t,e){return Lt(t,e).reduce((n,r)=>n+K(r),0)}function Ge(t,e){return Array.isArray(t)?e==null?t.length:t.reduce((n,r)=>n+(e(r)?1:0),0):0}function Xe(t,e){let n=Lt(t,e);return n.length?ne(t,e)/n.length:0}function Ke(t,e){let n=Lt(t,e).filter(r=>r!=null&&r!=="");return n.length?n.every(r=>typeof r=="number"||!Number.isNaN(Number(r)))?Math.min(...n.map(Number)):n.reduce((r,o)=>String(r)<=String(o)?r:o):0}function Je(t,e){let n=Lt(t,e).filter(r=>r!=null&&r!=="");return n.length?n.every(r=>typeof r=="number"||!Number.isNaN(Number(r)))?Math.max(...n.map(Number)):n.reduce((r,o)=>String(r)>=String(o)?r:o):0}function Qe(t,e,n){let r=K(t)===1?e:n??e+"s";return`${t} ${r}`}function Ze(t,e){let n=new Date(t),r=new Date(e);return Number.isNaN(+n)||Number.isNaN(+r)?0:Math.round((r-n)/864e5)}function Z(t){return typeof t=="number"?t:Number(t)}var At={usd:t=>"$"+Z(t).toLocaleString("en-US",{maximumFractionDigits:0}),usd2:t=>"$"+Z(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}),pct:t=>Math.round(Z(t))+"%",pct1:t=>Z(t).toFixed(1)+"%",int:t=>Math.round(Z(t)).toLocaleString("en-US"),num:t=>Z(t).toLocaleString("en-US"),num2:t=>Z(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}),compact:t=>Z(t).toLocaleString("en-US",{notation:"compact"}),date:t=>{let e=new Date(t);return Number.isNaN(+e)?String(t):e.toLocaleDateString("en-US")},clock:t=>{let e=Z(t),n=Math.floor(e/100),r=n%10,o=Math.floor(n/10)%60;return`${Math.floor(n/600)}:${String(o).padStart(2,"0")}.${r}`}},tr=new Set(["usd","usd2","pct","pct1","int","num","num2","compact","clock"]);function oe(t,e){if(!t)return e==null?"":String(e);let n=At[t];if(typeof n!="function"){let r=new Error(`unknown format "${t}"`);throw r.sapCode="E22",r}if(tr.has(t)){let r=typeof e=="number"?e:Number(e);if(!Number.isFinite(r)){let o=new Error(`format "${t}" received ${typeof e=="string"?`"${e}"`:e}`);throw o.sapCode="E22",o}}return n(e)}function se(){return[At,K,ne,Ge,Xe,Ke,Je,Qe,Ze]}var er=["state","item","el","root","fmt","num","sum","count","avg","min","max","plural","days"],Rt=new Map,ie=/\bstate\.([a-z][a-z0-9_]*)/g,ae=/\bitem\.([a-z][a-z0-9_]*)/g;function rr(t){let e=new Set,n=new Set,r;for(ie.lastIndex=0;r=ie.exec(t);)e.add(r[1]);for(ae.lastIndex=0;r=ae.exec(t);)n.add(r[1]);return{state:e,item:n}}function P(t,e=!1){let n=(e?"!":"")+t,r=Rt.get(n);if(r)return r;Rt.size>512&&Rt.clear();try{let o=e?`"use strict";
5
- ${t}`:`"use strict"; return (${t});`;r={fn:new Function(...er,o),src:t,statement:e,deps:rr(t),error:null}}catch(o){r={fn:null,src:t,statement:e,deps:{state:new Set,item:new Set},error:o}}return Rt.set(n,r),r}function G(t,e){if(t.error)throw t.error;return t.fn(e.state,e.item,e.el??null,e.root,...se())}function ue(t){let e=new Map;for(let u of t)e.set(u.name,u);let n=[],r=new Map,o=[];function a(u){let R=r.get(u.name);if(R!==1){if(R===0){let k=[...o.slice(o.indexOf(u.name)),u.name].join(" -> "),y=new Error(`calc: cycle: ${k}`);throw y.sapCode="E07",y.cycle=k,y}r.set(u.name,0),o.push(u.name);for(let k of u.entry.deps.state){let y=e.get(k);y&&y!==u&&a(y)}for(let k of u.entry.deps.item){let y=e.get(k);y&&y!==u&&a(y)}o.pop(),r.set(u.name,1),n.push(u)}}for(let u of t)a(u);return n}function ce(t){return(t.getAttribute("type")||"text").toLowerCase()}function lt(t){let e=t.tagName;if(e==="INPUT"){let n=ce(t);n==="checkbox"||n==="radio"?t.checked?t.setAttribute("checked",""):t.removeAttribute("checked"):t.setAttribute("value",t.value);return}if(e==="TEXTAREA"){t.setAttribute("data-value",t.value);return}if(e==="SELECT"){let n=t.options;for(let r=0;r<n.length;r++)n[r].selected?n[r].setAttribute("selected",""):n[r].removeAttribute("selected")}}function fe(t,e=t){let n=t.tagName;if(n==="INPUT"){let r=ce(t);r==="checkbox"||r==="radio"?e.checked?t.hasAttribute("checked")||t.setAttribute("checked",""):t.removeAttribute("checked"):e.value!==(t.getAttribute("value")??"")&&t.setAttribute("value",e.value);return}if(n==="TEXTAREA"){let r=e.value.startsWith(`
4
+ var Sap=(()=>{var Yt=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Qe=Object.prototype.hasOwnProperty;var Ze=(t,e)=>{for(var n in e)Yt(t,n,{get:e[n],enumerable:!0})},tr=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Je(e))!Qe.call(t,i)&&i!==n&&Yt(t,i,{get:()=>e[i],enumerable:!(r=Ke(e,i))||r.enumerable});return t};var er=t=>tr(Yt({},"__esModule",{value:!0}),t);var nn={};Ze(nn,{Sap:()=>F,default:()=>rn,mount:()=>Xe,mountAll:()=>Ut,runtime:()=>dt});function ue(t){let e=!1,n=new Set,r=[];function i(f){f&&(r.push(f),r.length>8&&r.shift())}function s(f,w){i(w),!f._broken&&(n.add(f),!e&&(e=!0,queueMicrotask(a)))}function a(){e=!1;let f=[...n];n.clear();for(let w of f)R(w)}function R(f){if(!f._broken){if(f._passes=(f._passes||0)+1,f._passes>50){f._broken=!0,f._breakerRing=r.slice(),t(f,{breaker:!0});return}f._resetArmed||(f._resetArmed=!0,setTimeout(()=>{f._passes=0,f._resetArmed=!1},0)),t(f)}}function k(f,w){i(w),R(f)}function A(f){f._broken=!1,f._passes=0}return{schedule:s,runNow:k,rearm:A,ring:r}}var Xt={E01:{slug:"foreign-dialect",behavior:"HALT"},E02:{slug:"moustaches-in-text",behavior:"HALT"},E04:{slug:"duplicate-declaration",behavior:"HALT"},E05:{slug:"reserved-name",behavior:"HALT"},E06:{slug:"global-html-name",behavior:"HALT"},E07:{slug:"calc-cycle",behavior:"ERR"},E08:{slug:"expression-syntax",behavior:"HALT"},E10:{slug:"orphan-item",behavior:"HALT"},E12:{slug:"unknown-state-key",behavior:"ERR"},E15:{slug:"write-to-undeclared-key",behavior:"ERR"},E16:{slug:"write-to-computed-field",behavior:"ERR"},E17:{slug:"unresolvable-action-target",behavior:"HALT"},E18:{slug:"paint-on-form-control",behavior:"HALT"},E20:{slug:"bind-on-non-control",behavior:"HALT"},E22:{slug:"format-type",behavior:"ERR"},E24:{slug:"runtime-expression-throw",behavior:"ERR"},E26:{slug:"circuit-breaker",behavior:"HALT"},E30:{slug:"attr-on-bound-control",behavior:"HALT"},E31:{slug:"password-without-transient",behavior:"HALT"},E32:{slug:"file-bind",behavior:"HALT"},E33:{slug:"dialog-state-open",behavior:"HALT"},E34:{slug:"transient-persist-collision",behavior:"HALT"},E35:{slug:"presence-state-misuse",behavior:"HALT"},E40:{slug:"each-not-array",behavior:"ERR"},E41:{slug:"each-bad-key",behavior:"ERR"},E42:{slug:"each-template",behavior:"ERR"},E43:{slug:"bind-in-each-row",behavior:"ERR"},W03:{slug:"unknown-colon-attribute",behavior:"WARN"},W04:{slug:"expression-in-when",behavior:"WARN"},W30:{slug:"nonzero-mount-writes",behavior:"WARN"},W31:{slug:"detail-dialog-saved-open",behavior:"WARN"}},mt=["disabled","readonly","required","checked","selected","multiple","open","inert","autofocus","novalidate","hidden"],St=new Set(["title","style","hidden","lang","dir","translate","class","id","nonce","autofocus","tabindex","contenteditable","spellcheck","draggable","role","slot","part","name","value","type","itemscope","itemtype","itemid","itemprop","itemref"]),Rt=new Set(["sap","scope","items","item","template","bind","calc","text","show","attr","set","trigger","move","sort","detail","each","effect","invalid","confirm","transient","default","persist","sortable","editmode"]);function Dt(t){if(!t||t.nodeType!==1)return"?";if(t.id)return`${t.tagName.toLowerCase()}#${t.id}`;let e=[],n=t,r=0;for(;n&&n.nodeType===1&&r<4;){let i=n.tagName.toLowerCase();if(n.hasAttribute("sap"))i+="[sap]";else if(n.parentElement){let s=[...n.parentElement.children].filter(a=>a.tagName===n.tagName);s.length>1&&(i+=`:nth-of-type(${s.indexOf(n)+1})`)}if(e.unshift(i),n.hasAttribute("sap"))break;n=n.parentElement,r++}return e.join(" > ")}function ce(t){let e=t.toLowerCase();return/^x-text$|^x-html$/.test(e)?'use text="state.x" (Sap paints text only)':/^x-show$|^v-show$|^v-if$/.test(e)?'use show="expr" (toggles native hidden)':/^x-model$|^v-model$/.test(e)?'use bind="field"':/^@|^x-on:|^v-on:|^on:/.test(e)?"use native onclick + Sap(this) (no event directive)":/^:|^x-bind:class$|^v-bind:class$/.test(e)?'use class:NAME="expr" or attr:NAME="expr"':/^x-for$|^v-for$/.test(e)?'use items="name" on the container and item template on the row':/^x-data$/.test(e)?"declare state with state= / bind / items (no JS state object)":/^x-init$/.test(e)?"use a <script> or onclick + Sap(this)":/^bind:/.test(e)?'use bind="field"; one-way paint is attr:NAME="expr"':/^x-/.test(e)||/^v-/.test(e)?"this is a foreign-dialect attribute; Sap has no x-/v- attributes":null}var pt=class{constructor(e){this.appName=e,this.errors=[],this.warnings=[],this.halted=!1,this.haltReason=null}block(e,n,r={}){let i=(Xt[e]||{}).slug||"error",s={code:e,slug:i,el:Dt(n),attr:r.attr||null,expr:r.expr||null,key:r.key||null,problem:r.problem||"",didYouMean:r.didYouMean||null,fix:r.fix||null,phase:r.phase||"runtime"},a=[`
5
+ `+(e[0]==="W"?"sap \u26A0 ":"sap \u2717 ")+e+" "+i];return a.push(` at ${s.el}${s.attr?` \u2014 ${s.attr}="${s.expr??""}"`:""}`),s.problem&&a.push(` problem: ${s.problem}`),s.didYouMean&&a.push(` did you mean: ${s.didYouMean}`),s.fix&&a.push(` fix: ${s.fix}`),console.error(a.join(`
6
+ `)),s}error(e,n,r={}){let i=this.block(e,n,r);return this.errors.push(i),i}warn(e,n,r={}){let i=this.block(e,n,r);return this.warnings.push(i),i}report(){return{ok:this.errors.length===0&&!this.halted,app:this.appName,halted:this.halted,haltReason:this.haltReason,errors:this.errors.slice(),warnings:this.warnings.slice()}}};function ut(t,e){t&&t.getAttribute("sap-error")!==e&&t.setAttribute("sap-error",e)}function Ct(t){t&&t.hasAttribute("sap-error")&&t.removeAttribute("sap-error")}function xt(t,e){let n=null,r=3;for(let i of e){let s=rr(t,i);s<r&&(r=s,n=i)}return n}function rr(t,e){let n=t.length,r=e.length,i=Array.from({length:n+1},(s,a)=>[a,...new Array(r).fill(0)]);for(let s=0;s<=r;s++)i[0][s]=s;for(let s=1;s<=n;s++)for(let a=1;a<=r;a++)i[s][a]=Math.min(i[s-1][a]+1,i[s][a-1]+1,i[s-1][a-1]+(t[s-1]===e[a-1]?0:1));return i[n][r]}var nr=new Set(mt),or={readonly:"readOnly",novalidate:"noValidate"},ir=0,fe=new WeakMap;function Mt(t,e="sap"){let n=t.getAttribute("data-id");if(n)return n;if(t.id)return t.id;let r=fe.get(t);return r||(r=`${e}-${(ir++).toString(36)}`,fe.set(t,r)),r}function le(t,e="row"){for(;;){let n=`${e}-${Math.random().toString(36).slice(2,8)}`;if(!t.getElementById(n)&&!t.querySelector(`[data-id="${n}"]`))return n}}function sr(t){return t.hasAttribute("scope")||t.hasAttribute("items")||t.hasAttribute("detail")||t.hasAttribute("each")}function ar(t){return t.tagName==="TEMPLATE"||t.hasAttribute("sap-ignore")||t.hasAttribute("template")}function K(t,e){for(let r of t.children)n(r);function n(r){if(r.nodeType!==1||ar(r))return;let i=sr(r);if(e(r,i),!i)for(let s of r.children)n(s)}}function Y(t){let e=t;for(;e;){if(e.hasAttribute("sap")||e.hasAttribute("scope")||e.hasAttribute("item")||e.hasAttribute("detail"))return e;e=e.parentElement}return null}function ft(t){for(let e=t;e&&e.nodeType===1;e=e.parentElement){if(e._sapEachRow)return e;if(e.hasAttribute("item")||e.hasAttribute("sap"))return null}return null}function It(t){let e=t;for(;e;){if(e.hasAttribute("detail")||e.hasAttribute("item"))return e;e=e.parentElement}return null}function kt(t){let e=t;for(;e;){if(e.hasAttribute("detail"))return e;e=e.parentElement}return null}function lt(t,e){if(t.hasAttribute("item")&&t.getAttribute("bind")===e)return t;let n=null;return K(t,r=>{!n&&r.getAttribute("bind")===e&&(n=r)}),n}function ht(t,e){let n=null;return K(t,r=>{!n&&r.getAttribute("items")===e&&(n=r)}),n}function bt(t,e){return!t||t.nodeType!==1||!t.hasAttribute("item")?!1:lt(t,e)||ht(t,e)?!0:z(t.getAttribute("state")||"").some(n=>n.name===e)}function de(t){let e=t&&t.$el;return e&&e.nodeType===1&&e.isConnected&&e.hasAttribute("item")?e:null}function Ot(t){return!!t.closest("form[trigger-add]")}function Z(t){return[...t.children].filter(e=>e.hasAttribute("item")&&!e.hasAttribute("template"))}function Kt(t,e){if(!t||!e)return null;let n=[...t.querySelectorAll(`template[items="${e}"]`)].find(i=>i.closest("[sap]")===t),r=n&&n.content.firstElementChild;return r&&r.hasAttribute("item")?r:null}function Ft(t){let e=[...t.children].find(n=>n.hasAttribute("item")&&n.hasAttribute("template"));return e||Kt(t.closest("[sap]"),t.getAttribute("items"))}function z(t){let e=[];if(!t)return e;for(let n of t.trim().split(/\s+/)){if(!n)continue;let r=n,i,s=r.indexOf("=");s>=0&&(i=r.slice(s+1),r=r.slice(0,s));let a=r.split(":"),R=a[0],k="string",A=!1;for(let N of a.slice(1))N==="num"?k="num":N==="bool"?k="bool":N==="presence"?k="presence":N==="transient"&&(A=!0);let f=R,w=f.startsWith("data-")&&f.length>5?f.slice(5).replace(/-([a-z])/g,(N,I)=>I.toUpperCase()):f;e.push({name:w,attr:f,type:k,default:i,transient:A})}return e}function ct(t,e){if(e==="num"){if(t==null||t==="")return 0;let n=Number(t);return Number.isNaN(n)?0:n}return e==="bool"?t==="true"||t===""||t==="1":t??""}function Jt(t,e){return e==="bool"?t?"true":"false":t==null?"":String(t)}function Qt(t,e){return nr.has(e)&&typeof t[or[e]||e]=="boolean"}function gt(t,e){return e.type==="presence"||e.type!=="num"&&Qt(t,e.attr||e.name)}function $t(t){return t.default!=null?t.default:t.type==="num"?"0":t.type==="bool"?"false":""}function pe(t,e){let n=e.attr||e.name;if(gt(t,e))return t.hasAttribute(n);let r=t.getAttribute(n);return ct(r??$t(e),e.type)}function me(t,e){return gt(t,e)?e.default!=null?ct(e.default,"bool"):!1:ct($t(e),e.type)}function _t(t,e,n){let r=e.attr||e.name;if(gt(t,e)){n?t.hasAttribute(r)||t.setAttribute(r,""):t.hasAttribute(r)&&t.removeAttribute(r);return}t.setAttribute(r,Jt(n,e.type))}function Pt(t,e){let n=e.attr||e.name,r=t._sapTransient||(t._sapTransient={});if(!(e.name in r)){let i=t.getAttribute(n);i==null&&(i=$t(e)),r[e.name]=ct(i,e.type)}return t.hasAttribute(n)&&t.removeAttribute(n),r[e.name]}function Tt(t,e,n){let r=e.attr||e.name;(t._sapTransient||(t._sapTransient={}))[e.name]=n,t.hasAttribute(r)&&t.removeAttribute(r)}function Nt(t,e,n){let r=String(n).split("."),i=r[r.length-1];if(r.length===1){let R=ur(e,i);return R||(t.getAttribute("items")===i?t:t.querySelector(`[items="${i}"]:not(template)`))}let s=r[r.length-2],a=[...t.querySelectorAll(`[scope="${s}"]`)].find(R=>ht(R,i));return a?ht(a,i):null}function ur(t,e){let n=Y(t);for(;n;){if(n.getAttribute("items")===e)return n;let r=ht(n,e);if(r)return r;n=Y(n.parentElement)}return null}function tt(t){if(typeof t=="number")return t;if(t==null||t==="")return 0;let e=Number(typeof t=="string"?t.replace(/[$,%\s]/g,""):t);return Number.isNaN(e)?0:e}function Wt(t,e){return Array.isArray(t)?e==null?t:t.map(n=>typeof e=="function"?e(n):n?.[e]):[]}function he(t,e){return Wt(t,e).reduce((n,r)=>n+tt(r),0)}function cr(t,e){return Array.isArray(t)?e==null?t.length:t.reduce((n,r)=>n+(e(r)?1:0),0):0}function fr(t,e){let n=Wt(t,e);return n.length?he(t,e)/n.length:0}function lr(t,e){let n=Wt(t,e).filter(r=>r!=null&&r!=="");return n.length?n.every(r=>typeof r=="number"||!Number.isNaN(Number(r)))?Math.min(...n.map(Number)):n.reduce((r,i)=>String(r)<=String(i)?r:i):0}function dr(t,e){let n=Wt(t,e).filter(r=>r!=null&&r!=="");return n.length?n.every(r=>typeof r=="number"||!Number.isNaN(Number(r)))?Math.max(...n.map(Number)):n.reduce((r,i)=>String(r)>=String(i)?r:i):0}function pr(t,e,n){let r=tt(t)===1?e:n??e+"s";return`${t} ${r}`}function mr(t,e){let n=new Date(t),r=new Date(e);return Number.isNaN(+n)||Number.isNaN(+r)?0:Math.round((r-n)/864e5)}function nt(t){return typeof t=="number"?t:Number(t)}var Lt={usd:t=>"$"+nt(t).toLocaleString("en-US",{maximumFractionDigits:0}),usd2:t=>"$"+nt(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}),pct:t=>Math.round(nt(t))+"%",pct1:t=>nt(t).toFixed(1)+"%",int:t=>Math.round(nt(t)).toLocaleString("en-US"),num:t=>nt(t).toLocaleString("en-US"),num2:t=>nt(t).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}),compact:t=>nt(t).toLocaleString("en-US",{notation:"compact"}),date:t=>{let e=new Date(t);return Number.isNaN(+e)?String(t):e.toLocaleDateString("en-US")},clock:t=>{let e=nt(t),n=Math.floor(e/100),r=n%10,i=Math.floor(n/10)%60;return`${Math.floor(n/600)}:${String(i).padStart(2,"0")}.${r}`}},hr=new Set(["usd","usd2","pct","pct1","int","num","num2","compact","clock"]);function be(t,e){if(!t)return e==null?"":String(e);let n=Lt[t];if(typeof n!="function"){let r=new Error(`unknown format "${t}"`);throw r.sapCode="E22",r}if(hr.has(t)){let r=typeof e=="number"?e:Number(e);if(!Number.isFinite(r)){let i=new Error(`format "${t}" received ${typeof e=="string"?`"${e}"`:e}`);throw i.sapCode="E22",i}}return n(e)}function ge(){return[Lt,tt,he,cr,fr,lr,dr,pr,mr]}var br=["state","item","el","root","fmt","num","sum","count","avg","min","max","plural","days"],Bt=new Map,we=/\bstate\.([a-z][a-z0-9_]*)/g,ye=/\bitem\.([a-z][a-z0-9_]*)/g;function gr(t){let e=new Set,n=new Set,r;for(we.lastIndex=0;r=we.exec(t);)e.add(r[1]);for(ye.lastIndex=0;r=ye.exec(t);)n.add(r[1]);return{state:e,item:n}}function H(t,e=!1){let n=(e?"!":"")+t,r=Bt.get(n);if(r)return r;Bt.size>512&&Bt.clear();try{let i=e?`"use strict";
7
+ ${t}`:`"use strict"; return (${t});`;r={fn:new Function(...br,i),src:t,statement:e,deps:gr(t),error:null}}catch(i){r={fn:null,src:t,statement:e,deps:{state:new Set,item:new Set},error:i}}return Bt.set(n,r),r}function J(t,e){if(t.error)throw t.error;return t.fn(e.state,e.item,e.el??null,e.root,...ge())}function Ae(t){let e=new Map;for(let a of t)e.set(a.name,a);let n=[],r=new Map,i=[];function s(a){let R=r.get(a.name);if(R!==1){if(R===0){let k=[...i.slice(i.indexOf(a.name)),a.name].join(" -> "),A=new Error(`calc: cycle: ${k}`);throw A.sapCode="E07",A.cycle=k,A}r.set(a.name,0),i.push(a.name);for(let k of a.entry.deps.state){let A=e.get(k);A&&A!==a&&s(A)}for(let k of a.entry.deps.item){let A=e.get(k);A&&A!==a&&s(A)}i.pop(),r.set(a.name,1),n.push(a)}}for(let a of t)s(a);return n}function Ee(t){return(t.getAttribute("type")||"text").toLowerCase()}function wt(t){let e=t.tagName;if(e==="INPUT"){let n=Ee(t);n==="checkbox"||n==="radio"?t.checked?t.setAttribute("checked",""):t.removeAttribute("checked"):t.setAttribute("value",t.value);return}if(e==="TEXTAREA"){t.setAttribute("data-value",t.value);return}if(e==="SELECT"){let n=t.options;for(let r=0;r<n.length;r++)n[r].selected?n[r].setAttribute("selected",""):n[r].removeAttribute("selected")}}function ve(t,e=t){let n=t.tagName;if(n==="INPUT"){let r=Ee(t);r==="checkbox"||r==="radio"?e.checked?t.hasAttribute("checked")||t.setAttribute("checked",""):t.removeAttribute("checked"):e.value!==(t.getAttribute("value")??"")&&t.setAttribute("value",e.value);return}if(n==="TEXTAREA"){let r=e.value.startsWith(`
6
8
  `)?`
7
- `+e.value:e.value;t.textContent!==r&&(t.textContent=r),t.removeAttribute("data-value");return}if(n==="SELECT"){let r=t.options,o=e.options;for(let a=0;a<r.length;a++)o[a]&&o[a].selected?r[a].hasAttribute("selected")||r[a].setAttribute("selected",""):r[a].removeAttribute("selected")}}function Ct(t){t.tagName!=="TEXTAREA"||!t.hasAttribute("data-value")||t!==t.ownerDocument.activeElement&&(t.textContent=t.getAttribute("data-value"),t.removeAttribute("data-value"))}function j(t){if(typeof window>"u")return null;let e=window.clay,n=window.hyperclay;return t==="consent"?e?.confirm||n?.consent||null:e?.[t]||n?.[t]||null}var Ut=["clay:mutation-ready","hyperclay:mutation-ready"],nr=["clay:sync-applied","hyperclay:livesync-applied"],or=["clay:ready","hyperclay:ready"];function vt(t,e,n){let r=null,o=a=>{r!==null&&r!==a.type||(r=a.type,queueMicrotask(()=>{r=null}),n(a))};for(let a of e)t.addEventListener(a,o);return()=>{for(let a of e)t.removeEventListener(a,o)}}function le(t){let e=typeof window<"u"&&window.clay&&window.clay.ready;e&&typeof e.then=="function"?e.then(()=>t(),()=>t()):t()}function Mt(t){let e=j("region");return!e||typeof e.resolveRegionPolicy!="function"||typeof e.skipForPolicy!="function"?!1:e.skipForPolicy(e.resolveRegionPolicy(t),void 0,["no-save","freeze"])}function de(){let t=j("consent");return typeof t=="function"?t:null}function pe(t,e){if(typeof e!="function")throw new Error("Sap.batch(label, fn): fn must be a function");let n=j("undo");n&&n.flush&&n.flush();let r=e();if(r&&typeof r.then=="function")throw new Error("Sap.batch fn must be synchronous (it returned a promise)");return n&&n.commitCaptured&&n.commitCaptured(t),r}function me(t){if(typeof window>"u"||typeof document>"u")return;let e=()=>{let a=!1;for(let u of t.apps())u.root.isConnected?t.runNow(u,"platform"):a=!0;a&&(t.pruneDisconnected(),t.remountIfPresent())};vt(document,nr,e);let n=!1,r=()=>{},o=()=>{if(n)return!0;let a=j("undo");if(!a||typeof a.on!="function")return!1;let u=a.on("undo",e);return typeof u!="function"?!1:typeof a.on("redo",e)!="function"?(u(),!1):(n=!0,r(),!0)};if(!o()){let a=vt(document,Ut,o),u=vt(document,or,o);r=()=>{a(),u()};let R=j("ready");R&&typeof R.then=="function"&&R.then(o,()=>{})}}function sr(t){let e=t.tagName;if(e==="INPUT"){let n=(t.getAttribute("type")||"text").toLowerCase();return n==="checkbox"?"checkbox":n==="radio"?"radio":n==="number"||n==="range"?"number":n==="hidden"?"hidden":"text"}return e==="TEXTAREA"?"text":e==="SELECT"?t.multiple?"select-multiple":"select-one":"leaf"}function ir(t){if(t.validity&&t.validity.badInput)return t.hasAttribute("value")?Number(t.getAttribute("value"))||0:t._sapLastGood??0;if(t.value==="")return 0;let e=Number(t.value);return Number.isNaN(e)?t._sapLastGood??0:(t._sapLastGood=e,e)}function ar(t,e){switch(e){case"checkbox":return t.checked;case"radio":return t.checked?t.value:void 0;case"number":return ir(t);case"select-one":return t.value;case"select-multiple":return[...t.selectedOptions].map(n=>n.value);case"hidden":case"text":return t.value;case"leaf":return t.textContent;default:return t.value}}function ur(t,e,n){switch(e){case"checkbox":t.checked=!!n;break;case"radio":t.checked=String(t.value)===String(n);break;case"number":case"text":case"hidden":t.value=n==null?"":String(n);break;case"select-one":t.value=n==null?"":String(n);break;case"select-multiple":{let r=new Set((Array.isArray(n)?n:[n]).map(String));for(let o of t.options)o.selected=r.has(o.value);break}case"leaf":t.textContent=n==null?"":String(n);break;default:t.value=n==null?"":String(n)}}function he(t){if(t.hasAttribute("transient")){t.removeAttribute("value"),t.removeAttribute("checked"),t.removeAttribute("data-value");return}Mt(t)||lt(t)}function cr(t){t.dispatchEvent(new Event("input",{bubbles:!0})),t.dispatchEvent(new Event("change",{bubbles:!0}))}function F(t){let e=sr(t);return{el:t,kind:e,read(){return ar(t,e)},write(n,r={}){ur(t,e,n),r.noMirror||he(t),r.silent||cr(t)},mirror(){he(t)}}}var Vt={E01:{slug:"foreign-dialect",behavior:"HALT"},E02:{slug:"moustaches-in-text",behavior:"HALT"},E04:{slug:"duplicate-declaration",behavior:"HALT"},E05:{slug:"reserved-name",behavior:"HALT"},E06:{slug:"global-html-name",behavior:"HALT"},E07:{slug:"calc-cycle",behavior:"ERR"},E08:{slug:"expression-syntax",behavior:"HALT"},E10:{slug:"orphan-item",behavior:"HALT"},E12:{slug:"unknown-state-key",behavior:"ERR"},E15:{slug:"write-to-undeclared-key",behavior:"ERR"},E16:{slug:"write-to-computed-field",behavior:"ERR"},E17:{slug:"unresolvable-action-target",behavior:"HALT"},E18:{slug:"paint-on-form-control",behavior:"HALT"},E20:{slug:"bind-on-non-control",behavior:"HALT"},E22:{slug:"format-type",behavior:"ERR"},E24:{slug:"runtime-expression-throw",behavior:"ERR"},E26:{slug:"circuit-breaker",behavior:"HALT"},E30:{slug:"attr-on-bound-control",behavior:"HALT"},E31:{slug:"password-without-transient",behavior:"HALT"},E32:{slug:"file-bind",behavior:"HALT"},E33:{slug:"dialog-state-open",behavior:"HALT"},E34:{slug:"transient-persist-collision",behavior:"HALT"},E40:{slug:"each-not-array",behavior:"ERR"},E41:{slug:"each-bad-key",behavior:"ERR"},E42:{slug:"each-template",behavior:"ERR"},E43:{slug:"bind-in-each-row",behavior:"ERR"},W03:{slug:"unknown-colon-attribute",behavior:"WARN"},W04:{slug:"expression-in-when",behavior:"WARN"},W30:{slug:"nonzero-mount-writes",behavior:"WARN"}},Dt=["disabled","readonly","required","checked","selected","multiple","open","inert","autofocus","novalidate","hidden"],Et=new Set(["title","style","hidden","lang","dir","translate","class","id","nonce","autofocus","tabindex","contenteditable","spellcheck","draggable","role","slot","part","name","value","type","itemscope","itemtype","itemid","itemprop","itemref"]),It=new Set(["sap","scope","items","item","template","bind","calc","text","show","attr","set","trigger","move","sort","detail","each","effect","invalid","confirm","transient","default","persist","sortable","editmode"]);function Wt(t){if(!t||t.nodeType!==1)return"?";if(t.id)return`${t.tagName.toLowerCase()}#${t.id}`;let e=[],n=t,r=0;for(;n&&n.nodeType===1&&r<4;){let o=n.tagName.toLowerCase();if(n.hasAttribute("sap"))o+="[sap]";else if(n.parentElement){let a=[...n.parentElement.children].filter(u=>u.tagName===n.tagName);a.length>1&&(o+=`:nth-of-type(${a.indexOf(n)+1})`)}if(e.unshift(o),n.hasAttribute("sap"))break;n=n.parentElement,r++}return e.join(" > ")}function be(t){let e=t.toLowerCase();return/^x-text$|^x-html$/.test(e)?'use text="state.x" (Sap paints text only)':/^x-show$|^v-show$|^v-if$/.test(e)?'use show="expr" (toggles native hidden)':/^x-model$|^v-model$/.test(e)?'use bind="field"':/^@|^x-on:|^v-on:|^on:/.test(e)?"use native onclick + Sap(this) (no event directive)":/^:|^x-bind:class$|^v-bind:class$/.test(e)?'use class:NAME="expr" or attr:NAME="expr"':/^x-for$|^v-for$/.test(e)?'use items="name" on the container and item template on the row':/^x-data$/.test(e)?"declare state with state= / bind / items (no JS state object)":/^x-init$/.test(e)?"use a <script> or onclick + Sap(this)":/^bind:/.test(e)?'use bind="field"; one-way paint is attr:NAME="expr"':/^x-/.test(e)||/^v-/.test(e)?"this is a foreign-dialect attribute; Sap has no x-/v- attributes":null}var dt=class{constructor(e){this.appName=e,this.errors=[],this.warnings=[],this.halted=!1,this.haltReason=null}block(e,n,r={}){let o=(Vt[e]||{}).slug||"error",a={code:e,slug:o,el:Wt(n),attr:r.attr||null,expr:r.expr||null,key:r.key||null,problem:r.problem||"",didYouMean:r.didYouMean||null,fix:r.fix||null,phase:r.phase||"runtime"},u=[`
8
- `+(e[0]==="W"?"sap \u26A0 ":"sap \u2717 ")+e+" "+o];return u.push(` at ${a.el}${a.attr?` \u2014 ${a.attr}="${a.expr??""}"`:""}`),a.problem&&u.push(` problem: ${a.problem}`),a.didYouMean&&u.push(` did you mean: ${a.didYouMean}`),a.fix&&u.push(` fix: ${a.fix}`),console.error(u.join(`
9
- `)),a}error(e,n,r={}){let o=this.block(e,n,r);return this.errors.push(o),o}warn(e,n,r={}){let o=this.block(e,n,r);return this.warnings.push(o),o}report(){return{ok:this.errors.length===0&&!this.halted,app:this.appName,halted:this.halted,haltReason:this.haltReason,errors:this.errors.slice(),warnings:this.warnings.slice()}}};function at(t,e){t&&t.getAttribute("sap-error")!==e&&t.setAttribute("sap-error",e)}function Ot(t){t&&t.hasAttribute("sap-error")&&t.removeAttribute("sap-error")}function St(t,e){let n=null,r=3;for(let o of e){let a=fr(t,o);a<r&&(r=a,n=o)}return n}function fr(t,e){let n=t.length,r=e.length,o=Array.from({length:n+1},(a,u)=>[u,...new Array(r).fill(0)]);for(let a=0;a<=r;a++)o[0][a]=a;for(let a=1;a<=n;a++)for(let u=1;u<=r;u++)o[a][u]=Math.min(o[a-1][u]+1,o[a][u-1]+1,o[a-1][u-1]+(t[a-1]===e[u-1]?0:1));return o[n][r]}var et=null,Ft=!1,pt=null;function ge(t){let e=null;return{kind:"hub",subscribe(n){let r=t.onAnyChange({debounce:0,require:"observed"},n);typeof r=="function"&&(e=r)},suppress(n){t.pause();try{return n()}finally{t.resume()}},teardown(){if(e){try{e()}catch{}e=null}}}}function lr(){let t=null;return{kind:"native",subscribe(e){t=new MutationObserver(r=>e(dr(r)));let n=typeof document<"u"&&document.body||typeof document<"u"&&document.documentElement;n&&t.observe(n,{childList:!0,subtree:!0,attributes:!0,characterData:!0})},suppress(e){let n=j("undo");n&&n.pause&&n.pause();try{return e()}finally{t&&t.takeRecords(),n&&n.resume&&n.resume()}},teardown(){t&&(t.disconnect(),t=null)}}}function dr(t){let e=[];for(let n of t)if(n.type==="attributes"){let r=n.target;r&&r.nodeType===1&&!Pt(r)&&e.push({type:"attribute",element:r})}else if(n.type==="characterData"){let r=n.target&&n.target.parentElement;r&&!Pt(r)&&e.push({type:"characterData",element:r})}else if(n.type==="childList"){for(let r of n.addedNodes)if(!(r.nodeType!==1||Pt(r))&&(e.push({type:"add",element:r}),r.querySelectorAll))for(let o of r.querySelectorAll("*"))Pt(o)||e.push({type:"add",element:o});for(let r of n.removedNodes)r.nodeType===1&&e.push({type:"remove",element:r,parent:n.target})}return e}function Pt(t){return!!(t.closest&&t.closest("[sap-ignore],[template]"))}function pr(t,e){t.pruneDisconnected();let n=new Set,r=!1;for(let o of e){let a=o.type==="remove"?o.parent:o.element,u=a&&t.appFor(a);u&&n.add(u),o.type==="add"&&o.element&&o.element.nodeType===1&&o.element.hasAttribute&&o.element.hasAttribute("sap")&&!(t.isRegistered&&t.isRegistered(o.element))&&(r=!0)}r&&t.remountIfPresent();for(let o of n)o.root.isConnected&&t.schedule(o,"mutation")}function we(t){if(et)return et.suppress(t);let e=j("undo");if(e&&e.pause&&e.resume){e.pause();try{return t()}finally{e.resume()}}return t()}function Yt(t,e){Ft=!0,et=t,t.subscribe(n=>pr(e,n))}function Gt(t){if(Ft||typeof window>"u"||typeof document>"u")return;let e=j("Mutation");if(e&&typeof e.onAnyChange=="function"){Yt(ge(e),t);return}typeof MutationObserver=="function"&&(Yt(lr(),t),pt=vt(document,Ut,function(){let r=j("Mutation");r&&(pt(),pt=null,et&&et.teardown(),Ft=!1,Yt(ge(r),t))}))}function ye(){if(et)try{et.teardown()}catch{}pt&&typeof document<"u"&&pt(),et=null,Ft=!1,pt=null}var Ee=new Set(Dt);function mt(t,e={}){if(e.breaker){t.diag.error("E26",t.root,{problem:"recompute loop halted after 50 passes; recent triggers: "+(t._breakerRing||[]).join(", ")}),at(t.root,"loop");return}we(()=>mr(t,e)),t._viewsChanged&&(t._viewsChanged=!1,t.root.dispatchEvent(new CustomEvent("sap:views-updated",{bubbles:!0})))}function mr(t,e){let n=t.root,r={},o=[],a=[],u=[],R=[],k=[],y=[],f=[],w=new Set;t.diag.errors=[];let N={root:r,state:r,item:null,ownerEl:n,projection:!1};function W(s,p){let h=p.attr||p.name,d=s.getAttribute(h);return d==null&&(d=p.default!=null?p.default:p.type==="num"?"0":p.type==="bool"?"false":"",k.push({el:s,name:p.name,attr:h,value:Nt(it(d,p.type),p.type)})),it(d,p.type)}function b(s,p){let h=q(s.getAttribute("state")||"");s._sapStateDecls=h;for(let d of h){if(d.type==="string"&&Ee.has(d.attr)&&typeof s[d.attr]=="boolean"){p[d.name]=s.hasAttribute(d.attr);continue}if(d.transient){p[d.name]=Tt(s,d);continue}p[d.name]=W(s,d)}}function g(s,p){if(!s.hasAttribute("bind"))return;let h=s.getAttribute("bind"),d=p.item||p.state,_=F(s);_.kind==="radio"?(h in d||(d[h]=""),s.checked&&(d[h]=s.value)):d[h]=_.read(),s.hasAttribute("transient")&&(s.removeAttribute("value"),s.removeAttribute("checked"))}function c(s,p){for(let h of s.attributes){let d=h.name,_=h.value;if(d.startsWith("calc:"))o.push({owner:p.item||p.state,ownerEl:p.ownerEl,name:d.slice(5),entry:P(_),el:s,ctx:p});else if(d==="text"||d.startsWith("text:"))a.push({el:s,kind:"text",fmt:d.includes(":")?d.slice(5):null,entry:P(_),ctx:p});else if(d==="show")a.push({el:s,kind:"show",entry:P(_),ctx:p});else if(d.startsWith("attr:"))a.push({el:s,kind:"attr",arg:d.slice(5),entry:P(_),ctx:p});else if(d.startsWith("class:"))a.push({el:s,kind:"class",arg:d.slice(6),entry:P(_),ctx:p});else if(d.startsWith("css:"))a.push({el:s,kind:"css",arg:d.slice(4),entry:P(_),ctx:p});else if(d==="effect")u.push({el:s,entry:P(_,!0),ctx:p});else if(d==="invalid")R.push({el:s,entry:P(_),ctx:p});else if(d.startsWith("show-when:")||d.startsWith("option:")){let D=d.slice(d.indexOf(":")+1);w.add(D),a.push({el:s,kind:"when",match:"show",field:D,values:_.split("|"),ctx:p})}else if(d.startsWith("hide-when:")){let D=d.slice(d.indexOf(":")+1);w.add(D),a.push({el:s,kind:"when",match:"hide",field:D,values:_.split("|"),ctx:p})}else if(d.startsWith("option-not:")){let D=d.slice(d.indexOf(":")+1);w.add(D),a.push({el:s,kind:"when",match:"show-not",field:D,values:_.split("|"),ctx:p})}}p.view&&s.hasAttribute("bind")&&t.diag.error("E43",s,{attr:"bind",expr:s.getAttribute("bind"),problem:"bind inside an each row; rows are read-only views of the data",fix:"change the record with set:, Sap(el), or a detail panel"}),p.projection&&s.hasAttribute("bind")&&a.push({el:s,kind:"projection",field:s.getAttribute("bind"),ctx:p})}function A(s,p,h){Object.defineProperty(s,"$key",{value:xt(p,"row"),enumerable:!1}),Object.defineProperty(s,"$index",{value:h,enumerable:!1}),Object.defineProperty(s,"$el",{value:p,enumerable:!1})}function x(s,p,h){b(s,p),s._sapScope=p,!h.projection&&s.hasAttribute("bind")&&g(s,h),c(s,h),s.hasAttribute("items")?O(s,p,h):E(s,p,h)}function E(s,p,h){Y(s,(d,_)=>{_?d.hasAttribute("scope")?$(d,p,h):d.hasAttribute("items")?(c(d,h),O(d,p,h)):d.hasAttribute("detail")?l(d,p,h):d.hasAttribute("each")&&(c(d,h),f.push({el:d,ctx:h})):(!h.projection&&!h.view&&g(d,h),c(d,h))})}function $(s,p,h){let d=s.getAttribute("scope"),_={};p[d]=_;let D={root:h.root,state:_,item:null,ownerEl:s,projection:h.projection};x(s,_,D)}function O(s,p,h){let d=s.getAttribute("items"),_=[];p[d]=_,s._sapList=_,X(s).forEach((D,ct)=>{let V={};A(V,D,ct);let tt={root:h.root,state:h.state,item:V,ownerEl:D,projection:h.projection};x(D,V,tt),_.push(V)})}function U(s,p){let h=String(s).split("."),d=p.state;for(let _ of h)d=d?.[_];if(d===void 0){d=p.root;for(let _ of h)d=d?.[_]}return d}function l(s,p,h){for(let d of q(s.getAttribute("state")||""))d.name in p||(p[d.name]=W(s,d));y.push({el:s,parentObj:p,ctx:h})}function i(s,p,h){s._sapScope=p;let d=s.getAttribute("detail")||"",_=/^([\w.]+)\s+by\s+(.+)$/.exec(d);if(!_){s.hidden=!0,s._sapDetailRow=null;return}let D=_[1],ct=_[2].trim(),V=U(D,h),tt;try{tt=G(P(ct),{state:p,item:h.item,el:s,root:h.root})}catch{tt=void 0}let Q=Array.isArray(V)?V.find(st=>st&&String(st.$key)===String(tt)):null;if(s._sapDetailRow=Q?Q.$el:null,!Q){s.hidden||(s.hidden=!0);return}s.hidden&&(s.hidden=!1);let ot={root:h.root,state:p,item:Q,ownerEl:Q.$el,projection:!0};c(s,ot),E(s,Q,ot)}function m(s,p){let h=[...s.children].find(B=>B.tagName==="TEMPLATE"),d=h&&h.content.children.length===1?h.content.firstElementChild:null;if(!d)return t.diag.error("E42",s,{attr:"each",problem:"each needs one <template> child with exactly one element root"}),0;let _=s.getAttribute("each"),D;try{D=G(P(_),{state:p.state,item:p.item,el:s,root:p.root})}catch(B){return t.diag.error("E24",s,{attr:"each",expr:_,problem:String(B.message)}),0}if(!Array.isArray(D))return t.diag.error("E40",s,{attr:"each",expr:_,problem:"each must evaluate to an array; the list keeps its last good rows"}),0;let ct=P(s.getAttribute("key")||"item.$key"),V=[],tt=new Set;for(let B of D){let z;try{z=G(ct,{state:p.state,item:B,el:s,root:p.root})}catch{z=void 0}let M=z==null?"":String(z);if(M===""||tt.has(M))return t.diag.error("E41",s,{attr:"key",expr:ct.src,problem:M===""?"an item has no key; the list keeps its last good rows":`duplicate key "${M}"; the list keeps its last good rows`}),0;tt.add(M),V.push(M)}let Q=s._sapEach||new Map,ot=new Map,st=0,zt=h;V.forEach((B,z)=>{let M=Q.get(B);if(!M||M.parentElement!==s){M=s.ownerDocument.importNode(d,!0);let ht=(M.getAttribute("clay")||"").split(/\s+/).filter(Boolean);ht.includes("editor-ui")||M.setAttribute("clay",[...ht,"editor-ui"].join(" ")),M._sapEachRow=!0,st++}M.getAttribute("data-key")!==B&&M.setAttribute("data-key",B),zt.nextElementSibling!==M&&(Ar(s,M,zt),st++),M._sapEachItem=D[z],ot.set(B,M),zt=M});for(let[B,z]of Q)ot.get(B)!==z&&z.parentElement===s&&(z.remove(),st++);return s._sapEach=ot,V.forEach((B,z)=>{let M=ot.get(B),ht={root:p.root,state:p.state,item:D[z],ownerEl:M,projection:!1,view:!0};c(M,ht),E(M,{},ht)}),st}x(n,r,N);for(let s=0;s<y.length;s++){let{el:p,parentObj:h,ctx:d}=y[s];i(p,h,d)}if(k.length&&w.size)for(let s of k)w.has(s.attr)&&s.el.getAttribute(s.attr)==null&&s.el.setAttribute(s.attr,s.value);let v=new Map;for(let s of o){let p=v.get(s.owner);p||(p={ownerEl:s.ownerEl,list:[]},v.set(s.owner,p)),p.list.push(s)}let S=[...v.values()].sort((s,p)=>ve(p.ownerEl)-ve(s.ownerEl));for(let s of S){let p;try{p=ue(s.list)}catch(h){t.diag.error("E07",s.list[0].el,{problem:h.message}),p=s.list}for(let h of p)try{h.owner[h.name]=G(h.entry,{state:h.ctx.state,item:h.ctx.item,el:h.el,root:h.ctx.root}),Ot(h.el)}catch(d){h.owner[h.name]=void 0,t.diag.error("E24",h.el,{attr:"calc:"+h.name,expr:h.entry.src,problem:String(d.message)}),at(h.el,d.sapCode||"E24")}}let T=0;for(let s=0;s<f.length;s++)T+=m(f[s].el,f[s].ctx);let L=0,C=T;for(let s of a){let p=gr(s,t);s.ctx.view?C+=p:L+=p}for(let s of u)wr(s,t);for(let s of R)yr(s);t._state=r,t._stats={fields:Object.keys(r).filter(s=>typeof r[s]!="function").length,calcs:o.length,paints:a.length,lists:v.size,writes:L,viewWrites:C},t._viewsChanged=C>0,t._lastPass={trigger:e.trigger||"refresh",writes:L},t._debug&&console.log(`sap pass \xB7 trigger: ${t._lastPass.trigger} \xB7 writes ${L}/${a.length}`)}function hr(t){return t.kind==="text"?t.fmt?"text:"+t.fmt:"text":t.kind==="attr"?"attr:"+t.arg:t.kind==="class"?"class:"+t.arg:t.kind==="css"?"css:"+t.arg:t.kind==="when"?(t.match==="hide"?"hide-when:":t.match==="show-not"?"option-not:":"show-when:")+t.field:t.kind}function Xt(t,e,n,r){let o=t;for(;o&&o.nodeType===1;){if(o.hasAttribute&&o.hasAttribute(e)){let a=n.includes(o.getAttribute(e));if(r?!a:a)return!0}o=o.parentElement}return!1}function br(t,e){if(t===t.ownerDocument.activeElement)return 0;let n=F(t),r=n.read(),o=e??"";return String(r)!==String(o)?(n.write(o,{silent:!0}),1):0}function gr(t,e){if(t.kind==="projection")return br(t.el,t.ctx.item?t.ctx.item[t.field]:"");if(t.kind==="when")return Ae(t,null);let n={state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root};try{let r=G(t.entry,n),o=Ae(t,r);return Ot(t.el),o}catch(r){return e.diag.error(r.sapCode==="E22"?"E22":"E24",t.el,{attr:hr(t),expr:t.entry&&t.entry.src,problem:String(r.message)}),at(t.el,r.sapCode||"E24"),0}}function Ae(t,e){let n=t.el;switch(t.kind){case"text":{let r=t.fmt!=null?oe(t.fmt,e):e==null?"":String(e);return n.textContent!==r?(n.textContent=r,1):0}case"show":{let r=!e;return n.hidden!==r?(n.hidden=r,1):0}case"when":{let r=j("optionVisibility");if(r&&r._started)return n._sapWhen&&n.hidden?(n.hidden=!1,n._sapWhen=!1,1):0;let o;t.match==="hide"?o=!Xt(n,t.field,t.values,!1):t.match==="show-not"?o=Xt(n,t.field,t.values,!0):o=Xt(n,t.field,t.values,!1),n._sapWhen=!0;let a=!o;return n.hidden!==a?(n.hidden=a,1):0}case"attr":{let r=t.arg;if(Ee.has(r)){let a=n.hasAttribute(r);return e&&!a?(n.setAttribute(r,""),1):!e&&a?(n.removeAttribute(r),1):0}let o=typeof e=="boolean"?String(e):e==null?"":String(e);return n.getAttribute(r)!==o?(n.setAttribute(r,o),1):0}case"class":{let r=!!e;return n.classList.contains(t.arg)!==r?(n.classList.toggle(t.arg,r),1):0}case"css":{let r=e==null?"":String(e);return n.style.getPropertyValue("--"+t.arg)!==r?(n.style.setProperty("--"+t.arg,r),1):0}default:return 0}}function wr(t,e){try{G(t.entry,{state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root}),Ot(t.el)}catch(n){e.diag.error("E24",t.el,{attr:"effect",expr:t.entry&&t.entry.src,problem:String(n.message)}),at(t.el,"E24")}}function yr(t){let e="";try{let n=G(t.entry,{state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root});e=typeof n=="string"?n:""}catch{e=""}typeof t.el.setCustomValidity=="function"&&t.el.setCustomValidity(e)}function ve(t){let e=0,n=t;for(;n&&!(n.hasAttribute&&n.hasAttribute("sap"));)n=n.parentElement,e++;return e}function Ar(t,e,n){let r=n.nextSibling;if(e.isConnected&&t.moveBefore)try{t.moveBefore(e,r);return}catch{}t.insertBefore(e,r)}var vr=new Set(Dt),Se=new Set(["calc","text","attr","class","css","set","move","sort","option","option-not","show-when","hide-when","editmode"]),Er=new Set(["show-when","hide-when","option","option-not"]),Sr=/\b(?:state|item|root)\.|===|!==|&&|\|\||[()]|^\s*!/,xe=new Set(["sap","scope","items","item","template","bind","show","effect","invalid","detail","state","transient","confirm","default","persist","sortable","trigger-add","trigger-remove","trigger-reset","sap-ignore","sap-error","no-save","no-watch","no-undo","no-trigger-autosave","freeze","mutations-ignore","save-remove","save-ignore","save-freeze"]);function xr(t){return t.tagName==="INPUT"||t.tagName==="SELECT"||t.tagName==="TEXTAREA"}function Kt(t){return t.hasAttribute("bind")}function kr(t,e){e(t);for(let r of t.children)n(r);function n(r){if(r.nodeType===1&&!((r.hasAttribute("sap-ignore")||r.hasAttribute("template"))&&r.hasAttribute("sap-ignore"))){e(r);for(let o of r.children)n(o)}}}function Bt(t,e){let n=!1,r=(u,R,k)=>{e.error(u,R,k),n=!0},o=t.ownerDocument.createTreeWalker(t,4),a;for(;a=o.nextNode();)if(/\{\{.*\}\}/.test(a.nodeValue||"")){r("E02",a.parentElement||t,{problem:"moustaches in text content are not a Sap feature",fix:'move the expression onto the element: text="state.x"'});break}return kr(t,u=>{let R=u.closest&&u.closest("[detail]");for(let k of[...u.attributes]){let y=k.name,f=be(y);if(f){r("E01",u,{attr:y,expr:k.value,problem:`"${y}" is a foreign-dialect attribute; Sap has no ${y.split(/[:=]/)[0]} directive`,fix:f+" \u2014 or wrap the subtree in sap-ignore if intentional"});continue}if(y.includes(":")){let w=y.slice(0,y.indexOf(":"));if(Se.has(w)){if(Er.has(w)&&Sr.test(k.value)){let N=y.slice(y.indexOf(":")+1);e.warn("W04",u,{attr:y,expr:k.value,problem:`${w}: compares the "${N}" attribute against a literal value, not a JS expression`,fix:`use show="${k.value}" for an expression, or a literal like ${w}:${N}="overview"`})}}else{let N=St(w,[...Se]);e.warn("W03",u,{attr:y,problem:`unknown "${w}:" attribute`,didYouMean:N?`${N}:`:null})}}else if(!xe.has(y)&&!Et.has(y)&&!vr.has(y)&&!/^(data-|aria-|on)/.test(y)&&!(y in u)){let w=St(y,[...xe]);w&&e.warn("W03",u,{attr:y,problem:`unknown "${y}" attribute`,didYouMean:w})}y==="attr:hidden"&&e.warn("W03",u,{attr:y,problem:"attr:hidden paints the wrong attribute",fix:'use show="expr"'}),(y==="attr:value"||y==="attr:checked"||y==="attr:selected")&&Kt(u)&&r("E30",u,{attr:y,problem:"attr: on a bound control collides with persist ownership",fix:"remove it; bind owns this attribute"}),y==="effect"&&Kt(u)&&/\b(value|checked)\s*=[^=]/.test(k.value)&&r("E30",u,{attr:y,expr:k.value,problem:"effect writes value/checked on a bound control (writes a stale value with no synthetic event)",fix:"write through onclick + Sap(this) instead"}),(y==="text"||y.startsWith("text:")||y==="show")&&xr(u)&&(y==="show"||r("E18",u,{attr:y,problem:"paint belongs on output elements, not form controls",fix:"move the paint to an <output> or <span>"}))}if(u.hasAttribute("state")){let k=q(u.getAttribute("state")),y=new Set;for(let f of k)f.name.includes("-")&&r("E08",u,{attr:"state",problem:`field "${f.name}" is not a valid identifier (the hyphen parses as subtraction)`,fix:`rename to ${f.name.replace(/-/g,"")}`}),y.has(f.name)&&r("E04",u,{attr:"state",problem:`field "${f.name}" is declared twice in one scope`}),y.add(f.name),It.has(f.attr)&&r("E05",u,{attr:"state",problem:`"${f.name}" is a reserved Sap word`}),Et.has(f.attr)&&r("E06",u,{attr:"state",problem:`"${f.name}" is a global HTML attribute name; pick another field name`}),f.name==="open"&&u.tagName==="DIALOG"&&r("E33",u,{attr:"state",problem:"dialog open is transient",fix:"use showModal() \u2014 declare state= only on <details> or popovers"})}if(Kt(u)){if(u.hasAttribute("-"),u.tagName==="INPUT"){let k=(u.getAttribute("type")||"text").toLowerCase();k==="file"&&r("E32",u,{attr:"bind",problem:"files never serialize into an HTML file",fix:"use no-save + effect instead of bind"}),k==="password"&&!u.hasAttribute("transient")&&r("E31",u,{attr:"bind",problem:"a password must never serialize into a world-readable file",fix:"add transient to the password input"})}else if(u.tagName!=="SELECT"&&u.tagName!=="TEXTAREA"){let k=u.getAttribute("contenteditable");!(k!=null&&k!=="false")&&u.children.length>0&&r("E20",u,{attr:"bind",problem:"bind on a container element is not a control; a write would overwrite its children",fix:"bind a control (input/select/textarea), a contenteditable, or an empty text leaf"})}}if(u.hasAttribute("transient")&&u.hasAttribute("persist")&&r("E34",u,{problem:"transient and persist are opposite: persist forces the live value into the saved bytes, leaking exactly what transient drops",fix:"remove one \u2014 transient to keep it out of the file, or persist to save it"}),u.hasAttribute("item")&&!u.hasAttribute("template")){let k=u.parentElement;(!k||!k.hasAttribute("items"))&&r("E10",u,{problem:"an [item] must be a direct child of an [items] list",fix:'wrap it in a container with items="name"'})}if(u.hasAttribute("items")&&R&&r("E17",u,{attr:"items",problem:"nested items inside a detail panel is a v1 mount error (nested collections ship in v1.1)"}),u.hasAttribute("items")){let k=t.querySelector(`[trigger-add="${u.getAttribute("items")}"]`);!_t(u)&&X(u).length===0&&k&&r("E17",u,{attr:"items",problem:`trigger-add targets items="${u.getAttribute("items")}" but it has no [item template] to clone`})}}),n&&(e.halted=!0,e.haltReason=e.errors[0]?e.errors[0].code:"halt",at(t,e.haltReason)),!n}var ke="sap-styles",$e="[item][template]{display:none!important}[hidden]{display:none!important}[sap-error]{outline:2px solid #e5484d;outline-offset:1px}",Jt=new WeakSet;function $r(t){if(Jt.has(t))return;let e=t.defaultView,n=e&&e.CSSStyleSheet;if(n&&"adoptedStyleSheets"in t)try{let r=new n;r.replaceSync($e),t.adoptedStyleSheets=[...t.adoptedStyleSheets,r],Jt.add(t);return}catch{}if(!t.getElementById(ke)){let r=t.createElement("style");r.id=ke,r.textContent=$e,(t.head||t.documentElement).appendChild(r)}Jt.add(t)}var _r=0;function _e(){return typeof performance<"u"&&performance.now?performance.now():0}function Qt(t){let e=t.id||t.getAttribute("sap")||`app-${_r++}`,n=new dt(e),r={root:t,name:e,diag:n,_state:null,_stats:null,_lastPass:null,_passes:0,_broken:!1,_mountMs:0,_mountWrites:0};if(!Bt(t,n))return r.halted=!0,r;$r(t.ownerDocument);for(let u of t.querySelectorAll("textarea[data-value]"))Ct(u);let a=_e();return mt(r,{trigger:"mount"}),r._mountMs=_e()-a,r._mountWrites=r._stats?r._stats.writes:0,r._mountWrites>0&&n.warn("W30",t,{problem:`${r._mountWrites} paint(s) ran at mount; the saved file was out of sync with its declared state`,fix:"re-save once so the file mounts clean (a settled file writes nothing)"}),r}function Nr(t,e){let n=null;return Y(t,r=>{!n&&r.getAttribute("scope")===e&&(n=r)}),n}function Ne(t,e,n){let r=H(t)||e;for(;r;){for(let o of q(r.getAttribute("state")||""))if(o.name===n)return{el:r,decl:o};if(r.hasAttribute("sap"))break;r=H(r.parentElement)}return null}function Tr(t){return typeof t=="number"?"num":typeof t=="boolean"?"bool":"string"}function Te(t){function e(b){let g=t.appFor(b);if(!g)return null;let c=gt(b),A=c&&c._sapEachItem&&c._sapEachItem.$el;if(A&&A.isConnected)return{ctxEl:A,appRec:g,isRow:!0};let x=wt(b);if(x)return x._sapDetailRow?{ctxEl:x._sapDetailRow,appRec:g,isRow:!0}:{ctxEl:H(x.parentElement)||g.root,appRec:g,isRow:!1};let E=$t(b);if(E&&E.hasAttribute("item"))return{ctxEl:E,appRec:g,isRow:!0};let $=H(b)||g.root;return{ctxEl:$,appRec:g,isRow:$.hasAttribute("item")}}function n(b){let g=typeof b=="string"?document.querySelector(b):b;if(!g||g.nodeType!==1)return null;let c=e(g);return c?W(c.ctxEl,c.appRec,c.isRow):null}function r(b,g,c){let A=ft(b,c);if(A)return F(A).read();let x=bt(b,c);if(x)return X(x).map(U=>W(U,g,!0));let E=Nr(b,c);if(E)return W(E,g,!1);let $=Ne(b,g.root,c);if($)return $.decl.transient?Tt($.el,$.decl):it($.el.getAttribute($.decl.attr||c),$.decl.type);let O=b._sapScope;return O?O[c]:void 0}function o(b,g,c,A,x){A.transient?jt(b,A,c):b.setAttribute(A.attr||g,Nt(c,A.type)),t.schedule(x,"set:"+g)}function a(b,g){let c=new Set,A=H(b)||g;for(;A;){for(let x of q(A.getAttribute("state")||""))c.add(x.name);if(A.hasAttribute("sap"))break;A=H(A.parentElement)}return Y(b,x=>{let E=x.getAttribute("bind");E&&c.add(E)}),c}function u(b,g,c,A){let x=ft(b,c);if(x){F(x).write(A);return}let E=b;for(;E;){for(let S of E.attributes)if(S.name==="calc:"+c){g.diag.error("E16",E,{attr:"calc:"+c,problem:`"${c}" is a computed field; computed fields are read-only`});return}if(E.hasAttribute("sap"))break;E=E.parentElement}let $=Ne(b,g.root,c);if($){o($.el,c,A,$.decl,g);return}let O=a(b,g.root);O.delete(c);let U=c.length>=4?St(c,[...O]):null;if(U){g.diag.error("E12",b,{key:c,problem:`unknown state key "${c}"`,didYouMean:U});return}if(It.has(c)||Et.has(c)){g.diag.error("E15",b,{key:c,problem:`cannot write undeclared field "${c}" \u2014 it is a reserved/global name and cannot become state`,fix:"pick a different field name, or declare it explicitly in a state= attribute"});return}let l=g.root,i=Tr(A),m=l.getAttribute("state")||"",v=i==="string"?c:`${c}:${i}`;l.setAttribute("state",m?`${m} ${v}`:v),o(l,c,A,{name:c,type:i,transient:!1},g)}function R(b){let g=b.ownerDocument;b.querySelectorAll("[id]").forEach(c=>{c.id=kt(g)}),b.querySelectorAll("[sap-error]").forEach(c=>c.removeAttribute("sap-error")),b.removeAttribute("sap-error"),b.hasAttribute("data-id")?(b.removeAttribute("id"),b.setAttribute("data-id",kt(g))):b.id=kt(g)}function k(b,g,c){let A=yt(g.root,b,c);if(!A)return g.diag.error("E17",b,{problem:`cannot resolve a list named "${c}" from here`}),null;let x=_t(A);if(!x)return g.diag.error("E17",A,{problem:`items="${c}" has no [item template] to clone`}),null;let E=x.cloneNode(!0);return E.removeAttribute("template"),R(E),A.appendChild(E),t.schedule(g,"trigger-add:"+c),W(E,g,!0)}function y(b,g){Y(b,c=>{if(c.hasAttribute("bind")){let A=F(c),x=c.getAttribute("default");A.kind==="checkbox"||A.kind==="radio"?A.write(x!=null?x===""||x==="true"||c.value===x:c.hasAttribute("checked")):A.write(x??(c.getAttribute("value")||""))}});for(let c of q(b.getAttribute("state")||"")){let A=c.default!=null?c.default:c.type==="num"?"0":c.type==="bool"?"false":"";c.transient?jt(b,c,it(A,c.type)):b.setAttribute(c.attr,A)}t.schedule(g,"trigger-reset")}function f(b,g){if(!b.isConnected)throw new Error("stale row handle: $remove() on a removed row");b.remove(),t.schedule(g,"trigger-remove")}function w(b,g,c){if(!b.isConnected)throw new Error("stale row handle: $move() on a removed row");let A=null;if(c&&c.nodeType===1?A=c:typeof c=="string"&&(A=yt(g.root,b,c)),!A){g.diag.error("E17",b,{problem:`$move() cannot resolve target "${c}"`});return}t.moveInto(A,b),t.schedule(g,"trigger-move")}function N(b){let g=b.parentElement;return g?X(g).indexOf(b):-1}function W(b,g,c){let A={get $el(){return b},get $key(){return xt(b,c?"row":"scope")},get $index(){return N(b)},$add(E){return k(b,g,E)},$reset(){return y(b,g),x},$remove(){f(b,g)},$move(E){w(b,g,E)},get $appRec(){return g}},x=new Proxy(A,{get(E,$){return typeof $=="symbol"||$[0]==="$"?E[$]:r(b,g,$)},set(E,$,O){return typeof $=="string"&&$[0]==="$"?(E[$]=O,!0):(u(b,g,$,O),!0)},has(E,$){return typeof $=="string"&&$[0]==="$"?$ in E:r(b,g,$)!==void 0}});return x}return{Sap:n,contextElFor:e,readField:r,writeField:u,makeProxy:W}}var Lr=["trigger-add","trigger-remove","trigger-reset"];function Rr(t){if(t.nodeType!==1)return!1;for(let e of t.attributes){let n=e.name;if(n.startsWith("set:")||n.startsWith("move:")||n.startsWith("sort:")||Lr.includes(n))return!0}return!1}function Cr(t,e){let n=t,r=e.parentElement;for(;n&&n!==r;){if(n.nodeType===1&&Rr(n)&&!(n.tagName==="FORM"&&n.hasAttribute("trigger-add")))return n;n=n.parentElement}return null}function Le(t,e){let{Sap:n}=e;function r(l,i){let m=null,v=gt(l),S=wt(l);if(v)m=v._sapEachItem??null;else if(S&&S._sapDetailRow)m=S._sapDetailRow._sapScope||null;else{let C=$t(l);C&&C.hasAttribute("item")&&(m=C._sapScope||null)}return{state:(H(l)||i.root)._sapScope||i._state||{},item:m,el:l,root:i._state||{}}}function o(l,i,m){if(!l.hasAttribute("confirm")){m();return}let v=l.getAttribute("confirm"),S=v,T=P(v);if(!T.error)try{let s=G(T,r(l,i));(typeof s=="string"||typeof s=="number")&&(S=String(s))}catch{}let L=de();if(!L){window.confirm(S)&&m();return}if(l._sapGatePending)return;l._sapGatePending=!0;let C=()=>{l._sapGatePending=!1};L(S,()=>{C(),m()}).catch(C)}function a(l,i){for(let m of l.attributes){if(!m.name.startsWith("set:"))continue;let v=m.name.slice(4),S=P(m.value);if(S.error){i.diag.error("E08",l,{attr:m.name,expr:m.value,problem:String(S.error.message)});continue}let T;try{T=G(S,r(l,i))}catch(C){i.diag.error("E24",l,{attr:m.name,expr:m.value,problem:String(C.message)});continue}let L=n(l);L&&(L[v]=T)}}function u(l){let i=gt(l);if(!i)return l.closest("[item]");let m=i._sapEachItem&&i._sapEachItem.$el;return m&&m.nodeType===1&&m.hasAttribute("item")?m:null}function R(l,i){let m=u(l);if(!m)return;let v=X(m.parentElement),S=v.indexOf(m);i==="up"&&S>0?t.placeBefore(m,v[S-1]):i==="down"&&S<v.length-1&&t.placeBefore(v[S+1],m)}function k(l,i,m){if(i)return yt(m.root,l,i);let v=l;for(;v;){if(v.hasAttribute&&v.hasAttribute("items"))return v;v=v.parentElement}let S=H(l)||m.root,T=[];return Y(S,L=>{L.hasAttribute("items")&&T.push(L)}),T[0]||null}function y(l,i){let m=l==null||l==="",v=i==null||i==="";if(m&&v)return 0;if(m)return 1;if(v)return-1;let S=Number(l),T=Number(i);return!Number.isNaN(S)&&!Number.isNaN(T)?S-T:String(l)<String(i)?-1:String(l)>String(i)?1:0}function f(l,i,m,v){let S=k(l,m,v);if(!S){v.diag.error("E17",l,{attr:"sort:"+i,problem:`no items list resolvable for sort:${i}`});return}let T=X(S),L=h=>h._sapScope?h._sapScope[i]:void 0,C=[...T].sort((h,d)=>y(L(h),L(d))),p=C.every((h,d)=>h===T[d])?[...C].reverse():C;for(let h of p)t.moveInto(S,h);t.schedule(v,"sort:"+i)}function w(l){if(!l||l.hidden)return;let i=l.querySelector("[bind]:not([type=hidden]), [contenteditable]");i&&typeof i.focus=="function"&&i.focus()}function N(l,i){o(l,i,()=>{let m=n(l);for(let v of[...l.attributes]){let S=v.name;if(S==="trigger-remove")m&&m.$remove();else if(S==="trigger-reset")m&&m.$reset();else if(S==="trigger-add"){let T=m&&m.$add(v.value);T&&w(T.$el)}else S==="move:up"?(R(l,"up"),t.schedule(i,"move:up")):S==="move:down"?(R(l,"down"),t.schedule(i,"move:down")):S.startsWith("move:to")?m&&m.$move(v.value):S.startsWith("sort:")&&f(l,S.slice(5),v.value,i)}[...l.attributes].some(v=>v.name.startsWith("set:"))&&a(l,i)})}function W(l){let i=l.target;if(!i||i.nodeType!==1)return;let m=t.appFor(i);if(!m)return;let v=Cr(i,m.root);v&&N(v,m)}function b(l){let i=F(l),m=l.getAttribute("default");i.kind==="checkbox"?i.write(m===""||m==="true"):i.write(m??"")}function g(l,i,m){let v=n(l);if(!v)return;let S=v.$add(m);if(!S)return;let T=[];Y(l,L=>{L.hasAttribute("bind")&&T.push(L)});for(let L of T){let C=ft(S.$el,L.getAttribute("bind"));C&&F(C).write(F(L).read())}T.forEach(b),T.length?typeof T[0].focus=="function"&&T[0].focus():w(S.$el)}function c(l){let i=l.target;if(!i||!i.hasAttribute||!i.hasAttribute("trigger-add"))return;let m=t.appFor(i);m&&(l.preventDefault(),o(i,m,()=>g(i,m,i.getAttribute("trigger-add"))))}function A(l){let i=l.target,m=t.appFor(i);m&&setTimeout(()=>{i.querySelectorAll("[bind]").forEach(v=>{v.dispatchEvent(new Event("input",{bubbles:!0})),v.dispatchEvent(new Event("change",{bubbles:!0}))}),t.schedule(m,"reset")},0)}function x(l){let i=t.appFor(l.target);i&&t.schedule(i,"toggle")}function E(l){let i=l.target;if(!i||i.nodeType!==1)return;let m=t.appFor(i);if(!m)return;i.hasAttribute("persist")&&!Mt(i)&&lt(i);let v=wt(i);if(v&&v._sapDetailRow&&i.hasAttribute("bind")){let S=v._sapDetailRow,T=i.getAttribute("bind"),L=ft(S,T);if(L&&L!==i){F(L).write(F(i).read());return}if(!L&&q(S.getAttribute("state")||"").some(C=>C.name===T)){e.writeField(S,m,T,F(i).read());return}}t.schedule(m,l.type+" "+(i.id||i.tagName.toLowerCase()))}function $(l){let i=l.detail||{};for(let m of[i.from,i.to,l.target]){if(!m||m.nodeType!==1)continue;let v=t.appFor(m);v&&t.schedule(v,"sorted")}}function O(l){if(l.key!=="ArrowUp"&&l.key!=="ArrowDown")return;let i=l.target;if(!i||i.nodeType!==1||i.tagName!=="INPUT"||!i.hasAttribute("bind")||!i.hasAttribute("step"))return;let m=(i.getAttribute("type")||"text").toLowerCase();if(m!=="text"&&m!=="tel"&&m!=="search"||!t.appFor(i))return;l.preventDefault();let S=K(i.getAttribute("step"))||1,T=l.key==="ArrowUp"?1:-1,L=K(i.value)+S*(l.shiftKey?10:1)*T,C=i.getAttribute("min"),s=i.getAttribute("max");C!==null&&C!==""&&L<K(C)&&(L=K(C)),s!==null&&s!==""&&L>K(s)&&(L=K(s)),F(i).write(String(Number(L.toFixed(2))))}function U(l=document){l.addEventListener("click",W),l.addEventListener("submit",c),l.addEventListener("reset",A),l.addEventListener("toggle",x,!0),l.addEventListener("input",E),l.addEventListener("change",E),l.addEventListener("clay:sorted",$),l.addEventListener("keydown",O)}return{install:U}}var Re=/^(set:|move:|sort:|trigger-add$|trigger-remove$|trigger-reset$)/;function Zt(t){return`${t.tagName.toLowerCase()}[sap]`}function Mr(t){let e=0;for(let n of t.querySelectorAll("*"))for(let r of n.attributes)if(Re.test(r.name)){e++;break}for(let n of t.attributes)if(Re.test(n.name)){e++;break}return e}function Ce(t){let e=[],n=r=>{for(let o of r.attributes){let a=o.name;(a.startsWith("calc:")||a==="text"||a.startsWith("text:")||a==="show"||a.startsWith("attr:")||a.startsWith("class:")||a.startsWith("css:")||a==="effect"||a==="invalid"||a.startsWith("set:")||a==="detail")&&e.push({el:r,attr:a,src:o.value})}};n(t);for(let r of t.querySelectorAll("*"))n(r);return e}function Me(t){function e(f){let w=f._stats||{},N=f.root;return{root:Zt(N),fields:w.fields||0,calcs:w.calcs||0,paints:w.paints||0,actions:Mr(N),lists:(N.hasAttribute("items")?1:0)+N.querySelectorAll("[items]").length,rows:N.querySelectorAll("[item]:not([template])").length,warnings:f.diag.warnings.length,errors:f.diag.errors.length,mountWrites:f._mountWrites||0,ms:Math.round((f._mountMs||0)*10)/10,passes:f._passes||0,lastPass:f._lastPass||null,ok:f.diag.errors.length===0&&!f.halted}}function n(){let f=t.apps().map(e);return{ok:f.every(w=>w.ok),apps:f}}function r(f){let w=e(f);return w.ok?`sap \u2713 ${w.root} \xB7 fields ${w.fields} \xB7 calcs ${w.calcs} \xB7 paints ${w.paints} \xB7 actions ${w.actions} \xB7 lists ${w.lists} \xB7 rows ${w.rows} \xB7 warnings ${w.warnings} \xB7 mount writes ${w.mountWrites} \xB7 ${w.ms}ms`:`sap \u2717 ${w.root} \xB7 errors ${w.errors} \xB7 warnings ${w.warnings} \xB7 ${w.ms}ms`}function o(){for(let f of t.apps()){let w=r(f);f.diag.errors.length||f.halted?console.error(w):console.log(w)}}function a(){let f=[],w=[];for(let N of t.apps())f.push(...N.diag.errors),w.push(...N.diag.warnings);return{ok:f.length===0,errors:f,warnings:w,counts:{errors:f.length,warnings:w.length}}}function u(f){return f?typeof f=="string"?document.querySelector(f):f.nodeType===1?f:null:null}function R(f,w){let N=u(f);if(!N)return console.warn("sap why: element not found"),null;let W=[`sap why <${N.tagName.toLowerCase()}> \u2014 ${Wt(N)}`],b=[...N.attributes].filter(c=>/^(bind|text|show|effect|invalid|detail|calc:|text:|attr:|class:|css:|set:|state|items|scope)/.test(c.name));for(let c of b)W.push(` ${c.name}="${c.value}"`);let g=N;for(;g&&!g._sapScope;)g=g.parentElement;if(g&&g._sapScope){let c=g._sapScope,A=w?[w]:Object.keys(c);W.push(" reads:");for(let x of A){let E=c[x];typeof E!="function"&&W.push(` ${x} = ${JSON.stringify(Array.isArray(E)?`[${E.length} rows]`:E)}`)}}return W.push(" serialization: textContent and value/checked attributes save with the file; reads live from properties"),console.log(W.join(`
10
- `)),null}function k(f){let w=f===void 0?!0:!!f;for(let N of t.apps())N._debug=w;return console.log(`sap debug ${w?"on":"off"} \u2014 per-pass headers will ${w?"":"no longer "}log`),w}function y(){let f=[],w=0;for(let c of t.apps()){let A=c.root,x=Zt(A);w++;let E=new dt(c.name);Bt(A,E);for(let i of E.errors)f.push({code:i.code,severity:"error",message:`${x}: ${i.code} ${i.slug} at ${i.el}`});for(let i of E.warnings)f.push({code:i.code,severity:"warn",message:`${x}: ${i.code} ${i.slug} at ${i.el}`});w++,mt(c,{trigger:"doctor-dryrun"});let $=c._stats?c._stats.writes:0;$>0&&f.push({code:"W30",severity:"warn",message:`${x}: dry recompute wrote ${$} cells on a quiet page; an element is stale or non-idempotent`}),w++;let O=Ce(A).map(i=>i.src).join(" \0 "),U=[];for(let i of[A,...A.querySelectorAll("[state]")])for(let m of q(i.getAttribute("state")||""))U.push(m.name);for(let i of U)new RegExp(`(state|item)\\.${i}\\b`).test(O)||f.push({code:"I33",severity:"info",message:`${x}: field "${i}" is declared but read nowhere (dead state)`});w++;let l=new Map;for(let i of A.querySelectorAll("[id]"))l.set(i.id,(l.get(i.id)||0)+1);for(let[i,m]of l)m>1&&f.push({code:"W32",severity:"warn",message:`${x}: duplicate id "${i}" (${m} elements) \u2014 clone/edit collision`});w++;for(let i of Ce(A))i.src.length>120&&f.push({code:"I33",severity:"info",message:`${x}: ${i.attr} expression is ${i.src.length} chars; consider a calc: field`});w++;for(let i of A.querySelectorAll("[text], [text\\:num]")){let m=i.textContent||"";/\.\d{5,}/.test(m)&&f.push({code:"I33",severity:"info",message:`${x}: ${Wt(i)} paints >4 decimals; consider text:FMT`})}}let N=f.filter(c=>c.severity==="error").length,W=f.filter(c=>c.severity==="warn").length,b=f.filter(c=>c.severity==="info").length;console.log(`sap doctor \xB7 ${t.apps().map(c=>Zt(c.root)).join(", ")} \xB7 errors ${N} \xB7 warnings ${W} \xB7 info ${b} \xB7 ${w} checks \xB7 0ms`);for(let c of f)(c.severity==="error"?console.error:c.severity==="warn"?console.warn:console.info)(` ${c.severity==="error"?"\u2717":c.severity==="warn"?"\u26A0":"\xB7"} ${c.message}`);return f}return{status:n,report:a,why:R,debug:k,doctor:y,greenLine:r,printGreenLines:o,REGISTRY:Vt}}var Dr="0.2.0",J=new Map,rt=[],te=ee(mt);function Ir(t){let e=t;for(;e;){if(e.nodeType===1&&e.hasAttribute&&e.hasAttribute("sap"))return J.get(e)||null;e=e.parentNode&&e.parentNode.host?e.parentNode.host:e.parentElement}return null}function Wr(){for(let t=rt.length-1;t>=0;t--){let e=rt[t];e.root.isConnected||(J.delete(e.root),rt.splice(t,1))}}function Or(t,e){if(t.moveBefore)try{t.moveBefore(e,null);return}catch{}t.appendChild(e)}function Pr(t,e){let n=e.parentElement;if(n){if(n.moveBefore)try{n.moveBefore(t,e);return}catch{}n.insertBefore(t,e)}}var ut={apps:()=>rt.slice(),appFor:Ir,isRegistered:t=>J.has(t),pruneDisconnected:Wr,schedule:(t,e)=>te.schedule(t,e),runNow:(t,e)=>te.runNow(t,e),moveInto:Or,placeBefore:Pr,remountIfPresent:()=>qt()},Ie=Te(ut),Fr=Le(ut,Ie),nt=Me(ut),De=!1;function We(){De||(De=!0,Fr.install(document),me(ut))}function qt(t=document){We(),Gt(ut);let e=t.querySelectorAll("[sap]"),n=[];for(let r of e){if(J.has(r))continue;let o=Qt(r);J.set(r,o),rt.push(o),n.push(o)}for(let r of n){let o=nt.greenLine(r);r.diag.errors.length||r.halted?console.error(o):console.log(o)}return n}function Oe(t){if(We(),Gt(ut),!t)return qt();let e=typeof t=="string"?document.querySelector(t):t;if(!e)return null;if(J.has(e))return J.get(e);let n=Qt(e);J.set(e,n),rt.push(n);let r=nt.greenLine(n);return n.diag.errors.length||n.halted?console.error(r):console.log(r),n}var I=Ie.Sap;I.version=Dr;I.refresh=function(){for(let e of rt)e.root.isConnected&&te.runNow(e,"refresh")};I.batch=pe;I.status=nt.status;I.report=nt.report;I.why=nt.why;I.debug=nt.debug;I.doctor=nt.doctor;I.greenLine=nt.greenLine;I.formats=At;I.serializeControlToAttributes=lt;I.finalizeControlForSave=fe;I.rehydrateControlFromAttributes=Ct;I.mount=Oe;I.config=function(e={}){return e.formats&&Object.assign(At,e.formats),I};I._registry=J;I._reset=function(){J.clear(),rt.length=0,ye()};function Br(){if(typeof document>"u")return;let t=()=>le(()=>qt());document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}Br();typeof window<"u"&&(window.Sap=I);var qr=I;return He(zr);})();
9
+ `+e.value:e.value;t.textContent!==r&&(t.textContent=r),t.removeAttribute("data-value");return}if(n==="SELECT"){let r=t.options,i=e.options;for(let s=0;s<r.length;s++)i[s]&&i[s].selected?r[s].hasAttribute("selected")||r[s].setAttribute("selected",""):r[s].removeAttribute("selected")}}function qt(t){t.tagName!=="TEXTAREA"||!t.hasAttribute("data-value")||t!==t.ownerDocument.activeElement&&(t.textContent=t.getAttribute("data-value"),t.removeAttribute("data-value"))}function X(t){if(typeof window>"u")return null;let e=window.clay,n=window.hyperclay;return t==="consent"?e?.confirm||n?.consent||null:e?.[t]||n?.[t]||null}var Zt=["clay:mutation-ready","hyperclay:mutation-ready"],wr=["clay:sync-applied","hyperclay:livesync-applied"],yr=["clay:ready","hyperclay:ready"],Ar=["clay:route"];function yt(t,e,n){let r=null,i=s=>{r!==null&&r!==s.type||(r=s.type,queueMicrotask(()=>{r=null}),n(s))};for(let s of e)t.addEventListener(s,i);return()=>{for(let s of e)t.removeEventListener(s,i)}}function Se(t){let e=typeof window<"u"&&window.clay&&window.clay.ready;e&&typeof e.then=="function"?e.then(()=>t(),()=>t()):t()}function Vt(t){let e=X("region");return!e||typeof e.resolveRegionPolicy!="function"||typeof e.skipForPolicy!="function"?!1:e.skipForPolicy(e.resolveRegionPolicy(t),void 0,["no-save","freeze"])}function xe(){let t=X("consent");return typeof t=="function"?t:null}function ke(t,e){if(typeof e!="function")throw new Error("Sap.batch(label, fn): fn must be a function");let n=X("undo");n&&n.flush&&n.flush();let r=e();if(r&&typeof r.then=="function")throw new Error("Sap.batch fn must be synchronous (it returned a promise)");return n&&n.commitCaptured&&n.commitCaptured(t),r}function $e(t){if(typeof window>"u"||typeof document>"u")return;let e=()=>{let s=!1;for(let a of t.apps())a.root.isConnected?t.runNow(a,"platform"):s=!0;s&&(t.pruneDisconnected(),t.remountIfPresent())};yt(document,wr,e),yt(document,Ar,e);let n=!1,r=()=>{},i=()=>{if(n)return!0;let s=X("undo");if(!s||typeof s.on!="function")return!1;let a=s.on("undo",e);return typeof a!="function"?!1:typeof s.on("redo",e)!="function"?(a(),!1):(n=!0,r(),!0)};if(!i()){let s=yt(document,Zt,i),a=yt(document,yr,i);r=()=>{s(),a()};let R=X("ready");R&&typeof R.then=="function"&&R.then(i,()=>{})}}function Er(t){let e=t.tagName;if(e==="INPUT"){let n=(t.getAttribute("type")||"text").toLowerCase();return n==="checkbox"?"checkbox":n==="radio"?"radio":n==="number"||n==="range"?"number":n==="hidden"?"hidden":"text"}return e==="TEXTAREA"?"text":e==="SELECT"?t.multiple?"select-multiple":"select-one":"leaf"}function vr(t){if(t.validity&&t.validity.badInput)return t.hasAttribute("value")?Number(t.getAttribute("value"))||0:t._sapLastGood??0;if(t.value==="")return 0;let e=Number(t.value);return Number.isNaN(e)?t._sapLastGood??0:(t._sapLastGood=e,e)}function Sr(t,e){switch(e){case"checkbox":return t.checked;case"radio":return t.checked?t.value:void 0;case"number":return vr(t);case"select-one":return t.value;case"select-multiple":return[...t.selectedOptions].map(n=>n.value);case"hidden":case"text":return t.value;case"leaf":return t.textContent;default:return t.value}}function xr(t,e,n){switch(e){case"checkbox":t.checked=!!n;break;case"radio":t.checked=String(t.value)===String(n);break;case"number":case"text":case"hidden":t.value=n==null?"":String(n);break;case"select-one":t.value=n==null?"":String(n);break;case"select-multiple":{let r=new Set((Array.isArray(n)?n:[n]).map(String));for(let i of t.options)i.selected=r.has(i.value);break}case"leaf":t.textContent=n==null?"":String(n);break;default:t.value=n==null?"":String(n)}}function _e(t){if(t.hasAttribute("transient")){t.removeAttribute("value"),t.removeAttribute("checked"),t.removeAttribute("data-value");return}Vt(t)||wt(t)}function kr(t){t.dispatchEvent(new Event("input",{bubbles:!0})),t.dispatchEvent(new Event("change",{bubbles:!0}))}function P(t){let e=Er(t);return{el:t,kind:e,read(){return Sr(t,e)},write(n,r={}){xr(t,e,n),r.noMirror||_e(t),r.silent||kr(t)},mirror(){_e(t)}}}var ot=null,Ht=!1,At=null;function Te(t){let e=null;return{kind:"hub",subscribe(n){let r=t.onAnyChange({debounce:0,require:"observed"},n);typeof r=="function"&&(e=r)},suppress(n){t.pause();try{return n()}finally{t.resume()}},teardown(){if(e){try{e()}catch{}e=null}}}}function $r(){let t=null;return{kind:"native",subscribe(e){t=new MutationObserver(r=>e(_r(r)));let n=typeof document<"u"&&document.body||typeof document<"u"&&document.documentElement;n&&t.observe(n,{childList:!0,subtree:!0,attributes:!0,characterData:!0})},suppress(e){let n=X("undo");n&&n.pause&&n.pause();try{return e()}finally{t&&t.takeRecords(),n&&n.resume&&n.resume()}},teardown(){t&&(t.disconnect(),t=null)}}}function _r(t){let e=[];for(let n of t)if(n.type==="attributes"){let r=n.target;r&&r.nodeType===1&&!zt(r)&&e.push({type:"attribute",element:r})}else if(n.type==="characterData"){let r=n.target&&n.target.parentElement;r&&!zt(r)&&e.push({type:"characterData",element:r})}else if(n.type==="childList"){for(let r of n.addedNodes)if(!(r.nodeType!==1||zt(r))&&(e.push({type:"add",element:r}),r.querySelectorAll))for(let i of r.querySelectorAll("*"))zt(i)||e.push({type:"add",element:i});for(let r of n.removedNodes)r.nodeType===1&&e.push({type:"remove",element:r,parent:n.target})}return e}function zt(t){return!!(t.closest&&t.closest("[sap-ignore],[template]"))}function Tr(t,e){t.pruneDisconnected();let n=new Set,r=!1;for(let i of e){let s=i.type==="remove"?i.parent:i.element,a=s&&t.appFor(s);a&&n.add(a),i.type==="add"&&i.element&&i.element.nodeType===1&&i.element.hasAttribute&&i.element.hasAttribute("sap")&&!(t.isRegistered&&t.isRegistered(i.element))&&(r=!0)}r&&t.remountIfPresent();for(let i of n)i.root.isConnected&&t.schedule(i,"mutation")}function Ne(t){if(ot)return ot.suppress(t);let e=X("undo");if(e&&e.pause&&e.resume){e.pause();try{return t()}finally{e.resume()}}return t()}function te(t,e){Ht=!0,ot=t,t.subscribe(n=>Tr(e,n))}function ee(t){if(Ht||typeof window>"u"||typeof document>"u")return;let e=X("Mutation");if(e&&typeof e.onAnyChange=="function"){te(Te(e),t);return}typeof MutationObserver=="function"&&(te($r(),t),At=yt(document,Zt,function(){let r=X("Mutation");r&&(At(),At=null,ot&&ot.teardown(),Ht=!1,te(Te(r),t))}))}function Le(){if(ot)try{ot.teardown()}catch{}At&&typeof document<"u"&&At(),ot=null,Ht=!1,At=null}var Nr=new Set(mt);function Et(t,e={}){if(e.breaker){t.diag.error("E26",t.root,{problem:"recompute loop halted after 50 passes; recent triggers: "+(t._breakerRing||[]).join(", ")}),ut(t.root,"loop");return}Ne(()=>Lr(t,e)),t._viewsChanged&&(t._viewsChanged=!1,t.root.dispatchEvent(new CustomEvent("sap:views-updated",{bubbles:!0})))}function Lr(t,e){let n=t.root,r={},i=[],s=[],a=[],R=[],k=[],A=[],f=[],w=new Set;t.diag.errors=[];let N={root:r,state:r,item:null,ownerEl:n,projection:!1};function I(o,p){let l=p.attr||p.name,g=o.getAttribute(l);return g==null&&(g=$t(p),k.push({el:o,name:p.name,attr:l,value:Jt(ct(g,p.type),p.type)})),ct(g,p.type)}function W(o,p){let l=z(o.getAttribute("state")||"");o._sapStateDecls=l;for(let g of l){if(g.transient){p[g.name]=Pt(o,g);continue}if(gt(o,g)){p[g.name]=o.hasAttribute(g.attr);continue}p[g.name]=I(o,g)}}function h(o,p){if(!o.hasAttribute("bind"))return;let l=o.getAttribute("bind"),g=p.item||p.state,L=P(o);L.kind==="radio"?(l in g||(g[l]=""),o.checked&&(g[l]=o.value)):g[l]=L.read(),o.hasAttribute("transient")&&(o.removeAttribute("value"),o.removeAttribute("checked"))}function d(o,p){for(let l of o.attributes){let g=l.name,L=l.value;if(g.startsWith("calc:"))i.push({owner:p.item||p.state,ownerEl:p.ownerEl,name:g.slice(5),entry:H(L),el:o,ctx:p});else if(g==="text"||g.startsWith("text:"))s.push({el:o,kind:"text",fmt:g.includes(":")?g.slice(5):null,entry:H(L),ctx:p});else if(g==="show")s.push({el:o,kind:"show",entry:H(L),ctx:p});else if(g.startsWith("attr:"))s.push({el:o,kind:"attr",arg:g.slice(5),entry:H(L),ctx:p});else if(g.startsWith("class:"))s.push({el:o,kind:"class",arg:g.slice(6),entry:H(L),ctx:p});else if(g.startsWith("css:"))s.push({el:o,kind:"css",arg:g.slice(4),entry:H(L),ctx:p});else if(g==="effect")a.push({el:o,entry:H(L,!0),ctx:p});else if(g==="invalid")R.push({el:o,entry:H(L),ctx:p});else if(g.startsWith("show-when:")||g.startsWith("option:")){let C=g.slice(g.indexOf(":")+1);w.add(C),s.push({el:o,kind:"when",match:"show",field:C,values:L.split("|"),ctx:p})}else if(g.startsWith("hide-when:")){let C=g.slice(g.indexOf(":")+1);w.add(C),s.push({el:o,kind:"when",match:"hide",field:C,values:L.split("|"),ctx:p})}else if(g.startsWith("option-not:")){let C=g.slice(g.indexOf(":")+1);w.add(C),s.push({el:o,kind:"when",match:"show-not",field:C,values:L.split("|"),ctx:p})}}if(o.hasAttribute("bind")&&(p.view||p.projection)&&!Ot(o)){let l=o.getAttribute("bind");p.view?bt(de(p.item),l)?(o._sapViewBind="item",s.push({el:o,kind:"projection",field:l,ctx:p,from:"item"})):l in p.state||l in p.root?(o._sapViewBind="drawn",s.push({el:o,kind:"projection",field:l,ctx:p,from:"drawn"})):(o._sapViewBind=null,t.diag.error("E43",o,{attr:"bind",expr:l,problem:`bind="${l}" inside an each row matches no field of the row's record or of the scope the row is drawn in`,fix:"bind a field the record owns (bind, state= or items= on the [item]), or declare it with state= where the list is drawn"})):s.push({el:o,kind:"projection",field:l,ctx:p})}}function m(o,p,l){Object.defineProperty(o,"$key",{value:Mt(p,"row"),enumerable:!1}),Object.defineProperty(o,"$index",{value:l,enumerable:!1}),Object.defineProperty(o,"$el",{value:p,enumerable:!1})}function y(o,p,l){W(o,p),o._sapScope=p,!l.projection&&o.hasAttribute("bind")&&h(o,l),d(o,l),o.hasAttribute("items")?$(o,p,l):E(o,p,l)}function E(o,p,l){K(o,(g,L)=>{L?g.hasAttribute("scope")?x(g,p,l):g.hasAttribute("items")?(d(g,l),$(g,p,l)):g.hasAttribute("detail")?B(g,p,l):g.hasAttribute("each")&&(d(g,l),f.push({el:g,ctx:l})):(!l.projection&&!l.view&&h(g,l),d(g,l))})}function x(o,p,l){let g=o.getAttribute("scope"),L={};p[g]=L;let C={root:l.root,state:L,item:null,ownerEl:o,projection:l.projection};y(o,L,C)}function $(o,p,l){let g=o.getAttribute("items"),L=[];p[g]=L,o._sapList=L,Z(o).forEach((C,Q)=>{let q={};m(q,C,Q);let rt={root:l.root,state:l.state,item:q,ownerEl:C,projection:l.projection};y(C,q,rt),L.push(q)})}function O(o,p){let l=String(o).split("."),g=C=>{for(let Q of l){if(C==null)return;C=Array.isArray(C)?C.flatMap(q=>q&&q[Q]!=null?q[Q]:[]):C[Q]}return C},L=g(p.state);return L===void 0?g(p.root):L}function B(o,p,l){for(let g of z(o.getAttribute("state")||""))g.name in p||(p[g.name]=gt(o,g)?o.hasAttribute(g.attr):I(o,g));A.push({el:o,parentObj:p,ctx:l})}function c(o,p,l){o._sapScope=p;let g=o.getAttribute("detail")||"",L=/^([\w.]+)\s+by\s+(.+)$/.exec(g);if(!L){o.hidden=!0,o._sapDetailRow=null;return}let C=L[1],Q=L[2].trim(),q=O(C,l),rt;try{rt=J(H(Q),{state:p,item:l.item,el:o,root:l.root})}catch{rt=void 0}let U=Array.isArray(q)&&rt!=null?q.find(V=>V&&typeof V=="object"&&V.$el&&String(V.$key)===String(rt)):null;if(o._sapDetailRow=U?U.$el:null,o.tagName==="DIALOG"){let V=U?String(U.$key):null;if(V!==o._sapDetailKey&&(o._sapDetailKey=V,o._sapDismissed=!1),!U){o._sapOpenedFor=null,o.open&&typeof o.close=="function"&&(o._sapEngineClose=!0,o.close());return}o.open?o._sapOpenedFor=V:(o._sapOpenedFor===V&&(o._sapDismissed=!0),o._sapOpenedFor=null,!o._sapDismissed&&o.isConnected&&typeof o.showModal=="function"&&(o.hidden&&(o.hidden=!1),o.showModal(),o._sapOpenedFor=V))}else{if(!U){o.hidden||(o.hidden=!0);return}o.hidden&&(o.hidden=!1)}let at={root:l.root,state:p,item:U,ownerEl:U.$el,projection:!0};d(o,at),E(o,U,at)}function u(o,p){for(let l=o.parentElement;l;l=l.parentElement)if(l._sapScope===p&&!l.hasAttribute("detail")||l.hasAttribute("sap"))return l;return n}function b(o,p){o._sapDrawnEl=u(o,p.state);let l=[...o.children].find(j=>j.tagName==="TEMPLATE"),g=l&&l.content.children.length===1?l.content.firstElementChild:null;if(!g)return t.diag.error("E42",o,{attr:"each",problem:"each needs one <template> child with exactly one element root"}),0;let L=o.getAttribute("each"),C;try{C=J(H(L),{state:p.state,item:p.item,el:o,root:p.root})}catch(j){return t.diag.error("E24",o,{attr:"each",expr:L,problem:String(j.message)}),0}if(!Array.isArray(C))return t.diag.error("E40",o,{attr:"each",expr:L,problem:"each must evaluate to an array; the list keeps its last good rows"}),0;let Q=H(o.getAttribute("key")||"item.$key"),q=[],rt=new Set;for(let j of C){let G;try{G=J(Q,{state:p.state,item:j,el:o,root:p.root})}catch{G=void 0}let M=G==null?"":String(G);if(M===""||rt.has(M))return t.diag.error("E41",o,{attr:"key",expr:Q.src,problem:M===""?"an item has no key; the list keeps its last good rows":`duplicate key "${M}"; the list keeps its last good rows`}),0;rt.add(M),q.push(M)}let U=o._sapEach||new Map,at=new Map,V=0,Gt=l;q.forEach((j,G)=>{let M=U.get(j);if(!M||M.parentElement!==o){M=o.ownerDocument.importNode(g,!0);let vt=(M.getAttribute("clay")||"").split(/\s+/).filter(Boolean);vt.includes("editor-ui")||M.setAttribute("clay",[...vt,"editor-ui"].join(" ")),M._sapEachRow=!0,V++}M.getAttribute("data-key")!==j&&M.setAttribute("data-key",j),Gt.nextElementSibling!==M&&(Ir(o,M,Gt),V++),M._sapEachItem=C[G],at.set(j,M),Gt=M});for(let[j,G]of U)at.get(j)!==G&&G.parentElement===o&&(G.remove(),V++);return o._sapEach=at,q.forEach((j,G)=>{let M=at.get(j),vt={root:p.root,state:p.state,item:C[G],ownerEl:M,projection:!1,view:!0};d(M,vt),E(M,{},vt)}),V}y(n,r,N);for(let o=0;o<A.length;o++){let{el:p,parentObj:l,ctx:g}=A[o];c(p,l,g)}if(k.length&&w.size)for(let o of k)w.has(o.attr)&&o.el.getAttribute(o.attr)==null&&o.el.setAttribute(o.attr,o.value);let v=new Map;for(let o of i){let p=v.get(o.owner);p||(p={ownerEl:o.ownerEl,list:[]},v.set(o.owner,p)),p.list.push(o)}let S=[...v.values()].sort((o,p)=>Ce(p.ownerEl)-Ce(o.ownerEl));for(let o of S){let p;try{p=Ae(o.list)}catch(l){t.diag.error("E07",o.list[0].el,{problem:l.message}),p=o.list}for(let l of p)try{l.owner[l.name]=J(l.entry,{state:l.ctx.state,item:l.ctx.item,el:l.el,root:l.ctx.root}),Ct(l.el)}catch(g){l.owner[l.name]=void 0,t.diag.error("E24",l.el,{attr:"calc:"+l.name,expr:l.entry.src,problem:String(g.message)}),ut(l.el,g.sapCode||"E24")}}let _=0;for(let o=0;o<f.length;o++)_+=b(f[o].el,f[o].ctx);let T=0,D=_;for(let o of s){let p=Dr(o,t);o.ctx.view?D+=p:T+=p}for(let o of a)Cr(o,t);for(let o of R)Mr(o);t._state=r,t._stats={fields:Object.keys(r).filter(o=>typeof r[o]!="function").length,calcs:i.length,paints:s.length,lists:v.size,writes:T,viewWrites:D},t._viewsChanged=D>0,t._lastPass={trigger:e.trigger||"refresh",writes:T},t._debug&&console.log(`sap pass \xB7 trigger: ${t._lastPass.trigger} \xB7 writes ${T}/${s.length}`)}function Rr(t){return t.kind==="text"?t.fmt?"text:"+t.fmt:"text":t.kind==="attr"?"attr:"+t.arg:t.kind==="class"?"class:"+t.arg:t.kind==="css"?"css:"+t.arg:t.kind==="when"?(t.match==="hide"?"hide-when:":t.match==="show-not"?"option-not:":"show-when:")+t.field:t.kind}function re(t,e,n,r){let i=t;for(;i&&i.nodeType===1;){if(i.hasAttribute&&i.hasAttribute(e)){let s=n.includes(i.getAttribute(e));if(r?!s:s)return!0}i=i.parentElement}return!1}function Re(t,e){if(t===t.ownerDocument.activeElement)return 0;if(t.type==="radio"){let s=e!=null&&String(t.value)===String(e);return t.checked===s?0:(t.checked=s,1)}let n=P(t),r=n.read(),i=e??"";return String(r)!==String(i)?(n.write(i,{silent:!0}),1):0}function Dr(t,e){if(t.kind==="projection"){if(t.from==="drawn"){let r=t.field in t.ctx.state?t.ctx.state:t.ctx.root;return Re(t.el,r[t.field])}return Re(t.el,t.ctx.item?t.ctx.item[t.field]:"")}if(t.kind==="when")return De(t,null);let n={state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root};try{let r=J(t.entry,n),i=De(t,r);return Ct(t.el),i}catch(r){return e.diag.error(r.sapCode==="E22"?"E22":"E24",t.el,{attr:Rr(t),expr:t.entry&&t.entry.src,problem:String(r.message)}),ut(t.el,r.sapCode||"E24"),0}}function De(t,e){let n=t.el;switch(t.kind){case"text":{let r=t.fmt!=null?be(t.fmt,e):e==null?"":String(e);return n.textContent!==r?(n.textContent=r,1):0}case"show":{let r=!e;return n.hidden!==r?(n.hidden=r,1):0}case"when":{let r=X("optionVisibility");if(r&&r._started)return n._sapWhen&&n.hidden?(n.hidden=!1,n._sapWhen=!1,1):0;let i;t.match==="hide"?i=!re(n,t.field,t.values,!1):t.match==="show-not"?i=re(n,t.field,t.values,!0):i=re(n,t.field,t.values,!1),n._sapWhen=!0;let s=!i;return n.hidden!==s?(n.hidden=s,1):0}case"attr":{let r=t.arg;if((r==="checked"||r==="selected")&&typeof n[r]=="boolean"&&!n.hasAttribute("bind")&&!n.closest("select[bind]")){let s=0;return n[r]!==!!e&&(n[r]=!!e,s=1),!!e!==n.hasAttribute(r)&&(e?n.setAttribute(r,""):n.removeAttribute(r),s=1),s}if(Nr.has(r)){let s=n.hasAttribute(r);return e&&!s?(n.setAttribute(r,""),1):!e&&s?(n.removeAttribute(r),1):0}let i=typeof e=="boolean"?String(e):e==null?"":String(e);return n.getAttribute(r)!==i?(n.setAttribute(r,i),1):0}case"class":{let r=!!e;return n.classList.contains(t.arg)!==r?(n.classList.toggle(t.arg,r),1):0}case"css":{let r=e==null?"":String(e);return n.style.getPropertyValue("--"+t.arg)!==r?(n.style.setProperty("--"+t.arg,r),1):0}default:return 0}}function Cr(t,e){try{J(t.entry,{state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root}),Ct(t.el)}catch(n){e.diag.error("E24",t.el,{attr:"effect",expr:t.entry&&t.entry.src,problem:String(n.message)}),ut(t.el,"E24")}}function Mr(t){let e="";try{let n=J(t.entry,{state:t.ctx.state,item:t.ctx.item,el:t.el,root:t.ctx.root});e=typeof n=="string"?n:""}catch{e=""}typeof t.el.setCustomValidity=="function"&&t.el.setCustomValidity(e)}function Ce(t){let e=0,n=t;for(;n&&!(n.hasAttribute&&n.hasAttribute("sap"));)n=n.parentElement,e++;return e}function Ir(t,e,n){let r=n.nextSibling;if(e.isConnected&&t.moveBefore)try{t.moveBefore(e,r);return}catch{}t.insertBefore(e,r)}var Or=new Set(mt),Me=new Set(["calc","text","attr","class","css","set","move","sort","option","option-not","show-when","hide-when","editmode"]),Fr=new Set(["show-when","hide-when","option","option-not"]),Pr=/\b(?:state|item|root)\.|===|!==|&&|\|\||[()]|^\s*!/,Ie=new Set(["sap","scope","items","item","template","bind","show","effect","invalid","detail","state","transient","confirm","default","persist","sortable","trigger-add","trigger-remove","trigger-reset","sap-ignore","sap-error","no-save","no-watch","no-undo","no-trigger-autosave","freeze","mutations-ignore","save-remove","save-ignore","save-freeze"]);function Wr(t){return t.tagName==="INPUT"||t.tagName==="SELECT"||t.tagName==="TEXTAREA"}function ne(t){return t.hasAttribute("bind")}function Br(t,e){e(t);for(let r of t.children)n(r);function n(r){if(r.nodeType===1&&!r.hasAttribute("sap-ignore")){if(r.tagName==="TEMPLATE"){if(r.hasAttribute("items"))for(let i of r.content.children)n(i);return}e(r);for(let i of r.children)n(i)}}}function jt(t,e){let n=!1,r=(a,R,k)=>{e.error(a,R,k),n=!0},i=t.ownerDocument.createTreeWalker(t,4),s;for(;s=i.nextNode();)if(/\{\{.*\}\}/.test(s.nodeValue||"")){r("E02",s.parentElement||t,{problem:"moustaches in text content are not a Sap feature",fix:'move the expression onto the element: text="state.x"'});break}return Br(t,a=>{let R=a.closest&&a.closest("[detail]");for(let k of[...a.attributes]){let A=k.name,f=ce(A);if(f){r("E01",a,{attr:A,expr:k.value,problem:`"${A}" is a foreign-dialect attribute; Sap has no ${A.split(/[:=]/)[0]} directive`,fix:f+" \u2014 or wrap the subtree in sap-ignore if intentional"});continue}if(A.includes(":")){let N=A.slice(0,A.indexOf(":"));if(Me.has(N)){if(Fr.has(N)&&Pr.test(k.value)){let I=A.slice(A.indexOf(":")+1);e.warn("W04",a,{attr:A,expr:k.value,problem:`${N}: compares the "${I}" attribute against a literal value, not a JS expression`,fix:`use show="${k.value}" for an expression, or a literal like ${N}:${I}="overview"`})}}else{let I=xt(N,[...Me]);e.warn("W03",a,{attr:A,problem:`unknown "${N}:" attribute`,didYouMean:I?`${I}:`:null})}}else if(!Ie.has(A)&&!St.has(A)&&!Or.has(A)&&!/^(data-|aria-|on)/.test(A)&&!(A in a)){let N=xt(A,[...Ie]);N&&e.warn("W03",a,{attr:A,problem:`unknown "${A}" attribute`,didYouMean:N})}A==="attr:hidden"&&e.warn("W03",a,{attr:A,problem:"attr:hidden paints the wrong attribute",fix:'use show="expr"'});let w=ne(a)||A==="attr:selected"&&a.tagName==="OPTION"&&!!a.closest("select[bind]");(A==="attr:value"||A==="attr:checked"||A==="attr:selected")&&w&&r("E30",a,{attr:A,problem:"attr: on a bound control collides with persist ownership",fix:"remove it; bind owns this attribute"}),A==="effect"&&ne(a)&&/\b(value|checked)\s*=[^=]/.test(k.value)&&r("E30",a,{attr:A,expr:k.value,problem:"effect writes value/checked on a bound control (writes a stale value with no synthetic event)",fix:"write through onclick + Sap(this) instead"}),(A==="text"||A.startsWith("text:")||A==="show")&&Wr(a)&&(A==="show"||r("E18",a,{attr:A,problem:"paint belongs on output elements, not form controls",fix:"move the paint to an <output> or <span>"}))}if(a.hasAttribute("state")){let k=z(a.getAttribute("state")),A=new Set;for(let f of k){f.name.includes("-")&&r("E08",a,{attr:"state",problem:`field "${f.name}" is not a valid identifier (the hyphen parses as subtraction)`,fix:`rename to ${f.name.replace(/-/g,"")}`}),A.has(f.name)&&r("E04",a,{attr:"state",problem:`field "${f.name}" is declared twice in one scope`}),A.add(f.name),Rt.has(f.attr)&&r("E05",a,{attr:"state",problem:`"${f.name}" is a reserved Sap word`}),St.has(f.attr)&&r("E06",a,{attr:"state",problem:`"${f.name}" is a global HTML attribute name; pick another field name`}),f.name==="open"&&a.tagName==="DIALOG"&&r("E33",a,{attr:"state",problem:"dialog open is transient",fix:"use showModal() \u2014 declare state= only on <details> or popovers"});let w=Qt(a,f.attr);w&&(f.attr==="checked"||f.attr==="selected")&&r("E35",a,{attr:"state",problem:`"${f.attr}" on a form control is the control's own state, not a declared field`,fix:'bind the control instead, e.g. <input type="checkbox" bind="done">'}),w&&f.type==="num"&&r("E35",a,{attr:"state",problem:`"${f.attr}" is an HTML boolean attribute; it cannot hold a number`,fix:`declare it bare: state="${f.attr}"`}),f.transient&&(w||f.type==="presence")&&r("E35",a,{attr:"state",problem:`"${f.name}" is carried by attribute presence, which transient would strip`,fix:"declare a separate name:bool:transient field and paint the attribute from it"})}}if(ne(a)){if(a.hasAttribute("-"),a.tagName==="INPUT"){let k=(a.getAttribute("type")||"text").toLowerCase();k==="file"&&r("E32",a,{attr:"bind",problem:"files never serialize into an HTML file",fix:"use no-save + effect instead of bind"}),k==="password"&&!a.hasAttribute("transient")&&r("E31",a,{attr:"bind",problem:"a password must never serialize into a world-readable file",fix:"add transient to the password input"})}else if(a.tagName!=="SELECT"&&a.tagName!=="TEXTAREA"){let k=a.getAttribute("contenteditable");!(k!=null&&k!=="false")&&a.children.length>0&&r("E20",a,{attr:"bind",problem:"bind on a container element is not a control; a write would overwrite its children",fix:"bind a control (input/select/textarea), a contenteditable, or an empty text leaf"})}}if(a.hasAttribute("transient")&&a.hasAttribute("persist")&&r("E34",a,{problem:"transient and persist are opposite: persist forces the live value into the saved bytes, leaking exactly what transient drops",fix:"remove one \u2014 transient to keep it out of the file, or persist to save it"}),a.tagName==="DIALOG"&&a.hasAttribute("detail")&&!(a.parentElement&&a.parentElement.closest('[clay~="freeze"], [freeze], [save-freeze]'))&&e.warn("W31",a,{attr:"detail",problem:"a detail dialog writes open when it opens, and that attribute would be saved into the file",fix:'wrap the dialog in an element with clay="freeze" (not editor-ui, which removes it from the file), and make its key field transient'}),a.hasAttribute("item")&&!a.hasAttribute("template")&&a.parentNode&&a.parentNode.nodeType===1){let k=a.parentElement;(!k||!k.hasAttribute("items"))&&r("E10",a,{problem:"an [item] must be a direct child of an [items] list",fix:'wrap it in a container with items="name"'})}if(a.hasAttribute("items")&&R&&r("E17",a,{attr:"items",problem:"nested items inside a detail panel is a v1 mount error (nested collections ship in v1.1)"}),a.hasAttribute("items")){let k=t.querySelector(`[trigger-add="${a.getAttribute("items")}"]`);!Ft(a)&&!Kt(t,a.getAttribute("items"))&&Z(a).length===0&&k&&r("E17",a,{attr:"items",problem:`trigger-add targets items="${a.getAttribute("items")}" but it has no [item template] to clone`})}}),n&&(e.halted=!0,e.haltReason=e.errors[0]?e.errors[0].code:"halt",ut(t,e.haltReason)),!n}var Oe="sap-styles",Fe="[item][template]{display:none!important}[hidden]{display:none!important}[sap-error]{outline:2px solid #e5484d;outline-offset:1px}",oe=new WeakSet;function qr(t){if(oe.has(t))return;let e=t.defaultView,n=e&&e.CSSStyleSheet;if(n&&"adoptedStyleSheets"in t)try{let r=new n;r.replaceSync(Fe),t.adoptedStyleSheets=[...t.adoptedStyleSheets,r],oe.add(t);return}catch{}if(!t.getElementById(Oe)){let r=t.createElement("style");r.id=Oe,r.textContent=Fe,(t.head||t.documentElement).appendChild(r)}oe.add(t)}var Vr=0;function Pe(){return typeof performance<"u"&&performance.now?performance.now():0}function ie(t){let e=t.id||t.getAttribute("sap")||`app-${Vr++}`,n=new pt(e),r={root:t,name:e,diag:n,_state:null,_stats:null,_lastPass:null,_passes:0,_broken:!1,_mountMs:0,_mountWrites:0};if(!jt(t,n))return r.halted=!0,r;qr(t.ownerDocument);for(let a of t.querySelectorAll("textarea[data-value]"))qt(a);let s=Pe();return Et(r,{trigger:"mount"}),r._mountMs=Pe()-s,r._mountWrites=r._stats?r._stats.writes:0,r._mountWrites>0&&n.warn("W30",t,{problem:`${r._mountWrites} paint(s) ran at mount; the saved file was out of sync with its declared state`,fix:"re-save once so the file mounts clean (a settled file writes nothing)"}),r}var zr=["for","form","list","headers","popovertarget","commandfor","anchor","aria-activedescendant","aria-controls","aria-describedby","aria-details","aria-errormessage","aria-flowto","aria-labelledby","aria-owns"];function Hr(t,e){let n=null;return K(t,r=>{!n&&r.getAttribute("scope")===e&&(n=r)}),n}function We(t,e,n){let r=Y(t)||e;for(;r;){for(let i of z(r.getAttribute("state")||""))if(i.name===n)return{el:r,decl:i};if(r.hasAttribute("sap"))break;r=Y(r.parentElement)}return null}function jr(t){return typeof t=="number"?"num":typeof t=="boolean"?"bool":"string"}function Be(t){function e(h){let d=t.appFor(h);if(!d)return null;let m=ft(h),y=m&&m._sapEachItem&&m._sapEachItem.$el;if(y&&y.isConnected)return{ctxEl:y,appRec:d,isRow:!0};let E=kt(h);if(E)return E._sapDetailRow?{ctxEl:E._sapDetailRow,appRec:d,isRow:!0}:{ctxEl:Y(E.parentElement)||d.root,appRec:d,isRow:!1};let x=It(h);if(x&&x.hasAttribute("item"))return{ctxEl:x,appRec:d,isRow:!0};let $=Y(h)||d.root;return{ctxEl:$,appRec:d,isRow:$.hasAttribute("item")}}function n(h){let d=typeof h=="string"?document.querySelector(h):h;if(!d||d.nodeType!==1)return null;let m=e(d);return m?W(m.ctxEl,m.appRec,m.isRow):null}function r(h,d){let m=ft(h);if(!m)return n(h);let y=t.appFor(h),E=m._sapEachItem&&m._sapEachItem.$el;if(E&&E.nodeType===1&&E.hasAttribute("item")&&bt(E,d))return E.isConnected?W(E,y,!0):null;let x=m.parentElement&&m.parentElement._sapDrawnEl;return!x||!x.isConnected?null:W(x,y,x.hasAttribute("item"))}function i(h,d,m){let y=lt(h,m);if(y)return P(y).read();let E=ht(h,m);if(E)return Z(E).map(B=>W(B,d,!0));let x=Hr(h,m);if(x)return W(x,d,!1);let $=We(h,d.root,m);if($)return $.decl.transient?Pt($.el,$.decl):pe($.el,$.decl);let O=h._sapScope;return O?O[m]:void 0}function s(h,d,m,y,E){y.transient?Tt(h,y,m):_t(h,y,m),t.schedule(E,"set:"+d)}function a(h,d){let m=new Set,y=Y(h)||d;for(;y;){for(let E of z(y.getAttribute("state")||""))m.add(E.name);if(y.hasAttribute("sap"))break;y=Y(y.parentElement)}return K(h,E=>{let x=E.getAttribute("bind");x&&m.add(x)}),m}function R(h,d,m,y){let E=lt(h,m);if(E){P(E).write(y);return}let x=h;for(;x;){for(let S of x.attributes)if(S.name==="calc:"+m){d.diag.error("E16",x,{attr:"calc:"+m,problem:`"${m}" is a computed field; computed fields are read-only`});return}if(x.hasAttribute("sap"))break;x=x.parentElement}let $=We(h,d.root,m);if($){s($.el,m,y,$.decl,d);return}let O=a(h,d.root);O.delete(m);let B=m.length>=4?xt(m,[...O]):null;if(B){d.diag.error("E12",h,{key:m,problem:`unknown state key "${m}"`,didYouMean:B});return}if(Rt.has(m)||St.has(m)){d.diag.error("E15",h,{key:m,problem:`cannot write undeclared field "${m}" \u2014 it is a reserved/global name and cannot become state`,fix:"pick a different field name, or declare it explicitly in a state= attribute"});return}let c=d.root,u=jr(y),b=c.getAttribute("state")||"",v=u==="string"?m:`${m}:${u}`;c.setAttribute("state",b?`${b} ${v}`:v),s(c,m,y,{name:m,attr:m,type:u,transient:!1},d)}function k(h){let d=h.ownerDocument,m=new Map,y=(E,x)=>{let $=le(d),O=E.getAttribute(x);O&&x==="id"&&m.set(O,$),E.setAttribute(x,$)};h.querySelectorAll("[id]").forEach(E=>y(E,"id")),h.querySelectorAll("[data-id]").forEach(E=>y(E,"data-id")),h.querySelectorAll("[sap-error]").forEach(E=>E.removeAttribute("sap-error")),h.removeAttribute("sap-error"),h.hasAttribute("data-id")?(h.removeAttribute("id"),y(h,"data-id")):y(h,"id");for(let E of[h,...h.querySelectorAll("*")])for(let x of zr){let $=E.getAttribute(x);if($==null)continue;let O=$.split(/\s+/).map(B=>m.get(B)||B).join(" ");O!==$&&E.setAttribute(x,O)}}function A(h,d,m){let y=Nt(d.root,h,m);if(!y)return d.diag.error("E17",h,{problem:`cannot resolve a list named "${m}" from here`}),null;let E=Ft(y);if(!E)return d.diag.error("E17",y,{problem:`items="${m}" has no [item template] to clone`}),null;let x=y.ownerDocument.importNode(E,!0);return x.removeAttribute("template"),k(x),y.appendChild(x),t.schedule(d,"trigger-add:"+m),W(x,d,!0)}function f(h,d){K(h,m=>{if(m.hasAttribute("bind")){let y=P(m),E=m.getAttribute("default");y.kind==="checkbox"||y.kind==="radio"?y.write(E!=null?E===""||E==="true"||m.value===E:m.hasAttribute("checked")):y.write(E??(m.getAttribute("value")||""))}});for(let m of z(h.getAttribute("state")||"")){let y=me(h,m);m.transient?Tt(h,m,y):_t(h,m,y)}t.schedule(d,"trigger-reset")}function w(h,d){if(!h.isConnected)throw new Error("stale row handle: $remove() on a removed row");h.remove(),t.schedule(d,"trigger-remove")}function N(h,d,m){if(!h.isConnected)throw new Error("stale row handle: $move() on a removed row");let y=null;if(m&&m.nodeType===1?y=m:typeof m=="string"&&(y=Nt(d.root,h,m)),!y){d.diag.error("E17",h,{problem:`$move() cannot resolve target "${m}"`});return}t.moveInto(y,h),t.schedule(d,"trigger-move")}function I(h){let d=h.parentElement;return d?Z(d).indexOf(h):-1}function W(h,d,m){let y={get $el(){return h},get $key(){return Mt(h,m?"row":"scope")},get $index(){return I(h)},$add(x){return A(h,d,x)},$reset(){return f(h,d),E},$remove(){w(h,d)},$move(x){N(h,d,x)},get $appRec(){return d}},E=new Proxy(y,{get(x,$){return typeof $=="symbol"||$[0]==="$"?x[$]:i(h,d,$)},set(x,$,O){return typeof $=="string"&&$[0]==="$"?(x[$]=O,!0):(R(h,d,$,O),!0)},has(x,$){return typeof $=="string"&&$[0]==="$"?$ in x:i(h,d,$)!==void 0}});return E}return{Sap:n,contextElFor:e,readField:i,writeField:R,makeProxy:W,writeTargetFor:r}}var Ur=["trigger-add","trigger-remove","trigger-reset"];function Gr(t){if(t.nodeType!==1)return!1;for(let e of t.attributes){let n=e.name;if(n.startsWith("set:")||n.startsWith("move:")||n.startsWith("sort:")||Ur.includes(n))return!0}return!1}function Yr(t,e){let n=t,r=e.parentElement;for(;n&&n!==r;){if(n.nodeType===1&&Gr(n)&&!(n.tagName==="FORM"&&n.hasAttribute("trigger-add")))return n;n=n.parentElement}return null}function qe(t,e){let{Sap:n}=e;function r(c,u){let b=null,v=ft(c),S=kt(c);if(v)b=v._sapEachItem??null;else if(S&&S._sapDetailRow)b=S._sapDetailRow._sapScope||null;else{let D=It(c);D&&D.hasAttribute("item")&&(b=D._sapScope||null)}return{state:(Y(c)||u.root)._sapScope||u._state||{},item:b,el:c,root:u._state||{}}}function i(c,u,b){if(!c.hasAttribute("confirm")){b();return}let v=c.getAttribute("confirm"),S=v,_=H(v);if(!_.error)try{let o=J(_,r(c,u));(typeof o=="string"||typeof o=="number")&&(S=String(o))}catch{}let T=xe();if(!T){window.confirm(S)&&b();return}if(c._sapGatePending)return;c._sapGatePending=!0;let D=()=>{c._sapGatePending=!1};T(S,()=>{D(),b()}).catch(D)}function s(c,u){for(let b of c.attributes){if(!b.name.startsWith("set:"))continue;let v=b.name.slice(4),S=H(b.value);if(S.error){u.diag.error("E08",c,{attr:b.name,expr:b.value,problem:String(S.error.message)});continue}let _;try{_=J(S,r(c,u))}catch(D){u.diag.error("E24",c,{attr:b.name,expr:b.value,problem:String(D.message)});continue}let T=e.writeTargetFor(c,v);T&&(T[v]=_)}}function a(c){let u=ft(c);if(!u)return c.closest("[item]");let b=u._sapEachItem&&u._sapEachItem.$el;return b&&b.nodeType===1&&b.hasAttribute("item")?b:null}function R(c,u){let b=a(c);if(!b)return;let v=Z(b.parentElement),S=v.indexOf(b);u==="up"&&S>0?t.placeBefore(b,v[S-1]):u==="down"&&S<v.length-1&&t.placeBefore(v[S+1],b)}function k(c,u,b){if(u)return Nt(b.root,c,u);let v=c;for(;v;){if(v.hasAttribute&&v.hasAttribute("items"))return v;v=v.parentElement}let S=Y(c)||b.root,_=[];return K(S,T=>{T.hasAttribute("items")&&_.push(T)}),_[0]||null}function A(c,u){let b=c==null||c==="",v=u==null||u==="";if(b&&v)return 0;if(b)return 1;if(v)return-1;let S=Number(c),_=Number(u);return!Number.isNaN(S)&&!Number.isNaN(_)?S-_:String(c)<String(u)?-1:String(c)>String(u)?1:0}function f(c,u,b,v){let S=k(c,b,v);if(!S){v.diag.error("E17",c,{attr:"sort:"+u,problem:`no items list resolvable for sort:${u}`});return}let _=Z(S),T=l=>l._sapScope?l._sapScope[u]:void 0,D=[..._].sort((l,g)=>A(T(l),T(g))),p=D.every((l,g)=>l===_[g])?[...D].reverse():D;for(let l of p)t.moveInto(S,l);t.schedule(v,"sort:"+u)}function w(c){if(!c||c.hidden)return;let u=c.querySelector("[bind]:not([type=hidden]), [contenteditable]");u&&typeof u.focus=="function"&&u.focus()}function N(c,u){i(c,u,()=>{let b=n(c);for(let v of[...c.attributes]){let S=v.name;if(S==="trigger-remove")b&&b.$remove();else if(S==="trigger-reset")b&&b.$reset();else if(S==="trigger-add"){let _=b&&b.$add(v.value);_&&w(_.$el)}else S==="move:up"?(R(c,"up"),t.schedule(u,"move:up")):S==="move:down"?(R(c,"down"),t.schedule(u,"move:down")):S.startsWith("move:to")?b&&b.$move(v.value):S.startsWith("sort:")&&f(c,S.slice(5),v.value,u)}[...c.attributes].some(v=>v.name.startsWith("set:"))&&s(c,u)})}function I(c){let u=c.target;if(!u||u.nodeType!==1)return;let b=t.appFor(u);if(!b)return;let v=Yr(u,b.root);v&&N(v,b)}function W(c){let u=P(c),b=c.getAttribute("default");u.kind==="checkbox"?u.write(b===""||b==="true"):u.write(b??"")}function h(c,u,b){let v=n(c);if(!v)return;let S=v.$add(b);if(!S)return;let _=[];K(c,T=>{T.hasAttribute("bind")&&_.push(T)});for(let T of _){if(T.type==="radio"&&!T.checked)continue;let D=T.getAttribute("bind"),o=lt(S.$el,D);o?P(o).write(P(T).read()):bt(S.$el,D)&&(S[D]=P(T).read())}_.forEach(W),_.length?typeof _[0].focus=="function"&&_[0].focus():w(S.$el)}function d(c){let u=c.target;if(!u||!u.hasAttribute||!u.hasAttribute("trigger-add"))return;let b=t.appFor(u);b&&(c.preventDefault(),i(u,b,()=>h(u,b,u.getAttribute("trigger-add"))))}function m(c){let u=c.target,b=t.appFor(u);b&&setTimeout(()=>{u.querySelectorAll("[bind]").forEach(v=>{v.dispatchEvent(new Event("input",{bubbles:!0})),v.dispatchEvent(new Event("change",{bubbles:!0}))}),t.schedule(b,"reset")},0)}function y(c){let u=t.appFor(c.target);u&&t.schedule(u,"toggle")}function E(c){let u=c.target;if(!u||u.tagName!=="DIALOG"||!u.hasAttribute("detail"))return;if(u._sapEngineClose){u._sapEngineClose=!1;return}if(u.open)return;let b=/^[\w.]+\s+by\s+state\.(\w+)\s*$/.exec(u.getAttribute("detail")||""),v=t.appFor(u);if(!b||!v)return;let S=z(u.getAttribute("state")||"").find(T=>T.name===b[1]);if(S){S.transient?Tt(u,S,""):_t(u,S,""),t.schedule(v,"close");return}let _=n(u.parentElement);_&&_[b[1]]!==""&&(_[b[1]]="")}function x(c){let u=c.target;if(!u||u.nodeType!==1)return;let b=t.appFor(u);if(!b)return;u.hasAttribute("persist")&&!Vt(u)&&wt(u);let v=u.hasAttribute("bind")&&Ot(u);if(!v&&u.hasAttribute("bind")&&ft(u)){let _=u.getAttribute("bind"),T=u._sapViewBind?e.writeTargetFor(u,_):null;T&&(T[_]=P(u).read());return}let S=kt(u);if(S&&S._sapDetailRow&&u.hasAttribute("bind")&&!v){let _=S._sapDetailRow,T=u.getAttribute("bind"),D=lt(_,T);if(D&&D!==u){P(D).write(P(u).read());return}if(!D&&z(_.getAttribute("state")||"").some(o=>o.name===T)){e.writeField(_,b,T,P(u).read());return}}t.schedule(b,c.type+" "+(u.id||u.tagName.toLowerCase()))}function $(c){let u=c.detail||{};for(let b of[u.from,u.to,c.target]){if(!b||b.nodeType!==1)continue;let v=t.appFor(b);v&&t.schedule(v,"sorted")}}function O(c){if(c.key!=="ArrowUp"&&c.key!=="ArrowDown")return;let u=c.target;if(!u||u.nodeType!==1||u.tagName!=="INPUT"||!u.hasAttribute("bind")||!u.hasAttribute("step"))return;let b=(u.getAttribute("type")||"text").toLowerCase();if(b!=="text"&&b!=="tel"&&b!=="search"||!t.appFor(u))return;c.preventDefault();let S=tt(u.getAttribute("step"))||1,_=c.key==="ArrowUp"?1:-1,T=tt(u.value)+S*(c.shiftKey?10:1)*_,D=u.getAttribute("min"),o=u.getAttribute("max");D!==null&&D!==""&&T<tt(D)&&(T=tt(D)),o!==null&&o!==""&&T>tt(o)&&(T=tt(o)),P(u).write(String(Number(T.toFixed(2))))}function B(c=document){c.addEventListener("click",I),c.addEventListener("submit",d),c.addEventListener("reset",m),c.addEventListener("toggle",y,!0),c.addEventListener("close",E,!0),c.addEventListener("input",x),c.addEventListener("change",x),c.addEventListener("clay:sorted",$),c.addEventListener("keydown",O)}return{install:B}}var Ve=/^(set:|move:|sort:|trigger-add$|trigger-remove$|trigger-reset$)/;function se(t){return`${t.tagName.toLowerCase()}[sap]`}function Xr(t){let e=0;for(let n of t.querySelectorAll("*"))for(let r of n.attributes)if(Ve.test(r.name)){e++;break}for(let n of t.attributes)if(Ve.test(n.name)){e++;break}return e}function ze(t){let e=[],n=r=>{for(let i of r.attributes){let s=i.name;(s.startsWith("calc:")||s==="text"||s.startsWith("text:")||s==="show"||s.startsWith("attr:")||s.startsWith("class:")||s.startsWith("css:")||s==="effect"||s==="invalid"||s.startsWith("set:")||s==="detail")&&e.push({el:r,attr:s,src:i.value})}};n(t);for(let r of t.querySelectorAll("*"))n(r);return e}function He(t){function e(f){let w=f._stats||{},N=f.root;return{root:se(N),fields:w.fields||0,calcs:w.calcs||0,paints:w.paints||0,actions:Xr(N),lists:(N.hasAttribute("items")?1:0)+N.querySelectorAll("[items]").length,rows:N.querySelectorAll("[item]:not([template])").length,warnings:f.diag.warnings.length,errors:f.diag.errors.length,mountWrites:f._mountWrites||0,ms:Math.round((f._mountMs||0)*10)/10,passes:f._passes||0,lastPass:f._lastPass||null,ok:f.diag.errors.length===0&&!f.halted}}function n(){let f=t.apps().map(e);return{ok:f.every(w=>w.ok),apps:f}}function r(f){let w=e(f);return w.ok?`sap \u2713 ${w.root} \xB7 fields ${w.fields} \xB7 calcs ${w.calcs} \xB7 paints ${w.paints} \xB7 actions ${w.actions} \xB7 lists ${w.lists} \xB7 rows ${w.rows} \xB7 warnings ${w.warnings} \xB7 mount writes ${w.mountWrites} \xB7 ${w.ms}ms`:`sap \u2717 ${w.root} \xB7 errors ${w.errors} \xB7 warnings ${w.warnings} \xB7 ${w.ms}ms`}function i(){for(let f of t.apps()){let w=r(f);f.diag.errors.length||f.halted?console.error(w):console.log(w)}}function s(){let f=[],w=[];for(let N of t.apps())f.push(...N.diag.errors),w.push(...N.diag.warnings);return{ok:f.length===0,errors:f,warnings:w,counts:{errors:f.length,warnings:w.length}}}function a(f){return f?typeof f=="string"?document.querySelector(f):f.nodeType===1?f:null:null}function R(f,w){let N=a(f);if(!N)return console.warn("sap why: element not found"),null;let I=[`sap why <${N.tagName.toLowerCase()}> \u2014 ${Dt(N)}`],W=[...N.attributes].filter(d=>/^(bind|text|show|effect|invalid|detail|calc:|text:|attr:|class:|css:|set:|state|items|scope)/.test(d.name));for(let d of W)I.push(` ${d.name}="${d.value}"`);let h=N;for(;h&&!h._sapScope;)h=h.parentElement;if(h&&h._sapScope){let d=h._sapScope,m=w?[w]:Object.keys(d);I.push(" reads:");for(let y of m){let E=d[y];typeof E!="function"&&I.push(` ${y} = ${JSON.stringify(Array.isArray(E)?`[${E.length} rows]`:E)}`)}}return I.push(" serialization: textContent and value/checked attributes save with the file; reads live from properties"),console.log(I.join(`
10
+ `)),null}function k(f){let w=f===void 0?!0:!!f;for(let N of t.apps())N._debug=w;return console.log(`sap debug ${w?"on":"off"} \u2014 per-pass headers will ${w?"":"no longer "}log`),w}function A(){let f=[],w=0;for(let d of t.apps()){let m=d.root,y=se(m);w++;let E=new pt(d.name);jt(m,E);for(let c of E.errors)f.push({code:c.code,severity:"error",message:`${y}: ${c.code} ${c.slug} at ${c.el}`});for(let c of E.warnings)f.push({code:c.code,severity:"warn",message:`${y}: ${c.code} ${c.slug} at ${c.el}`});w++,Et(d,{trigger:"doctor-dryrun"});let x=d._stats?d._stats.writes:0;x>0&&f.push({code:"W30",severity:"warn",message:`${y}: dry recompute wrote ${x} cells on a quiet page; an element is stale or non-idempotent`}),w++;let $=ze(m).map(c=>c.src).join(" \0 "),O=[];for(let c of[m,...m.querySelectorAll("[state]")])for(let u of z(c.getAttribute("state")||""))O.push(u.name);for(let c of O)new RegExp(`(state|item)\\.${c}\\b`).test($)||f.push({code:"I33",severity:"info",message:`${y}: field "${c}" is declared but read nowhere (dead state)`});w++;let B=new Map;for(let c of m.querySelectorAll("[id]"))B.set(c.id,(B.get(c.id)||0)+1);for(let[c,u]of B)u>1&&f.push({code:"W32",severity:"warn",message:`${y}: duplicate id "${c}" (${u} elements) \u2014 clone/edit collision`});w++;for(let c of ze(m))c.src.length>120&&f.push({code:"I33",severity:"info",message:`${y}: ${c.attr} expression is ${c.src.length} chars; consider a calc: field`});w++;for(let c of m.querySelectorAll("[text], [text\\:num]")){let u=c.textContent||"";/\.\d{5,}/.test(u)&&f.push({code:"I33",severity:"info",message:`${y}: ${Dt(c)} paints >4 decimals; consider text:FMT`})}}let N=f.filter(d=>d.severity==="error").length,I=f.filter(d=>d.severity==="warn").length,W=f.filter(d=>d.severity==="info").length;console.log(`sap doctor \xB7 ${t.apps().map(d=>se(d.root)).join(", ")} \xB7 errors ${N} \xB7 warnings ${I} \xB7 info ${W} \xB7 ${w} checks \xB7 0ms`);for(let d of f)(d.severity==="error"?console.error:d.severity==="warn"?console.warn:console.info)(` ${d.severity==="error"?"\u2717":d.severity==="warn"?"\u26A0":"\xB7"} ${d.message}`);return f}return{status:n,report:s,why:R,debug:k,doctor:A,greenLine:r,printGreenLines:i,REGISTRY:Xt}}var je="0.5.0";var et=new Map,it=[],ae=ue(Et);function Kr(t){let e=t;for(;e;){if(e.nodeType===1&&e.hasAttribute&&e.hasAttribute("sap"))return et.get(e)||null;e=e.parentNode&&e.parentNode.host?e.parentNode.host:e.parentElement}return null}function Jr(){for(let t=it.length-1;t>=0;t--){let e=it[t];e.root.isConnected||(et.delete(e.root),it.splice(t,1))}}function Qr(t,e){if(t.moveBefore)try{t.moveBefore(e,null);return}catch{}t.appendChild(e)}function Zr(t,e){let n=e.parentElement;if(n){if(n.moveBefore)try{n.moveBefore(t,e);return}catch{}n.insertBefore(t,e)}}var dt={apps:()=>it.slice(),appFor:Kr,isRegistered:t=>et.has(t),pruneDisconnected:Jr,schedule:(t,e)=>ae.schedule(t,e),runNow:(t,e)=>ae.runNow(t,e),moveInto:Qr,placeBefore:Zr,remountIfPresent:()=>Ut()},Ge=Be(dt),tn=qe(dt,Ge),st=He(dt),Ue=!1;function Ye(){Ue||(Ue=!0,tn.install(document),$e(dt))}function Ut(t=document){Ye(),ee(dt);let e=t.querySelectorAll("[sap]"),n=[];for(let r of e){if(et.has(r))continue;let i=ie(r);et.set(r,i),it.push(i),n.push(i)}for(let r of n){let i=st.greenLine(r);r.diag.errors.length||r.halted?console.error(i):console.log(i)}return n}function Xe(t){if(Ye(),ee(dt),!t)return Ut();let e=typeof t=="string"?document.querySelector(t):t;if(!e)return null;if(et.has(e))return et.get(e);let n=ie(e);et.set(e,n),it.push(n);let r=st.greenLine(n);return n.diag.errors.length||n.halted?console.error(r):console.log(r),n}var F=Ge.Sap;F.version=je;F.refresh=function(){for(let e of it)e.root.isConnected&&ae.runNow(e,"refresh")};F.batch=ke;F.status=st.status;F.report=st.report;F.why=st.why;F.debug=st.debug;F.doctor=st.doctor;F.greenLine=st.greenLine;F.formats=Lt;F.serializeControlToAttributes=wt;F.finalizeControlForSave=ve;F.rehydrateControlFromAttributes=qt;F.mount=Xe;F.config=function(e={}){return e.formats&&Object.assign(Lt,e.formats),F};F._registry=et;F._reset=function(){et.clear(),it.length=0,Le()};function en(){if(typeof document>"u")return;let t=()=>Se(()=>Ut());document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}en();typeof window<"u"&&(window.Sap=F);var rn=F;return er(nn);})();
11
11
  if (typeof window !== 'undefined' && Sap && Sap.default) window.Sap = Sap.default;
12
12
  var sapDefault = Sap.default;
13
13
  window.clay = window.clay || {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panphora/clayjs",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "type": "module",
5
5
  "description": "clayjs: malleable documents. Save lifecycle for self-saving HTML.",
6
6
  "license": "MIT-0",
@@ -0,0 +1,72 @@
1
+ /**
2
+ * [add-from] Custom Attribute
3
+ *
4
+ * Adds a new item from a <template> on click. Edit mode only: this module is in
5
+ * the edit-only wave, so a visitor's page never loads it.
6
+ *
7
+ * Usage:
8
+ * <button add-from="#task-tpl" add-to="#tasks">Add task</button>
9
+ *
10
+ * The template's first element is cloned, given a fresh data-id unless it already
11
+ * has one (templates carry none), and appended to the add-to element. Its first
12
+ * editable field is focused with its text selected, so typing replaces the
13
+ * placeholder. Ids are built without crypto.randomUUID, which is missing outside
14
+ * a secure context.
15
+ */
16
+
17
+ const FIELD = '[contenteditable]:not([contenteditable="false"]), input, textarea';
18
+
19
+ export function newId() {
20
+ return Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
21
+ }
22
+
23
+ function find(selector) {
24
+ if (!selector) return null;
25
+ try {
26
+ return document.querySelector(selector);
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+
32
+ function focusField(item) {
33
+ const field = item.matches(FIELD) ? item : item.querySelector(FIELD);
34
+ if (!field) return;
35
+ field.focus();
36
+ if (typeof field.select === "function") return field.select();
37
+ const range = document.createRange();
38
+ range.selectNodeContents(field);
39
+ const selection = window.getSelection();
40
+ selection.removeAllRanges();
41
+ selection.addRange(range);
42
+ }
43
+
44
+ export function addFrom(trigger) {
45
+ const template = find(trigger.getAttribute("add-from"));
46
+ const list = find(trigger.getAttribute("add-to"));
47
+ const blueprint = template?.content?.firstElementChild;
48
+ if (!blueprint || !list) {
49
+ console.warn("[add-from] add-from must name a <template> and add-to the element to add into", trigger);
50
+ return null;
51
+ }
52
+ const item = blueprint.cloneNode(true);
53
+ if (!item.getAttribute("data-id")) item.setAttribute("data-id", newId());
54
+ list.append(item);
55
+ focusField(item);
56
+ return item;
57
+ }
58
+
59
+ function onClick(event) {
60
+ const trigger = event.target.closest?.("[add-from]");
61
+ if (!trigger) return;
62
+ event.preventDefault();
63
+ addFrom(trigger);
64
+ }
65
+
66
+ function init() {
67
+ document.addEventListener("click", onClick);
68
+ }
69
+
70
+ init();
71
+
72
+ export default init;
@@ -37,6 +37,7 @@ const MINIMIZE_SVG = '<svg viewBox="0 0 12 12" width="12" height="12" aria-hidde
37
37
  const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
38
38
 
39
39
  const BLOCKED_ROW = "This spot changed again. Review the latest edit or download your copy.";
40
+ const DATA_BLOCKED_ROW = "A data value can't be put back from here. Download your copy to keep yours.";
40
41
 
41
42
  let view = "hidden";
42
43
  let listOpen = false;
@@ -173,10 +174,6 @@ function render() {
173
174
  root.append(drawPanel(m));
174
175
  }
175
176
  set(root, "display", toastText || view !== "hidden" ? "flex" : "none");
176
- if (view !== "hidden") {
177
- const section = document.querySelector("[data-clay-section-notice]");
178
- if (section) set(section, "display", "none");
179
- }
180
177
  if (wellEl) wellEl.scrollTop = scroll;
181
178
 
182
179
  const want = pendingFocus || focusKey;
@@ -514,7 +511,7 @@ async function onRevert() {
514
511
  document.removeEventListener("focus", track, true);
515
512
  }
516
513
  busy = null;
517
- for (const id of result.blockedIds) blockedRows.set(id, BLOCKED_ROW);
514
+ for (const id of result.blockedIds) blockedRows.set(id, ledger()?.get(id)?.kind === "json" ? DATA_BLOCKED_ROW : BLOCKED_ROW);
518
515
  view = mode() ? "bar" : "hidden";
519
516
  pendingFocus = stayed ? "review" : null;
520
517
  const saving = result.saveResult && (result.saveResult.ok || result.saveResult.msg === "Save already in progress");
@@ -262,6 +262,41 @@ function recoveryRow(record, rv) {
262
262
  };
263
263
  }
264
264
 
265
+ // A JSON conflict path ('players[id="alice"].x', 'grid[0][1]', '["a b"]') as the words
266
+ // a person reads: players → alice → x. A keyed segment shows its key's value.
267
+ export function jsonPathWords(path) {
268
+ const words = [];
269
+ let i = 0;
270
+ while (i < path.length) {
271
+ if (path[i] === ".") { i++; continue; }
272
+ if (path[i] === "[") {
273
+ let j = i + 1;
274
+ let inString = false;
275
+ for (; j < path.length; j++) {
276
+ const ch = path[j];
277
+ if (inString) {
278
+ if (ch === "\\") j++;
279
+ else if (ch === '"') inString = false;
280
+ } else if (ch === '"') inString = true;
281
+ else if (ch === "]") break;
282
+ }
283
+ let inner = path.slice(i + 1, j);
284
+ const keyed = /^[A-Za-z_$][\w$]*=/.exec(inner);
285
+ if (keyed) inner = inner.slice(keyed[0].length);
286
+ try { words.push(String(JSON.parse(inner))); } catch { words.push(inner); }
287
+ i = j + 1;
288
+ continue;
289
+ }
290
+ let j = i;
291
+ while (j < path.length && path[j] !== "." && path[j] !== "[") j++;
292
+ words.push(path.slice(i, j));
293
+ i = j;
294
+ }
295
+ return words.join(" → ");
296
+ }
297
+
298
+ const jsonValue = (v) => (v === undefined ? "(deleted)" : JSON.stringify(v));
299
+
265
300
  export function rowOf(record) {
266
301
  const id = record.id;
267
302
  if (record.recovery?.version === 1) return recoveryRow(record, record.recovery);
@@ -283,6 +318,13 @@ export function rowOf(record) {
283
318
  yours: both ? side(plain(record.local)) : null, now: both ? side(plain(record.remote)) : null, sentence,
284
319
  };
285
320
  }
321
+ if (record.kind === "json") {
322
+ const where = jsonPathWords(record.path || "");
323
+ return {
324
+ id, kind: "json", name: where ? `${record.name} → ${where}` : record.name, target: null,
325
+ yours: side(jsonValue(record.local)), now: side(jsonValue(record.resolved)), sentence: null,
326
+ };
327
+ }
286
328
  const host = hostOf(record.node);
287
329
  const el = elementOf(record.node);
288
330
  const name = el && HIDDEN.has(el.localName) ? kindName(el)
@@ -43,6 +43,20 @@ let nextSaveKeepalive = false;
43
43
  // CustomEvent would put it on a bus any script on the page can listen to.
44
44
  const saveAcceptedHooks = [];
45
45
 
46
+ // Headers another module asks every save to carry, by name.
47
+ const extraSaveHeaders = new Map();
48
+
49
+ /**
50
+ * Add a header to every save from now on, or remove it with a null value.
51
+ *
52
+ * @param {string} name
53
+ * @param {string|null} value
54
+ */
55
+ export function setSaveHeader(name, value) {
56
+ if (value == null) extraSaveHeaders.delete(name);
57
+ else extraSaveHeaders.set(name, String(value));
58
+ }
59
+
46
60
  /**
47
61
  * Send the next save with `keepalive`, so a request whose page is going away (a tab
48
62
  * closing, a navigation) is still finished by the transport.
@@ -238,6 +252,11 @@ function errorResult(err) {
238
252
  // Live sync compares it with the frames it merges to know when the refusal
239
253
  // is answered.
240
254
  conflictEtag: conflicted ? (err.etag ?? null) : null,
255
+ // The host's answer, null when none came (a lost connection or a timeout).
256
+ status: Number.isInteger(err.status) ? err.status : null,
257
+ // An attempt of this save timed out, so it may have landed whatever the
258
+ // final answer says.
259
+ hadTimeout: timedOut || err.hadTimeout === true,
241
260
  etag: null
242
261
  };
243
262
  }
@@ -312,6 +331,8 @@ function buildSaveRequest(content, userDriven, signal, saveId, etag, keepalive =
312
331
  body: content
313
332
  };
314
333
 
334
+ for (const [name, value] of extraSaveHeaders) options.headers[name] = value;
335
+
315
336
  if (etag) options.headers['If-Match'] = etag;
316
337
 
317
338
  if (keepalive && new Blob([content]).size < KEEPALIVE_MAX_BODY) options.keepalive = true;
@@ -559,6 +580,7 @@ async function sendSave(content) {
559
580
  try {
560
581
  return await sendOnce(content, saveId, etag);
561
582
  } catch (err) {
583
+ if (reSent) err.hadTimeout = true;
562
584
  if (err.name === 'AbortError') {
563
585
  if (reSent) throw err;
564
586
  const { landed, resend, etag: original } = await recoverUnknownSave();
package/src/core/save.js CHANGED
@@ -221,6 +221,13 @@ export function resumeAutosave() {
221
221
  savePageThrottled();
222
222
  }
223
223
 
224
+ // Whether an agent's request currently holds autosave off. A caller that forces a
225
+ // save on its own schedule (live data checkpoints) asks this first, because a
226
+ // forced save would write the browser's bytes over the agent's.
227
+ export function autosaveIsSuspended() {
228
+ return autosaveSuspended > 0;
229
+ }
230
+
224
231
  // ============================================
225
232
  // THE ALL-SAVE HOLD
226
233
  // ============================================
@@ -372,15 +379,17 @@ function applySaveResult(result, forComparison, forDirty, label, gateToken, forS
372
379
  } else if (result.msgType === 'conflict') {
373
380
  holdForConflict(result.conflictEtag);
374
381
  setSaveState('conflict', result.msg, result.msgType, {
382
+ hadTimeout: result.hadTimeout === true,
375
383
  changedBy: result.changedBy ?? null,
376
384
  afterTimeout: result.afterTimeout === true,
377
385
  etag: result.conflictEtag ?? null,
378
386
  });
379
387
  } else if (result.msgType !== 'skipped') {
388
+ const extra = { status: result.status ?? null, hadTimeout: result.hadTimeout === true };
380
389
  if (!navigator.onLine) {
381
- setSaveState('offline', result.msg);
390
+ setSaveState('offline', result.msg, '', extra);
382
391
  } else {
383
- setSaveState('error', result.msg);
392
+ setSaveState('error', result.msg, '', extra);
384
393
  }
385
394
  }
386
395
  }
@@ -21,6 +21,7 @@ export const POLICY_TOKENS = Object.freeze([
21
21
  'no-data',
22
22
  'freeze',
23
23
  'editor-ui',
24
+ 'live',
24
25
  ])
25
26
 
26
27
  export function hasPolicyToken(element, token) {