@hazem3500/komo 0.9.24 → 0.9.26

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.
@@ -0,0 +1 @@
1
+ import{b as e}from"./chunk-MZE3O5EH.js";import{a as t,d as n,e as o,g as i,h as r,i as a,j as s,k as l,l as d,m as p,n as c,o as u,p as f,q as g,r as m,s as h,t as b,u as k,v,w as x,x as y,y as w}from"./chunk-K6ETEZER.js";import"./chunk-RPY7OOOR.js";var E=new Map,$=new WeakMap,C=!1;function S(e){let t={};for(let n of e?.themes??[])try{t[n.id]=n.current()}catch{}return t}function A(e,t={}){let n=$.get(e);n||$.set(e,n=new Map);let o=JSON.stringify(Object.entries(t).sort()),i=n.get(o);return i||(i=Promise.resolve().then(()=>e.list(Object.keys(t).length?t:void 0)).then(e=>Array.isArray(e)?e.filter(e=>e&&"string"==typeof e.path):[]),i.catch(()=>n.delete(o)),n.set(o,i)),i}function P(e,t){return Promise.resolve().then(()=>e.resolve(t)).then(e=>e??{},()=>({}))}function N(e){let t,n=e.trim().toLowerCase().replace(/\s+/g," "),o=/^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/.exec(n)?.[1];if(o)t=(o.length<5?[...o].map(e=>e+e).join(""):o).match(/../g).map((e,t)=>parseInt(e,16)/(t>2?255:1));else{let e=/^rgba?\(([^)]*)\)$/.exec(n)?.[1].split(/\s*[,/]\s*|\s+/);e&&(3===e.length||4===e.length)&&e.every(e=>/^[\d.]+%?$/.test(e))&&(t=e.map((e,t)=>parseFloat(e)*(e.endsWith("%")?t>2?.01:2.55:1)))}if(!t)return n.replace(/\s*,\s*/g,",");let[i,r,a,s=1]=t.map((e,t)=>t>2?+e.toFixed(2):Math.round(e));return 1===s?`rgb(${i},${r},${a})`:`rgba(${i},${r},${a},${s})`}function M(e,t){let n=N(t);return n?e.find(e=>"string"==typeof e.value&&N(e.value)===n):void 0}function T(e){return e.label||e.path}function L(e){return[e.path,e.ref,e.value,e.states?.length?`States: ${e.states.join(", ")}`:"",e.description].filter(Boolean).join(" · ")}function j(){let e=document.createElement("span");return e.className="design-token-off",e.setAttribute("role","img"),e}function z(e,t,n){e.title=`Not from a token · ${t||"unset"}${n?` · matches ${T(n)}`:""}`,e.setAttribute("aria-label",e.title)}function O(t,n,o,i){try{if(t.preview)return t.preview(n,o,i)??(()=>{})}catch{return()=>{}}return e(n,o,i.value)}function R(e,t){return[...E.get(e)??[]].reverse().find(e=>e.property===t)?.token}function D(e){let t=E.get(e);t?.pop()?.undo(),t&&!t.length&&E.delete(e)}function q(e){return!!E.get(e)?.length}function V(e){for(;E.has(e);)D(e)}function B(e){return[...new Set(E.get(e)?.map(e=>e.property))]}function U(e,t){try{let n=t.adapter.describe?.(e,t.property,t.from,t.token);return n?String(n).replace(/\s+/g," ").replace(/→/g,"->").trim().slice(0,300):void 0}catch{return}}function H(e){let t=[],n=new Set;for(let o of function(e){let t=new Map;for(let n of E.get(e)??[])t.set(n.property,n);return[...t.values()].filter(e=>!("path"in e.from)||e.from.path!==e.token.path)}(e)){n.add(o.adapter.id);let i="path"in o.from?`${o.fromToken?.value?`${o.fromToken.value} `:""}[${o.from.path}]`:o.from.offToken||"(unset)";t.push(`Element ${o.property}: ${i} → ${o.token.value} [${o.token.path}]`);let r=U(e,o);r&&t.push(`Apply: ${r}`)}if(t.length)return["Proposed design-token changes (preview only)",...t,`Token adapter: ${[...n].join(", ")}`].join("\n")}var I=new Map,_=new Map,F=new WeakSet,J=new WeakMap;function W(e){return void 0===e?"unset":JSON.stringify(e)??"unset"}var Y=new Map;function K(e){if(e)for(let[e,t]of I){let o=n(e);o&&(Y.set(e,o.props),o.setProps({...o.props,...Object.fromEntries(t)}))}else for(let[e,t]of Y)n(e)?.setProps(t);e||Y.clear(),l(e),function(e){if(e!==C){C=e;for(let[t,n]of E)if(e)for(let e of[...n].reverse())e.undo();else for(let e of n)e.undo=O(e.adapter,t,e.property,e.token)}}(e)}function Z(e){return!!I.get(e)?.size}function G(e){let t=n(e),o=t?.definition.textProp,i=t?.definition.props.find(e=>e.name===o);if(!t||!o||"string"!==i?.kind)return null;let r=t.props[o];if("string"!=typeof r||r.length>500)return null;let a=I.get(e);return a||I.set(e,a=new Map),a.has(o)||a.set(o,r),{propName:o,before:r}}function Q(e,o,i){let r=n(e),a=r?.definition.props.find(e=>e.name===o);return!(!r||r.definition.textProp!==o||"string"!==a?.kind||i.length>500||!t(a,i))&&(r.setProps({...r.props,[o]:i}),!0)}function X(e,t,n,o){if(n===o){let o=I.get(e);return void(o?.get(t)===n&&!(_.get(e)??[]).some(e=>e.propName===t)&&(o.delete(t),o.size||I.delete(e)))}let i=_.get(e);i||_.set(e,i=[]),i.push({propName:t,before:n,after:o})}function ee(e,t,n){Q(e,t,n);let o=I.get(e);o?.get(t)===n&&!(_.get(e)??[]).some(e=>e.propName===t)&&(o.delete(t),o.size||I.delete(e))}function te(e){return!!e&&!!_.get(e)?.length}function ne(e){let t=I.get(e),o=n(e);if(!t?.size||!o)return;let r=i(e),a=[...t].map(([e,t])=>{let n=o.definition.props.find(t=>t.name===e)?.styleProperty,i=o.props[e],a=n&&"string"==typeof i?r?.tokens.find(e=>e.properties.includes(n)&&i===`var(${e.cssVariable})`):void 0;return`- ${e}: ${W(t)} → ${W(i)}${a?` [${a.path}]`:" [custom value]"}`});return["Proposed React prop changes (preview only)",`Component: ${o.definition.name}`,`Source: ${o.definition.source}:${o.definition.line}`,...a,"Preview values use the app's React state callback; inline feedback does not write source files."].join("\n")}function oe(e,t){if(n(e))return null;let i;try{i=t?.components?.identify(e)}catch{}let r=o(e);return i?.name&&(!r||r.root!==i.element&&r.root.contains(i.element))?i:null}var ie=e=>String(e).replace(/\s+/g," ").trim();function re(e,t){let i=Object.entries(S(t)).map(([e,t])=>`${ie(e)}=${ie(t)}`).join(", "),r=oe(e,t),a=n(e),s=a?{root:e,component:a}:r?void 0:o(e);if(s){let{definition:e,props:t}=s.component;r={name:e.name,source:`${e.source}:${e.line}`,props:{...t,...Object.fromEntries(I.get(s.root)??[])}}}let l=Object.entries(r?.props??{}).filter(([,e])=>null===e||["boolean","number"].includes(typeof e)||"string"==typeof e&&e.length<=80).slice(0,12).map(([e,t])=>`${ie(e)}=${JSON.stringify(t).replace(/→/g,"\\u2192")}`);return[i&&`Theme: ${i}`,r?.name&&`Component: ${ie(r.name)}${r.source?` (${ie(r.source)})`:""}`,l.length&&`Props: ${l.join(", ")}`].filter(e=>!!e)}function ae(e){return[ne(e),w(e),H(e)].filter(e=>!!e).join("\n\n")||void 0}function se(e,t,o){J.get(e)?.abort();let i=new AbortController;J.set(e,i),e.addEventListener("click",e=>{let i=t();if(!i)return;let r=w(i)||q(i);!n(i)&&!r||(e.stopImmediatePropagation(),o(i,ae(i)))},{capture:!0,signal:i.signal})}function le(e){return k(e)}function de(e){return b(e)||q(e)}function pe(e){v(e)}function ce(e){x(e),V(e)}function ue(e){if(!e||F.has(e))return;let t=document.createElement("style");t.textContent=".design-react-source{display:block;padding:0 0 8px;color:#77736f;font-size:10px;overflow-wrap:anywhere}.design-react-inside{padding:10px 12px}.design-react-inside button{padding:0;border:0;background:none;color:#bda6ef;font:inherit;cursor:pointer}.design-react-inside button:hover{text-decoration:underline}.design-react-field.design-field{display:grid;grid-template-columns:76px minmax(0,1fr);gap:0 8px;height:auto;min-height:28px;margin-top:4px;background:none;box-shadow:none;color:#898680;font-size:11px}.design-react-field>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.design-react-field.design-field>:is(input,select){box-sizing:border-box;width:100%;min-width:0;height:28px;padding:0 8px;border:0;border-radius:6px;background-color:#ffffff0a;color:#f1efeb;font:inherit;font-size:11px}.design-react-field.design-field>:is(input,select):focus-visible{outline:1px solid #bda6ef;outline-offset:-1px}.design-react-field.design-field>select{padding-right:20px}.design-react-field input[type=checkbox]{justify-self:end;width:14px;height:14px;accent-color:#bda6ef}.design-react-field input:disabled{opacity:.55;cursor:not-allowed}.design-react-type{display:none}.design-react-field .design-token-binding{grid-column:2;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:6px;margin-top:4px;color:#77736f;font-size:10px}.design-react-field .design-token-binding select{min-width:0;height:24px;border:0;border-radius:6px;appearance:none;background:#ffffff0a url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 3 4 5.5 6.5 3' fill='none' stroke='%23898680' stroke-width='1.2'/%3E%3C/svg%3E\") right 6px center/8px no-repeat;color:#e9e6e1;padding:0 18px 0 6px;font:inherit;font-size:10px;cursor:pointer}.design-react-field .design-token-binding[data-mode=token] select{background-color:#bda6ef24;color:#e6dcfb}.design-token-binding__state{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.design-field>.design-token-binding{display:contents}.design-field:has(>.design-token-binding)>input[data-property]{padding-right:28px}.design-token-icon,.design-token-detach,.design-field>.design-token-binding select{position:absolute;top:4px;right:4px;width:20px;height:20px;box-sizing:border-box;border-radius:5px}.design-token-icon{display:grid;place-items:center;color:#77736f;opacity:0;pointer-events:none;transition:opacity .12s}.design-token-icon::before{content:'';width:6px;height:6px;border:1.2px solid currentColor;border-radius:1.5px;rotate:45deg}.design-field:is(:hover,:focus-within) .design-token-icon{opacity:1}.design-field>.design-token-binding select{margin:0;padding:0;border:0;opacity:0;cursor:pointer;appearance:none}.design-field>.design-token-binding select:hover+.design-token-icon,.design-field:has(.design-token-binding select:hover) .design-token-icon{background:#ffffff14;color:#e9e6e1}.design-field:has(.design-token-binding select:focus-visible) :is(.design-token-icon,.design-token-chip){outline:2px solid #bda6ef;outline-offset:1px;opacity:1}.design-field[data-token-mode=override] .design-token-icon{opacity:1;color:#e7c27d}.design-token-chip,.design-token-detach{display:none}.design-field:is([data-token-mode=token],[data-token-mode=connected])>[data-property]{visibility:hidden}.design-field:is([data-token-mode=token],[data-token-mode=connected]) .design-token-chip{position:absolute;inset:4px 28px 4px var(--lead,4px);display:flex;align-items:center;gap:5px;padding:0 6px;border-radius:4px;background:#bda6ef1f;color:#e6dcfb;font-size:11px;white-space:nowrap;overflow:hidden;pointer-events:none}.design-token-chip::before{content:'';flex:none;width:5px;height:5px;border:1.2px solid #c8b5f4;border-radius:1px;rotate:45deg}.design-field:is([data-token-mode=token],[data-token-mode=connected]) .design-token-binding select{left:var(--lead,4px);right:28px;width:auto}.design-field:is([data-token-mode=token],[data-token-mode=connected]) .design-token-icon{display:none}.design-field:is([data-token-mode=token],[data-token-mode=connected]) .design-token-detach{display:grid;place-items:center;color:#898680}.design-token-detach:hover{background:#ffffff14;color:#f1efeb}.design-token-detach svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round}.design-theme-group .design-react-source{padding:0 0 6px}.design-theme-heading{display:block;padding:8px 0 2px;color:#77736f;font-size:10px;text-transform:capitalize}.design-theme-token{position:relative;display:grid;grid-template-columns:96px minmax(0,1fr) 20px;align-items:center;gap:6px;margin-top:4px}.design-theme-token>span{overflow:hidden;color:#898680;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.design-theme-token[data-changed]>span{color:#e6dcfb}.design-theme-token[data-changed]::before{content:'';position:absolute;top:calc(50% - 2px);left:-8px;width:4px;height:4px;border-radius:50%;background:#bda6ef}.design-theme-reset{display:grid;place-items:center;width:20px;height:20px;padding:0;border:0;border-radius:5px;background:none;color:#77736f;cursor:pointer}.design-theme-reset:disabled{visibility:hidden}.design-theme-reset:hover{background:#ffffff14;color:#f1efeb}.design-theme-reset svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}.design-token-off{position:absolute;top:8px;right:24px;display:grid;place-items:center;width:12px;height:12px}.design-token-off::before{content:'';width:4px;height:4px;border-radius:50%;background:#e7c27d;opacity:.7}.design-token-off[hidden]{display:none}.design-field:has(>.design-token-binding>.design-token-off:not([hidden]))>input[data-property]{padding-right:38px}.design-theme-switch{padding:6px 12px 8px}.design-theme-switch .design-react-field>span{text-transform:capitalize}.design-theme-options{display:flex;min-width:0;padding:2px;border-radius:6px;background:#ffffff0a}.design-theme-options button{flex:1;min-width:0;height:24px;padding:0 6px;border:0;border-radius:4px;background:none;color:#898680;font:inherit;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.design-theme-options button:hover{color:#f1efeb}.design-theme-options button[aria-pressed=true]{background:#ffffff1a;color:#f1efeb}.design-theme-options button:focus-visible{outline:1px solid #bda6ef;outline-offset:-1px}@media (max-width:520px){.design-theme-options button{height:30px}.design-react-field.design-field>:is(input,select){height:34px}.design-token-icon,.design-token-detach,.design-field>.design-token-binding select{top:7px}.design-token-off{top:11px}}.design-token-match{grid-column:1/-1;display:flex;align-items:center;gap:6px;min-width:0;margin-top:-2px;padding:0 4px;color:#77736f;font-size:10px}.design-token-match[hidden]{display:none}.design-token-match>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.design-token-match button{flex:none;padding:0;border:0;background:none;color:#bda6ef;font:inherit;cursor:pointer}.design-token-match button:hover{text-decoration:underline}.design-token-match button:focus-visible{outline:1px solid #bda6ef;outline-offset:2px;border-radius:2px}@media (pointer:coarse){.design-token-match button{min-height:32px}}",e.append(t),F.add(e)}function fe(e,t){e.dataset.picker="token",e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false");let n,o=n=>import("./token-picker-JANYJIL4.js").then(o=>{!e.isConnected||e.disabled||!n&&o.isTokenPickerOpen(e)||o.toggleTokenPicker({trigger:e,...t()})},()=>{});e.addEventListener("pointerdown",t=>{t.button||(t.preventDefault(),n="mouse"===t.pointerType?void 0:t,!n&&(e.focus(),o(!0)))}),e.addEventListener("pointerup",e=>{n&&Math.abs(e.clientY-n.clientY)<=10&&o(!0),n=void 0});for(let t of["mousedown","touchend"])e.addEventListener(t,e=>{e.cancelable&&e.preventDefault()});e.addEventListener("keydown",e=>{e.ctrlKey||e.metaKey||!["Enter"," ","ArrowDown","ArrowUp"].includes(e.key)||(e.preventDefault(),o(!1))})}function ge(e,t){let n=document.createElement("div");n.className="design-token-match",n.hidden=!0;let o=document.createElement("span"),i=document.createElement("button");i.type="button",i.textContent="Use token",n.append(o,i);let r=()=>{};return i.addEventListener("click",e=>{e.preventDefault(),r()}),{show(a,s){n.isConnected||(e??t.parentElement)?.after(n),n.hidden=!a,r=s,o.textContent=a?`Matches ${a.label||a.path}`:"",o.title=a?`${a.path}${a.ref?` · ${a.ref}`:""} · ${a.value}`:"",i.setAttribute("aria-label",a?`Use token ${a.label||a.path}`:"Use token")}}}function me(t,n,o,a){let s=i(t);if(!s)return null;let l=h(s,n);if(!l.length)return null;ue(a);let d=document.createElement("span");d.className="design-token-binding",d.setAttribute("data-mode","custom");let u=document.createElement("span");u.className="design-token-icon",u.setAttribute("aria-hidden","true");let b=document.createElement("span");b.className="design-token-chip",b.setAttribute("aria-hidden","true");let k=document.createElement("button");k.type="button",k.className="design-token-detach",k.title="Detach token",k.setAttribute("aria-label",`Detach token from ${n}`),k.innerHTML='<svg viewBox="0 0 12 12"><path d="M5 3.5 6.5 2a2.1 2.1 0 0 1 3 3L8 6.5M7 8.5 5.5 10a2.1 2.1 0 0 1-3-3L4 5.5M2 2l8 8"/></svg>';let v=document.createElement("select");v.setAttribute("aria-label",`Style token for ${n}`);let x=document.createElement("small");x.className="design-token-binding__state",x.setAttribute("aria-live","polite");let y=`komo-token-${n}-${Math.random().toString(36).slice(2,8)}`;x.id=y,v.setAttribute("aria-describedby",y);let w=document.createElement("option");w.value="custom",w.textContent="Custom value",v.append(w);for(let e of l){let t=document.createElement("option"),n=r(s,e);t.value=e.path,t.textContent=n?`${e.path} · ${n}`:e.path,v.append(t)}let E=j(),$=e=>({path:e.path,type:e.type,value:r(s,e),properties:e.properties,group:e.path.split(".")[0],ref:e.cssVariable}),C=ge(null,d),S=e=>{v.value=e,v.dispatchEvent(new Event("change"))};fe(v,()=>({tokens:l.map($),property:n,current:v.value,onPreview:o=>{let i=l.find(e=>e.path===o.path);return e(t,n,`var(${i.cssVariable})`)},onSelect:e=>S(e.path)}));let A=()=>{let e=f(s,t,n),o=e?null:g(s,t,n),i="token"===e?.mode?l.find(t=>t.path===e.tokenPath):void 0,r=i??o?.token;v.value=r?.path??"custom",b.textContent=r?.path??"";let a=e?.declaredPath,p=i?"token":o?"connected":a?"override":"custom";d.dataset.mode=p,d.parentElement?.setAttribute("data-token-mode",p),x.textContent="token"===p?a&&a!==i?.path?`Rebound from ${a} · preview`:`Linked to ${i?.path} · preview`:"connected"===p?"Connected "+("inline"===o?.origin?"inline":"from stylesheet"):"override"===p?`Custom override · was ${a}`:"",v.title=x.textContent||"Choose a token",E.hidden="custom"!==p;let c="custom"===p?getComputedStyle(t).getPropertyValue(n).trim():"",u="custom"===p?M(l.map($),c):void 0;"custom"===p&&z(E,c,u),C.show(u,()=>u&&S(u.path))},P=new MutationObserver(A);P.observe(t,{attributes:!0,attributeFilter:["style"]});let N=new MutationObserver(()=>{d.isConnected||(P.disconnect(),N.disconnect())});return N.observe(d.ownerDocument,{childList:!0,subtree:!0}),v.addEventListener("change",()=>{let e=t.style.getPropertyValue(n),i=l.find(e=>e.path===v.value),r=f(s,t,n);if(i&&r&&i.path===r.declaredPath)m(s,t,n),o(e,t.style.getPropertyValue(n),i.path);else if(i)(i.path!==g(s,t,n)?.token.path||r)&&p(s,t,i,n,{recordHistory:!1})&&o(e,t.style.getPropertyValue(n),i.path);else{let i=d.parentElement?.querySelector("[data-property]")?.value??getComputedStyle(t).getPropertyValue(n).trim(),r=/^-?[\d.]+$/.test(i.trim())&&!/weight|line/.test(n)?`${i.trim()}px`:i;c(s,t,n,r),t.style.setProperty(n,r),o(e,r)}A()}),k.addEventListener("click",()=>{let e=l.find(e=>e.path===v.value),t=d.parentElement?.querySelector("input[data-property]"),n=e&&r(s,e);t&&n&&(t.value="number"===t.type?String(parseFloat(n)):n),v.value="custom",v.dispatchEvent(new Event("change")),d.parentElement?.querySelector("[data-property]")?.focus()}),d.append(b,v,u,k,E,x),queueMicrotask(A),A(),d}function he(e){let t=i(e);return new Set([...t?.elementBindings.get(e)?.keys()??[],...B(e)])}function be(e,t,n,o,i,r,a,s,l){let d=t.flatMap(e=>{let t=[...n.querySelectorAll("[data-field-property]")].find(t=>t.dataset.fieldProperty===e.property),o=t?.querySelector("[data-property]");return t&&o?[{field:e,label:t,input:o}]:[]}),p=t=>{for(let{field:o,label:i,input:s}of d){if(i.querySelector(".design-token-binding")||!n.contains(i))continue;let l=t(o,i,s,()=>{r&&(s.value=r(o,e));let t=i.querySelector('input[type="range"],input[type="color"]');t&&(t.value="color"===o.kind&&a?a(s.value):s.value)});l&&i.append(l)}},c=s?.tokens;if(!c)return void p((t,n,r,a)=>me(e,t.property,e=>{o(t,r,e),a()},i));ue(i);let u=function(e,t){let n,o=(Array.isArray(t?.themes)?t.themes:[]).find(e=>Array.isArray(e?.options)&&e.options.length>1&&e.options.length<4);if(o)return()=>n??=Promise.all(o.options.map(n=>A(e,{...S(t),[o.id]:n.id}).then(e=>({label:Me(n.label,n.id),values:new Map(e.map(e=>[e.path,e.value]))})))).catch(()=>[])}(c,s);return Promise.all([A(c,S(s)),P(c,e)]).then(([t,n])=>{p((o,i,r,a)=>ke(c,e,o.property,t,n[o.property],e=>{l?.(e),a()},i,r,u))},()=>{})}function ke(e,t,n,o,i,r,a,s,l){let d=function(e,t){return e.filter(e=>e.properties?.includes(t))}(o,n);if(!d.length&&!i)return null;let p=i&&"offToken"in i?i.offToken:void 0,c=void 0===p?void 0:M(d,p),u=document.createElement("span");u.className="design-token-binding";let f=document.createElement("span");f.className="design-token-chip",f.setAttribute("aria-hidden","true");let g=document.createElement("span");g.className="design-token-icon",g.setAttribute("aria-hidden","true");let m=document.createElement("button");m.type="button",m.className="design-token-detach",m.title="Edit the value",m.setAttribute("aria-label",`Edit ${n} value`),m.innerHTML='<svg viewBox="0 0 12 12"><path d="M5 3.5 6.5 2a2.1 2.1 0 0 1 3 3L8 6.5M7 8.5 5.5 10a2.1 2.1 0 0 1-3-3L4 5.5M2 2l8 8"/></svg>';let h=document.createElement("select");h.setAttribute("aria-label",`Style token for ${n}`),h.disabled=!d.length;let b=document.createElement("option");b.value="",b.textContent="Choose a token",h.append(b);let k=new Map([["",h]]);for(let e of d){let t=e.group??"",n=k.get(t);n||(n=document.createElement("optgroup"),n.label=t,k.set(t,n));let o=document.createElement("option");o.value=e.path,o.textContent=`${T(e)}${e.ref?` · ${e.ref}`:""}${e===c?" · same value":""}`,o.title=L(e),n.append(o)}for(let[e,t]of k)e&&h.append(t);let v=j();void 0!==p&&z(v,p,c);let x=document.createElement("small");x.className="design-token-binding__state",x.setAttribute("aria-live","polite");let y=!1,w=ge(a,u);fe(h,()=>({tokens:o,property:n,current:y?void 0:R(t,n)?.path??(i&&"path"in i?i.path:void 0),themes:l,onPreview:o=>O(e,t,n,o),onSelect:C}));let $=()=>{let e=R(t,n),r=y?void 0:e?.path??(i&&"path"in i?i.path:void 0),s=r?o.find(e=>e.path===r):void 0;h.value=r&&d.some(e=>e.path===r)?r:"",f.textContent=s?T(s):r??"";let l=r?e?"token":"connected":"custom";u.dataset.mode=l,(a??u.parentElement)?.setAttribute("data-token-mode",l),v.hidden=void 0===p||!!e,x.textContent=s?`${e?"Preview":"Uses"} ${L(s)}`:r?`Uses ${r}`:v.hidden?"":v.title,h.title=x.textContent||"Choose a token",w.show(v.hidden||y?void 0:c,()=>c&&C(c))};function C(a){y=!1;let s=i??{offToken:getComputedStyle(t).getPropertyValue(n).trim()},l="path"in s?o.find(e=>e.path===s.path):void 0;r(function(e,t,n,o,i,r){let a=E.get(t);a||E.set(t,a=[]);let s=a.find(e=>e.property===n);return a.push({adapter:e,property:n,token:o,from:s?.from??i,fromToken:s?s.fromToken:r,undo:O(e,t,n,o)}),()=>D(t)}(e,t,n,a,s,l)),$()}return h.addEventListener("change",()=>{let e=d.find(e=>e.path===h.value);e?C(e):$()}),m.addEventListener("click",()=>{y=!0,$(),s?.focus()}),u.append(f,h,g,m,v,x),$(),u}var ve=!1;function xe(e,t,n,o){let r=i(e);if(!r||!r.tokens.length)return null;ue(o);let a=document.createElement("details");a.className="design-group design-theme-group",a.open=ve,a.addEventListener("toggle",()=>{a.isConnected&&(ve=a.open)});let s=document.createElement("summary");s.textContent="Shared theme";let l=document.createElement("small");l.className="design-react-source",l.textContent="Changes every element using these tokens",a.append(s,l);let d=new Map;for(let e of r.tokens){let t=e.path.split(".")[0];d.set(t,[...d.get(t)??[],e])}let p=r.tokens.length>6&&d.size>1;for(let[e,o]of p?d:new Map([["",r.tokens]])){if(e){let t=document.createElement("small");t.className="design-theme-heading",t.textContent=e,a.append(t)}for(let i of o)a.append(ye(r,i,t,n,e))}return a}function ye(e,t,n,o,i){let l=document.createElement("div");l.className="design-theme-token";let p=document.createElement("span");p.textContent=i&&t.path.slice(i.length+1)||t.path,p.title=`${t.path} · ${a(e,t)} matching · ${t.impactSelector}`;let c=n.fields.find(e=>t.properties.includes(e.property)),u={property:t.cssVariable,label:`Shared theme value for ${t.path}`,kind:"dimension"===t.type?"size":c?.kind??"text",glyph:"color"===t.type?void 0:c?.glyph,values:c?.values},f=!1,g=n.fieldControl(u,{element:e.root,begin:()=>{f=!1},apply:(n,i,r)=>{let a=null!==r&&s(e,t,r.trim(),f);n.setAttribute("aria-invalid",String(!a)),a&&(f=!0,k(),o())},commit:(e,t,n)=>{!1!==n&&(f=!1,"true"===e.getAttribute("aria-invalid")&&b())}}),m=g.querySelector("[data-property]"),h=g.querySelector('input[type="color"]'),b=()=>{let o=r(e,t);m.value=o,h&&(h.value=n.toHex(o)),m.removeAttribute("aria-invalid"),k()},k=()=>{v.disabled=!l.toggleAttribute("data-changed",e.themeEdits.has(t.path)),"fontFamily"===t.type&&(m.title=m.value)},v=document.createElement("button");return v.type="button",v.className="design-theme-reset",v.title="Reset to page value",v.setAttribute("aria-label",`Reset ${t.path}`),v.innerHTML='<svg viewBox="0 0 16 16"><path d="M2.5 2.5v3h3M3 5.5a5.5 5.5 0 1 1-.5 2.5"/></svg>',v.addEventListener("click",()=>{d(e,t),b(),o()}),b(),l.append(p,g,v),l}function we(e,t,n){let o=i(e);o&&c(o,e,t,n)}function Ee(e,t){let n=i(e);n&&u(n,e,t)}function $e(e){let t=_.get(e)?.pop(),o=n(e);if(!t||!o)return;o.setProps({...o.props,[t.propName]:t.before});let i=I.get(e);if(i){let n=i.get(t.propName);Object.is(n,t.before)&&i.delete(t.propName),i.size||I.delete(e)}}function Ce(){for(let e of[...I.keys()])Le(e);I.clear(),_.clear(),y(),function(){for(let e of[...E.keys()])V(e)}(),Ne()}var Se,Ae=new Map;function Pe(e){try{return String(e.current())}catch{return}}function Ne(){for(let[e,t]of Ae)try{Pe(e)!==t&&e.apply(t)}catch{}Ae.clear()}var Me=(e,t)=>e||t.charAt(0).toUpperCase()+t.slice(1);function Te(e,t,n,o){if(e.querySelector(".design-theme-switch"))return;let i=document.createElement("div");i.className="design-group design-theme-switch";let r,a=t?.themes;for(let e of Array.isArray(a)?a:[]){let t=Pe(e),o=Array.isArray(e?.options)?e.options.filter(e=>"string"==typeof e?.id):[];if(void 0===t||o.length<2)continue;let a=Me(e.label,String(e.id)),s=o=>{let i=Pe(e);if(o!==i){Ae.has(e)||Ae.set(e,i??t),Se=e;try{e.apply(o)}catch{}n()}},l=document.createElement(o.length>3?"label":"div");l.className="design-field design-react-field";let d,p=document.createElement("span");if(p.textContent=a,o.length>3){let e=document.createElement("select");for(let t of o)e.append(new Option(Me(t.label,t.id),t.id));e.value=t,e.setAttribute("aria-label",`${a} theme`),e.addEventListener("change",()=>s(e.value)),d=e}else{d=document.createElement("div"),d.className="design-theme-options",d.setAttribute("role","group"),d.setAttribute("aria-label",`${a} theme`);for(let e of o){let n=document.createElement("button");n.type="button",n.textContent=Me(e.label,e.id),n.setAttribute("aria-pressed",String(e.id===t)),n.addEventListener("click",()=>s(e.id)),d.append(n)}}Se===e&&(r=d.querySelector("[aria-pressed=true]")??d),l.append(p,d),i.append(l)}Se=void 0,i.childElementCount&&(ue(o),e.prepend(i),r?.focus({preventScroll:!0}))}function Le(e){let t=I.get(e),o=n(e);!t?.size||!o||(o.setProps({...o.props,...Object.fromEntries(t)}),I.delete(e),_.delete(e))}function je(e,n,o,i,r,a){let s=n.definition.props.find(e=>e.name===o);if(!s||!t(s,i))return r.setAttribute("aria-invalid","true"),!1;r.removeAttribute("aria-invalid");let l=n.props[o];if(Object.is(l,i))return!0;let d=I.get(e);d||I.set(e,d=new Map);let p=d.has(o)?d.get(o):l;Object.is(p,i)?d.delete(o):d.set(o,p),d.size||I.delete(e);let c=_.get(e);return c||_.set(e,c=[]),c.push({propName:o,before:l,after:i}),n.setProps({...n.props,[o]:i}),a(),!0}function ze(e,t,r,a,s){let l=n(e);if(!l){let t=oe(e,s),n=null;try{n=t&&s?.components?.panel?.(t)||null}catch{}return n&&ue(r),n??function(e,t,n){let i=o(e);if(!i)return null;ue(n);let r=document.createElement("small");if(r.className="design-react-source design-react-group design-react-inside",r.append(`Inside ${i.component.definition.name}`),t){let e=document.createElement("button");e.type="button",e.textContent="Select component",e.addEventListener("click",()=>t(i.root)),r.append(" · ",e)}return r}(e,a,r)}ue(r);let d=document.createElement("details");d.className="design-group design-react-group",d.open=!0;let p=document.createElement("summary");p.textContent="Properties",d.append(p);let c=document.createElement("small");c.className="design-react-source",c.textContent=`${l.definition.name} · ${l.definition.source}:${l.definition.line}`,d.append(c);for(let n of l.definition.props){let o=n.styleProperty,r=document.createElement("label");r.className="design-field design-react-field";let a=document.createElement("span");a.textContent=n.name;let s,p=l.props[n.name];if("enum"===n.kind){let e=document.createElement("select");for(let t of n.values??[]){let n=document.createElement("option");n.value=String(t),n.textContent=String(t),e.append(n)}if(void 0===p&&!n.required){let t=document.createElement("option");t.value="",t.textContent="unset",e.prepend(t)}e.value=void 0===p?"":String(p),s=e}else{let e=document.createElement("input");"boolean"===n.kind?(e.type="checkbox",e.checked=!0===p):"number"===n.kind?(e.type="number",e.step="any",e.value="number"==typeof p?String(p):""):(e.type="text",e.maxLength=500,e.autocomplete="off",e.value="string"==typeof p?p:""),s=e}if(s.setAttribute("aria-label",`${l.definition.name} ${n.name}`),"unsupported"===n.kind)s=document.createElement("input"),s.disabled=!0,s.value=`Read only · ${n.typeLabel}`,s.setAttribute("aria-label",`${l.definition.name} ${n.name}, read only`),r.title=`Inline feedback does not edit ${n.typeLabel} props.`;else{let o=()=>{let o=s instanceof HTMLInputElement&&"checkbox"===s.type?s.checked:s.value,i=o;if("number"===n.kind)i=""===String(o).trim()?void 0:Number(o);else if("enum"===n.kind){let e=(n.values??[]).find(e=>String(e)===o);i=""!==o||n.required?e:void 0}else"boolean"===n.kind&&(i=!0===o);je(e,l,n.name,i,s,t)};s.addEventListener("change",o)}r.append(a,s);let c=document.createElement("small");if(c.className="design-react-type",c.textContent=`${n.typeLabel}${n.required?" · required":" · optional"}`,r.append(c),r.title||=c.textContent,"string"===n.kind&&o){let a=i(e),d=a?h(a,o):[];if(d.length){let i=document.createElement("span");i.className="design-token-binding";let a=document.createElement("span");a.textContent="Style token";let p=document.createElement("select");p.setAttribute("aria-label",`Style token for ${n.name}`);let c=document.createElement("option");c.value="custom",c.textContent="Custom value",p.append(c);for(let e of d){let t=document.createElement("option");t.value=e.path,t.textContent=e.path,p.append(t)}let u=()=>{let e=d.find(e=>l.props[n.name]===`var(${e.cssVariable})`);p.value=e?.path??"custom",i.dataset.mode=e?"token":"custom"};p.addEventListener("change",()=>{let i=d.find(e=>e.path===p.value),r=i?`var(${i.cssVariable})`:"string"==typeof l.props[n.name]&&String(l.props[n.name]).startsWith("var(")?e.ownerDocument.defaultView?.getComputedStyle(e).getPropertyValue(o).trim()??"":"string"==typeof l.props[n.name]?l.props[n.name]:"";je(e,l,n.name,r,s,t)&&u()}),i.append(a,p),r.append(i),u()}}d.append(r)}return d}export{be as attachStyleTokenControls,Te as attachThemeSwitcher,G as beginReactTextEdit,le as canUndoDesignTokenEdit,te as canUndoReactProp,ee as cancelReactTextEdit,ke as createAdapterTokenControl,xe as createDesignThemePanel,me as createElementTokenControl,ze as createReactPropsPanel,re as designContext,X as finishReactTextEdit,de as hasDesignTokenEdit,Z as hasReactPropChanges,se as installCommentCapture,we as noteDesignTokenOverride,Q as previewReactTextEdit,ae as proposedDesignChanges,ne as proposedReactChanges,ce as resetDesignTokenEdits,Ce as resetPreviews,Le as resetReactProps,Ne as restoreThemes,K as showDesignBefore,Ee as syncDesignTokenBinding,he as tokenBoundProperties,pe as undoDesignTokenEdit,$e as undoReactProp};
@@ -1,52 +1,53 @@
1
+ import type { DesignTarget } from "./design-target.js";
1
2
  import type { DesignSystem, DesignToken, TokenAdapter, TokenUsage } from "./design-system.js";
2
3
  import type { ThemeValues } from "./token-picker.js";
3
4
  /** Before/After for React prop previews and shared theme values. */
4
5
  export declare function showDesignBefore(on: boolean): void;
5
- export declare function hasReactPropChanges(element: HTMLElement): boolean;
6
+ export declare function hasReactPropChanges(element: DesignTarget): boolean;
6
7
  export interface ReactTextEditStart {
7
8
  propName: string;
8
9
  before: string;
9
10
  }
10
11
  /** Only an explicit registered textProp can drive a React-rendered inline edit. */
11
- export declare function beginReactTextEdit(element: HTMLElement): ReactTextEditStart | null;
12
+ export declare function beginReactTextEdit(element: DesignTarget): ReactTextEditStart | null;
12
13
  /** Preview through the registered React state callback; never mutate React's DOM. */
13
- export declare function previewReactTextEdit(element: HTMLElement, propName: string, value: string): boolean;
14
- export declare function finishReactTextEdit(element: HTMLElement, propName: string, before: string, after: string): void;
15
- export declare function cancelReactTextEdit(element: HTMLElement, propName: string, before: string): void;
16
- export declare function canUndoReactProp(element: HTMLElement | null): boolean;
17
- export declare function proposedReactChanges(element: HTMLElement): string | undefined;
14
+ export declare function previewReactTextEdit(element: DesignTarget, propName: string, value: string): boolean;
15
+ export declare function finishReactTextEdit(element: DesignTarget, propName: string, before: string, after: string): void;
16
+ export declare function cancelReactTextEdit(element: DesignTarget, propName: string, before: string): void;
17
+ export declare function canUndoReactProp(element: DesignTarget | null): boolean;
18
+ export declare function proposedReactChanges(element: DesignTarget): string | undefined;
18
19
  /**
19
20
  * Context lines for a proposal, so agents and the CLI know what the change was
20
21
  * made in: "Theme: mode=dark", "Component: PromoCard (src/card.tsx:19)" and
21
22
  * 'Props: tone="calm"'. The registered React component wins, then the app's
22
23
  * component adapter, then the registered component around the element.
23
24
  */
24
- export declare function designContext(element: HTMLElement, design?: DesignSystem): string[];
25
- export declare function proposedDesignChanges(element: HTMLElement): string | undefined;
26
- export declare function installCommentCapture(button: HTMLButtonElement, selected: () => HTMLElement | null, onComment: (element: Element, proposal?: string) => void): void;
27
- export declare function canUndoDesignTokenEdit(element: HTMLElement | null): boolean;
28
- export declare function hasDesignTokenEdit(element: HTMLElement): boolean;
29
- export declare function undoDesignTokenEdit(element: HTMLElement): void;
30
- export declare function resetDesignTokenEdits(element: HTMLElement): void;
25
+ export declare function designContext(element: DesignTarget, design?: DesignSystem): string[];
26
+ export declare function proposedDesignChanges(element: DesignTarget): string | undefined;
27
+ export declare function installCommentCapture(button: HTMLButtonElement, selected: () => DesignTarget | null, onComment: (element: Element, proposal?: string) => void): void;
28
+ export declare function canUndoDesignTokenEdit(element: DesignTarget | null): boolean;
29
+ export declare function hasDesignTokenEdit(element: DesignTarget): boolean;
30
+ export declare function undoDesignTokenEdit(element: DesignTarget): void;
31
+ export declare function resetDesignTokenEdits(element: DesignTarget): void;
31
32
  /** Add token references directly to the existing style-property row. */
32
- export declare function createElementTokenControl(element: HTMLElement, property: string, onEdit: (before: string, after: string, tokenPath?: string) => void, styleRoot?: ShadowRoot): HTMLElement | null;
33
+ export declare function createElementTokenControl(element: DesignTarget, property: string, onEdit: (before: string, after: string, tokenPath?: string) => void, styleRoot?: ShadowRoot): HTMLElement | null;
33
34
  /** Properties whose before/after is described by token provenance instead of raw CSS. */
34
- export declare function tokenBoundProperties(element: HTMLElement): Set<string>;
35
+ export declare function tokenBoundProperties(element: DesignTarget): Set<string>;
35
36
  export declare function attachStyleTokenControls<T extends {
36
37
  property: string;
37
38
  kind?: string;
38
- }>(element: HTMLElement, fields: readonly T[], container: HTMLElement, onEdit: (field: T, input: HTMLInputElement | HTMLSelectElement, before: string) => void, styleRoot?: ShadowRoot, valueFor?: (field: T, element: HTMLElement) => string, toHex?: (value: string) => string, design?: DesignSystem, onSwap?: (undo: () => void) => void): void | Promise<void>;
39
+ }>(element: DesignTarget, fields: readonly T[], container: HTMLElement, onEdit: (field: T, input: HTMLInputElement | HTMLSelectElement, before: string) => void, styleRoot?: ShadowRoot, valueFor?: (field: T, element: DesignTarget) => string, toHex?: (value: string) => string, design?: DesignSystem, onSwap?: (undo: () => void) => void): void | Promise<void>;
39
40
  /** A field's token chip, suggestions and off-token marker, driven by the app's adapter. */
40
- export declare function createAdapterTokenControl(adapter: TokenAdapter, element: HTMLElement, property: string, tokens: readonly DesignToken[], usage: TokenUsage | undefined, onSwap: (undo: () => void) => void, label?: HTMLElement, input?: HTMLElement, themes?: () => Promise<ThemeValues[]>): HTMLElement | null;
41
+ export declare function createAdapterTokenControl(adapter: TokenAdapter, element: DesignTarget, property: string, tokens: readonly DesignToken[], usage: TokenUsage | undefined, onSwap: (undo: () => void) => void, label?: HTMLElement, input?: HTMLElement, themes?: () => Promise<ThemeValues[]>): HTMLElement | null;
41
42
  type ThemeFields = Pick<typeof import("./design-panel.js"), "fieldControl" | "fields" | "toHex">;
42
43
  /**
43
44
  * Shared theme editing stays secondary; per-element token choice lives on each knob.
44
45
  * Token rows reuse the panel's own fields and preview live, like every other field.
45
46
  */
46
- export declare function createDesignThemePanel(element: HTMLElement, panel: ThemeFields, onEdit: () => void, styleRoot?: ShadowRoot): HTMLElement | null;
47
- export declare function noteDesignTokenOverride(element: HTMLElement, property: string, value: string): void;
48
- export declare function syncDesignTokenBinding(element: HTMLElement, property: string): void;
49
- export declare function undoReactProp(element: HTMLElement): void;
47
+ export declare function createDesignThemePanel(element: DesignTarget, panel: ThemeFields, onEdit: () => void, styleRoot?: ShadowRoot): HTMLElement | null;
48
+ export declare function noteDesignTokenOverride(element: DesignTarget, property: string, value: string): void;
49
+ export declare function syncDesignTokenBinding(element: DesignTarget, property: string): void;
50
+ export declare function undoReactProp(element: DesignTarget): void;
50
51
  /** Undo every prop, token and theme preview, and put switched themes back, e.g. when Design mode closes. */
51
52
  export declare function resetPreviews(): void;
52
53
  /** Put every axis Design mode switched back to its original option. */
@@ -59,6 +60,6 @@ export declare function restoreThemes(): void;
59
60
  * so token lists, chips and values follow the new theme.
60
61
  */
61
62
  export declare function attachThemeSwitcher(container: HTMLElement, design: DesignSystem | undefined, onSwitch: () => void, styleRoot?: ShadowRoot): void;
62
- export declare function resetReactProps(element: HTMLElement): void;
63
- export declare function createReactPropsPanel(element: HTMLElement, onEdit: () => void, styleRoot?: ShadowRoot, select?: (root: HTMLElement) => void, design?: DesignSystem): HTMLElement | null;
63
+ export declare function resetReactProps(element: DesignTarget): void;
64
+ export declare function createReactPropsPanel(element: DesignTarget, onEdit: () => void, styleRoot?: ShadowRoot, select?: (root: HTMLElement) => void, design?: DesignSystem): HTMLElement | null;
64
65
  export {};
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- "use client";import{b as e,c as n,f as t,z as r}from"./chunk-JXIYWNFL.js";import{b as o}from"./chunk-AVMLHTCA.js";import"./chunk-ILX63XAJ.js";import"./chunk-DH22G2S5.js";import"./chunk-53M6AOAX.js";import"./chunk-WGISPOJV.js";import"./chunk-PLSWBSSX.js";import{useEffect as s,useRef as c}from"react";function u(e){let n=c(null);s(()=>{if(n.current&&function(e,n){return[...new Set([...Object.keys(e),...Object.keys(n)])].every(t=>{if("shortcuts"===t||"features"===t||"frame"===t){let r=e[t]??{},o=n[t]??{};return Object.keys({...r,...o}).every(e=>Object.is(r[e],o[e]))}if("design"===t){let t=e.design,r=n.design;if(!t||!r)return t===r;let o=t.themes??[],s=r.themes??[];return t.tokens===r.tokens&&t.components===r.components&&o.length===s.length&&o.every((e,n)=>e===s[n])}if("onboarding"!==t)return Object.is(e[t],n[t]);let r=e.onboarding,o=n.onboarding;return r&&o?Object.keys({...r,...o}).every(e=>"sites"===e?r.sites?.length===o.sites?.length&&(r.sites??[]).every((e,n)=>e===o.sites?.[n]):Object.is(r[e],o[e])):r===o})}(n.current.config,e)||(n.current?.controller.destroy(),n.current=null,!1===e.enabled))return;let t={...e,...e.onboarding?{onboarding:{...e.onboarding,...e.onboarding.sites?{sites:[...e.onboarding.sites]}:{}}}:{}};n.current={config:t,controller:o(t)}}),s(()=>()=>{n.current?.controller.destroy(),n.current=null},[])}function i(t){let r=c(null),o=c(null);return o.current||(o.current=e=>{r.current=e}),s(()=>{if(!0===t.enabled&&r.current)return e(r.current,t.component,t.props,t.onChange)},[t.enabled,t.component]),s(()=>{!0===t.enabled&&n(r.current,t.component,t.props,t.onChange)},[t.enabled,t.component,t.props,t.onChange]),{ref:o.current,"data-komo-inspectable":t.component.id}}function l(e){s(()=>{if(!0!==e.enabled)return;let n=e.root??document.documentElement;return t(n,e.tokens)},[e.root,e.tokens,e.enabled])}export{r as cssVariableTokens,u as useKomo,l as useKomoDesignTokens,i as useKomoInspectable};
1
+ "use client";import{b as e,c as n,f as t,z as r}from"./chunk-K6ETEZER.js";import{b as o}from"./chunk-G2QGDYNV.js";import"./chunk-ILX63XAJ.js";import"./chunk-DH22G2S5.js";import"./chunk-RPY7OOOR.js";import"./chunk-53M6AOAX.js";import"./chunk-WGISPOJV.js";import"./chunk-PLSWBSSX.js";import{useEffect as s,useRef as c}from"react";function u(e){let n=c(null);s(()=>{if(n.current&&function(e,n){return[...new Set([...Object.keys(e),...Object.keys(n)])].every(t=>{if("shortcuts"===t||"features"===t||"frame"===t){let r=e[t]??{},o=n[t]??{};return Object.keys({...r,...o}).every(e=>Object.is(r[e],o[e]))}if("design"===t){let t=e.design,r=n.design;if(!t||!r)return t===r;let o=t.themes??[],s=r.themes??[];return t.tokens===r.tokens&&t.components===r.components&&o.length===s.length&&o.every((e,n)=>e===s[n])}if("onboarding"!==t)return Object.is(e[t],n[t]);let r=e.onboarding,o=n.onboarding;return r&&o?Object.keys({...r,...o}).every(e=>"sites"===e?r.sites?.length===o.sites?.length&&(r.sites??[]).every((e,n)=>e===o.sites?.[n]):Object.is(r[e],o[e])):r===o})}(n.current.config,e)||(n.current?.controller.destroy(),n.current=null,!1===e.enabled))return;let t={...e,...e.onboarding?{onboarding:{...e.onboarding,...e.onboarding.sites?{sites:[...e.onboarding.sites]}:{}}}:{}};n.current={config:t,controller:o(t)}}),s(()=>()=>{n.current?.controller.destroy(),n.current=null},[])}function i(t){let r=c(null),o=c(null);return o.current||(o.current=e=>{r.current=e}),s(()=>{if(!0===t.enabled&&r.current)return e(r.current,t.component,t.props,t.onChange)},[t.enabled,t.component]),s(()=>{!0===t.enabled&&n(r.current,t.component,t.props,t.onChange)},[t.enabled,t.component,t.props,t.onChange]),{ref:o.current,"data-komo-inspectable":t.component.id}}function l(e){s(()=>{if(!0!==e.enabled)return;let n=e.root??document.documentElement;return t(n,e.tokens)},[e.root,e.tokens,e.enabled])}export{r as cssVariableTokens,u as useKomo,l as useKomoDesignTokens,i as useKomoInspectable};
@@ -0,0 +1 @@
1
+ import{a as e,b as t,c as o,d as n}from"./chunk-MZE3O5EH.js";import"./chunk-RPY7OOOR.js";var i,l=new WeakSet,a=new WeakMap,r=new WeakSet,s=0;function d(t,o){o&&a.set(t,o),i&&!i.select.isConnected&&i.close();let n=t.getRootNode();if((n instanceof ShadowRoot||n===document)&&!r.has(n)){r.add(n);let t=document.createElement("style");t.textContent=e+".design-field>select{appearance:none;padding-right:20px;cursor:pointer;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 3 4 5.5 6.5 3' fill='none' stroke='%23898680' stroke-width='1.2'/%3E%3C/svg%3E\") right 7px center/8px no-repeat}.komo-select{width:max-content;max-height:240px;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;padding:4px;line-height:1.2}.komo-select [role=option]{display:flex;align-items:center;gap:8px;min-height:26px;padding:0 8px;border-radius:6px;white-space:nowrap;cursor:pointer}.komo-select [role=option] span{flex:1;overflow:hidden;text-overflow:ellipsis}.komo-select [data-active]{background:#ffffff14;color:#f1efeb}.komo-select [aria-selected=true]{color:#f1efeb}.komo-select [aria-selected=true]::after{content:'';flex:none;width:7px;height:3.5px;margin:-3px 1px 0 0;border:solid #bda6ef;border-width:0 0 1.5px 1.5px;rotate:-45deg}.komo-select [aria-disabled=true]{opacity:.4;cursor:default}.komo-select small{display:block;padding:8px 8px 4px;color:#77736f;font-size:10px;font-weight:500}.komo-select [role=group]+[role=group],.komo-select [role=option]+[role=group]{margin-top:4px;border-top:1px solid #ffffff0d}@media (pointer:coarse){.komo-select{font-size:13px}.komo-select [role=option]{min-height:40px}}",(n instanceof ShadowRoot?n:document.head).append(t)}if(l.has(t))return;l.add(t);let s=e=>{let t=e.composedPath()[0];return t instanceof HTMLSelectElement&&!t.disabled&&!t.multiple&&!t.dataset.picker?t:null};t.addEventListener("focusin",e=>{let t=s(e);t&&!t.hasAttribute("aria-haspopup")&&(t.setAttribute("aria-haspopup","listbox"),t.setAttribute("aria-expanded","false"))}),t.addEventListener("pointerdown",e=>{p="mouse"===e.pointerType?void 0:e;let o=s(e);!o||e.button||(e.preventDefault(),p||u(o,a.get(t)))},!0),t.addEventListener("pointerup",e=>{let o=s(e);o&&p&&!c(e)&&u(o,a.get(t))},!0);for(let e of["mousedown","touchend"])t.addEventListener(e,e=>{s(e)&&e.cancelable&&e.preventDefault()},!0);t.addEventListener("keydown",e=>{let o=s(e);!o||i?.select===o||e.ctrlKey||e.metaKey||["Enter"," ","ArrowDown","ArrowUp"].includes(e.key)&&(e.preventDefault(),f(o,a.get(t)))},!0)}var p,c=e=>p&&Math.abs(e.clientY-p.clientY)>10;function u(e,t){if(i?.select===e)return i.close();p||e.focus(),f(e,t)}function f(e,l){i?.close(),p=void 0;let a="komo-select-"+ ++s,r=document.createElement("div");r.className="komo-select",r.id=a,r.setAttribute("role","listbox"),r.setAttribute("aria-label",e.getAttribute("aria-label")??e.title);let d=[],u=(e,t)=>{let o=document.createElement("div");o.id=`${a}-${d.length}`,o.setAttribute("role","option"),o.setAttribute("aria-selected",String(e.selected)),e.disabled&&o.setAttribute("aria-disabled","true"),e.title&&(o.title=e.title);let n=document.createElement("span");n.textContent=e.label,o.append(n),t.append(o),d.push({node:o,option:e})};for(let t of e.children)if(t instanceof HTMLOptionElement)u(t,r);else if(t instanceof HTMLOptGroupElement){let e=document.createElement("div");e.setAttribute("role","group"),e.setAttribute("aria-labelledby",`${a}-g${d.length}`);let o=document.createElement("small");o.id=`${a}-g${d.length}`,o.textContent=t.label,e.append(o);for(let o of t.querySelectorAll("option"))u(o,e);r.append(e)}let f,m=-1,g=e.dataset.property,h=()=>{let e=f;f=void 0,e?.()},b=d.flatMap((e,t)=>e.option.disabled?[]:[t]),x=(o,n=!0)=>{if(!(o>=0))return;o!==m&&n&&(h(),l&&g&&!d[o].option.selected&&(f=t(l,g,d[o].option.value))),d[m]?.node.removeAttribute("data-active"),m=o;let i=d[o].node;i.toggleAttribute("data-active",!0),e.setAttribute("aria-activedescendant",i.id);let a=i.offsetTop,s=a+i.offsetHeight;a<r.scrollTop?r.scrollTop=a-4:s>r.scrollTop+r.clientHeight&&(r.scrollTop=s-r.clientHeight+4)},v=e=>{let t=b.indexOf(m);x(b[t<0?0:Math.max(0,Math.min(b.length-1,t+e))])},w=t=>{let o=d[t]?.option;A(),o&&!o.disabled&&!o.selected&&(o.selected=!0,e.dispatchEvent(new Event("input",{bubbles:!0,composed:!0})),e.dispatchEvent(new Event("change",{bubbles:!0})))},E=new AbortController,{signal:k}=E;function A(){i?.close===A&&(i=void 0,h(),E.abort(),r.remove(),e.setAttribute("aria-expanded","false"),e.removeAttribute("aria-activedescendant"),e.removeAttribute("aria-controls"))}i={select:e,close:A};let y="",L=0;addEventListener("keydown",t=>{if(!e.isConnected||t.composedPath()[0]!==e)return A();let o=t.key;if(!(t.ctrlKey||t.metaKey||t.altKey&&!o.startsWith("Arrow"))){if("Tab"===o)return A();if("ArrowDown"===o||"ArrowUp"===o)v("ArrowDown"===o?1:-1);else if("Home"===o||"PageUp"===o)x(b[0]);else if("End"===o||"PageDown"===o)x(b[b.length-1]);else if("Escape"===o)A();else if("Enter"===o||" "===o&&!y)w(m);else{if(1!==o.length)return;{y=t.timeStamp-L<1e3?y+o.toLowerCase():o.toLowerCase(),L=t.timeStamp;let e=Math.max(0,b.indexOf(m)+(y[1]?0:1)),n=[...b.slice(e),...b.slice(0,e)].find(e=>d[e].option.label.toLowerCase().startsWith(y));void 0!==n&&x(n)}}t.preventDefault(),t.stopImmediatePropagation()}},{capture:!0,signal:k}),addEventListener("pointerdown",t=>{let o=t.composedPath();!o.includes(r)&&!o.includes(e)&&A()},{capture:!0,signal:k});let M=e=>{e.target!==r&&A()};addEventListener("scroll",M,{capture:!0,signal:k}),e.getRootNode().addEventListener("scroll",M,{capture:!0,signal:k}),addEventListener("resize",A,{signal:k}),n(e,A,k),e.addEventListener("blur",A,{signal:k}),r.addEventListener("mousedown",e=>e.preventDefault(),{signal:k}),r.addEventListener("pointermove",e=>{let t=e.target.closest?.("[role=option]"),o=d.findIndex(e=>e.node===t);b.includes(o)&&o!==m&&x(o)},{signal:k}),r.addEventListener("click",e=>{if(e.preventDefault(),c(e))return;let t=e.target.closest?.("[role=option]"),o=d.findIndex(e=>e.node===t);b.includes(o)&&w(o)},{signal:k});let C=e.closest(".design-field")??e.parentElement;C.append(r),e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","true"),e.setAttribute("aria-controls",a);let D=(e.offsetWidth<60?C:e).getBoundingClientRect(),H=o(C),T=(r.offsetParent??C).getBoundingClientRect(),S=Math.min(Math.max(D.width,r.offsetWidth+2,120),H.right-H.left-8),O=H.bottom-D.bottom-8,P=D.top-H.top-8,R=r.scrollHeight,$=R>O&&P>O,W=Math.max($?P:O,60),K=Math.min(R,240,W);r.style.width=`${S}px`,r.style.maxHeight=`${Math.min(240,W)}px`,r.style.left=Math.max(H.left+4,Math.min(D.left,H.right-S-4))-T.left+"px",r.style.top=($?D.top-K-4:D.bottom+4)-T.top+"px",r.toggleAttribute("data-up",$),x(d.findIndex(e=>e.option.selected&&!e.option.disabled),!1),m<0&&v(0)}export{d as attach};
@@ -2,4 +2,4 @@
2
2
  * Replace the system popup of every select inside `container`, now and later.
3
3
  * Called on each render, it also closes a popup whose select was just replaced.
4
4
  */
5
- export declare function attach(container: HTMLElement): void;
5
+ export declare function attach(container: HTMLElement, element?: HTMLElement | SVGElement): void;