foss-design 0.6.0 → 0.7.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/dist/cli.js +826 -63
- package/dist/runtime/index.js +56 -8
- package/dist/viewer/assets/{index-D6sHcSw6.js → index-CBCJT9KP.js} +1 -1
- package/dist/viewer/assets/index-CgFWotIU.css +2 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer-lib/index.js +1 -1
- package/dist/viewer-lib/styles.css +4 -0
- package/package.json +1 -1
- package/dist/viewer/assets/index-BL2Cxj98.css +0 -2
package/dist/runtime/index.js
CHANGED
|
@@ -637,6 +637,7 @@ var config = window.__DESIGN__ ?? { key: "", canvas: "", id: "", props: {} };
|
|
|
637
637
|
var embedded = window.parent !== window;
|
|
638
638
|
var query = new URLSearchParams(window.location.search);
|
|
639
639
|
var capture = query.has("capture");
|
|
640
|
+
var frameUrl = location.pathname + location.search + location.hash;
|
|
640
641
|
servePublicFolder(config.public);
|
|
641
642
|
var theme = config.theme ?? (query.get("theme") === "dark" ? "dark" : "light");
|
|
642
643
|
var themeListeners = /* @__PURE__ */ new Set();
|
|
@@ -741,9 +742,14 @@ function watchSize() {
|
|
|
741
742
|
window.addEventListener("load", queue);
|
|
742
743
|
queue();
|
|
743
744
|
}
|
|
745
|
+
var touched = false;
|
|
746
|
+
var inspecting = false;
|
|
747
|
+
var loaded = false;
|
|
748
|
+
var signalled = false;
|
|
749
|
+
var holds = 0;
|
|
744
750
|
var snapshotTimer;
|
|
745
751
|
function scheduleSnapshot() {
|
|
746
|
-
if (!config.snapshots || !embedded || capture) return;
|
|
752
|
+
if (!config.snapshots || !embedded || capture || touched || !signalled) return;
|
|
747
753
|
clearTimeout(snapshotTimer);
|
|
748
754
|
snapshotTimer = setTimeout(() => {
|
|
749
755
|
const run = () => void takeSnapshot();
|
|
@@ -752,6 +758,7 @@ function scheduleSnapshot() {
|
|
|
752
758
|
}, 1800);
|
|
753
759
|
}
|
|
754
760
|
async function takeSnapshot() {
|
|
761
|
+
if (touched) return;
|
|
755
762
|
try {
|
|
756
763
|
const { domToBlob } = await import("modern-screenshot");
|
|
757
764
|
const width = window.innerWidth;
|
|
@@ -763,7 +770,7 @@ async function takeSnapshot() {
|
|
|
763
770
|
type: "image/png",
|
|
764
771
|
backgroundColor: getComputedStyle(document.body).backgroundColor
|
|
765
772
|
});
|
|
766
|
-
if (!blob) return;
|
|
773
|
+
if (!blob || touched) return;
|
|
767
774
|
const [canvas, id] = [config.canvas, config.id].map(encodeURIComponent);
|
|
768
775
|
await fetch(`/api/snapshots/${canvas}/${id}?theme=${theme}&height=${config.autoHeight ? height : ""}`, {
|
|
769
776
|
method: "POST",
|
|
@@ -820,12 +827,31 @@ function keepLinksInFrame() {
|
|
|
820
827
|
const original = history[name].bind(history);
|
|
821
828
|
history[name] = (data, unused, url) => {
|
|
822
829
|
original(data, unused, url);
|
|
823
|
-
if (url === void 0 || url === null) return;
|
|
830
|
+
if (url === void 0 || url === null || !signalled) return;
|
|
824
831
|
const raw = String(url);
|
|
825
832
|
report(new URL(raw, location.href), false, raw, true);
|
|
826
833
|
};
|
|
827
834
|
}
|
|
828
835
|
}
|
|
836
|
+
function signalReady() {
|
|
837
|
+
if (signalled || !loaded || holds > 0) return;
|
|
838
|
+
signalled = true;
|
|
839
|
+
window.__DESIGN_READY__ = true;
|
|
840
|
+
post({ type: "ready" });
|
|
841
|
+
scheduleSnapshot();
|
|
842
|
+
}
|
|
843
|
+
function holdReady() {
|
|
844
|
+
holds++;
|
|
845
|
+
window.__DESIGN_HOLDS__ = holds;
|
|
846
|
+
let released = false;
|
|
847
|
+
return () => {
|
|
848
|
+
if (released) return;
|
|
849
|
+
released = true;
|
|
850
|
+
holds--;
|
|
851
|
+
window.__DESIGN_HOLDS__ = holds;
|
|
852
|
+
requestAnimationFrame(() => requestAnimationFrame(signalReady));
|
|
853
|
+
};
|
|
854
|
+
}
|
|
829
855
|
var booted = false;
|
|
830
856
|
var hmrBound = false;
|
|
831
857
|
var canvasHost = false;
|
|
@@ -833,6 +859,11 @@ function boot() {
|
|
|
833
859
|
if (booted) return;
|
|
834
860
|
booted = true;
|
|
835
861
|
applyTheme(theme);
|
|
862
|
+
if (embedded) {
|
|
863
|
+
const style = document.createElement("style");
|
|
864
|
+
style.textContent = ":where(html, body) { overscroll-behavior: none; }";
|
|
865
|
+
document.head.prepend(style);
|
|
866
|
+
}
|
|
836
867
|
let inspector = null;
|
|
837
868
|
window.addEventListener("message", (event) => {
|
|
838
869
|
const data = event.data;
|
|
@@ -844,6 +875,7 @@ function boot() {
|
|
|
844
875
|
} else if (data.type === "inspect") {
|
|
845
876
|
inspector ??= new FrameInspector(post);
|
|
846
877
|
if (data.tokens) inspector.setTokens(data.tokens);
|
|
878
|
+
inspecting = !!data.on;
|
|
847
879
|
if (data.on) inspector.enable();
|
|
848
880
|
else inspector.disable();
|
|
849
881
|
} else if (data.type === "inspect-select") inspector?.select(data.ref);
|
|
@@ -871,6 +903,19 @@ function boot() {
|
|
|
871
903
|
if (event.key === "Escape" && !event.defaultPrevented) post({ type: "keydown", code: "Escape" });
|
|
872
904
|
});
|
|
873
905
|
const isModifier = (name) => name === "Meta" || name === "Control";
|
|
906
|
+
const touch = (event) => {
|
|
907
|
+
if (!event.isTrusted || inspecting) return;
|
|
908
|
+
touched = true;
|
|
909
|
+
clearTimeout(snapshotTimer);
|
|
910
|
+
};
|
|
911
|
+
window.addEventListener("pointerdown", touch, true);
|
|
912
|
+
window.addEventListener(
|
|
913
|
+
"keydown",
|
|
914
|
+
(event) => {
|
|
915
|
+
if (!isModifier(event.key) && event.key !== "Shift" && event.key !== "Alt") touch(event);
|
|
916
|
+
},
|
|
917
|
+
true
|
|
918
|
+
);
|
|
874
919
|
window.addEventListener(
|
|
875
920
|
"keydown",
|
|
876
921
|
(event) => {
|
|
@@ -893,14 +938,13 @@ function boot() {
|
|
|
893
938
|
recordError(String(reason?.message ?? reason ?? "Unhandled rejection"));
|
|
894
939
|
});
|
|
895
940
|
const ready = () => {
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
scheduleSnapshot();
|
|
941
|
+
loaded = true;
|
|
942
|
+
signalReady();
|
|
899
943
|
};
|
|
900
944
|
const whenBodyReady = () => {
|
|
901
945
|
if (embedded) watchSize();
|
|
902
|
-
const
|
|
903
|
-
void fonts.then(() => requestAnimationFrame(() => requestAnimationFrame(ready)));
|
|
946
|
+
const loaded2 = document.readyState === "complete" ? Promise.resolve() : new Promise((resolve) => window.addEventListener("load", () => resolve(), { once: true }));
|
|
947
|
+
void loaded2.then(() => document.fonts?.ready).then(() => requestAnimationFrame(() => requestAnimationFrame(ready)));
|
|
904
948
|
};
|
|
905
949
|
if (document.body) whenBodyReady();
|
|
906
950
|
else document.addEventListener("DOMContentLoaded", whenBodyReady, { once: true });
|
|
@@ -912,6 +956,9 @@ function hmr(hot) {
|
|
|
912
956
|
post({ type: "updated" });
|
|
913
957
|
scheduleSnapshot();
|
|
914
958
|
});
|
|
959
|
+
hot.on("vite:beforeFullReload", () => {
|
|
960
|
+
History.prototype.replaceState.call(history, history.state, "", frameUrl);
|
|
961
|
+
});
|
|
915
962
|
hot.on("vite:error", (payload) => {
|
|
916
963
|
const err = payload.err;
|
|
917
964
|
recordError(err?.message ?? "Build error");
|
|
@@ -965,6 +1012,7 @@ export {
|
|
|
965
1012
|
boot,
|
|
966
1013
|
go,
|
|
967
1014
|
hmr,
|
|
1015
|
+
holdReady,
|
|
968
1016
|
mount,
|
|
969
1017
|
useScreen,
|
|
970
1018
|
useTheme
|
|
@@ -124,7 +124,7 @@ ${e}</tr>
|
|
|
124
124
|
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+TD(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}},WD=new UD;function GD(e,t){return WD.parse(e,t)}GD.options=GD.setOptions=function(e){return WD.setOptions(e),GD.defaults=WD.defaults,rE(GD.defaults),GD},GD.getDefaults=tE,GD.defaults=nE;function KD(...e){return WD.use(...e),GD.defaults=WD.defaults,rE(GD.defaults),GD}GD.use=KD,GD.walkTokens=function(e,t){return WD.walkTokens(e,t)},GD.parseInline=WD.parseInline,GD.Parser=VD,GD.parser=VD.parse,GD.Renderer=zD,GD.TextRenderer=BD,GD.Lexer=RD,GD.lexer=RD.lex,GD.Tokenizer=LD,GD.Hooks=HD,GD.parse=GD,GD.options,GD.setOptions,GD.walkTokens,GD.parseInline,VD.parse,RD.lex;var qD=new Set([`http:`,`https:`,`mailto:`]);function JD(e){let t=e.replace(/[\u0000- \u007f]/g,``),n=/^([a-z][a-z0-9+.-]*):/i.exec(t)?.[1];return!n||qD.has(`${n.toLowerCase()}:`)}function YD(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var XD=new UD({gfm:!0,breaks:!1},{renderer:{html:({text:e})=>YD(e),link(e){return!JD(e.href)&&this.parser.parseInline(e.tokens)},image(e){return!JD(e.href)&&YD(e.text)}}});function ZD(e){return XD.parse(e,{async:!1}).replace(/<a href=/g,`<a target="_blank" rel="noreferrer" href=`)}function QD({text:e,className:t}){let n=(0,v.useMemo)(()=>ZD(e),[e]);return(0,R.jsx)(`div`,{className:X(`prose`,t),dangerouslySetInnerHTML:{__html:n}})}function $D(e,t,n=!0){let r=(0,v.useRef)(null);return(0,v.useLayoutEffect)(()=>{let i=r.current;if(!i||!n)return;let a=new ResizeObserver(()=>QT(e,t,{h:i.offsetHeight}));return a.observe(i),()=>a.disconnect()},[e,t,n]),r}function eO(e){return e<600?`smartphone`:e<1100?`tablet`:`monitor`}var tO=(0,v.memo)(function({placed:e,mode:t,thumb:n,theme:r,store:i,events:a,capture:o}){let{item:s,x:c,y:l,w:u,h:d}=e,f=(0,v.useRef)(null),{frameSandbox:p}=Xg(),m=(0,v.useCallback)(e=>{f.current=e,eE(i,s.id,e)},[i,s.id]),h=c_(i,e=>e.frames[s.id]),g=c_(i,e=>e.active===s.id),_=c_(i,e=>e.inspecting&&s.kind===`screen`),y=s.frame.height===`auto`,b=s.kind===`screen`?s.theme??r:r,x=s.kind===`screen`?s.rev:s.url,[S]=(0,v.useState)(b),C=s.kind===`screen`?XC(s.url,S,o?{capture:`1`}:void 0):s.url,w=!!h?.ready,T=t===`off`,E=!T&&!(s.kind===`screen`&&s.missing);(0,v.useEffect)(()=>{T&&$T(i,s.id,{ready:!1})},[T,i,s.id]),(0,v.useEffect)(()=>{let e=f.current;if(e&&!T&&s.kind===`screen`)return WC(e,t=>{switch(t.type){case`ready`:$T(i,s.id,{ready:!0}),KC(e);break;case`size`:y&&QT(i,s.id,{h:Math.max(200,t.height)});break;case`error`:{let e=i.get().frames[s.id]?.errors??[];e.includes(t.message)||$T(i,s.id,{errors:[...e,t.message]});break}case`updated`:$T(i,s.id,{errors:[]});break;case`go`:a.onGo(s.id,t.target);break;case`link`:a.onLink(s.id,t);break;case`wheel`:a.onWheel(e,t);break;case`keydown`:t.code===`Escape`&&a.onEscape()}})},[T,s.id,s.kind,y,i,a,C,x]),(0,v.useEffect)(()=>{s.kind===`screen`&&qC(f.current,b)},[b,s.kind]);let D=b===`dark`?`light`:`dark`,O=e=>e?.[b]??e?.[D],k=s.kind===`screen`?O(s.snapshots):void 0,A=n&&s.kind===`screen`?O(s.thumbs)??k:k,j=t===`asleep`&&w&&!!A;return(0,R.jsxs)(`div`,{"data-item":s.id,className:`absolute overflow-hidden bg-surface`,style:{left:c,top:l,width:u,height:d,boxShadow:`var(--shadow-frame), 0 0 0 1px var(--rule)`},children:[(!w||j)&&A?(0,R.jsx)(`img`,{src:A,alt:``,draggable:!1,loading:`lazy`,decoding:`async`,className:`absolute inset-0 h-full w-full object-cover object-top select-none`}):null,!w&&!A?(0,R.jsx)(nO,{item:s,loading:E}):null,E?(0,R.jsx)(`div`,{className:`absolute inset-0`,style:{contentVisibility:j?`hidden`:`visible`},children:(0,R.jsx)(`iframe`,{ref:m,src:C,title:s.title,allow:`clipboard-read; clipboard-write; fullscreen`,sandbox:p,className:X(`absolute top-0 left-0 block border-0 transition-opacity duration-200`,w?`opacity-100`:`opacity-0`),style:{width:u,height:d,colorScheme:b},onLoad:()=>{s.kind===`url`?$T(i,s.id,{ready:!0}):(qC(f.current,b),KC(f.current))}},x)}):null,g||_?null:(0,R.jsx)(`div`,{"data-shield":s.id,className:`absolute inset-0`})]})});function nO({item:e,loading:t}){let n=e.kind===`screen`&&e.missing;return(0,R.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-soft text-muted`,children:[(0,R.jsx)(Z,{name:n?`alert`:e.kind===`url`?`globe`:eO(e.frame.width),size:Math.max(24,Math.min(96,e.frame.width/12)),strokeWidth:1.25,className:n?`text-danger-text`:void 0}),(0,R.jsx)(`div`,{className:`max-w-[80%] truncate text-center`,style:{fontSize:Math.max(14,e.frame.width/40)},children:n?`Missing file: ${e.kind===`screen`?e.src:``}`:t?`Loading…`:e.title})]})}var rO=(0,v.memo)(function({placed:e,store:t}){let{item:n,x:r,y:i,w:a}=e,o=$D(t,n.id),s=n.tone===`plain`;return(0,R.jsxs)(`div`,{ref:o,"data-item":n.id,className:X(`absolute`,s?``:`rounded-[10px] border border-note-line bg-note px-6 py-5 shadow-frame`),style:{left:r,top:i,width:a},children:[n.title?(0,R.jsx)(`div`,{className:`mb-2 font-semibold text-ink`,style:{fontSize:s?26:19},children:n.title}):null,(0,R.jsx)(QD,{text:n.text,className:s?`prose-plain`:`prose-note`})]})}),iO=(0,v.memo)(function({placed:e,store:t}){let{item:n,x:r,y:i,w:a,h:o}=e;return(0,R.jsx)(`div`,{"data-item":n.id,className:`absolute overflow-hidden rounded-[6px] bg-surface`,style:{left:r,top:i,width:a,height:o,boxShadow:`0 0 0 1px var(--rule)`},children:n.missing?(0,R.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-danger-text`,children:[(0,R.jsx)(Z,{name:`alert`,size:20}),` Missing image`]}):(0,R.jsx)(`img`,{src:n.url,alt:n.title,draggable:!1,className:`block h-full w-full object-contain select-none`,onLoad:e=>{let r=e.currentTarget;QT(t,n.id,{w:r.naturalWidth,h:r.naturalHeight})}})})}),aO=(0,v.memo)(function({section:e,x:t,y:n,w:r,store:i}){let a=$D(i,`section:${e.id}`);return!e.title&&!e.description?null:(0,R.jsxs)(`div`,{ref:a,className:`canvas-section absolute`,style:{left:t,top:n,width:Math.min(Math.max(r,720),1400)},children:[e.title?(0,R.jsx)(`div`,{className:`text-[40px] leading-[1.15] font-semibold tracking-[-0.015em] text-ink`,children:e.title}):null,e.description?(0,R.jsx)(`div`,{className:`mt-3 max-w-[1100px]`,children:(0,R.jsx)(QD,{text:e.description,className:`prose-plain`})}):null]})}),oO={phone:{width:390,height:844,label:`Phone`},"phone-sm":{width:375,height:667,label:`Phone S`},"phone-lg":{width:430,height:932,label:`Phone L`},tablet:{width:834,height:1194,label:`Tablet`},"tablet-landscape":{width:1194,height:834,label:`Tablet landscape`},laptop:{width:1280,height:800,label:`Laptop`},desktop:{width:1440,height:900,label:`Desktop`},wide:{width:1920,height:1080,label:`Wide`}};Object.keys(oO);var sO=e=>({"--x":e.x,"--y":e.y,"--w":e.w,"--h":e.h});function cO(e){let t=e.item;if(t.kind!==`screen`&&t.kind!==`url`)return``;let n=t.frame.device?oO[t.frame.device]?.label:void 0,r=`${t.frame.width} × ${t.frame.height===`auto`?`auto`:t.frame.height}`;return n?`${n} · ${r}`:r}var lO=(0,v.memo)(function({placed:e,store:t}){let n=e.item.id,r=c_(t,e=>e.selected===n),i=c_(t,e=>e.frames[n]?.errors.length??0);return(0,R.jsxs)(`div`,{"data-at":``,"data-label":n,style:sO(e),className:X(`frame-label pointer-events-auto flex cursor-default items-center gap-1.5 overflow-hidden pb-1.5 text-[12.5px] leading-none whitespace-nowrap select-none`,r?`text-ink`:`text-muted hover:text-ink2`),children:[i?(0,R.jsx)(`span`,{className:`size-[7px] shrink-0 rounded-full bg-danger`,title:`${i} errors`}):null,(0,R.jsx)(`span`,{className:X(`min-w-[3ch] truncate`,r?`font-semibold`:`font-medium`),children:e.item.title}),(0,R.jsx)(`span`,{className:`frame-device min-w-0 shrink-[20] truncate text-[11.5px] text-muted opacity-80`,children:cO(e)})]})});function uO({placed:e,kind:t}){return(0,R.jsx)(`div`,{"data-at":``,style:sO(e),className:X(`frame-outline rounded-[1px]`,t===`hover`?`outline outline-[1.5px] outline-action/60`:`outline-2 outline-action outline`)})}function dO({layout:e,view:t,store:n,overlayRef:r}){let i=c_(n,e=>e.selected),a=c_(n,e=>e.active),o=c_(n,e=>e.hovered),s=c_(n,e=>e.zoomTiny),c=(0,v.useMemo)(()=>e.items.filter(e=>KT(e.item)),[e]),l=(0,v.useMemo)(()=>{if(!t||s)return[];let{x:e,y:n,z:r,w:i,h:a}=t,o={x:-e/r-i/r,y:-n/r-a/r,w:i/r*3,h:a/r*3};return c.filter(e=>Bw(e,o))},[c,t,s]),u=t=>t?e.items.find(e=>e.item.id===t):void 0,d=u(i),f=o&&o!==i?u(o):void 0;return(0,R.jsxs)(`div`,{ref:r,className:`canvas-overlay`,"data-tiny":s,children:[l.map(e=>(0,R.jsx)(lO,{placed:e,store:n},e.item.id)),f?(0,R.jsx)(uO,{placed:f,kind:`hover`}):null,d?(0,R.jsx)(uO,{placed:d,kind:a===i?`active`:`selected`}):null]})}var fO=12,pO=20,mO=110,hO=.2,gO=400,_O=.2,vO=3,yO=8e3,bO=14,xO=96;function SO({layout:e,theme:t,store:n,camera:r,events:i,capture:a,apiRef:o,onPlay:s,onSelect:c}){let l=(0,v.useRef)(null),u=(0,v.useRef)(null),d=(0,v.useRef)(null),f=(0,v.useRef)(null),[p,m]=(0,v.useState)(null),h=c_(n,e=>e.panning),g=c_(n,e=>e.selected),_=c_(n,e=>e.active),y=(0,v.useMemo)(()=>e.items.filter(e=>KT(e.item)),[e]);(0,v.useLayoutEffect)(()=>{let e=l.current,t=u.current,i=d.current,a,o,s=!1,c=0,p=()=>m({...r.camera,w:e.clientWidth,h:e.clientHeight,moving:s}),h=e=>{t.style.transform=`translate3d(${e.x}px, ${e.y}px, 0) scale(${e.z})`,s||(s=!0,t.classList.add(`moving`)),clearTimeout(a),a=setTimeout(()=>{s=!1,t.classList.remove(`moving`),p()},160);let r=f.current;r&&(r.style.setProperty(`--tx`,String(e.x)),r.style.setProperty(`--ty`,String(e.y)),r.style.setProperty(`--z`,String(e.z)));let l=24*e.z;for(;l<bO;)l*=4;for(;l>xO;)l/=4;l!==c&&(c=l,i.style.backgroundSize=`${l}px ${l}px`);let u=e=>((e+xO)%l+l)%l-l;i.style.transform=`translate3d(${u(e.x)}px, ${u(e.y)}px, 0)`;let d=e.z<.09;n.get().zoomTiny!==d&&n.set(e=>({...e,zoomTiny:d})),t.classList.toggle(`far`,e.z<.15),o??=setTimeout(()=>{o=void 0,p()},90)};h(r.camera),p();let g=r.subscribe(h),_=e.getBoundingClientRect().left,v=new ResizeObserver(()=>{let t=e.getBoundingClientRect().left;if(t!==_){let e=r.camera;r.set({...e,x:e.x-(t-_)}),_=t}p()});return v.observe(e),()=>{g(),v.disconnect(),clearTimeout(a),clearTimeout(o)}},[r,n]),(0,v.useEffect)(()=>{let t=l.current,n=()=>{let{w:n,h:i}={w:t.clientWidth,h:t.clientHeight},o=e.bounds,s=o.w&&n?Math.min((n-160)/o.w,(i-160)/Math.max(o.h,1)):1;r.minZoom=a?.01:Math.min(.25,Math.max(Iw,s*.5))};n();let i=new ResizeObserver(n);return i.observe(t),()=>i.disconnect()},[r,e.bounds,a]),(0,v.useEffect)(()=>{let t=l.current,n=()=>({w:t.clientWidth,h:t.clientHeight});o.current={size:n,openView(){let{w:t,h:i}=n(),a=e.bounds;if(!a.w)return;if(Math.min((t-160)/a.w,(i-160)/Math.max(a.h,1))>=_O)return this.fitAll(!1);let o=e.sections[0]??a,s=Math.min(.5,Math.max(.25,(t-160)/Math.max(o.w,1)));r.set({z:s,x:80-a.x*s,y:80-a.y*s})},fitAll(t=!0){let{w:i,h:a}=n();if(!e.bounds.w)return;let o=zw(e.bounds,i,a,80,1,r.minZoom);t?r.animateTo(o):r.set(o)},fitItem(t,i=!0){let a=e.items.find(e=>e.item.id===t);if(!a)return;let{w:o,h:s}=n(),c=zw(a,o,s,64,1,r.minZoom);i?r.animateTo(c):r.set(c)},zoomBy(e){let{w:t,h:i}=n(),a=r.camera,o=a.z*e,s=(t/2-a.x)/a.z,c=(i/2-a.y)/a.z;r.animateTo({z:o,x:t/2-s*o,y:i/2-c*o},180)},zoomTo(e){let{w:t,h:i}=n(),a=r.camera,o=(t/2-a.x)/a.z,s=(i/2-a.y)/a.z;r.animateTo({z:e,x:t/2-o*e,y:i/2-s*e},220)}}},[o,r,e]);let b=(0,v.useRef)([]),x=(0,v.useRef)(new Map),[S,C]=(0,v.useState)(0),w=c_(n,e=>CO(e.frames)),T=(0,v.useMemo)(()=>{let e=new Map;if(a){for(let t of y)e.set(t.item.id,`live`);return e}if(!p)return e;let{x:t,y:n,z:r,w:i,h:o}=p,s={x:-t/r,y:-n/r,w:i/r,h:o/r},c={x:s.x-s.w*.25,y:s.y-s.h*.25,w:s.w*1.5,h:s.h*1.5},l=s.x+s.w/2,u=s.y+s.h/2,d=e=>Math.max(0,Math.min(e.x+e.w,s.x+s.w)-Math.max(e.x,s.x))*Math.max(0,Math.min(e.y+e.h,s.y+s.h)-Math.max(e.y,s.y)),f=e=>Math.hypot(e.x+e.w/2-l,e.y+e.h/2-u),m=y.filter(e=>r>=hO&&Bw(e,c)&&e.w*r>=mO).sort((e,t)=>d(t)-d(e)||f(e)-f(t)).slice(0,fO).map(e=>e.item.id),h=[_,g].filter(e=>!!e),v=new Set(y.map(e=>e.item.id)),S=new Set(w.split(`
|
|
125
125
|
`)),C=new Set(b.current),T=performance.now(),E=e=>!S.has(e)&&T-(x.current.get(e)??0)<yO,D=vO-[...C].filter(E).length,O=[];for(let e of new Set([...h,...m]))v.has(e)&&(C.has(e)?O.push(e):(h.includes(e)||!p.moving&&D>0)&&(O.push(e),x.current.set(e,T),D--));let k=[...new Set([...O,...b.current])].filter(e=>v.has(e)).slice(0,pO);b.current=k;for(let e of x.current.keys())k.includes(e)||x.current.delete(e);for(let t of k)e.set(t,O.includes(t)?`live`:`asleep`);return e},[p,y,_,g,a,w,S]);(0,v.useEffect)(()=>{let e=performance.now(),t=new Set(w.split(`
|
|
126
126
|
`)),n=[...x.current].filter(([e])=>!t.has(e)).map(([,t])=>t+yO-e).filter(e=>e>0);if(!n.length)return;let r=setTimeout(()=>C(e=>e+1),Math.min(...n)+20);return()=>clearTimeout(r)},[T,w]);let E=(0,v.useRef)(null),D=(0,v.useRef)(new Map),O=(0,v.useRef)(null),k=(0,v.useRef)(!1),A=e=>{n.get().panning!==e&&n.set(t=>({...t,panning:e}))};(0,v.useEffect)(()=>{let e=e=>{e.code===`Space`&&!wO(e.target)&&(k.current=!0,l.current?.classList.add(`cursor-grab`),e.preventDefault())},t=e=>{e.code===`Space`&&(k.current=!1,l.current?.classList.remove(`cursor-grab`))};return window.addEventListener(`keydown`,e),window.addEventListener(`keyup`,t),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`keyup`,t)}},[]);let j=e=>{let t=e;return(t?.closest(`[data-shield]`))?.dataset.shield??(t?.closest(`[data-label]`))?.dataset.label??(t?.closest(`[data-item]`))?.dataset.item??null},ee=e=>{if(e.target.closest(`[data-ui]`)||e.button!==0&&e.button!==1)return;if(l.current.setPointerCapture(e.pointerId),D.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),r.interrupt(),D.current.size===2){let[e,t]=[...D.current.values()];O.current={dist:Math.hypot(e.x-t.x,e.y-t.y),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},E.current=null,A(!0);return}let t=e.button===1||k.current;E.current={id:t?null:j(e.target),startX:e.clientX,startY:e.clientY,lastX:e.clientX,lastY:e.clientY,moved:t},t&&A(!0)},te=e=>{if(D.current.has(e.pointerId)&&D.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),O.current&&D.current.size===2){let[e,t]=[...D.current.values()],n=Math.hypot(e.x-t.x,e.y-t.y),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=l.current.getBoundingClientRect();r.panBy(i-O.current.midX,a-O.current.midY),r.zoomAt(i-o.left,a-o.top,n/Math.max(O.current.dist,1)),O.current={dist:n,midX:i,midY:a};return}let t=E.current;if(!t){if(!n.get().panning){let t=j(e.target);n.get().hovered!==t&&n.set(e=>({...e,hovered:t}))}return}!t.moved&&Math.hypot(e.clientX-t.startX,e.clientY-t.startY)>3&&(t.moved=!0,A(!0)),t.moved&&r.panBy(e.clientX-t.lastX,e.clientY-t.lastY),t.lastX=e.clientX,t.lastY=e.clientY},M=e=>{D.current.delete(e.pointerId),D.current.size<2&&(O.current=null);let t=E.current;E.current=null,t&&!t.moved&&c(t.id,{x:e.clientX,y:e.clientY}),D.current.size||A(!1)};(0,v.useEffect)(()=>{let e=l.current,t=t=>{if(t.target.closest(`[data-ui]`))return;t.preventDefault();let n=e.getBoundingClientRect(),i=t.deltaMode===1?16:t.deltaMode===2?n.height:1;if(t.ctrlKey||t.metaKey){let e=t.deltaY*i,a=Math.abs(e)<40?.012:.0025;r.zoomAt(t.clientX-n.left,t.clientY-n.top,Math.exp(-e*a))}else r.panBy(-t.deltaX*i,-t.deltaY*i)};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[r]);let N=e.sections;return(0,R.jsxs)(`div`,{ref:l,className:X(`canvas-root relative h-full w-full touch-none overflow-hidden select-none`,h&&`canvas-panning cursor-grabbing`),onPointerDown:ee,onPointerMove:te,onPointerUp:M,onPointerCancel:M,onPointerLeave:()=>n.get().hovered&&n.set(e=>({...e,hovered:null})),onDoubleClick:t=>{let n=j(t.target),r=n?e.items.find(e=>e.item.id===n):void 0;r&&KT(r.item)&&s(r.item.id)},children:[(0,R.jsx)(`div`,{ref:d,className:`canvas-grid`}),(0,R.jsxs)(`div`,{ref:u,className:`canvas-world`,children:[N.map(e=>(0,R.jsx)(aO,{section:e.section,x:e.x,y:e.y,w:e.w,store:n},`section:${e.section.id}`)),e.items.map(e=>{let{item:r}=e;return r.kind===`screen`||r.kind===`url`?(0,R.jsx)(tO,{placed:e,mode:T.get(r.id)??`off`,thumb:!a&&!!p&&e.w*p.z*devicePixelRatio<=gO,theme:t,store:n,events:i,capture:a},r.id):r.kind===`note`?(0,R.jsx)(rO,{placed:e,store:n},r.id):(0,R.jsx)(iO,{placed:e,store:n},r.id)})]}),(0,R.jsx)(dO,{layout:e,view:p,store:n,overlayRef:f})]})}function CO(e){return Object.keys(e).filter(t=>e[t].ready).sort().join(`
|
|
127
|
-
`)}function wO(e){let t=e;return!!t&&(t.isContentEditable||/^(input|textarea|select)$/i.test(t.tagName))}var TO=new URLSearchParams(window.location.search),EO=TO.has(`capture`),DO=(e,t)=>`foss-design.camera.${e}.${t}`;function OO(e){try{let t=JSON.parse(sessionStorage.getItem(e)??`null`);if(t&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.z))return t}catch{}return null}function kO(e){let t=__(),n=TO.get(`theme`),[r,i]=(0,v.useState)(n===`dark`||n===`light`?n:null);return[r??e?.theme??t,i]}function AO({canvasId:e,pageId:t}){let{data:n,error:r,isLoading:i}=e_(e);if(r)return(0,R.jsx)(Fw,{title:`Canvas not found`,text:r.message});if(i||!n)return(0,R.jsx)(`div`,{className:`canvas-dots grow`});let a=t??TO.get(`page`)??void 0,o=n.pages.find(e=>e.id===a)??n.pages[0];return(0,R.jsx)(jO,{canvas:n,page:o},`${n.id}/${o?.id??``}`)}function jO({canvas:e,page:t}){let[,n]=F(),r=(0,v.useMemo)(()=>ZT(),[]),i=(0,v.useMemo)(()=>new Rw,[]),a=(0,v.useRef)(null),[o,s]=kO(e),[c,l]=(0,v.useState)(()=>!EO&&window.innerWidth>900),[u,d]=(0,v.useState)(!1),f=c_(r,e=>e.sizes),p=(0,v.useMemo)(()=>t?YT(t,f):{items:[],sections:[],bounds:{x:0,y:0,w:0,h:0}},[t,f]),m=FO(c_(r,e=>e.frameEls),p),h=ew(m),g=u||h;(0,v.useEffect)(()=>{r.set(e=>e.inspecting===g?e:{...e,inspecting:g,active:null})},[g,r]);let _=$C(m,g,{onEscape:()=>d(!1)}),y=!!_.info;(0,v.useEffect)(()=>{y&&d(!0)},[y]),(0,v.useEffect)(()=>{let e=_.frame;if(!e)return;let t=Object.entries(r.get().frameEls).find(([,t])=>t===e)?.[0];t&&r.get().selected!==t&&r.set(e=>({...e,selected:t}))},[_.frame,r]);let b=(0,v.useMemo)(()=>XT(p),[p]),x=DO(e.id,t?.id??``),S=(0,v.useRef)(!1);(0,v.useEffect)(()=>{if(S.current||!p.bounds.w)return;S.current=!0;let t=o_(e.id),n=EO?null:OO(x);t?(r.set(e=>({...e,selected:t})),requestAnimationFrame(()=>a.current?.fitItem(t,!1))):n&&n.z>=i.minZoom?i.set(n):requestAnimationFrame(()=>EO?a.current?.fitAll(!1):a.current?.openView())},[p,i,x,e.id,r]),(0,v.useEffect)(()=>{if(EO)return;let e,t=i.subscribe(t=>{clearTimeout(e),e=setTimeout(()=>sessionStorage.setItem(x,JSON.stringify(t)),250)});return()=>{t(),clearTimeout(e)}},[i,x]);let C=(0,v.useCallback)(e=>{let t=e?p.items.find(t=>t.item.id===e)?.item:void 0;r.set(e=>({...e,selected:t?t.id:null,active:t&&KT(t)?t.id:null,hovered:null}))},[p,r]),w=(0,v.useCallback)(e=>{C(e),a.current?.fitItem(e)},[C]),T=(0,v.useCallback)(r=>n(`/c/${encodeURIComponent(e.id)}/play/${encodeURIComponent(r)}${t?`?page=${encodeURIComponent(t.id)}`:``}`),[e.id,t,n]);(0,v.useEffect)(()=>{let t=t=>{let n=t.detail;n.canvas===e.id&&p.items.some(e=>e.item.id===n.item)&&(o_(e.id),w(n.item))};return window.addEventListener(`design:focus`,t),()=>window.removeEventListener(`design:focus`,t)},[e.id,p,w]);let E=(0,v.useMemo)(()=>({onGo(r,i){let[a,o]=i.includes(`/`)?i.split(`/`):[null,i],s=a?e.pages.filter(e=>e.id===a):[t,...e.pages.filter(e=>e!==t)];for(let r of s)if(r&&r.sections.some(e=>e.items.some(e=>e.id===o))){r===t?w(o):(n(IT(e,r)),window.dispatchEvent(new CustomEvent(`design:focus`,{detail:{canvas:e.id,item:o}})));return}console.warn(`[design] go("${i}"): no such screen`)},onLink(t,n){QC(n,e,e=>this.onGo(t,e),t)},onWheel(e,t){let n=e.closest(`.canvas-root`);if(!n)return;let r=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=i.camera.z;if(t.zoom){let e=Math.abs(t.deltaY)<40?.012:.0025;i.zoomAt(a.left-r.left+t.x*o,a.top-r.top+t.y*o,Math.exp(-t.deltaY*e))}else i.panBy(-t.deltaX,-t.deltaY)},onEscape(){r.set(e=>({...e,active:null}))}}),[e,t,i,r,w,n]);return(0,v.useEffect)(()=>{if(!EO)return;let e=Date.now(),t=setInterval(()=>{let n=r.get().frames;(b.every(e=>n[e.item.id]?.ready||e.item.kind===`screen`&&e.item.missing)||Date.now()-e>6e4)&&(clearInterval(t),a.current?.fitAll(!1),requestAnimationFrame(()=>requestAnimationFrame(()=>window.__DESIGN_CANVAS_READY__=!0)))},250);return()=>clearInterval(t)},[b,r]),(0,v.useEffect)(()=>{let i=i=>{if(wO(i.target)||document.querySelector(`[role="dialog"]`))return;let o=a.current,s=r.get(),c=i.metaKey||i.ctrlKey;if(i.key===`Escape`)_.info?_.select(null):u?d(!1):s.active?r.set(e=>({...e,active:null})):s.selected&&r.set(e=>({...e,selected:null}));else if(i.key===`i`&&!c&&!i.altKey)d(e=>!e);else if(i.shiftKey&&i.code===`Digit1`)o?.fitAll();else if(i.shiftKey&&i.code===`Digit2`&&s.selected)o?.fitItem(s.selected);else if(i.shiftKey&&i.code===`Digit0`)o?.zoomTo(1);else if((i.key===`=`||i.key===`+`)&&!i.altKey)i.preventDefault(),o?.zoomBy(1.4);else if(i.key===`-`&&!i.altKey)i.preventDefault(),o?.zoomBy(1/1.4);else if(c&&i.key===`0`)i.preventDefault(),o?.zoomTo(1);else if(c&&i.key===`\\`)i.preventDefault(),l(e=>!e);else if([`ArrowRight`,`ArrowDown`,`ArrowLeft`,`ArrowUp`].includes(i.key)&&b.length){i.preventDefault();let e=b.findIndex(e=>e.item.id===s.selected),t=i.key===`ArrowRight`||i.key===`ArrowDown`?1:-1,n=b[e===-1?0:(e+t+b.length)%b.length];r.set(e=>({...e,selected:n.item.id,active:null})),o?.fitItem(n.item.id)}else if(i.key===`Enter`&&s.selected){let e=p.items.find(e=>e.item.id===s.selected)?.item;e&&KT(e)&&T(e.id)}else if(i.key===`]`||i.key===`[`){let r=t?e.pages.indexOf(t):-1,a=e.pages[r+(i.key===`]`?1:-1)];a&&n(IT(e,a))}};return window.addEventListener(`keydown`,i),()=>window.removeEventListener(`keydown`,i)},[r,b,p,T,e,t,n,u,_]),EO?(0,R.jsx)(`div`,{className:`flex h-dvh`,children:(0,R.jsx)(SO,{layout:p,theme:o,store:r,camera:i,events:E,capture:!0,apiRef:a,onPlay:()=>{},onSelect:()=>{}})}):(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsx)(RT,{canvas:e,page:t,theme:o,onTheme:s,sidebar:c,onSidebar:l,inspect:u,onInspect:d,onPlay:()=>{let e=r.get().selected,t=e&&b.find(t=>t.item.id===e)||b[0];t&&T(t.item.id)},canPlay:b.length>0}),(0,R.jsxs)(`div`,{className:`flex min-h-0 grow basis-0`,children:[(0,R.jsx)(Ow,{open:c&&!!t,side:`left`,width:264,children:t?(0,R.jsx)(LT,{canvas:e,page:t,store:r,onPick:w}):null}),(0,R.jsxs)(`div`,{className:`relative min-w-0 grow`,children:[t&&p.items.length?(0,R.jsx)(SO,{layout:p,theme:o,store:r,camera:i,events:E,capture:!1,apiRef:a,onPlay:T,onSelect:C}):(0,R.jsx)(`div`,{className:`canvas-dots flex h-full`,children:(0,R.jsx)(Pw,{title:t?`This page is empty`:`This canvas has no pages`,text:(0,R.jsxs)(R.Fragment,{children:[`Add sections and screens to`,` `,(0,R.jsxs)(`code`,{className:`font-mono text-[13px]`,children:[`.design/canvas/`,e.id,`/canvas.json`]}),`.`]})})}),(0,R.jsx)(zT,{canvas:e,store:r,layoutItems:p.items.map(e=>e.item),theme:o,onPlay:T,inspect:g}),(0,R.jsx)(NO,{camera:i,apiRef:a}),e.issues.length?(0,R.jsx)(PO,{canvas:e}):null]}),(0,R.jsx)(Ow,{open:u,side:`right`,width:320,children:(0,R.jsx)(uw,{info:_.info,active:!0,onSelect:e=>_.select(e),onClose:()=>{d(!1),_.select(null)}})})]})]})}function MO({camera:e}){let[t,n]=(0,v.useState)(e.camera.z);return(0,v.useEffect)(()=>{let t=0;return e.subscribe(e=>{cancelAnimationFrame(t),t=requestAnimationFrame(()=>n(e.z))})},[e]),(0,R.jsxs)(R.Fragment,{children:[Math.round(t*100),`%`]})}function NO({camera:e,apiRef:t}){return(0,R.jsxs)(`div`,{"data-ui":!0,className:`absolute right-4 bottom-5 z-20 flex h-[46px] items-center gap-0.5 rounded-[10px] border border-rule bg-surface px-1.5 shadow-pop`,children:[(0,R.jsx)(N_,{icon:`zoom-out`,label:`Zoom out (−)`,onClick:()=>t.current?.zoomBy(1/1.4)}),(0,R.jsxs)(VS,{side:`top`,align:`end`,width:210,trigger:(0,R.jsx)(`button`,{type:`button`,className:`h-ctrl min-w-[56px] cursor-pointer rounded-[6px] border-0 bg-transparent px-1.5 text-[12.5px] font-medium text-ink2 tabular hover:bg-soft2`,children:(0,R.jsx)(MO,{camera:e})}),children:[(0,R.jsx)(US,{onSelect:()=>t.current?.fitAll(),hint:`⇧1`,children:`Zoom to fit`}),(0,R.jsx)(US,{onSelect:()=>t.current?.zoomTo(1),hint:`⇧0`,children:`100%`}),(0,R.jsx)(WS,{}),[.25,.5,2].map(e=>(0,R.jsxs)(US,{onSelect:()=>t.current?.zoomTo(e),children:[e*100,`%`]},e))]}),(0,R.jsx)(N_,{icon:`zoom-in`,label:`Zoom in (+)`,onClick:()=>t.current?.zoomBy(1.4)}),(0,R.jsx)(`div`,{className:`mx-0.5 h-5 w-px bg-rule`}),(0,R.jsx)(N_,{icon:`fit`,label:`Zoom to fit (⇧1)`,onClick:()=>t.current?.fitAll()})]})}function PO({canvas:e}){let t=e.issues.filter(e=>e.severity===`error`).length;return(0,R.jsxs)(EC,{children:[(0,R.jsx)(DC,{asChild:!0,children:(0,R.jsxs)(`button`,{type:`button`,"data-ui":!0,className:`absolute bottom-5 left-4 z-20 flex h-[46px] cursor-pointer items-center gap-2 rounded-[10px] border border-rule bg-surface px-3.5 text-[13px] font-medium shadow-pop hover:bg-soft`,children:[(0,R.jsx)(Z,{name:`alert`,size:15,className:t?`text-danger-text`:`text-action`}),e.issues.length,` `,e.issues.length===1?`problem`:`problems`,` in canvas.json`]})}),(0,R.jsx)(OC,{children:(0,R.jsx)(kC,{side:`top`,align:`start`,sideOffset:8,collisionPadding:12,className:`z-50 max-h-[50vh] w-[460px] max-w-[calc(100vw-24px)] overflow-y-auto rounded-[10px] border border-rule bg-surface shadow-pop outline-none data-[state=open]:animate-[q-pop_120ms_ease-out]`,children:(0,R.jsx)(Tw,{issues:e.issues})})})]})}function FO(e,t){let n=(0,v.useRef)([]);return(0,v.useMemo)(()=>{let r=new Set(t.items.filter(e=>e.item.kind===`screen`).map(e=>e.item.id)),i=Object.entries(e).filter(e=>!!e[1]&&r.has(e[0])).map(([,e])=>e);return i.length===n.current.length&&i.every((e,t)=>e===n.current[t])||(n.current=i),n.current},[e,t])}function IO({open:e,onOpenChange:t,title:n,children:r}){return(0,R.jsx)(mg,{open:e,onOpenChange:t,children:(0,R.jsx)($u,{children:e?(0,R.jsxs)(vg,{forceMount:!0,children:[(0,R.jsx)(bg,{asChild:!0,forceMount:!0,children:(0,R.jsx)(Wf.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.16},className:`fixed inset-0 z-50 bg-overlay`})}),(0,R.jsx)(wg,{asChild:!0,forceMount:!0,"aria-describedby":void 0,children:(0,R.jsxs)(Wf.div,{initial:{y:`100%`},animate:{y:0},exit:{y:`100%`,transition:{duration:.18,ease:`easeIn`}},transition:{type:`spring`,stiffness:420,damping:40},className:`fixed inset-x-0 bottom-0 z-50 flex max-h-[82dvh] flex-col rounded-t-[14px] border-t border-rule bg-surface pb-[env(safe-area-inset-bottom)] shadow-pop outline-none`,children:[(0,R.jsx)(`div`,{className:`flex justify-center pt-2`,children:(0,R.jsx)(`span`,{"aria-hidden":!0,className:`h-1 w-9 rounded-full bg-rule-strong`})}),(0,R.jsxs)(`div`,{className:`flex min-h-[48px] items-center justify-between gap-3 pr-2 pl-4`,children:[(0,R.jsx)(kg,{className:`m-0 truncate text-[15px] font-semibold`,children:n}),(0,R.jsx)(jg,{asChild:!0,children:(0,R.jsx)(N_,{icon:`x`,label:`Close`})})]}),(0,R.jsx)(`div`,{className:`min-h-0 overflow-y-auto overscroll-contain border-t border-rule`,children:r})]})})]}):null})})}function LO(e,t){return(t?e.pages.filter(e=>e.id===t):e.pages).flatMap(t=>t.sections.flatMap(n=>n.items.filter(e=>e.kind===`screen`||e.kind===`url`).map(r=>({item:r,pageId:t.id,where:[e.pages.length>1?t.title:null,n.title].filter(Boolean).join(` · `)}))))}var RO=(e,t,n)=>`/c/${encodeURIComponent(e)}/play/${encodeURIComponent(t)}?page=${encodeURIComponent(n)}`;function zO({canvasId:e,itemId:t}){let{data:n,error:r,isLoading:i}=e_(e);return r?(0,R.jsx)(Fw,{title:`Canvas not found`,text:r.message}):i||!n?null:(0,R.jsx)(BO,{canvas:n,itemId:t})}function BO({canvas:e,itemId:t}){let[,n]=F(),{frameSandbox:r,slots:i}=Xg(),a=new URLSearchParams(window.location.search).get(`page`)??(window.location.hash.split(`?`)[1]?new URLSearchParams(window.location.hash.split(`?`)[1]).get(`page`):null),o=(0,v.useMemo)(()=>LO(e,null),[e]),s=o.find(e=>e.item.id===t),c=a??s?.pageId??null,l=(0,v.useMemo)(()=>c?LO(e,c):o,[e,c,o]),u=l.findIndex(e=>e.item.id===t),d=__(),[f,p]=(0,v.useState)(e.theme??d),[m,h]=(0,v.useState)(`fit`),g=(0,v.useRef)(null),_=(0,v.useRef)(null),[y,b]=(0,v.useState)(null),x=(0,v.useCallback)(e=>{_.current=e,b(e)},[]),[S,C]=(0,v.useState)(!1),[w,T]=(0,v.useState)({w:0,h:0}),[E,D]=(0,v.useState)([]),O=c?`/c/${encodeURIComponent(e.id)}/p/${encodeURIComponent(c)}`:`/c/${encodeURIComponent(e.id)}`,k=t=>{if(!l.length)return;let r=l[(u+t+l.length)%l.length];n(RO(e.id,r.item.id,r.pageId),{replace:!0})};(0,v.useLayoutEffect)(()=>{let e=g.current;if(!e)return;let t=new ResizeObserver(()=>T({w:e.clientWidth,h:e.clientHeight}));return t.observe(e),()=>t.disconnect()},[]),(0,v.useEffect)(()=>{let e=e=>{wO(e.target)||document.querySelector(`[role="dialog"]`)||(e.key===`ArrowRight`?k(1):e.key===`ArrowLeft`?k(-1):e.key===`i`&&!e.metaKey&&!e.ctrlKey&&!e.altKey?C(e=>!e):e.key===`Escape`&&(P.info?P.select(null):S?C(!1):n(O)))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)});let A=l[u],j=A?.item,ee=j?.kind===`screen`?j.theme??f:f,te=NT(e.id,j,ee),[M]=(0,v.useState)(ee),N=j?j.kind===`screen`?XC(j.url,M):j.url:``,ne=(0,v.useMemo)(()=>y&&j?.kind===`screen`?[y]:[],[y,j?.kind]),re=ew(ne),P=$C(ne,S||re,{onEscape:()=>C(!1)}),ie=!!P.info;if((0,v.useEffect)(()=>{ie&&C(!0)},[ie]),(0,v.useEffect)(()=>{let t=_.current;if(t&&j?.kind===`screen`)return D([]),WC(t,t=>{if(t.type===`error`)D(e=>e.includes(t.message)?e:[...e,t.message]);else if(t.type===`updated`)D([]);else if(t.type===`keydown`&&t.code===`Escape`)n(O);else if(t.type===`go`){let[r,i]=t.target.includes(`/`)?t.target.split(`/`):[null,t.target],a=o.find(e=>e.item.id===i&&(!r||e.pageId===r));a&&n(RO(e.id,a.item.id,a.pageId))}else t.type===`link`&&QC(t,e,t=>{let r=o.find(e=>e.item.id===t);r&&n(RO(e.id,r.item.id,r.pageId))},j?.id)})},[j,N,o,e.id,n,O]),(0,v.useEffect)(()=>{j?.kind===`screen`&&qC(_.current,ee)},[ee,j]),!j)return(0,R.jsx)(Fw,{title:`Screen not found`,text:`No screen "${t}" on this canvas.`});let ae=j.frame.width,oe=j.frame.height===`auto`?Math.max(w.h-48,400):j.frame.height,se=m===`fit`?Math.min(1,(w.w-48)/ae,(w.h-48)/oe):1,ce=ae<=w.w-48&&oe<=w.h-48;return(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsxs)(XS,{children:[i.barStart,(0,R.jsx)(jT,{content:(0,R.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[`Back to canvas `,(0,R.jsx)(y_,{children:`esc`})]}),children:(0,R.jsx)(ye,{href:O,className:`inline-flex h-ctrl w-ctrl items-center justify-center rounded-[6px] text-muted hover:bg-soft2 hover:text-ink2`,"aria-label":`Back to canvas`,children:(0,R.jsx)(Z,{name:`arrow-left`,size:16})})}),(0,R.jsxs)(`div`,{className:`flex min-w-0 flex-col leading-tight`,children:[(0,R.jsx)(`span`,{className:`truncate text-[14px] font-semibold`,children:j.title}),(0,R.jsx)(`span`,{className:`truncate text-[12px] text-muted`,children:[e.title,A.where].filter(Boolean).join(` · `)})]}),(0,R.jsxs)(`div`,{className:`mx-auto flex items-center gap-1`,children:[(0,R.jsx)(N_,{icon:`chevron-left`,label:`Previous screen (←)`,onClick:()=>k(-1),disabled:l.length<2}),(0,R.jsxs)(`span`,{className:`min-w-[52px] text-center text-[12.5px] text-muted tabular`,children:[u+1,` / `,l.length]}),(0,R.jsx)(N_,{icon:`chevron-right`,label:`Next screen (→)`,onClick:()=>k(1),disabled:l.length<2})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[ce?null:(0,R.jsx)(Vw,{label:`Scale`,value:m,onChange:h,items:[{value:`fit`,label:`Fit`},{value:`actual`,label:`100%`}]}),j.kind===`screen`&&!j.theme?(0,R.jsx)(Vw,{label:`Screen theme`,value:f,onChange:p,items:[{value:`light`,label:(0,R.jsx)(Z,{name:`sun`,size:15}),title:`Light`},{value:`dark`,label:(0,R.jsx)(Z,{name:`moon`,size:15}),title:`Dark`}]}):null,j.kind===`screen`?(0,R.jsx)(BT,{on:S,onChange:C}):null,(0,R.jsx)(N_,{icon:`refresh`,label:`Reload`,onClick:()=>JC(_.current)}),te?(0,R.jsx)(`a`,{href:te,target:`_blank`,rel:`noreferrer`,title:`Open in a new tab`,className:`inline-flex h-ctrl w-ctrl items-center justify-center rounded-[6px] text-muted hover:bg-soft2 hover:text-ink2`,children:(0,R.jsx)(Z,{name:`external`,size:16})}):null,(0,R.jsx)(qS,{}),i.barEnd]})]}),i.belowBar?(0,R.jsx)(`div`,{className:`shrink-0`,children:i.belowBar}):null,(0,R.jsxs)(`div`,{className:`flex min-h-0 grow basis-0`,children:[(0,R.jsxs)(`div`,{ref:g,className:`canvas-dots relative min-w-0 grow ${m===`actual`?`overflow-auto`:`overflow-hidden`}`,children:[E.length?(0,R.jsxs)(`div`,{className:`absolute inset-x-0 top-0 z-10 flex items-start gap-2 border-b border-rule bg-danger-soft px-4 py-2 font-mono text-[12px] whitespace-pre-wrap text-danger-text`,children:[(0,R.jsx)(Z,{name:`alert`,size:14,className:`mt-px`}),E.join(`
|
|
127
|
+
`)}function wO(e){let t=e;return!!t&&(t.isContentEditable||/^(input|textarea|select)$/i.test(t.tagName))}var TO=new URLSearchParams(window.location.search),EO=TO.has(`capture`),DO=(e,t)=>`foss-design.camera.${e}.${t}`;function OO(e){try{let t=JSON.parse(sessionStorage.getItem(e)??`null`);if(t&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.z))return t}catch{}return null}function kO(e){let t=__(),n=TO.get(`theme`),[r,i]=(0,v.useState)(n===`dark`||n===`light`?n:null);return[r??e?.theme??t,i]}function AO({canvasId:e,pageId:t}){let{data:n,error:r,isLoading:i}=e_(e);if(r)return(0,R.jsx)(Fw,{title:`Canvas not found`,text:r.message});if(i||!n)return(0,R.jsx)(`div`,{className:`canvas-dots grow`});let a=t??TO.get(`page`)??void 0,o=n.pages.find(e=>e.id===a)??n.pages[0];return(0,R.jsx)(jO,{canvas:n,page:o},`${n.id}/${o?.id??``}`)}function jO({canvas:e,page:t}){let[,n]=F(),r=(0,v.useMemo)(()=>ZT(),[]),i=(0,v.useMemo)(()=>new Rw,[]),a=(0,v.useRef)(null),[o,s]=kO(e),[c,l]=(0,v.useState)(()=>!EO&&window.innerWidth>900),[u,d]=(0,v.useState)(!1),f=c_(r,e=>e.sizes),p=(0,v.useMemo)(()=>t?YT(t,f):{items:[],sections:[],bounds:{x:0,y:0,w:0,h:0}},[t,f]),m=FO(c_(r,e=>e.frameEls),p),h=ew(m),g=u||h;(0,v.useEffect)(()=>{r.set(e=>e.inspecting===g?e:{...e,inspecting:g,active:null})},[g,r]);let _=$C(m,g,{onEscape:()=>d(!1)}),y=!!_.info;(0,v.useEffect)(()=>{y&&d(!0)},[y]),(0,v.useEffect)(()=>{let e=_.frame;if(!e)return;let t=Object.entries(r.get().frameEls).find(([,t])=>t===e)?.[0];t&&r.get().selected!==t&&r.set(e=>({...e,selected:t}))},[_.frame,r]);let b=(0,v.useMemo)(()=>XT(p),[p]),x=DO(e.id,t?.id??``),S=(0,v.useRef)(!1);(0,v.useEffect)(()=>{if(S.current||!p.bounds.w)return;S.current=!0;let t=o_(e.id),n=EO?null:OO(x);t?(r.set(e=>({...e,selected:t})),requestAnimationFrame(()=>a.current?.fitItem(t,!1))):n&&n.z>=i.minZoom?i.set(n):requestAnimationFrame(()=>EO?a.current?.fitAll(!1):a.current?.openView())},[p,i,x,e.id,r]),(0,v.useEffect)(()=>{if(EO)return;let e,t=i.subscribe(t=>{clearTimeout(e),e=setTimeout(()=>sessionStorage.setItem(x,JSON.stringify(t)),250)});return()=>{t(),clearTimeout(e)}},[i,x]);let C=(0,v.useCallback)(e=>{let t=e?p.items.find(t=>t.item.id===e)?.item:void 0;r.set(e=>({...e,selected:t?t.id:null,active:t&&KT(t)?t.id:null,hovered:null}))},[p,r]),w=(0,v.useCallback)(e=>{C(e),a.current?.fitItem(e)},[C]),T=(0,v.useCallback)(r=>n(`/c/${encodeURIComponent(e.id)}/play/${encodeURIComponent(r)}${t?`?page=${encodeURIComponent(t.id)}`:``}`),[e.id,t,n]);(0,v.useEffect)(()=>{let t=t=>{let n=t.detail;n.canvas===e.id&&p.items.some(e=>e.item.id===n.item)&&(o_(e.id),w(n.item))};return window.addEventListener(`design:focus`,t),()=>window.removeEventListener(`design:focus`,t)},[e.id,p,w]);let E=(0,v.useMemo)(()=>({onGo(r,i){let[a,o]=i.includes(`/`)?i.split(`/`):[null,i],s=a?e.pages.filter(e=>e.id===a):[t,...e.pages.filter(e=>e!==t)];for(let r of s)if(r&&r.sections.some(e=>e.items.some(e=>e.id===o))){r===t?w(o):(n(IT(e,r)),window.dispatchEvent(new CustomEvent(`design:focus`,{detail:{canvas:e.id,item:o}})));return}console.warn(`[design] go("${i}"): no such screen`)},onLink(t,n){QC(n,e,e=>this.onGo(t,e),t)},onWheel(e,t){let n=e.closest(`.canvas-root`);if(!n)return;let r=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=i.camera.z;if(t.zoom){let e=Math.abs(t.deltaY)<40?.012:.0025;i.zoomAt(a.left-r.left+t.x*o,a.top-r.top+t.y*o,Math.exp(-t.deltaY*e))}else i.panBy(-t.deltaX,-t.deltaY)},onEscape(){r.set(e=>({...e,active:null}))}}),[e,t,i,r,w,n]);return(0,v.useEffect)(()=>{if(!EO)return;let e=Date.now(),t=setInterval(()=>{let n=r.get().frames;(b.every(e=>n[e.item.id]?.ready||e.item.kind===`screen`&&e.item.missing)||Date.now()-e>6e4)&&(clearInterval(t),a.current?.fitAll(!1),requestAnimationFrame(()=>requestAnimationFrame(()=>window.__DESIGN_CANVAS_READY__=!0)))},250);return()=>clearInterval(t)},[b,r]),(0,v.useEffect)(()=>{let i=i=>{if(wO(i.target)||document.querySelector(`[role="dialog"]`))return;let o=a.current,s=r.get(),c=i.metaKey||i.ctrlKey;if(i.key===`Escape`)_.info?_.select(null):u?d(!1):s.active?r.set(e=>({...e,active:null})):s.selected&&r.set(e=>({...e,selected:null}));else if(i.key===`i`&&!c&&!i.altKey)d(e=>!e);else if(i.shiftKey&&i.code===`Digit1`)o?.fitAll();else if(i.shiftKey&&i.code===`Digit2`&&s.selected)o?.fitItem(s.selected);else if(i.shiftKey&&i.code===`Digit0`)o?.zoomTo(1);else if((i.key===`=`||i.key===`+`)&&!i.altKey)i.preventDefault(),o?.zoomBy(1.4);else if(i.key===`-`&&!i.altKey)i.preventDefault(),o?.zoomBy(1/1.4);else if(c&&i.key===`0`)i.preventDefault(),o?.zoomTo(1);else if(c&&i.key===`\\`)i.preventDefault(),l(e=>!e);else if([`ArrowRight`,`ArrowDown`,`ArrowLeft`,`ArrowUp`].includes(i.key)&&b.length){i.preventDefault();let e=b.findIndex(e=>e.item.id===s.selected),t=i.key===`ArrowRight`||i.key===`ArrowDown`?1:-1,n=b[e===-1?0:(e+t+b.length)%b.length];r.set(e=>({...e,selected:n.item.id,active:null})),o?.fitItem(n.item.id)}else if(i.key===`Enter`&&s.selected){let e=p.items.find(e=>e.item.id===s.selected)?.item;e&&KT(e)&&T(e.id)}else if(i.key===`]`||i.key===`[`){let r=t?e.pages.indexOf(t):-1,a=e.pages[r+(i.key===`]`?1:-1)];a&&n(IT(e,a))}};return window.addEventListener(`keydown`,i),()=>window.removeEventListener(`keydown`,i)},[r,b,p,T,e,t,n,u,_]),EO?(0,R.jsx)(`div`,{className:`flex h-dvh`,children:(0,R.jsx)(SO,{layout:p,theme:o,store:r,camera:i,events:E,capture:!0,apiRef:a,onPlay:()=>{},onSelect:()=>{}})}):(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsx)(RT,{canvas:e,page:t,theme:o,onTheme:s,sidebar:c,onSidebar:l,inspect:u,onInspect:d,onPlay:()=>{let e=r.get().selected,t=e&&b.find(t=>t.item.id===e)||b[0];t&&T(t.item.id)},canPlay:b.length>0}),(0,R.jsxs)(`div`,{className:`flex min-h-0 grow basis-0`,children:[(0,R.jsx)(Ow,{open:c&&!!t,side:`left`,width:264,children:t?(0,R.jsx)(LT,{canvas:e,page:t,store:r,onPick:w}):null}),(0,R.jsxs)(`div`,{className:`relative min-w-0 grow`,children:[t&&p.items.length?(0,R.jsx)(SO,{layout:p,theme:o,store:r,camera:i,events:E,capture:!1,apiRef:a,onPlay:T,onSelect:C}):(0,R.jsx)(`div`,{className:`canvas-dots flex h-full`,children:(0,R.jsx)(Pw,{title:t?`This page is empty`:`This canvas has no pages`,text:(0,R.jsxs)(R.Fragment,{children:[`Add sections and screens to`,` `,(0,R.jsxs)(`code`,{className:`font-mono text-[13px]`,children:[`.design/canvas/`,e.id,`/canvas.json`]}),`.`]})})}),(0,R.jsx)(zT,{canvas:e,store:r,layoutItems:p.items.map(e=>e.item),theme:o,onPlay:T,inspect:g}),(0,R.jsx)(NO,{camera:i,apiRef:a}),e.issues.length?(0,R.jsx)(PO,{canvas:e}):null]}),(0,R.jsx)(Ow,{open:u,side:`right`,width:320,children:(0,R.jsx)(uw,{info:_.info,active:!0,onSelect:e=>_.select(e),onClose:()=>{d(!1),_.select(null)}})})]})]})}function MO({camera:e}){let[t,n]=(0,v.useState)(e.camera.z);return(0,v.useEffect)(()=>{let t=0;return e.subscribe(e=>{cancelAnimationFrame(t),t=requestAnimationFrame(()=>n(e.z))})},[e]),(0,R.jsxs)(R.Fragment,{children:[Math.round(t*100),`%`]})}function NO({camera:e,apiRef:t}){return(0,R.jsxs)(`div`,{"data-ui":!0,className:`absolute right-4 bottom-5 z-20 flex h-[46px] items-center gap-0.5 rounded-[10px] border border-rule bg-surface px-1.5 shadow-pop`,children:[(0,R.jsx)(N_,{icon:`zoom-out`,label:`Zoom out (−)`,onClick:()=>t.current?.zoomBy(1/1.4)}),(0,R.jsxs)(VS,{side:`top`,align:`end`,width:210,trigger:(0,R.jsx)(`button`,{type:`button`,className:`h-ctrl min-w-[56px] cursor-pointer rounded-[6px] border-0 bg-transparent px-1.5 text-[12.5px] font-medium text-ink2 tabular hover:bg-soft2`,children:(0,R.jsx)(MO,{camera:e})}),children:[(0,R.jsx)(US,{onSelect:()=>t.current?.fitAll(),hint:`⇧1`,children:`Zoom to fit`}),(0,R.jsx)(US,{onSelect:()=>t.current?.zoomTo(1),hint:`⇧0`,children:`100%`}),(0,R.jsx)(WS,{}),[.25,.5,2].map(e=>(0,R.jsxs)(US,{onSelect:()=>t.current?.zoomTo(e),children:[e*100,`%`]},e))]}),(0,R.jsx)(N_,{icon:`zoom-in`,label:`Zoom in (+)`,onClick:()=>t.current?.zoomBy(1.4)}),(0,R.jsx)(`div`,{className:`mx-0.5 h-5 w-px bg-rule`}),(0,R.jsx)(N_,{icon:`fit`,label:`Zoom to fit (⇧1)`,onClick:()=>t.current?.fitAll()})]})}function PO({canvas:e}){let t=e.issues.filter(e=>e.severity===`error`).length;return(0,R.jsxs)(EC,{children:[(0,R.jsx)(DC,{asChild:!0,children:(0,R.jsxs)(`button`,{type:`button`,"data-ui":!0,className:`absolute bottom-5 left-4 z-20 flex h-[46px] cursor-pointer items-center gap-2 rounded-[10px] border border-rule bg-surface px-3.5 text-[13px] font-medium shadow-pop hover:bg-soft`,children:[(0,R.jsx)(Z,{name:`alert`,size:15,className:t?`text-danger-text`:`text-action`}),e.issues.length,` `,e.issues.length===1?`problem`:`problems`,` in canvas.json`]})}),(0,R.jsx)(OC,{children:(0,R.jsx)(kC,{side:`top`,align:`start`,sideOffset:8,collisionPadding:12,className:`z-50 max-h-[50vh] w-[460px] max-w-[calc(100vw-24px)] overflow-y-auto rounded-[10px] border border-rule bg-surface shadow-pop outline-none data-[state=open]:animate-[q-pop_120ms_ease-out]`,children:(0,R.jsx)(Tw,{issues:e.issues})})})]})}function FO(e,t){let n=(0,v.useRef)([]);return(0,v.useMemo)(()=>{let r=new Set(t.items.filter(e=>e.item.kind===`screen`).map(e=>e.item.id)),i=Object.entries(e).filter(e=>!!e[1]&&r.has(e[0])).map(([,e])=>e);return i.length===n.current.length&&i.every((e,t)=>e===n.current[t])||(n.current=i),n.current},[e,t])}function IO({open:e,onOpenChange:t,title:n,children:r}){return(0,R.jsx)(mg,{open:e,onOpenChange:t,children:(0,R.jsx)($u,{children:e?(0,R.jsxs)(vg,{forceMount:!0,children:[(0,R.jsx)(bg,{asChild:!0,forceMount:!0,children:(0,R.jsx)(Wf.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.16},className:`fixed inset-0 z-50 bg-overlay`})}),(0,R.jsx)(wg,{asChild:!0,forceMount:!0,"aria-describedby":void 0,children:(0,R.jsxs)(Wf.div,{initial:{y:`100%`},animate:{y:0},exit:{y:`100%`,transition:{duration:.18,ease:`easeIn`}},transition:{type:`spring`,stiffness:420,damping:40},className:`fixed inset-x-0 bottom-0 z-50 flex max-h-[82dvh] flex-col rounded-t-[14px] border-t border-rule bg-surface pb-[env(safe-area-inset-bottom)] shadow-pop outline-none`,children:[(0,R.jsx)(`div`,{className:`flex justify-center pt-2`,children:(0,R.jsx)(`span`,{"aria-hidden":!0,className:`h-1 w-9 rounded-full bg-rule-strong`})}),(0,R.jsxs)(`div`,{className:`flex min-h-[48px] items-center justify-between gap-3 pr-2 pl-4`,children:[(0,R.jsx)(kg,{className:`m-0 truncate text-[15px] font-semibold`,children:n}),(0,R.jsx)(jg,{asChild:!0,children:(0,R.jsx)(N_,{icon:`x`,label:`Close`})})]}),(0,R.jsx)(`div`,{className:`min-h-0 overflow-y-auto overscroll-contain border-t border-rule`,children:r})]})})]}):null})})}function LO(e,t){return(t?e.pages.filter(e=>e.id===t):e.pages).flatMap(t=>t.sections.flatMap(n=>n.items.filter(e=>e.kind===`screen`||e.kind===`url`).map(r=>({item:r,pageId:t.id,where:[e.pages.length>1?t.title:null,n.title].filter(Boolean).join(` · `)}))))}var RO=(e,t,n)=>`/c/${encodeURIComponent(e)}/play/${encodeURIComponent(t)}?page=${encodeURIComponent(n)}`;function zO({canvasId:e,itemId:t}){let{data:n,error:r,isLoading:i}=e_(e);return r?(0,R.jsx)(Fw,{title:`Canvas not found`,text:r.message}):i||!n?null:(0,R.jsx)(BO,{canvas:n,itemId:t})}function BO({canvas:e,itemId:t}){let[,n]=F(),{frameSandbox:r,slots:i}=Xg(),a=new URLSearchParams(window.location.search).get(`page`)??(window.location.hash.split(`?`)[1]?new URLSearchParams(window.location.hash.split(`?`)[1]).get(`page`):null),o=(0,v.useMemo)(()=>LO(e,null),[e]),s=o.find(e=>e.item.id===t),c=a??s?.pageId??null,l=(0,v.useMemo)(()=>c?LO(e,c):o,[e,c,o]),u=l.findIndex(e=>e.item.id===t),d=__(),[f,p]=(0,v.useState)(e.theme??d),[m,h]=(0,v.useState)(`fit`),g=(0,v.useRef)(null),_=(0,v.useRef)(null),[y,b]=(0,v.useState)(null),x=(0,v.useCallback)(e=>{_.current=e,b(e)},[]),[S,C]=(0,v.useState)(!1),[w,T]=(0,v.useState)({w:0,h:0}),[E,D]=(0,v.useState)([]),O=c?`/c/${encodeURIComponent(e.id)}/p/${encodeURIComponent(c)}`:`/c/${encodeURIComponent(e.id)}`,k=t=>{if(!l.length)return;let r=l[(u+t+l.length)%l.length];n(RO(e.id,r.item.id,r.pageId),{replace:!0})};(0,v.useLayoutEffect)(()=>{let e=g.current;if(!e)return;let t=new ResizeObserver(()=>T({w:e.clientWidth,h:e.clientHeight}));return t.observe(e),()=>t.disconnect()},[]),(0,v.useEffect)(()=>{let e=e=>{wO(e.target)||document.querySelector(`[role="dialog"]`)||(e.key===`ArrowRight`?k(1):e.key===`ArrowLeft`?k(-1):e.key===`i`&&!e.metaKey&&!e.ctrlKey&&!e.altKey?C(e=>!e):e.key===`Escape`&&(P.info?P.select(null):S?C(!1):n(O)))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)});let A=l[u],j=A?.item,ee=j?.kind===`screen`?j.theme??f:f,te=NT(e.id,j,ee),[M]=(0,v.useState)(ee),N=j?j.kind===`screen`?XC(j.url,M):j.url:``,ne=(0,v.useMemo)(()=>y&&j?.kind===`screen`?[y]:[],[y,j?.kind]),re=ew(ne),P=$C(ne,S||re,{onEscape:()=>C(!1)}),ie=!!P.info;if((0,v.useEffect)(()=>{ie&&C(!0)},[ie]),(0,v.useEffect)(()=>{let t=_.current;if(t&&j?.kind===`screen`)return D([]),WC(t,t=>{if(t.type===`error`)D(e=>e.includes(t.message)?e:[...e,t.message]);else if(t.type===`updated`)D([]);else if(t.type===`keydown`&&t.code===`Escape`)n(O);else if(t.type===`go`){let[r,i]=t.target.includes(`/`)?t.target.split(`/`):[null,t.target],a=o.find(e=>e.item.id===i&&(!r||e.pageId===r));a&&n(RO(e.id,a.item.id,a.pageId))}else t.type===`link`&&QC(t,e,t=>{let r=o.find(e=>e.item.id===t);r&&n(RO(e.id,r.item.id,r.pageId))},j?.id)})},[j,N,o,e.id,n,O]),(0,v.useEffect)(()=>{j?.kind===`screen`&&qC(_.current,ee)},[ee,j]),!j)return(0,R.jsx)(Fw,{title:`Screen not found`,text:`No screen "${t}" on this canvas.`});let ae=j.frame.width,oe=j.frame.height===`auto`?Math.max(w.h-48,400):j.frame.height,se=m===`fit`?Math.min(1,(w.w-48)/ae,(w.h-48)/oe):1,ce=ae<=w.w-48&&oe<=w.h-48;return(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsxs)(XS,{children:[i.barStart,(0,R.jsx)(jT,{content:(0,R.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[`Back to canvas `,(0,R.jsx)(y_,{children:`esc`})]}),children:(0,R.jsx)(ye,{href:O,className:`inline-flex h-ctrl w-ctrl items-center justify-center rounded-[6px] text-muted hover:bg-soft2 hover:text-ink2`,"aria-label":`Back to canvas`,children:(0,R.jsx)(Z,{name:`arrow-left`,size:16})})}),(0,R.jsxs)(`div`,{className:`flex min-w-0 flex-col leading-tight`,children:[(0,R.jsx)(`span`,{className:`truncate text-[14px] font-semibold`,children:j.title}),(0,R.jsx)(`span`,{className:`truncate text-[12px] text-muted`,children:[e.title,A.where].filter(Boolean).join(` · `)})]}),(0,R.jsxs)(`div`,{className:`mx-auto flex items-center gap-1`,children:[(0,R.jsx)(N_,{icon:`chevron-left`,label:`Previous screen (←)`,onClick:()=>k(-1),disabled:l.length<2}),(0,R.jsxs)(`span`,{className:`min-w-[52px] text-center text-[12.5px] text-muted tabular`,children:[u+1,` / `,l.length]}),(0,R.jsx)(N_,{icon:`chevron-right`,label:`Next screen (→)`,onClick:()=>k(1),disabled:l.length<2})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[ce?null:(0,R.jsx)(Vw,{label:`Scale`,value:m,onChange:h,items:[{value:`fit`,label:`Fit`},{value:`actual`,label:`100%`}]}),j.kind===`screen`&&!j.theme?(0,R.jsx)(Vw,{label:`Screen theme`,value:f,onChange:p,items:[{value:`light`,label:(0,R.jsx)(Z,{name:`sun`,size:15}),title:`Light`},{value:`dark`,label:(0,R.jsx)(Z,{name:`moon`,size:15}),title:`Dark`}]}):null,j.kind===`screen`?(0,R.jsx)(BT,{on:S,onChange:C}):null,(0,R.jsx)(N_,{icon:`refresh`,label:`Reload`,onClick:()=>JC(_.current)}),te?(0,R.jsx)(`a`,{href:te,target:`_blank`,rel:`noreferrer`,title:`Open in a new tab`,className:`inline-flex h-ctrl w-ctrl items-center justify-center rounded-[6px] text-muted hover:bg-soft2 hover:text-ink2`,children:(0,R.jsx)(Z,{name:`external`,size:16})}):null,(0,R.jsx)(qS,{}),i.barEnd]})]}),i.belowBar?(0,R.jsx)(`div`,{className:`shrink-0`,children:i.belowBar}):null,(0,R.jsxs)(`div`,{className:`flex min-h-0 grow basis-0`,children:[(0,R.jsxs)(`div`,{ref:g,className:`canvas-dots relative min-w-0 grow overscroll-none ${m===`actual`?`overflow-auto`:`overflow-hidden`}`,children:[E.length?(0,R.jsxs)(`div`,{className:`absolute inset-x-0 top-0 z-10 flex items-start gap-2 border-b border-rule bg-danger-soft px-4 py-2 font-mono text-[12px] whitespace-pre-wrap text-danger-text`,children:[(0,R.jsx)(Z,{name:`alert`,size:14,className:`mt-px`}),E.join(`
|
|
128
128
|
`)]}):null,(0,R.jsx)(`div`,{className:`flex min-h-full min-w-full items-center justify-center p-6`,style:{width:m===`actual`?ae+48:void 0},children:(0,R.jsx)(`div`,{className:`shrink-0 overflow-hidden bg-surface`,style:{width:ae*se,height:oe*se,boxShadow:`var(--shadow-frame), 0 0 0 1px var(--rule)`},children:(0,R.jsx)(`iframe`,{ref:x,src:N,title:j.title,allow:`clipboard-read; clipboard-write; fullscreen`,sandbox:r,className:`block border-0`,style:{width:ae,height:oe,transform:`scale(${se})`,transformOrigin:`0 0`,colorScheme:ee},onLoad:()=>j.kind===`screen`&&qC(_.current,ee)},`${j.id}:${j.kind===`screen`?j.rev:j.url}`)})})]}),(0,R.jsx)(Ow,{open:S,side:`right`,width:320,children:(0,R.jsx)(uw,{info:P.info,active:!0,onSelect:e=>P.select(e),onClose:()=>{C(!1),P.select(null)}})})]})]})}var VO=12;function HO({canvasId:e,pageId:t,itemId:n}){let{data:r,error:i,isLoading:a}=e_(e);return i?(0,R.jsx)(Fw,{title:`Canvas not found`,text:i.message}):a||!r?(0,R.jsx)(`div`,{className:`canvas-dots h-dvh`}):(0,R.jsx)(UO,{canvas:r,pageId:t,itemId:n})}function UO({canvas:e,pageId:t,itemId:n}){let[,r]=F(),{frameSandbox:i,slots:a,scope:o}=Xg(),s=__(),c=(0,v.useMemo)(()=>LO(e,null),[e]),l=Math.max(0,n?c.findIndex(e=>e.item.id===n):t?c.findIndex(e=>e.pageId===t):0),u=c[l],d=u?.item,[f,p]=(0,v.useState)(e.theme??s),[m,h]=(0,v.useState)(!1),[g,_]=(0,v.useState)([]),[y,b]=(0,v.useState)(0),[x,S]=(0,v.useState)(null),[C,w]=(0,v.useState)(0),[T,E]=(0,v.useState)(!1),D=(0,v.useRef)(null),O=(0,v.useRef)(null),[k,A]=(0,v.useState)(null),j=(0,v.useCallback)(e=>{e&&(O.current=e,A(e))},[]),ee=(0,v.useCallback)((t,n=0)=>{w(n),r(RO(e.id,t.item.id,t.pageId),{replace:!0})},[e.id,r]),te=e=>{c.length<2||ee(c[(l+e+c.length)%c.length],e)},M=e=>{let t=c.find(t=>t.item.id===e);t&&ee(t,c.indexOf(t)>l?1:-1)};(0,v.useLayoutEffect)(()=>{let e=D.current;if(!e)return;let t=new ResizeObserver(()=>b(e.clientWidth));return t.observe(e),()=>t.disconnect()},[]);let N=d?.kind===`screen`?d.theme??f:f,[ne]=(0,v.useState)(N),re=d?d.kind===`screen`?XC(d.url,ne):d.url:``,P=NT(e.id,d,N);(0,v.useEffect)(()=>{_([]),S(d?.kind===`screen`?d.measuredHeight??null:null),D.current?.scrollTo({top:0});let t=O.current;if(t&&d?.kind===`screen`)return WC(t,t=>{t.type===`size`?S(t.height):t.type===`error`?_(e=>e.includes(t.message)?e:[...e,t.message]):t.type===`updated`?_([]):t.type===`go`?M(t.target.includes(`/`)?t.target.split(`/`)[1]:t.target):t.type===`link`&&QC(t,e,M,d.id)})},[k,re]),(0,v.useEffect)(()=>{d?.kind===`screen`&&qC(O.current,N)},[N,d]),(0,v.useEffect)(()=>{let e=e=>{document.querySelector(`[role="dialog"]`)||(e.key===`ArrowRight`?te(1):e.key===`ArrowLeft`&&te(-1))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)});let ie=(0,v.useRef)(null),ae=e=>{let t=e.touches[0];ie.current=t?{x:t.clientX,y:t.clientY}:null},oe=e=>{let t=ie.current,n=e.changedTouches[0];if(ie.current=null,!t||!n)return;let r=n.clientX-t.x,i=n.clientY-t.y;Math.abs(r)>56&&Math.abs(r)>Math.abs(i)*1.5&&te(r<0?1:-1)};if(!d||!u)return(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsx)(GO,{canvas:e,title:e.title,sub:null}),(0,R.jsx)(Fw,{title:`No screens here`,text:`This canvas has no screens to show yet.`})]});let se=d.frame.width,ce=y?Math.min(1,(y-24)/se):0,le=ce>0&&ce<.8,ue=le&&T?1:ce,de=d.frame.height===`auto`?Math.max(x??0,480):d.frame.height,fe=d.kind===`screen`&&!d.theme;return(0,R.jsxs)(`div`,{className:`flex h-dvh flex-col`,children:[(0,R.jsx)(GO,{canvas:e,title:d.title||d.id,sub:[e.title,u.where].filter(Boolean).join(` · `),back:o?void 0:`/`,end:(0,R.jsxs)(R.Fragment,{children:[le?(0,R.jsx)(N_,{icon:T?`zoom-out`:`zoom-in`,label:T?`Fit to width`:`Actual size`,onClick:()=>E(e=>!e)}):null,(0,R.jsxs)(VS,{align:`end`,width:220,trigger:(0,R.jsx)(N_,{icon:`more`,label:`Screen options`}),children:[fe?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(GS,{children:`Screen theme`}),(0,R.jsx)(WO,{value:`light`,current:f,onPick:p}),(0,R.jsx)(WO,{value:`dark`,current:f,onPick:p}),(0,R.jsx)(WS,{})]}):null,(0,R.jsxs)(US,{onSelect:()=>JC(O.current),children:[(0,R.jsx)(Z,{name:`refresh`,size:15,className:`text-ink2`}),`Reload screen`]}),P?(0,R.jsxs)(US,{onSelect:()=>window.open(P,`_blank`,`noopener`),children:[(0,R.jsx)(Z,{name:`external`,size:15,className:`text-ink2`}),`Open in a new tab`]}):null,(0,R.jsxs)(US,{onSelect:()=>h_(s===`dark`?`light`:`dark`),children:[(0,R.jsx)(Z,{name:s===`dark`?`sun`:`moon`,size:15,className:`text-ink2`}),s===`dark`?`Light appearance`:`Dark appearance`]})]}),a.barEnd]})}),a.belowBar?(0,R.jsx)(`div`,{className:`shrink-0`,children:a.belowBar}):null,(0,R.jsxs)(`div`,{ref:D,onTouchStart:ae,onTouchEnd:oe,className:X(`canvas-dots relative min-h-0 grow overflow-y-auto overscroll-contain`,le&&T?`overflow-x-auto`:`overflow-x-hidden`),children:[g.length?(0,R.jsxs)(`div`,{className:`sticky top-0 z-10 flex items-start gap-2 border-b border-rule bg-danger-soft px-4 py-2 font-mono text-[12px] whitespace-pre-wrap text-danger-text`,children:[(0,R.jsx)(Z,{name:`alert`,size:14,className:`mt-px shrink-0`}),(0,R.jsx)(`span`,{className:`min-w-0 break-words`,children:g.join(`
|
|
129
129
|
`)})]}):null,(0,R.jsx)($u,{initial:!1,mode:`popLayout`,custom:C,children:(0,R.jsx)(Wf.div,{custom:C,initial:{opacity:0,x:C*40},animate:{opacity:1,x:0},exit:{opacity:0,x:C*-40,transition:{duration:.12}},transition:{type:`spring`,stiffness:420,damping:38},className:X(`flex`,le&&T?`w-max`:`justify-center`),style:{padding:VO},children:ue?(0,R.jsx)(`div`,{className:`shrink-0 overflow-hidden rounded-[6px] bg-surface`,style:{width:se*ue,height:de*ue,boxShadow:`var(--shadow-frame), 0 0 0 1px var(--rule)`},children:(0,R.jsx)(`iframe`,{ref:j,src:re,title:d.title,allow:`clipboard-read; clipboard-write; fullscreen`,sandbox:i,className:`block border-0`,style:{width:se,height:de,transform:`scale(${ue})`,transformOrigin:`0 0`,colorScheme:N},onLoad:()=>d.kind===`screen`&&qC(O.current,N)},`${d.id}:${d.kind===`screen`?d.rev:d.url}`)}):null},d.id)})]}),(0,R.jsxs)(`nav`,{"aria-label":`Screens`,className:`flex shrink-0 items-center gap-1 border-t border-rule bg-surface px-2 pt-1.5 pb-[max(6px,env(safe-area-inset-bottom))]`,children:[(0,R.jsx)(N_,{icon:`chevron-left`,label:`Previous screen`,onClick:()=>te(-1),disabled:c.length<2}),(0,R.jsxs)(`button`,{type:`button`,onClick:()=>h(!0),className:`flex h-10 min-w-0 grow cursor-pointer items-center justify-center gap-2 rounded-[8px] border-0 bg-transparent px-3 text-[13.5px] text-ink active:bg-soft2`,children:[(0,R.jsx)(Z,{name:`list`,size:15,className:`shrink-0 text-muted`}),(0,R.jsxs)(`span`,{className:`tabular shrink-0 text-muted`,children:[l+1,` / `,c.length]}),(0,R.jsx)(`span`,{className:`min-w-0 truncate font-medium`,children:d.title||d.id})]}),(0,R.jsx)(N_,{icon:`chevron-right`,label:`Next screen`,onClick:()=>te(1),disabled:c.length<2})]}),(0,R.jsx)(IO,{open:m,onOpenChange:h,title:e.title,children:(0,R.jsx)(qO,{canvas:e,current:d.id,onPick:e=>{h(!1),M(e)}})})]})}function WO({value:e,current:t,onPick:n}){return(0,R.jsxs)(US,{active:t===e,onSelect:()=>n(e),children:[(0,R.jsx)(Z,{name:e===`dark`?`moon`:`sun`,size:15,className:`text-ink2`}),e===`dark`?`Dark`:`Light`,t===e?(0,R.jsx)(Z,{name:`check`,size:15,className:`ml-auto text-ink2`}):null]})}function GO({canvas:e,title:t,sub:n,back:r,end:i}){let{slots:a}=Xg();return(0,R.jsxs)(`header`,{className:`flex h-[52px] shrink-0 items-center gap-2 border-b border-rule bg-surface pr-2 pl-2 pt-[env(safe-area-inset-top)]`,children:[a.barStart,r?(0,R.jsx)(ye,{href:r,"aria-label":`All canvases, leaving ${e.title}`,className:`inline-flex size-10 shrink-0 items-center justify-center rounded-[8px] text-ink2 active:bg-soft2`,children:(0,R.jsx)(Z,{name:`arrow-left`,size:18})}):(0,R.jsx)(`span`,{className:`flex size-10 shrink-0 items-center justify-center`,children:(0,R.jsx)(JS,{})}),(0,R.jsxs)(`div`,{className:`flex min-w-0 grow flex-col leading-tight`,children:[(0,R.jsx)(`span`,{className:`truncate text-[14.5px] font-semibold`,children:t}),n?(0,R.jsx)(`span`,{className:`truncate text-[12px] text-muted`,children:n}):null]}),(0,R.jsx)(`div`,{className:`flex shrink-0 items-center gap-1`,children:i})]})}var KO=e=>e.item.kind===`url`?`globe`:e.item.frame.device===`phone`?`smartphone`:e.item.frame.device===`tablet`?`tablet`:`monitor`;function qO({canvas:e,current:t,onPick:n}){let r=(0,v.useRef)(null);(0,v.useEffect)(()=>{r.current?.scrollIntoView({block:`center`})},[]);let i=e.pages.length>1;return(0,R.jsx)(`div`,{className:`flex flex-col pb-2`,children:e.pages.map(a=>{let o=LO(e,a.id);return o.length?(0,R.jsxs)(`section`,{className:`flex flex-col`,children:[i?(0,R.jsx)(`h3`,{className:`sticky top-0 z-[1] m-0 border-b border-rule bg-soft px-4 py-2 text-[12px] font-semibold text-ink2`,children:a.title}):null,a.sections.map(e=>{let i=o.filter(t=>e.items.includes(t.item));return i.length?(0,R.jsxs)(`div`,{className:`flex flex-col`,children:[e.title?(0,R.jsx)(`div`,{className:`px-4 pt-3 pb-1 text-[12px] text-muted`,children:e.title}):null,i.map(e=>{let i=e.item.id===t;return(0,R.jsxs)(`button`,{ref:i?r:void 0,type:`button`,"aria-current":i?`true`:void 0,onClick:()=>n(e.item.id),className:X(`flex min-h-[48px] cursor-pointer items-center gap-3 border-0 bg-transparent px-4 text-left text-[14px] active:bg-soft2`,i?`font-medium text-ink`:`text-ink2`),children:[(0,R.jsx)(`span`,{className:X(`flex size-8 shrink-0 items-center justify-center rounded-[8px]`,i?`bg-action-soft text-action`:`bg-soft2 text-muted`),children:(0,R.jsx)(Z,{name:KO(e),size:15})}),(0,R.jsx)(`span`,{className:`min-w-0 grow truncate`,children:e.item.title||e.item.id}),i?(0,R.jsx)(Z,{name:`check`,size:16,className:`shrink-0 text-action`}):null]},e.item.id)})]},e.id):null})]},a.id):null})})}var JO=[[`year`,31536e3],[`month`,2592e3],[`week`,604800],[`day`,86400],[`hour`,3600],[`minute`,60]],YO=new Intl.RelativeTimeFormat(`en`,{numeric:`auto`});function XO(e){if(!e)return``;let t=(e-Date.now())/1e3;for(let[e,n]of JO)if(Math.abs(t)>=n)return YO.format(Math.round(t/n),e);return`just now`}function ZO(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(+(e<10240))} KB`:`${(e/1024/1024).toFixed(1)} MB`}function QO(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}function $O({className:e,style:t}){return(0,R.jsx)(`span`,{"aria-hidden":`true`,className:X(`block animate-pulse rounded-[6px] bg-soft2`,e),style:t})}function ek({rows:e=3,lead:t=28,minH:n=56}){return(0,R.jsx)(`div`,{role:`status`,"aria-label":`Loading`,children:Array.from({length:e},(e,r)=>(0,R.jsxs)(`div`,{className:`flex items-center gap-3 border-t border-rule px-4`,style:{minHeight:n,opacity:1-r*.18},children:[t?(0,R.jsx)($O,{style:{width:t,height:Math.min(t,n-20)}}):null,(0,R.jsxs)(`span`,{className:`flex min-w-0 grow flex-col gap-1.5`,children:[(0,R.jsx)($O,{className:`h-3 w-[38%]`}),(0,R.jsx)($O,{className:`h-2.5 w-[62%]`})]}),(0,R.jsx)($O,{className:`h-3 w-14`})]},r))})}function tk({canvas:e}){return(0,R.jsx)(`div`,{className:`flex h-[54px] w-[86px] shrink-0 items-center justify-center overflow-hidden rounded-[6px] border border-rule bg-soft`,children:e.cover?(0,R.jsx)(`img`,{src:e.cover,alt:``,className:`h-full w-full object-cover object-top`}):(0,R.jsx)(Z,{name:`canvas`,size:18,className:`text-muted`})})}function nk({actions:e,children:t}){return e?(0,R.jsxs)(`div`,{className:`grid items-center border-t border-rule transition-colors hover:bg-soft`,style:{gridTemplateColumns:`minmax(0,1fr) auto`},children:[t,(0,R.jsx)(`div`,{className:`flex items-center gap-2 pr-4`,children:e})]}):t}function rk({children:e}){return e?(0,R.jsx)(`div`,{className:`flex items-center gap-2.5 border-t border-rule bg-soft px-4 py-3 text-[12.5px] text-muted`,children:e}):null}function ik({project:e}){let{canvasRowActions:t,canvasesFoot:n}=Xg().slots,r=rC();return e.canvases.length?(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Canvases`,count:e.canvases.length}),e.canvases.map(e=>{let n=t?.(e.id);return(0,R.jsx)(nk,{actions:n,children:r?(0,R.jsxs)(Sw,{to:`/c/${encodeURIComponent(e.id)}`,cols:`86px minmax(0,1fr)`,align:`ll`,pad:`10px 16px`,minH:74,first:!!n,children:[(0,R.jsx)(tk,{canvas:e}),(0,R.jsx)(b_,{top:e.title,bottom:(0,R.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[e.issues?(0,R.jsx)(fw,{tone:`danger`,children:QO(e.issues,`problem`)}):null,(0,R.jsxs)(`span`,{className:`truncate`,children:[QO(e.screens,`screen`),` · `,XO(e.updatedAt)]})]})})]}):(0,R.jsxs)(Sw,{to:`/c/${encodeURIComponent(e.id)}`,cols:`86px minmax(0,1fr) auto auto`,align:`llrr`,pad:`10px 16px`,minH:74,first:!!n,children:[(0,R.jsx)(tk,{canvas:e}),(0,R.jsx)(b_,{top:e.title,bottom:(0,R.jsx)(`span`,{className:`truncate`,children:e.description??e.id})}),(0,R.jsxs)(`span`,{className:`flex items-center gap-2 text-[12.5px] whitespace-nowrap text-muted`,children:[e.issues?(0,R.jsx)(fw,{tone:`danger`,children:QO(e.issues,`problem`)}):null,QO(e.screens,`screen`),` · `,QO(e.pages,`page`)]}),(0,R.jsx)(`span`,{className:`w-[92px] text-[12.5px] whitespace-nowrap text-muted`,children:XO(e.updatedAt)})]})},e.id)}),(0,R.jsx)(rk,{children:n})]}):(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Canvases`,count:0}),(0,R.jsx)(ww,{children:(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 py-6 text-center`,children:[(0,R.jsx)(`span`,{className:`text-[14px] text-ink2`,children:`No canvases yet.`}),(0,R.jsxs)(`span`,{className:`text-[13px] text-muted`,children:[`Ask your agent to design something, or run `,(0,R.jsx)(Q,{children:`design new <name>`}),` in the project.`]})]})}),(0,R.jsx)(rk,{children:n})]})}function ak({project:e}){let t=e.system;return t?(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Design system`,right:(0,R.jsx)(P_,{to:`/system`,children:`Open`})}),(0,R.jsxs)(ww,{gap:6,children:[(0,R.jsx)(`span`,{className:`text-[15px] font-semibold`,children:t.name}),t.description?(0,R.jsx)(`span`,{className:`text-[13px] text-ink2`,children:t.description}):null]}),(0,R.jsx)(Cw,{label:`Tokens`,labelWidth:120,end:!0,children:(0,R.jsx)(pw,{value:t.tokens})}),(0,R.jsx)(Cw,{label:`Components`,labelWidth:120,end:!0,children:(0,R.jsx)(pw,{value:t.components})}),(0,R.jsx)(Cw,{label:`Guidelines`,labelWidth:120,end:!0,children:(0,R.jsx)(pw,{value:t.guidelines})}),t.issues?(0,R.jsx)(Cw,{label:`Problems`,labelWidth:120,end:!0,children:(0,R.jsx)(fw,{tone:`danger`,children:t.issues})}):null]}):(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Design system`}),(0,R.jsx)(ww,{children:(0,R.jsxs)(`span`,{className:`text-[13px] text-muted`,children:[`No design system yet. Ask your agent to build one from the codebase, or run `,(0,R.jsx)(Q,{children:`design system init`}),`.`]})})]})}function ok(){return(0,R.jsxs)(kw,{children:[(0,R.jsxs)(`div`,{className:`flex flex-col gap-2.5 pt-1 pb-1`,children:[(0,R.jsx)($O,{className:`h-6 w-[220px]`}),(0,R.jsx)($O,{className:`h-3.5 w-[300px]`})]}),(0,R.jsxs)(`div`,{className:`grid items-start gap-5 max-lg:grid-cols-1!`,style:{gridTemplateColumns:`minmax(0,1fr) 340px`},children:[(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Canvases`}),(0,R.jsx)(ek,{rows:3,lead:86,minH:74})]}),(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:`Design system`}),(0,R.jsx)(ek,{rows:3,lead:0,minH:40})]})]})]})}function sk(){let{data:e,error:t,isLoading:n}=$g(),{slots:r}=Xg(),i=rC();return t?(0,R.jsx)(Pw,{title:`Could not load the project`,text:t.message}):n||!e?(0,R.jsx)(ok,{}):(0,R.jsxs)(kw,{children:[(0,R.jsx)(Aw,{title:e.name,right:i?void 0:r.homeActions,badge:i&&r.homeActions?(0,R.jsx)(`span`,{className:`ml-auto flex`,children:r.homeActions}):void 0,sub:r.homeSub?r.homeSub:e.static?`Snapshot built with foss-design ${e.version}`:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(Q,{size:12.5,wrap:!0,children:[e.root,`/.design`]}),` `,`· foss-design `,e.version]})}),(0,R.jsx)(Ew,{issues:e.issues,title:`Problems in design.json`}),(0,R.jsxs)(`div`,{className:`grid items-start gap-5 max-lg:grid-cols-1!`,style:{gridTemplateColumns:`minmax(0,1fr) 340px`},children:[(0,R.jsx)(ik,{project:e}),(0,R.jsx)(ak,{project:e})]}),r.homeAfter]})}function ck(e){let t=e.utility;if(t===void 0)return[];let n=t?`-${t}`:``;switch(e.kind){case`color`:return[`bg${n}`,`text${n}`,`border${n}`];case`font`:return[`font${n}`];case`text`:return[`text${n}`];case`weight`:return[`font${n}`];case`leading`:return[`leading${n}`];case`tracking`:return[`tracking${n}`];case`spacing`:return t?[`p${n}`,`gap${n}`]:[`p-1`,`gap-4`,`m-2`];case`radius`:return[`rounded${n}`];case`shadow`:return e.name.startsWith(`--inset-shadow-`)?[`inset-shadow${n}`]:e.name.startsWith(`--drop-shadow-`)?[`drop-shadow${n}`]:e.name.startsWith(`--text-shadow-`)?[`text-shadow${n}`]:[`shadow${n}`];case`blur`:return[`blur${n}`,`backdrop-blur${n}`];case`ease`:return[`ease${n}`];case`animation`:return[`animate${n}`];case`breakpoint`:return e.name.startsWith(`--container-`)?[`@${t}:`,`max-w${n}`]:[`${t}:`];default:return[]}}function lk(e,...t){return e.filter(e=>t.includes(e.kind))}function uk(e){let t=new Map;for(let n of e){let e=t.get(n.group)??[];e.push(n),t.set(n.group,e)}return[...t].map(([e,t])=>({group:e,tokens:t}))}function dk(e){let t=/^(-?[\d.]+)(px|rem|em)?$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?t[2]===`rem`||t[2]===`em`?n*16:n:null}function fk(e,t){return(t===`dark`?e.dark?.value:void 0)??e.light?.value}function pk(){let e=__(),[t,n]=(0,v.useState)(null);return[t??e,n]}function mk({value:e,onChange:t}){return(0,R.jsx)(Vw,{label:`Theme`,size:`sm`,value:e,onChange:t,items:[{value:`light`,label:(0,R.jsx)(Z,{name:`sun`,size:14}),title:`Light`},{value:`dark`,label:(0,R.jsx)(Z,{name:`moon`,size:14}),title:`Dark`}]})}function hk({items:e}){return e.length?(0,R.jsx)(`span`,{className:`flex min-w-0 flex-wrap gap-x-2 gap-y-0.5`,children:e.map(e=>(0,R.jsx)(Q,{size:12,className:`text-muted`,children:e},e))}):null}function gk({title:e,children:t}){return(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:e}),(0,R.jsx)(ww,{children:(0,R.jsx)(`div`,{className:`py-4 text-[13px] text-muted`,children:t})})]})}var _k=`.design/system/tokens.css`;function vk({children:e,className:t}){return(0,R.jsx)(`span`,{className:`font-mono text-[12px] text-muted [overflow-wrap:anywhere] ${t??``}`,children:e})}function yk({asset:e,index:t}){if(e.kind===`image`)return(0,R.jsx)(`span`,{className:`checker flex h-[132px] items-center justify-center overflow-hidden border-b border-rule`,children:(0,R.jsx)(`img`,{src:e.url,alt:``,className:`max-h-[96px] max-w-[80%] object-contain`})});if(e.kind===`font`){let n=`design-asset-font-${t}`;return(0,R.jsxs)(`span`,{className:`flex h-[132px] items-center justify-center border-b border-rule bg-soft`,children:[(0,R.jsx)(`style`,{children:`@font-face{font-family:"${n}";src:url("${e.url.replace(/"/g,`%22`)}")}`}),(0,R.jsx)(`span`,{className:`text-[52px] leading-none text-ink`,style:{fontFamily:`"${n}", var(--font-sans)`},children:`Aa`})]})}return(0,R.jsx)(`span`,{className:`flex h-[132px] items-center justify-center border-b border-rule bg-soft text-muted`,children:(0,R.jsx)(Z,{name:`file`,size:28})})}function bk({system:e}){return e.assets.length?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(Aw,{title:`Assets`,sub:`Click an asset to copy its import path.`}),(0,R.jsx)(`div`,{className:`grid gap-4`,style:{gridTemplateColumns:`repeat(auto-fill, minmax(210px, 1fr))`},children:e.assets.map((e,t)=>(0,R.jsx)(`button`,{type:`button`,title:`Copy the import path`,onClick:()=>IC(`@system/${e.path}`),className:`block cursor-pointer border-0 bg-transparent p-0 text-left`,children:(0,R.jsxs)(mw,{className:`transition-colors hover:border-rule-strong`,children:[(0,R.jsx)(yk,{asset:e,index:t}),(0,R.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5 px-3.5 py-2.5`,children:[(0,R.jsx)(`span`,{className:`truncate text-[13.5px] font-medium text-ink`,children:e.name}),(0,R.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2 text-[12.5px] text-muted`,children:[(0,R.jsx)(`span`,{className:`shrink-0`,children:ZO(e.size)}),(0,R.jsx)(Q,{size:12,className:`truncate`,children:e.path})]})]})]})},e.path))})]}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(Aw,{title:`Assets`}),(0,R.jsxs)(gk,{title:`No assets`,children:[`Put logos, icons, images and font files in `,(0,R.jsx)(Q,{children:`.design/system/assets`}),`; screens import them as`,` `,(0,R.jsx)(Q,{children:`@system/assets/…`}),`.`]})]})}function xk({color:e,label:t,className:n}){return e?(0,R.jsx)(`span`,{title:`${t}: ${e}`,className:X(`checker relative h-[30px] w-[44px] shrink-0 overflow-hidden rounded-[6px]`,n),children:(0,R.jsx)(`span`,{className:`absolute inset-0 rounded-[6px] shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)] dark:shadow-[inset_0_0_0_1px_rgba(255,255,255,0.12)]`,style:{background:e}})}):(0,R.jsx)(`span`,{className:X(`h-[30px] w-[44px] shrink-0`,n)})}function Sk({tokens:e}){let t=e.some(e=>e.dark),n=t=>(0,R.jsxs)(`div`,{className:`relative flex h-9 min-w-0 grow overflow-hidden rounded-[6px]`,children:[(0,R.jsx)(`span`,{className:`pointer-events-none absolute inset-0 z-10 rounded-[6px] shadow-[inset_0_0_0_1px_var(--rule-strong)] opacity-60`}),e.map(e=>{let n=t===`dark`?e.dark?.value??e.light?.value:e.light?.value;return(0,R.jsx)(`button`,{type:`button`,title:`${e.name}: ${n}`,onClick:()=>IC(`var(${e.name})`),className:`h-full min-w-0 flex-1 cursor-pointer border-0 p-0 transition-[flex-grow] duration-150 hover:grow-[1.6]`,style:{background:n}},e.name)})]});return(0,R.jsxs)(`div`,{className:`flex flex-col gap-1.5 border-t border-rule px-4 py-3`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-3`,children:[t?(0,R.jsx)(`span`,{className:`w-9 shrink-0 text-[12px] text-muted`,children:`Light`}):null,n(`light`)]}),t?(0,R.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,R.jsx)(`span`,{className:`w-9 shrink-0 text-[12px] text-muted`,children:`Dark`}),n(`dark`)]}):null]})}function Ck({token:e}){return(0,R.jsxs)(xw,{cols:`100px minmax(170px, 0.9fr) minmax(0, 1.4fr)`,minH:56,title:`Copy the variable`,onClick:()=>IC(`var(${e.name})`),children:[(0,R.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,R.jsx)(xk,{color:e.light?.value,label:`Light`}),e.dark?(0,R.jsx)(xk,{color:e.dark.value,label:`Dark`}):null]}),(0,R.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,R.jsx)(Q,{size:12.5,className:`truncate text-ink`,children:e.name}),(0,R.jsx)(hk,{items:ck(e).slice(0,2)})]}),(0,R.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,R.jsxs)(`span`,{className:`flex min-w-0 flex-wrap gap-x-3`,children:[(0,R.jsx)(Q,{size:12,className:`text-muted`,children:e.light?.value}),e.dark?(0,R.jsxs)(Q,{size:12,className:`text-muted`,children:[`dark `,e.dark.value]}):null]}),e.description?(0,R.jsx)(`span`,{className:`text-[13px] text-ink2`,children:e.description}):null]})]})}function wk({system:e}){let t=lk(e.tokens,`color`),n=uk(t);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(Aw,{title:`Colors`,sub:t.length?`${t.length} tokens · click a color to copy its variable`:void 0}),n.length?n.map(({group:e,tokens:t})=>(0,R.jsxs)(mw,{children:[(0,R.jsx)(hw,{title:e,count:t.length}),(0,R.jsx)(Sk,{tokens:t}),t.map(e=>(0,R.jsx)(Ck,{token:e},e.name))]},e)):(0,R.jsxs)(gk,{title:`No color tokens`,children:[`Add them to `,(0,R.jsx)(Q,{children:_k}),`: light values in `,(0,R.jsx)(Q,{children:`:root`}),`, dark ones in`,` `,(0,R.jsx)(Q,{children:`:root[data-theme="dark"]`}),`, and map them to Tailwind with `,(0,R.jsx)(Q,{children:`--color-*`}),` in`,` `,(0,R.jsx)(Q,{children:`@theme inline`}),`.`]})]})}function Tk({src:e,theme:t,title:n,minHeight:r=120,width:i,className:a}){let o=(0,v.useRef)(null),{frameSandbox:s}=Xg(),[c]=(0,v.useState)(()=>({src:e,theme:t})),l=XC(e,c.src===e?c.theme:t),[u,d]=(0,v.useState)(r),[f,p]=(0,v.useState)(!1),[m,h]=(0,v.useState)([]);return(0,v.useEffect)(()=>{let e=o.current;if(e)return p(!1),h([]),WC(e,e=>{e.type===`size`?d(Math.max(r,e.height)):e.type===`ready`?p(!0):e.type===`error`?h(t=>t.includes(e.message)?t:[...t,e.message]):e.type===`updated`&&h([])})},[r,l]),(0,v.useEffect)(()=>{qC(o.current,t)},[t]),(0,R.jsxs)(`div`,{className:X(`relative`,a),style:{width:i},children:[m.length?(0,R.jsxs)(`div`,{className:`flex items-start gap-2 border-b border-rule bg-danger-soft px-4 py-2.5 text-[12.5px] text-danger-text`,children:[(0,R.jsx)(Z,{name:`alert`,size:15,className:`mt-px`}),(0,R.jsx)(`div`,{className:`min-w-0 font-mono break-words`,children:m.join(`
|
|
130
130
|
`)})]}):null,(0,R.jsx)(`iframe`,{ref:o,src:l,title:n,sandbox:s,className:X(`block w-full border-0 transition-opacity duration-150`,f?`opacity-100`:`opacity-0`),style:{height:u,colorScheme:t},onLoad:()=>qC(o.current,t)},l),f?null:(0,R.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center text-muted`,children:(0,R.jsx)(Z,{name:`loader`,size:18})})]})}var Ek=`identifier keyword string class property entity jsxliterals sign comment break space`.split(` `),[Dk,Ok,kk,Ak,jk,Mk,Nk,Pk,Fk,Ik,Lk]=Ek.map((e,t)=>t);new Map(Ek.map((e,t)=>[e,t]));function Rk(e,t){let n=[],r=0,i=[],a=!1;function o(e){n.push({index:r++,value:e.map(([,e])=>e).join(``),tokens:e.map(([e,t])=>({type:Ek[e],value:t})),annotations:[]})}for(let e=0;e<t.length;e++){let n=t[e],[r,s]=n;if(r!==Ik){if(s.includes(`
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"IBM Plex Sans", system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, monospace;--spacing:.25rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--leading-tight:1.25;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"IBM Plex Sans", system-ui, sans-serif;--default-mono-font-family:"IBM Plex Mono", ui-monospace, monospace;--color-ink:var(--ink);--shadow-pop:var(--shadow-pop);--shadow-frame:var(--shadow-frame)}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);-webkit-text-size-adjust:100%;overscroll-behavior:none;font-size:14px;line-height:1.45}body{min-height:100dvh;margin:0}#root{flex-direction:column;min-height:100dvh;display:flex;overflow:clip}button{font:inherit}:focus-visible{outline:2px solid var(--action);outline-offset:2px}:where(.overflow-y-auto,.overflow-auto,.overflow-hidden) :focus-visible{outline-offset:-2px}::selection{background:var(--action-soft)}@supports selector(::-webkit-scrollbar){::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-corner{background:0 0}::-webkit-scrollbar-thumb{background:var(--scrollbar) padding-box;border:3px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-hover)}::-webkit-scrollbar-button{display:none}}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-x-6{inset-inline:calc(var(--spacing) * 6)}.inset-y-5{inset-block:calc(var(--spacing) * 5)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[2px\]{top:2px}.top-\[52px\]{top:52px}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:0}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-\[2px\]{left:2px}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-auto{margin-block:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-px{margin-top:1px}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[7px\]{width:7px;height:7px}.size-\[14px\]{width:14px;height:14px}.h-ctrl{height:32px}@media (max-width:767px){.h-ctrl{height:40px}}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-\[2px\]{height:2px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[44px\]{height:44px}.h-\[46px\]{height:46px}.h-\[52px\]{height:52px}.h-\[54px\]{height:54px}.h-\[60px\]{height:60px}.h-\[88px\]{height:88px}.h-\[112px\]{height:112px}.h-\[132px\]{height:132px}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[82dvh\]{max-height:82dvh}.max-h-\[96px\]{max-height:96px}.max-h-\[640px\]{max-height:640px}.max-h-\[calc\(100dvh-52px\)\]{max-height:calc(100dvh - 52px)}.max-h-\[min\(56vh\,520px\)\]{max-height:min(56vh,520px)}.max-h-\[min\(560px\,76vh\)\]{max-height:min(560px,76vh)}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-\[38px\]{min-height:38px}.min-h-\[46px\]{min-height:46px}.min-h-\[48px\]{min-height:48px}.min-h-\[50vh\]{min-height:50vh}.min-h-full{min-height:100%}.w-ctrl{width:32px}@media (max-width:767px){.w-ctrl{width:40px}}.w-5{width:calc(var(--spacing) * 5)}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-\[32px\]{width:32px}.w-\[38\%\]{width:38%}.w-\[44px\]{width:44px}.w-\[62\%\]{width:62%}.w-\[86px\]{width:86px}.w-\[92px\]{width:92px}.w-\[108px\]{width:108px}.w-\[220px\]{width:220px}.w-\[264px\]{width:264px}.w-\[300px\]{width:300px}.w-\[320px\]{width:320px}.w-\[460px\]{width:460px}.w-\[480px\]{width:480px}.w-\[560px\]{width:560px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-\[80\%\]{max-width:80%}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[400px\]{max-width:400px}.max-w-\[760px\]{max-width:760px}.max-w-\[1100px\]{max-width:1100px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[1440px\]{max-width:1440px}.max-w-\[calc\(100vw-24px\)\]{max-width:calc(100vw - 24px)}.max-w-\[min\(420px\,calc\(100vw-32px\)\)\]{max-width:min(420px,100vw - 32px)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\[3ch\]{min-width:3ch}.min-w-\[18px\]{min-width:18px}.min-w-\[52px\]{min-width:52px}.min-w-\[56px\]{min-width:56px}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink-\[20\]{flex-shrink:20}.grow{flex-grow:1}.basis-0{flex-basis:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[q-fade-in_160ms_ease-out\]{animation:.16s ease-out q-fade-in}.animate-\[q-pop_120ms_ease-out\]{animation:.12s ease-out q-pop}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-\[28px_minmax\(0\,1fr\)_28px\]{grid-template-columns:28px minmax(0,1fr) 28px}.grid-cols-\[92px_minmax\(0\,1fr\)\]{grid-template-columns:92px minmax(0,1fr)}.grid-rows-\[20px_auto_20px\]{grid-template-rows:20px auto 20px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.overscroll-none{overscroll-behavior:none}.rounded-\[1px\]{border-radius:1px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[9px\]{border-radius:9px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-full{border-radius:2147483647px}.rounded-t-\[14px\]{border-top-left-radius:14px;border-top-right-radius:14px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-action-line{border-color:var(--action-line)}.border-danger,.border-danger\/40{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.border-note-line{border-color:var(--note-line)}.border-primary{border-color:var(--primary)}.border-rule{border-color:var(--rule)}.border-rule-strong{border-color:var(--rule-strong)}.border-transparent{border-color:#0000}.checker{background-color:var(--surface);background-image:linear-gradient(45deg, var(--soft2) 25%, transparent 25%), linear-gradient(-45deg, var(--soft2) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--soft2) 75%), linear-gradient(-45deg, transparent 75%, var(--soft2) 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-size:16px 16px}.bg-\[\#6fa8dc\]\/25{background-color:#6fa8dc40;background-color:lab(66.4792% -8.4376 -32.6413/.25)}.bg-\[\#93c47d\]\/20{background-color:#93c47d33;background-color:lab(74.3863% -26.5347 30.2911/.2)}.bg-\[\#f6b26b\]\/15{background-color:#f6b26b26;background-color:lab(78.0588% 20.0952 46.1567/.15)}.bg-\[\#f9e27d\]\/15{background-color:#f9e27d26;background-color:lab(90.2485% -1.16244 51.8854/.15)}.bg-action{background-color:var(--action)}.bg-action-soft{background-color:var(--action-soft)}.bg-action\/70{background-color:var(--action)}@supports (color:color-mix(in lab, red, red)){.bg-action\/70{background-color:color-mix(in oklab, var(--action) 70%, transparent)}}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-ink{background-color:var(--ink)}.bg-ink2{background-color:var(--ink2)}.bg-note{background-color:var(--note)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-overlay{background-color:var(--overlay)}.bg-primary{background-color:var(--primary)}.bg-rule{background-color:var(--rule)}.bg-rule-strong{background-color:var(--rule-strong)}.bg-soft{background-color:var(--soft)}.bg-soft2{background-color:var(--soft2)}.bg-surface,.bg-surface\/40{background-color:var(--surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/40{background-color:color-mix(in oklab, var(--surface) 40%, transparent)}}.bg-track{background-color:var(--track)}.bg-transparent{background-color:#0000}.fill-action{fill:var(--action)}.fill-none{fill:none}.fill-primary{fill:var(--primary)}.fill-primary-ink{fill:var(--primary-ink)}.stroke-ink{stroke:var(--ink)}.stroke-rule{stroke:var(--rule)}.stroke-rule-strong{stroke:var(--rule-strong)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-top{object-position:top}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.px-ctrl{padding-inline:12px}@media (max-width:767px){.px-ctrl{padding-inline:14px}}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-\[5px\]{padding-inline:5px}.px-\[10px\]{padding-inline:10px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-\[7px\]{padding-block:7px}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-\[12vh\]{padding-top:12vh}.pt-\[env\(safe-area-inset-top\)\]{padding-top:env(safe-area-inset-top)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.pb-\[max\(6px\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(6px, env(safe-area-inset-bottom))}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:IBM Plex Mono,ui-monospace,monospace}.text-ctrl{font-size:13.5px}@media (max-width:767px){.text-ctrl{font-size:14px}}.text-\[9\.5px\]{font-size:9.5px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[22px\]{font-size:22px}.text-\[40px\]{font-size:40px}.text-\[52px\]{font-size:52px}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.015em\]{--tw-tracking:-.015em;letter-spacing:-.015em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-action{color:var(--action)}.text-danger-text{color:var(--danger-text)}.text-inherit{color:inherit}.text-ink{color:var(--ink)}.text-ink2{color:var(--ink2)}.text-muted{color:var(--muted)}.text-ok-text{color:var(--ok-text)}.text-on-danger{color:var(--on-danger)}.text-primary-ink{color:var(--primary-ink)}.uppercase{text-transform:uppercase}.tabular{font-variant-numeric:tabular-nums}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(0\,0\,0\,0\.10\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(0\,0\,0\,0\.25\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(0\,0\,0\,0\.12\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_var\(--rule-strong\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,var(--rule-strong));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-frame{--tw-shadow:var(--shadow-frame);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-pop{--tw-shadow:var(--shadow-pop);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-\[1\.5px\]{outline-style:var(--tw-outline-style);outline-width:1.5px}.outline-action,.outline-action\/60{outline-color:var(--action)}@supports (color:color-mix(in lab, red, red)){.outline-action\/60{outline-color:color-mix(in oklab, var(--action) 60%, transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,opacity\]{transition-property:background-color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[flex-grow\]{transition-property:flex-grow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-\[cubic-bezier\(0\.2\,0\.7\,0\.2\,1\)\]{--tw-ease:cubic-bezier(.2,.7,.2,1);transition-timing-function:cubic-bezier(.2,.7,.2,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted::placeholder{color:var(--muted)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.focus-within\:outline-offset-2:focus-within{outline-offset:2px}.focus-within\:outline-action:focus-within{outline-color:var(--action)}@media (hover:hover){.hover\:grow-\[1\.6\]:hover{flex-grow:1.6}.hover\:border-rule:hover{border-color:var(--rule)}.hover\:border-rule-strong:hover{border-color:var(--rule-strong)}.hover\:bg-soft:hover{background-color:var(--soft)}.hover\:bg-soft2:hover{background-color:var(--soft2)}.hover\:text-ink:hover{color:var(--ink)}.hover\:text-ink2:hover{color:var(--ink2)}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:outline-offset-\[-2px\]:focus-visible{outline-offset:-2px}.active\:bg-soft2:active{background-color:var(--soft2)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.aria-disabled\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.aria-disabled\:opacity-45[aria-disabled=true]{opacity:.45}.data-\[disabled\]\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[highlighted\]\:bg-soft[data-highlighted]{background-color:var(--soft)}.data-\[state\=closed\]\:animate-\[q-pop-out_100ms_ease-in_forwards\][data-state=closed]{animation:.1s ease-in forwards q-pop-out}.data-\[state\=delayed-open\]\:animate-\[q-pop_120ms_ease-out\][data-state=delayed-open],.data-\[state\=open\]\:animate-\[q-pop_120ms_ease-out\][data-state=open]{animation:.12s ease-out q-pop}@media not all and (min-width:80rem){.max-xl\:grid-cols-1\!{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media not all and (min-width:64rem){.max-lg\:static{position:static}.max-lg\:hidden{display:none}.max-lg\:max-h-none{max-height:none}.max-lg\:w-auto\!{width:auto!important}.max-lg\:grid-cols-1\!{grid-template-columns:repeat(1,minmax(0,1fr))!important}.max-lg\:gap-0{gap:0}.max-lg\:gap-1{gap:var(--spacing)}.max-lg\:overflow-visible{overflow:visible}.max-lg\:pb-0{padding-bottom:0}}@media not all and (min-width:48rem){.max-md\:flex{display:flex}.max-md\:hidden{display:none}.max-md\:w-ctrl\!{width:32px!important}@media (max-width:767px){.max-md\:w-ctrl\!{width:40px!important}}.max-md\:flex-col{flex-direction:column}.max-md\:items-stretch{align-items:stretch}.max-md\:justify-center{justify-content:center}.max-md\:gap-3{gap:calc(var(--spacing) * 3)}.max-md\:border-0\!{border-style:var(--tw-border-style)!important;border-width:0!important}.max-md\:bg-transparent\!{background-color:#0000!important}.max-md\:p-0\!{padding:0!important}.max-md\:px-4{padding-inline:calc(var(--spacing) * 4)}.max-md\:pt-4{padding-top:calc(var(--spacing) * 4)}}.dark\:shadow-\[inset_0_0_0_1px_rgba\(255\,255\,255\,0\.12\)\]:where([data-theme=dark],[data-theme=dark] *){--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#ffffff1f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media not all and (min-width:64rem){.max-lg\:\[\&_nav\]\:flex-row nav{flex-direction:row}.max-lg\:\[\&_nav\]\:flex-wrap nav{flex-wrap:wrap}}}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-greek-400-normal-_efipK4i.woff2)format("woff2"),url(./ibm-plex-sans-greek-400-normal-D9ESIMu3.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-latin-400-normal-CDDApCn2.woff2)format("woff2"),url(./ibm-plex-sans-latin-400-normal-CYLoc0-x.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-greek-500-normal-JMMifIXV.woff2)format("woff2"),url(./ibm-plex-sans-greek-500-normal-CuWXN6rf.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-latin-500-normal-6ng42L7E.woff2)format("woff2"),url(./ibm-plex-sans-latin-500-normal-BgVn5rGT.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2)format("woff2"),url(./ibm-plex-sans-greek-600-normal-D-CqTdkO.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2)format("woff2"),url(./ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2)format("woff2"),url(./ibm-plex-mono-latin-400-normal-CvHOgSBP.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2)format("woff2"),url(./ibm-plex-mono-latin-500-normal-CB9ihrfo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#edeff2;--surface:#fff;--soft:#f5f6f8;--soft2:#e8ebef;--ink:#1b1f24;--ink2:#3a414a;--muted:#59626d;--rule:#dce0e5;--rule-strong:#b5bcc5;--action:#a55700;--action-soft:#fbebd6;--action-line:#edcb9c;--ok:#1f7045;--ok-text:#1f7045;--ok-soft:#e2f1e8;--danger:#b42318;--danger-text:#b42318;--danger-soft:#fce8e6;--on-danger:#fff;--primary:#1b1f24;--primary-ink:#fff;--track:#d6dae0;--overlay:#1b1f2466;--shadow-pop:0 16px 40px #1b1f2429;--shadow-frame:0 1px 2px #1b1f240f, 0 8px 24px #1b1f240f;--grid-dot:#c9ced5;--note:#fdf3e3;--note-line:#edd6b1;--scrollbar:#c3c9d0;--scrollbar-hover:#9aa2ac;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--bg:#141619;--surface:#1b1e22;--soft:#202328;--soft2:#2a2e34;--ink:#e6e8eb;--ink2:#c3c8ce;--muted:#8a929c;--rule:#2a2e34;--rule-strong:#474d55;--action:#f0a040;--action-soft:#35280f;--action-line:#6b4a17;--ok:#58bd86;--ok-text:#6ccb97;--ok-soft:#183024;--danger:#e5645a;--danger-text:#f28b82;--danger-soft:#3a1d1a;--on-danger:#1a0b09;--primary:#e6e8eb;--primary-ink:#141619;--track:#2a2e34;--overlay:#0000008c;--shadow-pop:0 16px 40px #00000080;--shadow-frame:0 1px 2px #0000004d, 0 8px 24px #00000040;--grid-dot:#30343a;--note:#2a2415;--note-line:#574420;--scrollbar:#3a3f46;--scrollbar-hover:#565d66;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}@keyframes q-pop{0%{opacity:0;transform:translateY(-4px)scale(.98)}to{opacity:1;transform:none}}@keyframes q-pop-out{0%{opacity:1;transform:none}to{opacity:0;transform:translateY(-2px)scale(.98)}}@keyframes q-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.prose{color:var(--ink2);overflow-wrap:anywhere;font-size:14px;line-height:1.6}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.prose h1,.prose h2,.prose h3,.prose h4{color:var(--ink);margin:1.6em 0 .5em;font-weight:600;line-height:1.3}.prose h1{letter-spacing:-.01em;font-size:22px}.prose h2{font-size:17px}.prose h3{font-size:15px}.prose p,.prose ul,.prose ol,.prose pre,.prose table,.prose blockquote{margin:0 0 .9em}.prose ul,.prose ol{padding-left:1.3em}.prose ul{list-style:outside}.prose ol{list-style:decimal}.prose li+li{margin-top:.25em}.prose li::marker{color:var(--muted)}.prose strong{color:var(--ink);font-weight:600}.prose a{color:var(--ink);text-decoration:underline;-webkit-text-decoration-color:var(--rule-strong);-webkit-text-decoration-color:var(--rule-strong);-webkit-text-decoration-color:var(--rule-strong);text-decoration-color:var(--rule-strong);text-underline-offset:3px}.prose a:hover{-webkit-text-decoration-color:var(--ink2);-webkit-text-decoration-color:var(--ink2);-webkit-text-decoration-color:var(--ink2);text-decoration-color:var(--ink2)}.prose code{font-family:var(--font-mono);background:var(--soft2);border-radius:4px;padding:.1em .35em;font-size:.9em}.prose pre{background:var(--soft);border:1px solid var(--rule);border-radius:8px;padding:12px 14px;font-size:12.5px;line-height:1.55;overflow-x:auto}.prose pre code{font-size:inherit;background:0 0;padding:0}.prose blockquote{border-left:2px solid var(--rule-strong);color:var(--muted);padding-left:12px}.prose hr{border:0;border-top:1px solid var(--rule);margin:1.5em 0}.prose table{border-collapse:collapse;width:100%;font-size:13px}.prose th,.prose td{border-top:1px solid var(--rule);text-align:left;vertical-align:top;padding:6px 10px 6px 0}.prose th{color:var(--muted);font-weight:500}.prose img{border-radius:6px;max-width:100%}.prose.prose-note{font-size:17px;line-height:1.55}.prose.prose-plain{font-size:20px;line-height:1.5}:root{--sh-class:#7a4a00;--sh-identifier:#1b1f24;--sh-sign:#59626d;--sh-property:#1f5a8a;--sh-entity:#6d3fa0;--sh-jsxliterals:#1b1f24;--sh-string:#1f7045;--sh-keyword:#a55700;--sh-comment:#8d959f}:root[data-theme=dark]{--sh-class:#f0c070;--sh-identifier:#e6e8eb;--sh-sign:#8a929c;--sh-property:#7fb8e6;--sh-entity:#c49cf0;--sh-jsxliterals:#e6e8eb;--sh-string:#6ccb97;--sh-keyword:#f0a040;--sh-comment:#6e7680}.canvas-dots{background-color:var(--bg);background-image:radial-gradient(circle, var(--grid-dot) 1px, transparent 1.2px)}.canvas-root{background-color:var(--bg)}.canvas-grid{pointer-events:none;background-image:radial-gradient(circle, var(--grid-dot) 1px, transparent 1.2px);will-change:transform;position:absolute;inset:-96px}.canvas-world{transform-origin:0 0;position:absolute;top:0;left:0}.canvas-world.moving{will-change:transform}.canvas-world.far .canvas-section{visibility:hidden}.canvas-panning iframe{pointer-events:none}.canvas-overlay{pointer-events:none;position:absolute;inset:0;overflow:hidden}.canvas-overlay [data-at]{transform:translate(calc(var(--x) * var(--z) * 1px + var(--tx) * 1px), calc(var(--y) * var(--z) * 1px + var(--ty) * 1px));position:absolute;top:0;left:0}.canvas-overlay .frame-label{width:calc(var(--w) * var(--z) * 1px);translate:0 -100%;container-type:inline-size}@container (width<=250px){.frame-device{display:none}}.canvas-overlay .frame-outline{width:calc(var(--w) * var(--z) * 1px);height:calc(var(--h) * var(--z) * 1px)}.canvas-overlay[data-tiny=true] .frame-label{display:none}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
package/dist/viewer/index.html
CHANGED
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
document.documentElement.dataset.theme = dark ? 'dark' : 'light'
|
|
15
15
|
} catch (e) {}
|
|
16
16
|
</script>
|
|
17
|
-
<script type="module" crossorigin src="./assets/index-
|
|
18
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
17
|
+
<script type="module" crossorigin src="./assets/index-CBCJT9KP.js"></script>
|
|
18
|
+
<link rel="stylesheet" crossorigin href="./assets/index-CgFWotIU.css">
|
|
19
19
|
</head>
|
|
20
20
|
<body>
|
|
21
21
|
<div id="root"></div>
|
package/dist/viewer-lib/index.js
CHANGED
|
@@ -12898,7 +12898,7 @@ function Player({ canvas, itemId }) {
|
|
|
12898
12898
|
className: "flex min-h-0 grow basis-0",
|
|
12899
12899
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
12900
12900
|
ref: stage,
|
|
12901
|
-
className: `canvas-dots relative min-w-0 grow ${fit === "actual" ? "overflow-auto" : "overflow-hidden"}`,
|
|
12901
|
+
className: `canvas-dots relative min-w-0 grow overscroll-none ${fit === "actual" ? "overflow-auto" : "overflow-hidden"}`,
|
|
12902
12902
|
children: [errors.length ? /* @__PURE__ */ jsxs("div", {
|
|
12903
12903
|
className: "absolute inset-x-0 top-0 z-10 flex items-start gap-2 border-b border-rule bg-danger-soft px-4 py-2 font-mono text-[12px] whitespace-pre-wrap text-danger-text",
|
|
12904
12904
|
children: [/* @__PURE__ */ jsx(Icon, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "foss-design",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Design canvases and design systems for coding agents: live, animated, clickable screens on an infinite canvas, served locally from a .design folder.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|