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.
- package/README.md +8 -0
- package/dist/tweaks/bezier-4JJDADLM.js +1 -0
- package/dist/tweaks/chunk-K6N3NNAW.js +1 -0
- package/dist/tweaks/{chunk-EVLD7DUH.js → chunk-NMISCM24.js} +1 -1
- package/dist/tweaks/colour-J2FKMVZA.js +1 -0
- package/dist/tweaks/core.js +1 -1
- package/dist/tweaks/{gradient-YEKTFEP4.js → gradient-MV3DECUF.js} +1 -1
- package/dist/tweaks/image-NZPSGN4W.js +1 -0
- package/dist/tweaks/{interval-7OUK7M7J.js → interval-K4JN65W5.js} +1 -1
- package/dist/tweaks/monitor-PUIUETKC.js +2 -0
- package/dist/tweaks/{plot-X5IZM3QU.js → plot-IB2Q2LCO.js} +1 -1
- package/dist/tweaks/{point-23BHLSGI.js → point-UZ77545Q.js} +1 -1
- package/dist/tweaks/spring-IJA5GPVX.js +1 -0
- package/dist/tweaks/tabs-IVS2Y3JA.js +1 -0
- package/dist/tweaks.css +1 -1
- package/dist/tweaks.css.d.ts +3 -0
- package/dist/tweaks.js +3 -3
- package/dist/types/tweaks/shared.d.ts +6 -1
- package/dist/types/tweaks/types.d.ts +42 -0
- package/package.json +6 -2
- package/dist/tweaks/bezier-ZSQNFANZ.js +0 -1
- package/dist/tweaks/chunk-GJESM23Q.js +0 -1
- package/dist/tweaks/colour-W46T6NIC.js +0 -1
- package/dist/tweaks/image-VKNBVMVK.js +0 -1
- package/dist/tweaks/monitor-CY7CABK6.js +0 -2
- package/dist/tweaks/spring-Z2SKXUVV.js +0 -1
- package/dist/tweaks/tabs-CGHJ2VS2.js +0 -1
|
@@ -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.
|
|
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":
|
|
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",$);
|