tweakit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -67,10 +67,15 @@ export type SchemaObject = {
67
67
  step?: number;
68
68
  } | {
69
69
  type: "spring";
70
+ mode?: "time" | "physics";
71
+ visualDuration?: number;
72
+ bounce?: number;
70
73
  stiffness?: number;
71
74
  damping?: number;
72
75
  mass?: number;
73
76
  value?: {
77
+ visualDuration?: number;
78
+ bounce?: number;
74
79
  stiffness?: number;
75
80
  damping?: number;
76
81
  mass?: number;
@@ -224,6 +229,26 @@ export interface TweaksOptions {
224
229
  export type Params = Record<string, any> & {
225
230
  _last?: string;
226
231
  };
232
+ /** The whole-panel state `toJSON()` returns / `fromJSON()` accepts: every control value
233
+ * (nested to mirror folders/tabs) plus UI state — which folders are collapsed and which
234
+ * tab is active. JSON-safe; persist it however you like. Both `values` and `ui` are
235
+ * optional on the way in, so `fromJSON({ values })` restores values only and
236
+ * `fromJSON({ ui })` restores chrome only. (Panel collapse + floating position are not
237
+ * captured — position has its own `opts.persist` channel.) */
238
+ export interface PanelState {
239
+ /** Every control value, **nested** to mirror folders/tabs (e.g. `{ shadow: { radius: 16 } }`)
240
+ * — not the dotted form `set()`/`setMany()` take. `fromJSON` matches by that nested path and
241
+ * skips keys with no matching control. Normally you pass back what `toJSON()` produced. */
242
+ values?: Record<string, any>;
243
+ ui?: {
244
+ /** Folder collapse state → `true` when collapsed. Keys are the folder's path with each
245
+ * segment JSON-pointer-escaped (`.`→`~0`, `~`→`~1`) then joined by `.` — injective, so a
246
+ * literal dot in a key can't collide with the nesting separator. Treat keys as opaque. */
247
+ folders?: Record<string, boolean>;
248
+ /** Active tab → the active page's key, under the tabs control's path (escaped as above). */
249
+ tabs?: Record<string, string | null>;
250
+ };
251
+ }
227
252
  /** The panel object `tweaks()` returns. */
228
253
  export interface Panel {
229
254
  /** The panel root element — append it to the DOM. */
@@ -238,8 +263,25 @@ export interface Panel {
238
263
  * ("folder.child", "tabs.page.child"); a bare key also reaches a nested control
239
264
  * when it's unambiguous. A key matching no control is stored on `params` as-is. */
240
265
  set(key: string, value: unknown): void;
266
+ /** Set several controls at once — a flat map of keys (dotted for nested controls), e.g.
267
+ * `setMany({ "shadow.radius": 28, blur: 48 })`. Resolves each key like `set()`, then fires
268
+ * listeners + persists ONCE for the whole batch, where N separate `set()` calls would fire
269
+ * N times. Unknown / ambiguous / reserved keys warn and are skipped. */
270
+ setMany(values: Record<string, unknown>): void;
241
271
  /** Reset every control to its default (or run `opts.onReset`). */
242
272
  reset(): void;
273
+ /** Serialize the whole panel — every control value plus UI state (collapsed folders,
274
+ * active tabs) — to a plain JSON-safe object, independent of localStorage/presets. Hand
275
+ * it to your own storage: a file, a query string / share link, a server. `JSON.stringify`
276
+ * on the panel calls this too. Most meaningful once `ready` (lazy controls have built). */
277
+ toJSON(): PanelState;
278
+ /** Restore a panel from a `toJSON()` object: values are applied where their path still
279
+ * exists (missing ones skipped, like loading a preset), then folder/tab UI state. Fires
280
+ * listeners once. Both halves are optional — pass `{ values }` to restore values only, or
281
+ * `{ ui }` to restore chrome only. The value restore is undoable (one history step); the
282
+ * UI restore is intentionally outside undo, so a Cmd-Z reverts values without thrashing
283
+ * folders/tabs. */
284
+ fromJSON(state: PanelState): void;
243
285
  /** Re-theme the panel live; `null` reverts to the default. */
244
286
  setTheme(theme?: Theme | null): void;
245
287
  /** Save the current values as a named preset (needs `opts.persist`). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tweakit",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "A dependency-free, code-split real-time parameter panel — sliders, toggles, a wide-gamut OKLCH colour picker, curve editors and more, from a plain schema.",
6
6
  "license": "MIT",
@@ -40,12 +40,16 @@
40
40
  "types": "./dist/types/tweaks/core.d.ts",
41
41
  "import": "./dist/tweaks/core.js"
42
42
  },
43
- "./css": "./dist/tweaks.css"
43
+ "./css": {
44
+ "types": "./dist/tweaks.css.d.ts",
45
+ "default": "./dist/tweaks.css"
46
+ }
44
47
  },
45
48
  "files": [
46
49
  "dist/tweaks",
47
50
  "dist/tweaks.js",
48
51
  "dist/tweaks.css",
52
+ "dist/tweaks.css.d.ts",
49
53
  "dist/types",
50
54
  "THIRD-PARTY-NOTICES.md"
51
55
  ],
@@ -1 +0,0 @@
1
- import{M as K,O,b as N,j as C,k as a,l as L,q as k,r as q,u as J}from"./chunk-GJESM23Q.js";function U(Y,M){let P=[.25,.1,.25,1],s=Array.isArray(Y.value)&&Y.value.length===4?Y.value.map(Number):P.slice();s.some(e=>!Number.isFinite(e))&&(s=P.slice());let d=-.25,A=1.25,R=A-d,l=8,B=C("div","tw-bezier"),b=C("div","tw-bezier-graph"),m=a("svg","tw-bezier-svg");m.setAttribute("preserveAspectRatio","none");let X=a("line","tw-bezier-guide"),G=a("line","tw-bezier-guide"),H=a("line","tw-bezier-diag"),W=a("line","tw-bezier-ctl"),S=a("line","tw-bezier-ctl"),I=a("path","tw-bezier-curve");m.append(X,G,H,W,S,I);let g=L("tw-bezier-handle");g.setAttribute("aria-label","Control point 1");let f=L("tw-bezier-handle");f.setAttribute("aria-label","Control point 2"),b.append(m,g,f);let T=C("div","tw-fields tw-bezier-fields");B.append(b,T);let p=0,z=0,$=e=>l+e*(p-2*l),F=e=>z-l-(e-d)/R*(z-2*l),w=(e,i,t,o,r)=>{e.setAttribute("x1",i),e.setAttribute("y1",t),e.setAttribute("x2",o),e.setAttribute("y2",r)},h=()=>{if(p=b.offsetWidth,z=b.offsetHeight,p<2)return;m.setAttribute("viewBox",`0 0 ${p} ${z}`);let[e,i,t,o]=s,r=$(0),n=F(0),c=$(1),u=F(1),y=$(e),x=F(i),v=$(t),D=F(o);w(X,l,n,p-l,n),w(G,l,u,p-l,u),w(H,r,n,c,u),w(W,r,n,y,x),w(S,c,u,v,D),I.setAttribute("d",`M${r},${n} C${y},${x} ${v},${D} ${c},${u}`),g.style.left=y+"px",g.style.top=x+"px",f.style.left=v+"px",f.style.top=D+"px"},E=[{label:"X1",i:0,lo:0,hi:1},{label:"Y1",i:1,lo:d,hi:A},{label:"X2",i:2,lo:0,hi:1},{label:"Y2",i:3,lo:d,hi:A}],Q=E.map(e=>{let i=K({label:e.label,value:s[e.i],step:.01,min:e.lo,max:e.hi},t=>{s[e.i]=t,h(),M(s.slice())});return T.append(i.el),i}),V=()=>Q.forEach((e,i)=>e.set(s[E[i].i])),j=(e,i)=>{let t=null,o=0,r=0,n=1;J(e,{onDown:c=>{c.preventDefault(),t=b.getBoundingClientRect(),o=b.offsetWidth||t.width,r=b.offsetHeight||t.height,n=t.width/o,e.classList.add("is-dragging"),e.focus({focusVisible:!1})},onMove:c=>{let u=(c.clientX-t.left)/n,y=(c.clientY-t.top)/n,x=N((u-l)/(o-2*l),0,1),v=N(d+(r-l-y)/(r-2*l)*R,d,A);s[i*2]=+x.toFixed(2),s[i*2+1]=+v.toFixed(2),h(),V(),M(s.slice())},onEnd:()=>{t=null,e.classList.remove("is-dragging")}})};return j(g,0),j(f,1),k(h),q(B,[[window,"resize"],[window,"tw-reflow"]],h),{el:B,set:e=>{if(Array.isArray(e)&&e.length===4){let i=e.map(Number);if(i.some(t=>!Number.isFinite(t)))return;s=i.map((t,o)=>N(t,E[o].lo,E[o].hi)),h(),V()}},get:()=>s.slice()}}O("cubicbezier",U);
@@ -1 +0,0 @@
1
- var S=t=>t.replace(/([A-Z])/g," $1").replace(/^./,e=>e.toUpperCase()).trim(),g=(t,e,n)=>Math.min(n,Math.max(e,t)),K=t=>typeof t=="string"&&(/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(t.trim())||/^(oklch|oklab|rgba?|hsla?|hwb|lab|lch|color)\(/i.test(t.trim())),E=t=>{let e=String(t),n=/e-(\d+)$/i.exec(e);if(n)return Number(n[1])+(e.split("e")[0].split(".")[1]||"").length;let r=e.indexOf(".");return r===-1?0:e.length-r-1},F=(t,e,n)=>n>0?Number((e+Math.round((t-e)/n)*n).toFixed(E(n))):t,U=(t,e)=>{let n=e-t;return n<=1?.01:n<=10?.1:n<=100?1:10},Y=t=>t>=0?[0,t<=1?1:t*3||100]:[t>=-1?-1:t*3,0],L=t=>t==null?void 0:typeof t=="object"?t.value:t,I=t=>t==null?"":typeof t=="string"?S(t):typeof t=="object"?t.label??String(t.value):String(t),P="http://www.w3.org/2000/svg",p=(t,e,n)=>{let r=document.createElement(t);return e&&(r.className=e),n!=null&&(r.innerHTML=n),r},Z=(t,e)=>{let n=document.createElementNS(P,t);return e&&n.setAttribute("class",e),n},A=(t,e)=>{let n=p("button",t,e);return n.type="button",n},k=(t,e,n)=>{let r=p(t,e);return r.textContent=n,r},J=(t,e)=>getComputedStyle(t).getPropertyValue(e).trim(),Q=t=>{let e=getComputedStyle(t),n=r=>e.getPropertyValue(r).trim();return n("--tw-accent")||n("--tw-text-primary")||"#fff"},N=t=>["pointerdown","pointermove","pointerup"].forEach(e=>t.addEventListener(e,n=>n.stopPropagation())),tt=t=>{requestAnimationFrame(t),document.fonts&&document.fonts.ready&&document.fonts.ready.then(t)},et=(t,e,n)=>{let r=o=>{if(!t.isConnected)return i();n(o)},i=()=>e.forEach(([o,s])=>o.removeEventListener(s,r));return e.forEach(([o,s])=>o.addEventListener(s,r)),i},nt=(t,e)=>{t.addEventListener("pointerenter",()=>{t.classList.add("is-hover"),e&&e()}),t.addEventListener("pointerleave",()=>t.classList.remove("is-hover"))},y=!1;typeof document<"u"&&(document.addEventListener("pointerdown",()=>{y=!0},!0),document.addEventListener("keydown",()=>{y=!1},!0));var R=t=>{t.addEventListener("focus",()=>t.classList.toggle("tw-focus-quiet",y)),t.addEventListener("blur",()=>t.classList.remove("tw-focus-quiet"))};function T(t,{onDown:e,onMove:n,onEnd:r}={}){let i=null,o=s=>{i===null||s.pointerId!==i||(i=null,r&&r(s))};t.addEventListener("pointerdown",s=>{if(!(s.button!==0||i!==null)){i=s.pointerId;try{t.setPointerCapture(s.pointerId)}catch{}e&&e(s)}}),t.addEventListener("pointermove",s=>{if(s.pointerId===i){if(s.buttons===0)return o(s);n&&n(s)}}),t.addEventListener("pointerup",o),t.addEventListener("pointercancel",o),t.addEventListener("lostpointercapture",o)}var rt=(t,e)=>T(t,{onDown:n=>{t.classList.add("is-grabbing"),e(n)},onMove:e,onEnd:()=>t.classList.remove("is-grabbing")}),it=(t,e)=>{let n=e.getBoundingClientRect();return[g((t.clientX-n.left)/n.width,0,1),g((t.clientY-n.top)/n.height,0,1)]},ot=(t,e,n=1/0)=>{let r=t.getBoundingClientRect(),i=Math.min(window.devicePixelRatio||1,n);return t.width=r.width*i,t.height=r.height*i,e.setTransform(i,0,0,i,0,0),[r.width,r.height]},O=(t,e,{width:n,fallbackH:r=300,gap:i=6,align:o="start",prefer:s="below"}={})=>{let c=t.getBoundingClientRect();n==="match"&&(e.style.width=c.width+"px");let w=n==="match"?c.width:e.offsetWidth||n||0,m=o==="end"?c.right-w:o==="center"?c.left+c.width/2-w/2:c.left;e.style.left=Math.max(8,Math.min(m,window.innerWidth-w-8))+"px";let f=e.offsetHeight||r,d=window.innerHeight-c.bottom,l=c.top,a=f+12,u=d>=a,v=l>=a,M=(s==="above"?v||!u&&l>=d:!u&&(v||l>d))?c.top-f-i:c.bottom+i;e.style.top=g(M,i,window.innerHeight-f-i)+"px"},$={accent:"--tw-accent",onAccent:"--tw-on-accent",base:"--tw-base",dropdownBg:"--tw-dropdown-bg",surface:"--tw-surface",surfaceHover:"--tw-surface-hover",surfaceActive:"--tw-surface-active",border:"--tw-border",borderHover:"--tw-border-hover",selection:"--tw-selection",title:"--tw-text-root",section:"--tw-text-section",text:"--tw-text-primary",label:"--tw-text-label",textMuted:"--tw-text-secondary",textFaint:"--tw-text-tertiary",focus:"--tw-text-focus",success:"--tw-success",danger:"--tw-danger",shadow:"--tw-shadow-dropdown",shadowPanel:"--tw-shadow-panel",shadowPanelLifted:"--tw-shadow-panel-lifted",font:"--tw-font-sans",fontMono:"--tw-font-mono",radius:"--tw-radius",density:"--tw-row-height"},H=new Set(["radius","density"]),b=t=>(t/=255,t<=.03928?t/12.92:((t+.055)/1.055)**2.4),X=t=>{t=String(t).trim();let e=/^#([0-9a-f]{3})$/i.exec(t);if(e)return e[1].split("").map(n=>parseInt(n+n,16));if(e=/^#([0-9a-f]{6})$/i.exec(t),e)return[0,2,4].map(n=>parseInt(e[1].slice(n,n+2),16));if(e=/^rgba?\(([^)]+)\)/i.exec(t),e){let n=e[1].split(/[\s,/]+/).filter(Boolean).map(parseFloat);return[n[0],n[1],n[2]]}return null},_=t=>{let e=X(t);if(!e||e.some(r=>!Number.isFinite(r)))return"#ffffff";let n=.2126*b(e[0])+.7152*b(e[1])+.0722*b(e[2]);return 1.05/(n+.05)>=(n+.05)/.0571?"#ffffff":"#161616"},st=t=>{if(!t||typeof t!="object")return null;let e={};for(let[n,r]of Object.entries(t)){if(n.startsWith("--")){e[n]=String(r);continue}let i=$[n];i&&(e[i]=H.has(n)&&typeof r=="number"?`${r}px`:String(r))}return e["--tw-accent"]&&!e["--tw-on-accent"]&&(e["--tw-on-accent"]=_(e["--tw-accent"])),Object.keys(e).length?e:null},V=(t,e)=>{if(t){if(t._twAppliedVars)for(let n of t._twAppliedVars)t.style.removeProperty(n);if(t._twAppliedVars=e?Object.keys(e):null,e)for(let n in e)t.style.setProperty(n,e[n])}},B=(t,e)=>{let n=e?.closest('[data-tw-scheme="light"]')?"light":e?.closest('[data-tw-scheme="dark"]')?"dark":null;n?t.setAttribute("data-tw-scheme",n):t.removeAttribute("data-tw-scheme")},x=(t,e)=>{V(t,e?.closest(".tw-panel")?._twTheme),B(t,e)},h=null,at=()=>{h&&h()};function ct(t,e,n,r={}){let i=!1,o=null;n.classList.add("tw-portal"),n.addEventListener("pointerdown",u=>e.closest(".tw-panel")?._twEditPointer?.(u),!0),N(n);let s=()=>O(e,n,{width:r.width,fallbackH:r.fallbackH,gap:r.gap,align:r.align}),c=()=>{if(i){if(!t.isConnected)return a();s(),r.onReflow&&r.onReflow()}},w=u=>{!t.contains(u.target)&&!n.contains(u.target)&&a()},m=u=>{u.key==="Escape"&&i&&(a(),e.focus())},f=()=>x(n,t),d=u=>{u.every(v=>v.target===n)||f()},l=()=>{h&&h!==a&&h(),h=a,i=!0,t.classList.add("is-open"),e.setAttribute("aria-expanded","true"),document.body.appendChild(n),x(n,t),window.addEventListener("tw-retheme",f),typeof MutationObserver=="function"&&(o=new MutationObserver(d),o.observe(document.documentElement,{subtree:!0,attributes:!0,attributeFilter:["data-tw-scheme"]})),s(),requestAnimationFrame(()=>{n.classList.add("is-open"),r.onOpen&&r.onOpen(),s()}),requestAnimationFrame(function u(){if(i){if(!t.isConnected)return a();requestAnimationFrame(u)}}),setTimeout(()=>document.addEventListener("pointerdown",w,!0),0),document.addEventListener("keydown",m),window.addEventListener("scroll",c,!0),window.addEventListener("resize",c)},a=()=>{h===a&&(h=null),n.contains(document.activeElement)&&e.focus(),i=!1,t.classList.remove("is-open"),n.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),document.removeEventListener("pointerdown",w,!0),document.removeEventListener("keydown",m),window.removeEventListener("scroll",c,!0),window.removeEventListener("resize",c),window.removeEventListener("tw-retheme",f),o&&(o.disconnect(),o=null),setTimeout(()=>{i||n.remove()},200)};return e.addEventListener("click",()=>i?a():l()),{open:l,close:a,isOpen:()=>i,reflow:c}}var lt=(t,e)=>{if(t=t.toLowerCase(),t.includes(e))return!0;if(e.length<3)return!1;let n=e.length,r=t.length,i=new Array(r+1).fill(0);for(let o=1;o<=n;o++){let s=[o];for(let c=1;c<=r;c++)s[c]=Math.min(i[c]+1,s[c-1]+1,i[c-1]+(e[o-1]===t[c-1]?0:1));i=s}return Math.min(...i)<=(e.length<6?1:2)},j=typeof matchMedia=="function"?matchMedia("(prefers-reduced-motion: reduce)"):{matches:!1},z=(t,e)=>{j.matches||typeof t.animate!="function"||(t.style.transformOrigin=e>0?"left center":"right center",t.animate([{transform:"scaleX(1)"},{transform:"scaleX(1.18)"},{transform:"scaleX(1)"}],{duration:300,easing:"cubic-bezier(0.22, 1, 0.36, 1)"}))},dt=(t,e,n)=>{let r=t.querySelector('[data-active="true"]');if(!r)return;let i=r.offsetLeft,o=r.offsetWidth,s=parseFloat(e.style.left);e.style.left=i+"px",e.style.width=o+"px",n&&Number.isFinite(s)&&s!==i&&z(e,i>s?1:-1)},ut=(t,e)=>t.forEach(n=>{let r=n.dataset.value===String(e);n.dataset.active=String(r),n.setAttribute("aria-checked",String(r)),n.tabIndex=r?0:-1}),ft=(t,e,n)=>{let r=A(t);return r.setAttribute("role","radio"),r.textContent=I(e),r.dataset.value=L(e),r._twVal=L(e),r.addEventListener("click",()=>n(r._twVal)),r},wt=(t,e,n,r=0)=>{switch(t){case"ArrowRight":return(e+1)%n;case"ArrowLeft":return(e-1+n)%n;case"ArrowDown":return r<0?-1:r?e+r<n?e+r:e:(e+1)%n;case"ArrowUp":return r<0?-1:r?e-r>=0?e-r:e:(e-1+n)%n;case"Home":return 0;case"End":return n-1}return-1},mt=(t,e)=>{let n=p("div",t),r=A("tw-trigger");r.setAttribute("aria-expanded","false");let i=p("span","tw-trigger-right");return r.append(k("span","tw-trigger-label",e),i),n.append(r),{root:n,trigger:r,right:i}};function D(){let t=null,e=0,n=0,r=0;return{show(i,o,s){t=p("div","tw-grab-guide tw-portal"),t.innerHTML='<span class="tw-grab-line"></span><span class="tw-grab-dot"></span><span class="tw-grab-arrow"></span><span class="tw-grab-bubble"></span>',e=o,n=i,r=s??i,t.children[1].style.cssText=`left:${i}px;top:${e}px`,document.body.appendChild(t)},move(i,o){t&&(t.children[0].style.cssText=`left:${Math.min(n,i)}px;top:${e}px;width:${Math.abs(i-n)}px`,t.children[2].style.cssText=`left:${i}px;top:${e}px;transform:translate(-50%,-50%) scaleX(${i>=n?1:-1})`,t.children[3].style.cssText=`left:${r}px;top:${e-16}px`,t.children[3].textContent=o)},hide(){t&&(t.remove(),t=null)}}}function G(t,e,n,r,i,o){let s=0,c=0,w=null,m=1,f=D();t.addEventListener("pointerdown",l=>{if(l.button!==0||w!==null)return;l.preventDefault(),w=l.pointerId,s=l.clientX,c=r(),m=1,t.classList.add("is-dragging");try{t.setPointerCapture(l.pointerId)}catch{}let a=e.getBoundingClientRect();f.show(l.clientX,a.top+a.height/2,a.left+a.width/2),f.move(l.clientX,o())}),t.addEventListener("pointermove",l=>{if(l.pointerId!==w)return;if(l.buttons===0){d(l);return}let a=l.shiftKey?10:l.altKey?.1:1;a!==m&&(m=a,s=l.clientX,c=r()),i(c+(l.clientX-s)*n*a),f.move(l.clientX,o())});let d=l=>{w===null||l.pointerId!==w||(w=null,t.classList.remove("is-dragging"),f.hide())};t.addEventListener("pointerup",d),t.addEventListener("pointercancel",d),t.addEventListener("lostpointercapture",d)}function pt(t,e){let n=Number.isFinite(+t.step)&&+t.step>0?+t.step:1,r=E(n),i=+t.min,o=+t.max;if(Number.isFinite(i)&&Number.isFinite(o)&&o<i){let a=i;i=o,o=a}let s=a=>{let u=F(a,Number.isFinite(i)?i:0,n);return t.soft||(Number.isFinite(i)&&(u=Math.max(i,u)),Number.isFinite(o)&&(u=Math.min(o,u))),u},c=s(Number.isFinite(+t.value)?+t.value:0),w=p("div",t.row?"tw-row":"tw-field"),m=p("div","tw-num-wrap"),f=p("span","tw-num-grab",W);f.setAttribute("aria-hidden","true"),f.title="Drag to adjust";let d=p("input","tw-num");d.type="text",d.inputMode="decimal",d.setAttribute("aria-label",t.label),d.value=c.toFixed(r),R(d),m.append(f,d),w.append(k("span",t.row?"tw-row-label":"tw-field-label",t.label),m);let l=(a,u=!0)=>{a=+a,Number.isFinite(a)&&(c=s(a),d.value=c.toFixed(r),u&&e&&e(c))};return d.addEventListener("change",()=>{let a=parseFloat(d.value);l(isNaN(a)?c:a)}),d.addEventListener("keydown",a=>{a.key==="Enter"&&d.blur()}),G(f,m,n,()=>c,l,()=>d.value),{el:w,set:a=>l(a,!1),get:()=>c}}var W='<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M6 4v8M10 4v8"/></svg>',ht=t=>({el:t,set:()=>{},get:()=>{}}),C={},vt=(t,e)=>{C[t]=e},bt=t=>C[t];export{S as a,g as b,K as c,E as d,F as e,U as f,Y as g,L as h,I as i,p as j,Z as k,A as l,k as m,J as n,Q as o,N as p,tt as q,et as r,nt as s,R as t,T as u,rt as v,it as w,ot as x,O as y,st as z,V as A,B,x as C,at as D,ct as E,lt as F,j as G,dt as H,ut as I,ft as J,wt as K,mt as L,pt as M,ht as N,vt as O,bt as P};
@@ -1 +0,0 @@
1
- import{c as a,d as b,e as c,f as d}from"./chunk-EVLD7DUH.js";import"./chunk-GJESM23Q.js";export{a as CHECKER,c as createPickerBody,d as oklchStr,b as parseColor};
@@ -1 +0,0 @@
1
- import{O as f,j as s,l as g,m as u}from"./chunk-GJESM23Q.js";function m(o,v){let t=o.value||"",a=s("div","tw-row tw-image-row"),n=g("tw-image-drop");n.setAttribute("aria-label",`${o.label}: choose an image`);let d=s("span","tw-image-thumb"),c=s("span","tw-image-text");n.append(d,c);let r=s("input","tw-image-input");r.type="file",r.accept="image/*",a.append(u("span","tw-row-label",o.label),n,r);let i=()=>{n.dataset.set=t?"true":"false",d.style.backgroundImage=t?`url("${t}")`:"",c.textContent=t?"Replace":"Drop or choose"},p=e=>{if(!e||!e.type.startsWith("image/"))return;let l=new FileReader;l.onload=()=>{t=String(l.result),i(),v(t)},l.readAsDataURL(e)};return n.addEventListener("click",()=>r.click()),r.addEventListener("change",()=>{r.files[0]&&p(r.files[0])}),a.addEventListener("dragover",e=>{e.preventDefault(),a.dataset.over="true"}),a.addEventListener("dragleave",()=>{a.dataset.over="false"}),a.addEventListener("drop",e=>{e.preventDefault(),a.dataset.over="false",e.dataTransfer.files[0]&&p(e.dataTransfer.files[0])}),i(),{el:a,set:e=>{t=e||"",i()},get:()=>t}}f("image",m);
@@ -1,2 +0,0 @@
1
- import{N as M,O as P,b as R,j as I,m as L,o as q,x as S}from"./chunk-GJESM23Q.js";function J(t){let N=I("div","tw-fps"),k=L("span","tw-fps-val","\u2014"),d=document.createElement("canvas");d.className="tw-fps-canvas",N.append(L("span","tw-fps-label",t.label||"FPS"),k,d);let s=d.getContext("2d"),m=80,i=new Array(m).fill(0),C=120,w=0,r=0,b=0,v=0,E=0,y=!1,a=()=>{[v,E]=S(d,s,2)},l=()=>{if(v){s.clearRect(0,0,v,E),s.strokeStyle=q(N),s.lineWidth=1.5,s.lineJoin="round",s.beginPath();for(let o=0;o<m;o++){let u=i[(w+o)%m],h=o/(m-1)*v,g=E-Math.min(u/C,1)*E;o?s.lineTo(h,g):s.moveTo(h,g)}s.stroke()}},p=o=>{if(!d.isConnected){if(y){window.removeEventListener("resize",a),window.removeEventListener("tw-reflow",a),b=0;return}r=0,b=requestAnimationFrame(p);return}if(y||(y=!0,a()),r){let u=1e3/(o-r);i[w]=u,w=(w+1)%m,k.textContent=Math.round(u),l()}r=o,b=requestAnimationFrame(p)};return requestAnimationFrame(()=>{a(),b=requestAnimationFrame(p)}),window.addEventListener("resize",a),window.addEventListener("tw-reflow",a),M(N)}function W(t){let N=typeof t.get=="function"?t.get:()=>t.value,k=Math.max(30,Number.isFinite(+t.interval)?+t.interval:200),d;try{d=N()}catch{}let s=typeof d=="number",m=t.view==="graph"||s&&t.graph!==!1&&t.view!=="text"&&t.rows==null,i=I("div","tw-fps tw-monitor"),C=L("span","tw-fps-val","\u2014");i.append(L("span","tw-fps-label",t.label||"Monitor"),C);let w=0,r=()=>{},b=!1,v=e=>typeof e=="number"?Number.isInteger(e)?String(e):e.toFixed(t.decimals??2):String(e),E=()=>{w&&clearInterval(w),w=0,window.removeEventListener("resize",r),window.removeEventListener("tw-reflow",r)},y=e=>{w=setInterval(()=>{if(!i.isConnected){b&&E();return}b=!0;let c;try{c=N()}catch{return}e(c)},k)};if(!m&&t.rows){C.remove();let e=Math.max(1,Math.floor(+t.rows)||1),c=I("pre","tw-monitor-buffer");c.style.setProperty("--tw-monitor-rows",e),i.append(c);let F=[];return y(z=>{for(F.push(v(z));F.length>e;)F.shift();c.textContent=F.join(`
2
- `)}),M(i)}if(!m)return y(e=>{C.textContent=v(e)}),M(i);let a=document.createElement("canvas");a.className="tw-fps-canvas",i.append(a);let l=a.getContext("2d"),p=80,o=new Array(p).fill(NaN),u=0,h=0,g=0;r=()=>{[h,g]=S(a,l,2)};let T=()=>{if(h||r(),!h)return;let e=t.min,c=t.max;if(e==null||c==null){let n=1/0,f=-1/0;for(let x of o)Number.isNaN(x)||(x<n&&(n=x),x>f&&(f=x));n===1/0?(n=0,f=1):n===f&&(n-=.5,f+=.5);let A=(f-n)*.1;e==null&&(e=n-A),c==null&&(c=f+A)}let F=c-e||1;l.clearRect(0,0,h,g),l.strokeStyle=q(i),l.lineWidth=1.5,l.lineJoin="round",l.beginPath();let z=!1;for(let n=0;n<p;n++){let f=o[(u+n)%p];if(Number.isNaN(f))continue;let A=n/(p-1)*h,x=g-R((f-e)/F,0,1)*g;z?l.lineTo(A,x):(l.moveTo(A,x),z=!0)}l.stroke()};return y(e=>{typeof e=="number"&&(o[u]=e,u=(u+1)%p,C.textContent=v(e),T())}),requestAnimationFrame(()=>{r(),T()}),window.addEventListener("resize",r),window.addEventListener("tw-reflow",r),M(i)}P("fpsgraph",J);P("monitor",W);
@@ -1 +0,0 @@
1
- import{M as y,O as L,b as R,j as T,n as q,o as A,q as P,r as X,u as _}from"./chunk-GJESM23Q.js";function F(v,b,m,w=64){let e=Math.sqrt(v/m),s=b/(2*Math.sqrt(v*m)),c=Math.min(2.2,9/Math.max(s*e,.5)),d=[];for(let p=0;p<w;p++){let t=p/(w-1)*c,o;if(s<1-1e-4){let l=e*Math.sqrt(1-s*s);o=1-Math.exp(-s*e*t)*(Math.cos(l*t)+s*e/l*Math.sin(l*t))}else if(s<=1+1e-4)o=1-Math.exp(-e*t)*(1+e*t);else{let l=Math.sqrt(s*s-1),r=e*(s+l),g=e*(s-l);o=1-(r*Math.exp(-g*t)-g*Math.exp(-r*t))/(r-g)}d.push(o)}return d}function I(v,b){let m=(n,a,i)=>Number.isFinite(+n)?Math.max(a,+n):i,w=n=>({stiffness:m(n.stiffness,1,300),damping:m(n.damping,.5,26),mass:m(n.mass,.1,1)}),e=w({stiffness:300,damping:26,mass:1,...v.value||{}}),s=T("div","tw-spring"),c=T("div","tw-spring-viz"),d=document.createElement("canvas");d.className="tw-spring-canvas",c.append(d);let p=T("div","tw-fields");s.append(c,p);let t=d.getContext("2d"),o=()=>{let n=c.getBoundingClientRect(),a=Math.max(1,Math.round(n.width)),i=Math.max(1,Math.round(n.height));if(a<2)return;let f=window.devicePixelRatio||1;d.width=a*f,d.height=i*f,t.setTransform(f,0,0,f,0,0),t.clearRect(0,0,a,i);let C=F(e.stiffness,e.damping,e.mass,Math.max(160,Math.round(a*f))),B=Math.max(1.05,...C),M=6,E=u=>M+u/(C.length-1)*(a-2*M),x=u=>i-M-u/B*(i-2*M);t.strokeStyle=q(s,"--tw-surface-active")||"rgba(255,255,255,0.1)",t.lineWidth=1,t.beginPath(),t.moveTo(M,x(1)),t.lineTo(a-M,x(1)),t.stroke(),t.strokeStyle=A(s),t.lineWidth=1.5,t.lineJoin=t.lineCap="round",t.beginPath(),C.forEach((u,S)=>S?t.lineTo(E(S),x(u)):t.moveTo(E(S),x(u))),t.stroke()},l=()=>b({...e}),r={};[["stiffness","Stiffness",1],["damping","Damping",.5],["mass","Mass",.1]].forEach(([n,a,i])=>{r[n]=y({label:a,value:e[n],step:i,min:i},f=>{e[n]=f,o(),l()}),p.append(r[n].el)});let g=1,N=500,z=1,k=40,h=null,D=n=>{if(!h)return;let a=R((n.clientX-h.left)/h.width,0,1),i=R((n.clientY-h.top)/h.height,0,1);e.stiffness=Math.round(g+a*(N-g)),e.damping=Math.round((z+i*(k-z))*10)/10,r.stiffness.set(e.stiffness),r.damping.set(e.damping),o(),l()};return _(c,{onDown:n=>{n.preventDefault(),h=c.getBoundingClientRect(),c.classList.add("is-dragging"),D(n)},onMove:D,onEnd:()=>{h=null,c.classList.remove("is-dragging")}}),P(o),X(d,[[window,"resize"],[window,"tw-reflow"],[matchMedia("(prefers-color-scheme: dark)"),"change"],[window,"tw-retheme"]],o),{el:s,set:n=>{e=w({...e,...n||{}}),Object.keys(r).forEach(a=>r[a].set(e[a])),o()},get:()=>({...e})}}L("spring",I);
@@ -1 +0,0 @@
1
- import{H as w,K as f,O as A,j as r,m as v,q as g}from"./chunk-GJESM23Q.js";var S=0;function $(m){let o=`tw-tabs-${++S}`,b=r("div","tw-tabs"),s=r("div","tw-tabs-bar");s.setAttribute("role","tablist");let c=r("div","tw-tabs-pill");s.append(c);let l=r("div","tw-tabs-pages"),d=[],i=m.pages.map((a,e)=>{let t=v("button","tw-tabs-tab",a.title);t.type="button",t.setAttribute("role","tab"),t.dataset.active=String(e===0),t.setAttribute("aria-selected",String(e===0)),t.tabIndex=e===0?0:-1,t.id=`${o}-tab-${e}`,t.setAttribute("aria-controls",`${o}-page-${e}`);let n=r("div","tw-tabs-page tw-controls");return n.dataset.active=String(e===0),n.setAttribute("role","tabpanel"),n.id=`${o}-page-${e}`,n.setAttribute("aria-labelledby",t.id),d.push(n),l.append(n),t.addEventListener("click",()=>u(e)),s.append(t),t});b.append(s,l);let p=a=>w(s,c,a);function u(a){i.forEach((e,t)=>{e.dataset.active=String(t===a),e.setAttribute("aria-selected",String(t===a)),e.tabIndex=t===a?0:-1}),d.forEach((e,t)=>e.dataset.active=String(t===a)),p(!0),requestAnimationFrame(()=>window.dispatchEvent(new Event("tw-reflow")))}return s.addEventListener("keydown",a=>{let e=i.findIndex(n=>n.dataset.active==="true");if(e<0)return;let t=f(a.key,e,i.length,-1);t<0||(a.preventDefault(),u(t),i[t].focus())}),g(p),{el:b,bodies:d}}A("tabs",$);