@hazem3500/komo 0.9.13 → 0.9.14
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/README.md +3 -3
- package/dist/design-mode.js +1 -1
- package/dist/{design-panel-NU2WUI4D.js → design-panel-E5I2NED2.js} +1 -1
- package/dist/design-system.d.ts +2 -1
- package/dist/{inline-text-editor-H57VO5IE.js → inline-text-editor-TZNY2BNK.js} +1 -1
- package/dist/node.mjs +1 -1
- package/dist/react-props-panel-HWQ7WERB.js +1 -0
- package/dist/react-props-panel.d.ts +2 -1
- package/dist/select-menu-IA6BOUCR.js +1 -0
- package/dist/token-adapter.d.ts +1 -1
- package/dist/token-picker-XGRBJUNM.js +1 -0
- package/dist/token-picker.d.ts +25 -0
- package/package.json +1 -1
- package/server/setup-client.txt +35 -35
- package/dist/react-props-panel-XAG5DI3U.js +0 -1
- package/dist/select-menu-V7RYOZFK.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,d as t,e as n,g as o,h as i,i as r,j as a,k as s,l,m as d,n as p,o as c,p as u,q as f,r as g,s as m,t as h,u as b,v as k,w as v,x as y,y as x}from"./chunk-JXIYWNFL.js";import"./chunk-I7AUKTXE.js";var w=new Map,E=new WeakMap,$=!1;function C(e){let t={};for(let n of e?.themes??[])try{t[n.id]=n.current()}catch{}return t}function S(e,t={}){let n=E.get(e);n||E.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 A(e,t){return Promise.resolve().then(()=>e.resolve(t)).then(e=>e??{},()=>({}))}function P(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 N(e,t){let n=P(t);return n?e.find(e=>"string"==typeof e.value&&P(e.value)===n):void 0}function M(e){return e.label||e.path}function T(e){return[e.path,e.ref,e.value,e.states?.length?`States: ${e.states.join(", ")}`:"",e.description].filter(Boolean).join(" · ")}function L(){let e=document.createElement("span");return e.className="design-token-off",e.setAttribute("role","img"),e}function j(e,t,n){e.title=`Not from a token · ${t||"unset"}${n?` · matches ${M(n)}`:""}`,e.setAttribute("aria-label",e.title)}function z(e,t,n,o){try{if(e.preview)return e.preview(t,n,o)??(()=>{})}catch{return()=>{}}return function(e,t,n){let o=e.style;if(!o)return()=>{};let i=o.getPropertyValue(t),r=o.getPropertyPriority(t);return o.setProperty(t,n,r),()=>{i?o.setProperty(t,i,r):o.removeProperty(t)}}(t,n,o.value)}function D(e,t){return[...w.get(e)??[]].reverse().find(e=>e.property===t)?.token}function O(e){let t=w.get(e);t?.pop()?.undo(),t&&!t.length&&w.delete(e)}function q(e){return!!w.get(e)?.length}function R(e){for(;w.has(e);)O(e)}function V(e){return[...new Set(w.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 B(e){let t=[],n=new Set;for(let o of function(e){let t=new Map;for(let n of w.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,F=new Map,H=new WeakSet,W=new WeakMap;function _(e){return void 0===e?"unset":JSON.stringify(e)??"unset"}var J=new Map;function K(e){if(e)for(let[e,n]of I){let o=t(e);o&&(J.set(e,o.props),o.setProps({...o.props,...Object.fromEntries(n)}))}else for(let[e,n]of J)t(e)?.setProps(n);e||J.clear(),s(e),function(e){if(e!==$){$=e;for(let[t,n]of w)if(e)for(let e of[...n].reverse())e.undo();else for(let e of n)e.undo=z(e.adapter,t,e.property,e.token)}}(e)}function X(e){return!!I.get(e)?.size}function Y(e){let n=t(e),o=n?.definition.textProp,i=n?.definition.props.find(e=>e.name===o);if(!n||!o||"string"!==i?.kind)return null;let r=n.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 G(n,o,i){let r=t(n),a=r?.definition.props.find(e=>e.name===o);return!(!r||r.definition.textProp!==o||"string"!==a?.kind||i.length>500||!e(a,i))&&(r.setProps({...r.props,[o]:i}),!0)}function Q(e,t,n,o){if(n===o){let o=I.get(e);return void(o?.get(t)===n&&!(F.get(e)??[]).some(e=>e.propName===t)&&(o.delete(t),o.size||I.delete(e)))}let i=F.get(e);i||F.set(e,i=[]),i.push({propName:t,before:n,after:o})}function Z(e,t,n){G(e,t,n);let o=I.get(e);o?.get(t)===n&&!(F.get(e)??[]).some(e=>e.propName===t)&&(o.delete(t),o.size||I.delete(e))}function ee(e){return!!e&&!!F.get(e)?.length}function te(e){let n=I.get(e),i=t(e);if(!n?.size||!i)return;let r=o(e),a=[...n].map(([e,t])=>{let n=i.definition.props.find(t=>t.name===e)?.styleProperty,o=i.props[e],a=n&&"string"==typeof o?r?.tokens.find(e=>e.properties.includes(n)&&o===`var(${e.cssVariable})`):void 0;return`- ${e}: ${_(t)} → ${_(o)}${a?` [${a.path}]`:" [custom value]"}`});return["Proposed React prop changes (preview only)",`Component: ${i.definition.name}`,`Source: ${i.definition.source}:${i.definition.line}`,...a,"Preview values use the app's React state callback; inline feedback does not write source files."].join("\n")}function ne(e,o){if(t(e))return null;let i;try{i=o?.components?.identify(e)}catch{}let r=n(e);return i?.name&&(!r||r.root!==i.element&&r.root.contains(i.element))?i:null}var oe=e=>String(e).replace(/\s+/g," ").trim();function ie(e,o){let i=Object.entries(C(o)).map(([e,t])=>`${oe(e)}=${oe(t)}`).join(", "),r=ne(e,o),a=t(e),s=a?{root:e,component:a}:r?void 0:n(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])=>`${oe(e)}=${JSON.stringify(t).replace(/→/g,"\\u2192")}`);return[i&&`Theme: ${i}`,r?.name&&`Component: ${oe(r.name)}${r.source?` (${oe(r.source)})`:""}`,l.length&&`Props: ${l.join(", ")}`].filter(e=>!!e)}function re(e){return[te(e),x(e),B(e)].filter(e=>!!e).join("\n\n")||void 0}function ae(e,n,o){W.get(e)?.abort();let i=new AbortController;W.set(e,i),e.addEventListener("click",e=>{let i=n();if(!i)return;let r=x(i)||q(i);!t(i)&&!r||(e.stopImmediatePropagation(),o(i,re(i)))},{capture:!0,signal:i.signal})}function se(e){return b(e)}function le(e){return h(e)||q(e)}function de(e){k(e)}function pe(e){v(e),R(e)}function ce(e){if(!e||H.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),H.add(e)}function ue(e,t){e.dataset.picker="token",e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false");let n,o=n=>import("./token-picker-XGRBJUNM.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 fe(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 ge(e,t,n,r){let a=o(e);if(!a)return null;let s=m(a,t);if(!s.length)return null;ce(r);let l=document.createElement("span");l.className="design-token-binding",l.setAttribute("data-mode","custom");let c=document.createElement("span");c.className="design-token-icon",c.setAttribute("aria-hidden","true");let h=document.createElement("span");h.className="design-token-chip",h.setAttribute("aria-hidden","true");let b=document.createElement("button");b.type="button",b.className="design-token-detach",b.title="Detach token",b.setAttribute("aria-label",`Detach token from ${t}`),b.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 k=document.createElement("select");k.setAttribute("aria-label",`Style token for ${t}`);let v=document.createElement("small");v.className="design-token-binding__state",v.setAttribute("aria-live","polite");let y=`komo-token-${t}-${Math.random().toString(36).slice(2,8)}`;v.id=y,k.setAttribute("aria-describedby",y);let x=document.createElement("option");x.value="custom",x.textContent="Custom value",k.append(x);for(let e of s){let t=document.createElement("option"),n=i(a,e);t.value=e.path,t.textContent=n?`${e.path} · ${n}`:e.path,k.append(t)}let w=L(),E=e=>({path:e.path,type:e.type,value:i(a,e),properties:e.properties,group:e.path.split(".")[0],ref:e.cssVariable}),$=fe(null,l),C=e=>{k.value=e,k.dispatchEvent(new Event("change"))};ue(k,()=>({tokens:s.map(E),property:t,current:k.value,onSelect:e=>C(e.path)}));let S=()=>{let n=u(a,e,t),o=n?null:f(a,e,t),i="token"===n?.mode?s.find(e=>e.path===n.tokenPath):void 0,r=i??o?.token;k.value=r?.path??"custom",h.textContent=r?.path??"";let d=n?.declaredPath,p=i?"token":o?"connected":d?"override":"custom";l.dataset.mode=p,l.parentElement?.setAttribute("data-token-mode",p),v.textContent="token"===p?d&&d!==i?.path?`Rebound from ${d} · preview`:`Linked to ${i?.path} · preview`:"connected"===p?"Connected "+("inline"===o?.origin?"inline":"from stylesheet"):"override"===p?`Custom override · was ${d}`:"",k.title=v.textContent||"Choose a token",w.hidden="custom"!==p;let c="custom"===p?getComputedStyle(e).getPropertyValue(t).trim():"",g="custom"===p?N(s.map(E),c):void 0;"custom"===p&&j(w,c,g),$.show(g,()=>g&&C(g.path))},A=new MutationObserver(S);A.observe(e,{attributes:!0,attributeFilter:["style"]});let P=new MutationObserver(()=>{l.isConnected||(A.disconnect(),P.disconnect())});return P.observe(l.ownerDocument,{childList:!0,subtree:!0}),k.addEventListener("change",()=>{let o=e.style.getPropertyValue(t),i=s.find(e=>e.path===k.value),r=u(a,e,t);if(i&&r&&i.path===r.declaredPath)g(a,e,t),n(o,e.style.getPropertyValue(t),i.path);else if(i)(i.path!==f(a,e,t)?.token.path||r)&&d(a,e,i,t,{recordHistory:!1})&&n(o,e.style.getPropertyValue(t),i.path);else{let i=l.parentElement?.querySelector("[data-property]")?.value??getComputedStyle(e).getPropertyValue(t).trim(),r=/^-?[\d.]+$/.test(i.trim())&&!/weight|line/.test(t)?`${i.trim()}px`:i;p(a,e,t,r),e.style.setProperty(t,r),n(o,r)}S()}),b.addEventListener("click",()=>{let e=s.find(e=>e.path===k.value),t=l.parentElement?.querySelector("input[data-property]"),n=e&&i(a,e);t&&n&&(t.value="number"===t.type?String(parseFloat(n)):n),k.value="custom",k.dispatchEvent(new Event("change")),l.parentElement?.querySelector("[data-property]")?.focus()}),l.append(h,k,c,b,w,v),queueMicrotask(S),S(),l}function me(e){let t=o(e);return new Set([...t?.elementBindings.get(e)?.keys()??[],...V(e)])}function he(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)=>ge(e,t.property,e=>{o(t,r,e),a()},i));ce(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=>S(e,{...C(t),[o.id]:n.id}).then(e=>({label:Ne(n.label,n.id),values:new Map(e.map(e=>[e.path,e.value]))})))).catch(()=>[])}(c,s);return Promise.all([S(c,C(s)),A(c,e)]).then(([t,n])=>{p((o,i,r,a)=>be(c,e,o.property,t,n[o.property],e=>{l?.(e),a()},i,r,u))},()=>{})}function be(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:N(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=`${M(e)}${e.ref?` · ${e.ref}`:""}${e===c?" · same value":""}`,o.title=T(e),n.append(o)}for(let[e,t]of k)e&&h.append(t);let v=L();void 0!==p&&j(v,p,c);let y=document.createElement("small");y.className="design-token-binding__state",y.setAttribute("aria-live","polite");let x=!1,E=fe(a,u);ue(h,()=>({tokens:o,property:n,current:x?void 0:D(t,n)?.path??(i&&"path"in i?i.path:void 0),themes:l,onSelect:C}));let $=()=>{let e=D(t,n),r=x?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?M(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,y.textContent=s?`${e?"Preview":"Uses"} ${T(s)}`:r?`Uses ${r}`:v.hidden?"":v.title,h.title=y.textContent||"Choose a token",E.show(v.hidden||x?void 0:c,()=>c&&C(c))};function C(a){x=!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=w.get(t);a||w.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:z(e,t,n,o)}),()=>O(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",()=>{x=!0,$(),s?.focus()}),u.append(f,h,g,m,v,y),$(),u}var ke=!1;function ve(e,t,n,i){let r=o(e);if(!r||!r.tokens.length)return null;ce(i);let a=document.createElement("details");a.className="design-group design-theme-group",a.open=ke,a.addEventListener("toggle",()=>{a.isConnected&&(ke=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,s){let d=document.createElement("div");d.className="design-theme-token";let p=document.createElement("span");p.textContent=s&&t.path.slice(s.length+1)||t.path,p.title=`${t.path} · ${r(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 s=null!==r&&a(e,t,r.trim(),f);n.setAttribute("aria-invalid",String(!s)),s&&(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=i(e,t);m.value=o,h&&(h.value=n.toHex(o)),m.removeAttribute("aria-invalid"),k()},k=()=>{v.disabled=!d.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",()=>{l(e,t),b(),o()}),b(),d.append(p,g,v),d}function xe(e,t,n){let i=o(e);i&&p(i,e,t,n)}function we(e,t){let n=o(e);n&&c(n,e,t)}function Ee(e){let n=F.get(e)?.pop(),o=t(e);if(!n||!o)return;o.setProps({...o.props,[n.propName]:n.before});let i=I.get(e);if(i){let t=i.get(n.propName);Object.is(t,n.before)&&i.delete(n.propName),i.size||I.delete(e)}}function $e(){for(let e of[...I.keys()])Te(e);I.clear(),F.clear(),y(),function(){for(let e of[...w.keys()])R(e)}(),Pe()}var Ce,Se=new Map;function Ae(e){try{return String(e.current())}catch{return}}function Pe(){for(let[e,t]of Se)try{Ae(e)!==t&&e.apply(t)}catch{}Se.clear()}var Ne=(e,t)=>e||t.charAt(0).toUpperCase()+t.slice(1);function Me(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=Ae(e),o=Array.isArray(e?.options)?e.options.filter(e=>"string"==typeof e?.id):[];if(void 0===t||o.length<2)continue;let a=Ne(e.label,String(e.id)),s=o=>{let i=Ae(e);if(o!==i){Se.has(e)||Se.set(e,i??t),Ce=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(Ne(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=Ne(e.label,e.id),n.setAttribute("aria-pressed",String(e.id===t)),n.addEventListener("click",()=>s(e.id)),d.append(n)}}Ce===e&&(r=d.querySelector("[aria-pressed=true]")??d),l.append(p,d),i.append(l)}Ce=void 0,i.childElementCount&&(ce(o),e.prepend(i),r?.focus({preventScroll:!0}))}function Te(e){let n=I.get(e),o=t(e);!n?.size||!o||(o.setProps({...o.props,...Object.fromEntries(n)}),I.delete(e),F.delete(e))}function Le(t,n,o,i,r,a){let s=n.definition.props.find(e=>e.name===o);if(!s||!e(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(t);d||I.set(t,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(t);let c=F.get(t);return c||F.set(t,c=[]),c.push({propName:o,before:l,after:i}),n.setProps({...n.props,[o]:i}),a(),!0}function je(e,i,r,a,s){let l=t(e);if(!l){let t=ne(e,s),o=null;try{o=t&&s?.components?.panel?.(t)||null}catch{}return o&&ce(r),o??function(e,t,o){let i=n(e);if(!i)return null;ce(o);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)}ce(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 t of l.definition.props){let n=t.styleProperty,r=document.createElement("label");r.className="design-field design-react-field";let a=document.createElement("span");a.textContent=t.name;let s,p=l.props[t.name];if("enum"===t.kind){let e=document.createElement("select");for(let n of t.values??[]){let t=document.createElement("option");t.value=String(n),t.textContent=String(n),e.append(t)}if(void 0===p&&!t.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"===t.kind?(e.type="checkbox",e.checked=!0===p):"number"===t.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} ${t.name}`),"unsupported"===t.kind)s=document.createElement("input"),s.disabled=!0,s.value=`Read only · ${t.typeLabel}`,s.setAttribute("aria-label",`${l.definition.name} ${t.name}, read only`),r.title=`Inline feedback does not edit ${t.typeLabel} props.`;else{let n=()=>{let n=s instanceof HTMLInputElement&&"checkbox"===s.type?s.checked:s.value,o=n;if("number"===t.kind)o=""===String(n).trim()?void 0:Number(n);else if("enum"===t.kind){let e=(t.values??[]).find(e=>String(e)===n);o=""!==n||t.required?e:void 0}else"boolean"===t.kind&&(o=!0===n);Le(e,l,t.name,o,s,i)};s.addEventListener("change",n)}r.append(a,s);let c=document.createElement("small");if(c.className="design-react-type",c.textContent=`${t.typeLabel}${t.required?" · required":" · optional"}`,r.append(c),r.title||=c.textContent,"string"===t.kind&&n){let a=o(e),d=a?m(a,n):[];if(d.length){let o=document.createElement("span");o.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 ${t.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[t.name]===`var(${e.cssVariable})`);p.value=e?.path??"custom",o.dataset.mode=e?"token":"custom"};p.addEventListener("change",()=>{let o=d.find(e=>e.path===p.value),r=o?`var(${o.cssVariable})`:"string"==typeof l.props[t.name]&&String(l.props[t.name]).startsWith("var(")?e.ownerDocument.defaultView?.getComputedStyle(e).getPropertyValue(n).trim()??"":"string"==typeof l.props[t.name]?l.props[t.name]:"";Le(e,l,t.name,r,s,i)&&u()}),o.append(a,p),r.append(o),u()}}d.append(r)}return d}export{he as attachStyleTokenControls,Me as attachThemeSwitcher,Y as beginReactTextEdit,se as canUndoDesignTokenEdit,ee as canUndoReactProp,Z as cancelReactTextEdit,be as createAdapterTokenControl,ve as createDesignThemePanel,ge as createElementTokenControl,je as createReactPropsPanel,ie as designContext,Q as finishReactTextEdit,le as hasDesignTokenEdit,X as hasReactPropChanges,ae as installCommentCapture,xe as noteDesignTokenOverride,G as previewReactTextEdit,re as proposedDesignChanges,te as proposedReactChanges,pe as resetDesignTokenEdits,$e as resetPreviews,Te as resetReactProps,Pe as restoreThemes,K as showDesignBefore,we as syncDesignTokenBinding,me as tokenBoundProperties,de as undoDesignTokenEdit,Ee as undoReactProp};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DesignSystem, DesignToken, TokenAdapter, TokenUsage } from "./design-system.js";
|
|
2
|
+
import type { ThemeValues } from "./token-picker.js";
|
|
2
3
|
/** Before/After for React prop previews and shared theme values. */
|
|
3
4
|
export declare function showDesignBefore(on: boolean): void;
|
|
4
5
|
export declare function hasReactPropChanges(element: HTMLElement): boolean;
|
|
@@ -36,7 +37,7 @@ export declare function attachStyleTokenControls<T extends {
|
|
|
36
37
|
kind?: string;
|
|
37
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>;
|
|
38
39
|
/** A field's token chip, suggestions and off-token marker, driven by the app's adapter. */
|
|
39
|
-
export declare function createAdapterTokenControl(adapter: TokenAdapter, element: HTMLElement, property: string, tokens: readonly DesignToken[], usage: TokenUsage | undefined, onSwap: (undo: () => void) => void, label?: HTMLElement, input?: HTMLElement): HTMLElement | null;
|
|
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;
|
|
40
41
|
type ThemeFields = Pick<typeof import("./design-panel.js"), "fieldControl" | "fields" | "toHex">;
|
|
41
42
|
/**
|
|
42
43
|
* Shared theme editing stays secondary; per-element token choice lives on each knob.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-I7AUKTXE.js";var e,t=new WeakSet,o=new WeakSet,n=0;function i(n){e&&!e.select.isConnected&&e.close();let i=n.getRootNode();if((i instanceof ShadowRoot||i===document)&&!o.has(i)){o.add(i);let e=document.createElement("style");e.textContent=".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{position:absolute;z-index:20;box-sizing:border-box;width:max-content;max-height:240px;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;padding:4px;border-radius:10px;background:#232323;box-shadow:0 0 0 1px #ffffff14,0 12px 32px #0008;color:#d9d6d1;font-size:11px;font-weight:400;line-height:1.2;text-align:left;cursor:default;transform-origin:top;animation:komo-select-in var(--duration-fast,250ms) var(--ease-smooth-out,cubic-bezier(.22,1,.36,1)) backwards}.komo-select[data-up]{transform-origin:bottom}@keyframes komo-select-in{from{opacity:0;transform:scale(.97)}}@media (prefers-reduced-motion:reduce){.komo-select{animation:none}}.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}}",(i instanceof ShadowRoot?i:document.head).append(e)}if(t.has(n))return;t.add(n);let d=e=>{let t=e.composedPath()[0];return t instanceof HTMLSelectElement&&!t.disabled&&!t.multiple&&!t.dataset.picker?t:null};n.addEventListener("focusin",e=>{let t=d(e);t&&!t.hasAttribute("aria-haspopup")&&(t.setAttribute("aria-haspopup","listbox"),t.setAttribute("aria-expanded","false"))}),n.addEventListener("pointerdown",e=>{a="mouse"===e.pointerType?void 0:e;let t=d(e);!t||e.button||(e.preventDefault(),a||r(t))},!0),n.addEventListener("pointerup",e=>{let t=d(e);t&&a&&!l(e)&&r(t)},!0);for(let e of["mousedown","touchend"])n.addEventListener(e,e=>{d(e)&&e.cancelable&&e.preventDefault()},!0);n.addEventListener("keydown",t=>{let o=d(t);!o||e?.select===o||t.ctrlKey||t.metaKey||["Enter"," ","ArrowDown","ArrowUp"].includes(t.key)&&(t.preventDefault(),s(o))},!0)}var a,l=e=>a&&Math.abs(e.clientY-a.clientY)>10;function r(t){if(e?.select===t)return e.close();a||t.focus(),s(t)}function s(t){e?.close(),a=void 0;let o="komo-select-"+ ++n,i=document.createElement("div");i.className="komo-select",i.id=o,i.setAttribute("role","listbox"),i.setAttribute("aria-label",t.getAttribute("aria-label")??t.title);let r=[],s=(e,t)=>{let n=document.createElement("div");n.id=`${o}-${r.length}`,n.setAttribute("role","option"),n.setAttribute("aria-selected",String(e.selected)),e.disabled&&n.setAttribute("aria-disabled","true"),e.title&&(n.title=e.title);let i=document.createElement("span");i.textContent=e.label,n.append(i),t.append(n),r.push({node:n,option:e})};for(let e of t.children)if(e instanceof HTMLOptionElement)s(e,i);else if(e instanceof HTMLOptGroupElement){let t=document.createElement("div");t.setAttribute("role","group"),t.setAttribute("aria-labelledby",`${o}-g${r.length}`);let n=document.createElement("small");n.id=`${o}-g${r.length}`,n.textContent=e.label,t.append(n);for(let o of e.querySelectorAll("option"))s(o,t);i.append(t)}let d=-1,p=r.flatMap((e,t)=>e.option.disabled?[]:[t]),c=e=>{if(!(e>=0))return;r[d]?.node.removeAttribute("data-active"),d=e;let o=r[e].node;o.toggleAttribute("data-active",!0),t.setAttribute("aria-activedescendant",o.id);let n=o.offsetTop,a=n+o.offsetHeight;n<i.scrollTop?i.scrollTop=n-4:a>i.scrollTop+i.clientHeight&&(i.scrollTop=a-i.clientHeight+4)},f=e=>{let t=p.indexOf(d);c(p[t<0?0:Math.max(0,Math.min(p.length-1,t+e))])},u=e=>{let o=r[e]?.option;h(),o&&!o.disabled&&!o.selected&&(o.selected=!0,t.dispatchEvent(new Event("input",{bubbles:!0,composed:!0})),t.dispatchEvent(new Event("change",{bubbles:!0})))},m=new AbortController,{signal:g}=m;function h(){e?.select===t&&(e=void 0,m.abort(),i.remove(),t.setAttribute("aria-expanded","false"),t.removeAttribute("aria-activedescendant"),t.removeAttribute("aria-controls"))}e={select:t,close:h};let b="",x=0;addEventListener("keydown",e=>{if(!t.isConnected||e.composedPath()[0]!==t)return h();let o=e.key;if(!(e.ctrlKey||e.metaKey||e.altKey&&!o.startsWith("Arrow"))){if("Tab"===o)return h();if("ArrowDown"===o||"ArrowUp"===o)f("ArrowDown"===o?1:-1);else if("Home"===o||"PageUp"===o)c(p[0]);else if("End"===o||"PageDown"===o)c(p[p.length-1]);else if("Escape"===o)h();else if("Enter"===o||" "===o&&!b)u(d);else{if(1!==o.length)return;{b=e.timeStamp-x<1e3?b+o.toLowerCase():o.toLowerCase(),x=e.timeStamp;let t=Math.max(0,p.indexOf(d)+(b[1]?0:1)),n=[...p.slice(t),...p.slice(0,t)].find(e=>r[e].option.label.toLowerCase().startsWith(b));void 0!==n&&c(n)}}e.preventDefault(),e.stopImmediatePropagation()}},{capture:!0,signal:g}),addEventListener("pointerdown",e=>{let o=e.composedPath();!o.includes(i)&&!o.includes(t)&&h()},{capture:!0,signal:g});let v=e=>{e.target!==i&&h()};addEventListener("scroll",v,{capture:!0,signal:g}),t.getRootNode().addEventListener("scroll",v,{capture:!0,signal:g}),addEventListener("resize",h,{signal:g}),t.addEventListener("blur",h,{signal:g}),i.addEventListener("mousedown",e=>e.preventDefault(),{signal:g}),i.addEventListener("pointermove",e=>{let t=e.target.closest?.("[role=option]"),o=r.findIndex(e=>e.node===t);p.includes(o)&&o!==d&&c(o)},{signal:g}),i.addEventListener("click",e=>{if(e.preventDefault(),l(e))return;let t=e.target.closest?.("[role=option]"),o=r.findIndex(e=>e.node===t);p.includes(o)&&u(o)},{signal:g});let w=t.closest(".design-field")??t.parentElement;w.append(i),t.setAttribute("aria-haspopup","listbox"),t.setAttribute("aria-expanded","true"),t.setAttribute("aria-controls",o);let E=(t.offsetWidth<60?w:t).getBoundingClientRect(),k=function(e){let t={top:0,left:0,bottom:innerHeight,right:innerWidth};for(let o=e.parentElement;o;o=o.parentElement)if(/auto|scroll|hidden/.test(getComputedStyle(o).overflowY)){let e=o.getBoundingClientRect();return{top:Math.max(e.top,0),left:Math.max(e.left,0),bottom:Math.min(e.bottom,t.bottom),right:Math.min(e.right,t.right)}}return t}(w),A=(i.offsetParent??w).getBoundingClientRect(),y=Math.min(Math.max(E.width,i.offsetWidth+2,120),k.right-k.left-8),L=k.bottom-E.bottom-8,M=E.top-k.top-8,C=i.scrollHeight,T=C>L&&M>L,D=Math.max(T?M:L,60),H=Math.min(C,240,D);i.style.width=`${y}px`,i.style.maxHeight=`${Math.min(240,D)}px`,i.style.left=Math.max(k.left+4,Math.min(E.left,k.right-y-4))-A.left+"px",i.style.top=(T?E.top-H-4:E.bottom+4)-A.top+"px",i.toggleAttribute("data-up",T),c(r.findIndex(e=>e.option.selected&&!e.option.disabled)),d<0&&f(0)}export{i as attach};
|
package/dist/token-adapter.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare function listTokens(adapter: TokenAdapter, theme?: ThemeState): P
|
|
|
7
7
|
export declare function resolveTokens(adapter: TokenAdapter, element: Element): Promise<Record<string, TokenUsage>>;
|
|
8
8
|
/** Tokens suggested for one CSS property, in list order. */
|
|
9
9
|
export declare function tokensFor(tokens: readonly DesignToken[], property: string): DesignToken[];
|
|
10
|
-
/** The token whose value is exactly the off-token value
|
|
10
|
+
/** The token whose value is exactly the off-token value, colors compared by channel. */
|
|
11
11
|
export declare function closestToken(tokens: readonly DesignToken[], value: string): DesignToken | undefined;
|
|
12
12
|
export declare function tokenName(token: DesignToken): string;
|
|
13
13
|
/** Tooltip text: path, ref, value and states; states are shown, never previewed. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-I7AUKTXE.js";var e,t=new WeakSet,o=0;function n(e){return e.label||e.path.slice(e.path.lastIndexOf(".")+1)||e.path}function r(e){let t=/^(-?[\d.]+)(px|r?em)?$/.exec(e.trim());return t?parseFloat(t[1])*(t[2]?"px"===t[2]?1:16:1):void 0}var i=(e,t,o)=>Math.min(o,Math.max(t,e));function a(e,t,o,a){let l=document.createElement("div");l.id=t,l.setAttribute("role","option"),l.setAttribute("aria-selected",String(o));let s=document.createElement("span");s.className="komo-tokens__name";let p=document.createElement("span");p.textContent=n(e),s.append(p);for(let t of e.states??[]){let e=document.createElement("i");e.textContent=t,s.append(e)}let d=document.createElement("span");d.className="komo-tokens__meta";let f="typography"===e.type?function(e){let t=e.trim().split(/\s+/);return[t.find(e=>/^(\d{3}|bold|bolder|lighter)$/.test(e)),t.find(e=>/^[\d.]+(px|r?em|pt|%)(\/\S+)?$/.test(e))].filter(Boolean).join(" · ")||e}(e.value??""):e.value??"";for(let t of[e.ref,f]){if(!t)continue;let e=document.createElement("span");e.textContent=t,d.append(e)}if(l.append(function(e,t){let o=document.createElement("span");o.className="komo-tokens__pv",o.setAttribute("aria-hidden","true");let n=e=>{let t=document.createElement("span");return t.className=`komo-tokens__${e}`,o.append(t),t},a=e.value??"",{type:l}=e;if("color"===l){let o=n("sw"),r=t.map(t=>t.values.get(e.path)).filter(e=>!!e);for(let e of new Set(r).size>1?r:[a]){let t=document.createElement("span");t.style.background=e,o.append(t)}}else if("dimension"===l||"letterSpacing"===l){let t=r(a);if(void 0===t)return o;let l=/radius/.test(`${e.path} ${e.properties?.join(" ")}`),s=n(l?"corner":"dim");l?s.style.borderTopLeftRadius=`${i(t,0,12)}px`:s.style.width=`${i(t/2,2,24)}px`}else if("shadow"===l)n("shadow").style.boxShadow=a;else if("typography"===l||"fontWeight"===l||"fontFamily"===l){let e=n("ag");if(e.textContent="Ag","typography"===l){e.style.font=a;let t=r(a.split(/\s+/).find(e=>/^[\d.]+(px|r?em)(\/|$)/.test(e))?.split("/")[0]??"");e.style.fontSize=`${i(t??13,10,16)}px`,e.style.lineHeight="1"}else"fontWeight"===l?e.style.fontWeight=a:e.style.fontFamily=a}return o}(e,a),s,d),e.description){let t=document.createElement("span");t.className="komo-tokens__desc",t.textContent=e.description,l.append(t)}let c=a.flatMap(t=>{let o=t.values.get(e.path);return o&&"color"===e.type?[`${t.label} ${o}`]:[]});return l.title=[e.path,e.ref,c.length>1?c.join(", "):e.value,e.states?.length?`States: ${e.states.join(", ")}`:"",e.description].filter(Boolean).join(" · "),l}function l(t){return e?.trigger===t}function s(t){l(t.trigger)?e.close(!0):p(t)}function p(r){e?.close();let{trigger:l,tokens:s,property:p}=r,d=l.getRootNode();if((d instanceof ShadowRoot||d===document)&&!t.has(d)){t.add(d);let e=document.createElement("style");e.textContent=".komo-tokens{position:absolute;z-index:20;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden;border-radius:10px;background:#232323;box-shadow:0 0 0 1px #ffffff14,0 12px 32px #0008;color:#d9d6d1;font-size:11px;font-weight:400;line-height:1.25;text-align:left;cursor:default;transform-origin:top;animation:komo-tokens-in var(--duration-fast,250ms) var(--ease-smooth-out,cubic-bezier(.22,1,.36,1)) backwards}.komo-tokens[data-up]{transform-origin:bottom}@keyframes komo-tokens-in{from{opacity:0;transform:scale(.97)}}@media (prefers-reduced-motion:reduce){.komo-tokens{animation:none}}.komo-tokens__bar{display:flex;gap:4px;padding:6px 6px 2px}.komo-tokens__bar input{flex:1;min-width:0;height:28px;box-sizing:border-box;margin:0;padding:0 8px;border:0;border-radius:6px;outline:0;box-shadow:none;background:#ffffff0a;color:#f1efeb;font:inherit}.komo-tokens__bar input::placeholder{color:#77736f}.komo-tokens__bar input:focus{outline:0;box-shadow:inset 0 0 0 1px #bda6ef}.komo-tokens__bar button{flex:none;height:28px;padding:0 8px;border:0;border-radius:6px;background:none;color:#898680;font:inherit;white-space:nowrap;cursor:pointer}.komo-tokens__bar button:hover{background:#ffffff0f;color:#f1efeb}.komo-tokens__bar button[aria-pressed=true]{background:#bda6ef24;color:#e6dcfb}.komo-tokens__bar button:focus-visible{outline:1px solid #bda6ef;outline-offset:-1px}.komo-tokens [role=listbox]{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin;padding:0 4px 4px}.komo-tokens small{position:sticky;top:0;z-index:1;display:block;padding:8px 8px 4px;background:#232323;color:#77736f;font-size:10px;font-weight:500}.komo-tokens [role=option]{display:grid;grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:1px 8px;box-sizing:border-box;min-height:28px;padding:4px 8px;border-radius:6px;cursor:pointer}.komo-tokens [data-active]{background:#ffffff14;color:#f1efeb}.komo-tokens__name{display:flex;align-items:center;gap:4px;min-width:0}.komo-tokens__name>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.komo-tokens__name>span{flex:none;max-width:100%}.komo-tokens__name>i{min-width:0;padding:1px 4px;border-radius:4px;background:#ffffff0d;color:#898680;font-size:9px;font-style:normal}.komo-tokens__desc{grid-column:2/-1;overflow:hidden;color:#77736f;font-size:10px;text-overflow:ellipsis;white-space:nowrap}.komo-tokens__meta{display:flex;align-items:center;gap:6px;max-width:160px;min-width:0;color:#77736f;font-size:10px;font-variant-numeric:tabular-nums;white-space:nowrap}.komo-tokens__meta span{overflow:hidden;text-overflow:ellipsis}.komo-tokens__meta span+span{flex:none;max-width:90px;color:#898680}.komo-tokens [aria-selected=true] .komo-tokens__meta::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-tokens__pv{display:flex;align-items:center;height:16px;overflow:hidden}.komo-tokens__sw{display:flex;width:16px;height:16px;border-radius:4px;overflow:hidden;background:repeating-conic-gradient(#ffffff40 0 25%,#ffffff0d 0 50%) 0 0/8px 8px;outline:1px solid #ffffff1f;outline-offset:-1px}.komo-tokens__sw>span{flex:1}.komo-tokens__dim{height:4px;min-width:2px;border-radius:2px;background:#bda6ef}.komo-tokens__corner{width:12px;height:12px;box-sizing:border-box;border:solid #bda6ef;border-width:1.5px 0 0 1.5px}.komo-tokens__shadow{width:16px;height:12px;margin-left:2px;border-radius:3px;background:#f1efeb}.komo-tokens__ag{color:#f1efeb;font-size:13px;line-height:1;white-space:nowrap}.komo-tokens__empty{padding:12px 8px;color:#77736f}@media (pointer:coarse){.komo-tokens{font-size:13px}.komo-tokens [role=option]{min-height:40px}.komo-tokens__bar input,.komo-tokens__bar button{height:36px}}",(d instanceof ShadowRoot?d:document.head).append(e)}let f="komo-tokens-"+ ++o,c=document.createElement("div");c.className="komo-tokens";let m=document.createElement("div");m.className="komo-tokens__bar";let u=document.createElement("input");u.type="text",u.placeholder="Search tokens",u.autocomplete="off",u.spellcheck=!1,u.setAttribute("role","combobox"),u.setAttribute("aria-expanded","true"),u.setAttribute("aria-controls",f),u.setAttribute("aria-autocomplete","list"),u.setAttribute("aria-label",`Search tokens for ${p}`);let g=document.createElement("div");g.id=f,g.setAttribute("role","listbox"),g.setAttribute("aria-label",`Tokens for ${p}`);let h=s.filter(e=>e.properties?.includes(p)),x=!h.length,k=document.createElement("button");k.type="button",k.textContent="Show all",k.title=`Show all ${s.length} tokens, not only ${p} tokens`,m.append(u),h.length&&h.length<s.length&&m.append(k),c.append(m,g);let b,w=new Map(s.map(e=>[e,`${n(e)} ${e.label??""} ${e.path} ${e.ref??""} ${e.value??""}`.toLowerCase()])),v=[],_=[],y=0,E=-1,$=g,A=e=>{for(;y<Math.min(e,_.length);y++){let{token:e,group:t}=_[y];if(t!==b&&(b=t,$=g,t)){$=document.createElement("div"),$.setAttribute("role","group");let e=document.createElement("small");e.id=`${f}-g${y}`,e.textContent=t,$.setAttribute("aria-labelledby",e.id),$.append(e),g.append($)}$.append(a(e,`${f}-${y}`,e.path===r.current,v))}},C=e=>g.querySelector(`#${f}-${e}`),S=(e,t=!0)=>{if(e<0||e>=_.length)return;A(e+60),C(E)?.removeAttribute("data-active"),E=e;let o=C(e);if(o.toggleAttribute("data-active",!0),u.setAttribute("aria-activedescendant",o.id),!t)return;let n=o.offsetTop-(o.parentElement===g?0:o.parentElement.firstElementChild.offsetHeight),r=o.offsetTop+o.offsetHeight;n<g.scrollTop?g.scrollTop=n-4:r>g.scrollTop+g.clientHeight&&(g.scrollTop=r-g.clientHeight+4)},T=()=>{let e=u.value.toLowerCase().split(/\s+/).filter(Boolean),t=x?s:h,o=e.length?t.filter(t=>e.every(e=>w.get(t).includes(e))):t,n=!e.length&&r.current?o.find(e=>e.path===r.current):void 0,i=new Map([["",[]]]);for(let e of o){if(e===n)continue;let t=e.group??"";i.set(t,[...i.get(t)??[],e])}if(_=[...n?[{token:n,group:"Current"}]:[],...[...i].flatMap(([e,t])=>t.map(t=>({token:t,group:e})))],g.replaceChildren(),g.scrollTop=0,y=0,E=-1,b=void 0,u.removeAttribute("aria-activedescendant"),k.setAttribute("aria-pressed",String(x)),!_.length){let t=document.createElement("div");return t.className="komo-tokens__empty",t.textContent=e.length?"No matching tokens":"No tokens",void g.append(t)}A(60),S(0,!1)},z=new AbortController,{signal:L}=z,M=!!globalThis.matchMedia?.("(pointer:coarse)")?.matches;function N(t=!1){e?.trigger===l&&(e=void 0,z.abort(),c.remove(),l.setAttribute("aria-expanded","false"),l.removeAttribute("aria-controls"),t&&l.isConnected&&l.focus({preventScroll:!0}))}e={trigger:l,close:N};let P=e=>{let t=_[e]?.token;t&&(N(!0),r.onSelect(t))};u.addEventListener("input",T,{signal:L}),k.addEventListener("click",()=>{x=!x,T(),M||u.focus({preventScroll:!0})},{signal:L}),addEventListener("keydown",e=>{if(!l.isConnected)return N();let t=e.composedPath();if(!t.includes(c)&&!t.includes(l))return;let{key:o}=e;if(!(e.ctrlKey||e.metaKey||e.altKey)){if("Escape"===o)N(!0);else{if("Tab"===o)return N();if(t[0]!==u)return;if("ArrowDown"===o||"ArrowUp"===o)S(i(E+("ArrowDown"===o?1:-1),0,_.length-1));else if("PageDown"===o||"PageUp"===o)S(i(E+("PageDown"===o?8:-8),0,_.length-1));else{if("Enter"!==o)return;P(E)}}e.preventDefault(),e.stopImmediatePropagation()}},{capture:!0,signal:L}),addEventListener("pointerdown",e=>{let t=e.composedPath();!t.includes(c)&&!t.includes(l)&&N()},{capture:!0,signal:L});let H=e=>{e.target===g?g.scrollTop+g.clientHeight>g.scrollHeight-200&&A(y+60):e.target instanceof Node&&c.contains(e.target)||N()};addEventListener("scroll",H,{capture:!0,signal:L}),d.addEventListener("scroll",H,{capture:!0,signal:L}),addEventListener("resize",()=>N(),{signal:L}),g.addEventListener("mousedown",e=>e.preventDefault(),{signal:L});let D=e=>{let t=e.target.closest?.("[role=option]");return t?Number(t.id.slice(f.length+1)):-1};g.addEventListener("pointermove",e=>{let t=D(e);t>=0&&t!==E&&S(t,!1)},{signal:L}),c.addEventListener("click",e=>{e.target!==u&&e.preventDefault();let t=D(e);t>=0&&P(t)},{signal:L}),T();let R=l.closest(".design-field")??l.parentElement;R.append(c),l.setAttribute("aria-expanded","true"),l.setAttribute("aria-controls",f);let j=R.getBoundingClientRect(),B=function(e){let t={top:0,left:0,bottom:innerHeight,right:innerWidth};for(let o=e.parentElement;o;o=o.parentElement)if(/auto|scroll|hidden/.test(getComputedStyle(o).overflowY)){let e=o.getBoundingClientRect();return{top:Math.max(e.top,0),left:Math.max(e.left,0),bottom:Math.min(e.bottom,t.bottom),right:Math.min(e.right,t.right)}}return t}(R),W=(c.offsetParent??R).getBoundingClientRect(),I=i(B.right-B.left-8,120,340),K=B.bottom-j.bottom-8,F=j.top-B.top-8,U=K<240&&F>K,O=Math.min(320,Math.max(U?F:K,120));if(c.style.width=`${I}px`,c.style.maxHeight=`${O}px`,c.style.left=i(j.left,B.left+4,B.right-I-4)-W.left+"px",c.style.top=U?"":j.bottom+4-W.top+"px",c.style.bottom=U?W.bottom-j.top+4+"px":"",c.toggleAttribute("data-up",U),r.current){let e=_.findIndex(e=>e.token.path===r.current);e>=0&&S(e)}return M||u.focus({preventScroll:!0}),Promise.resolve(r.themes?.()).then(t=>{if(!t||t.length<2||e?.trigger!==l)return;v=t;let o=E,n=g.scrollTop,r=y;g.replaceChildren(),y=0,b=void 0,A(r),g.scrollTop=n,S(o,!1)},()=>{}),()=>N()}export{l as isTokenPickerOpen,p as openTokenPicker,s as toggleTokenPicker,n as tokenLabel};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DesignToken } from "./design-system.js";
|
|
2
|
+
/** One theme option's resolved values, path → value, for split color swatches. */
|
|
3
|
+
export interface ThemeValues {
|
|
4
|
+
label: string;
|
|
5
|
+
values: ReadonlyMap<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface TokenPickerOptions {
|
|
8
|
+
/** The control that opened the picker; focus returns to it. */
|
|
9
|
+
trigger: HTMLElement;
|
|
10
|
+
/** Every token the picker may offer. */
|
|
11
|
+
tokens: readonly DesignToken[];
|
|
12
|
+
/** The field's CSS property: tokens whose `properties` include it are shown by default. */
|
|
13
|
+
property: string;
|
|
14
|
+
/** Path of the token the field uses now, pinned at the top. */
|
|
15
|
+
current?: string;
|
|
16
|
+
/** Values per theme option, for split swatches; resolved lazily. */
|
|
17
|
+
themes?: () => Promise<ThemeValues[]> | ThemeValues[] | undefined;
|
|
18
|
+
onSelect(token: DesignToken): void;
|
|
19
|
+
}
|
|
20
|
+
/** The row's name: `label`, else the last path segment, since the group heading names the rest. */
|
|
21
|
+
export declare function tokenLabel(token: DesignToken): string;
|
|
22
|
+
export declare function isTokenPickerOpen(trigger: HTMLElement): boolean;
|
|
23
|
+
/** Open the picker for `trigger`, or close it when it is already open there. */
|
|
24
|
+
export declare function toggleTokenPicker(options: TokenPickerOptions): void;
|
|
25
|
+
export declare function openTokenPicker(options: TokenPickerOptions): () => void;
|