Spaces:
Running
Running
| import"./modulepreload-polyfill-B5Qt9EMX.js";import{j as S,r as x}from"./index-CMkL1IIy.js";import{c as ve}from"./client-CiuGHKKk.js";import{b as xe,O as Me,a as re,c as be}from"./OrtWorkerClient-BX-dwmm6.js";import{p as Re,b as Fe,c as Ie,i as $e}from"./preprocess-Dn1t3C7G.js";import{s as Oe,f as Ge,a as Le}from"./flowSampler-73rRJlES.js";import{t as V}from"./ImageToGaussianModel-Buc7WHZd.js";import{a as Ne}from"./octree-CtLanPnB.js";const Be={dinov3:"dinov3_encoder_fp32.onnx",vaeEncoder:"flux2_vae_encoder.onnx",dit:"dit_step_webgpu_fp32.onnx",octree:"octree_occupancy_decoder_fp32.onnx",gaussianDecoder:"gaussian_decoder_fp32.onnx"};function me(e){return e.endsWith("/")?e:`${e}/`}function Ce(){return me("/models/triposplat/")}function De(e={}){const t=me(e.baseUrl?.trim()||Ce()),n=["dinov3","vaeEncoder","dit","octree","gaussianDecoder"],r={};for(const s of n){const a=Be[s];r[s]={internalPrecision:"float32",precision:s==="vaeEncoder"?e.vaeInputPrecision??"float32":"float32",manifest:{graphUrl:`${t}${a}`,externalData:[{path:`${a}.data`,url:`${t}${a}.data`}]}}}return r}function Ue(e="/models/triposplat/flux2_vae_encoder.onnx",t="float32"){return{vaeEncoder:{precision:t,manifest:xe(e,{externalDataPath:"flux2_vae_encoder.onnx.data"})}}}const ke=new Float32Array([1,0,0,0,0,-1,0,1,0]),oe=["x","y","z","nx","ny","nz","f_dc_0","f_dc_1","f_dc_2","opacity","scale_0","scale_1","scale_2","rot_0","rot_1","rot_2","rot_3"];function qe(e){return Math.min(1-1e-6,Math.max(1e-6,e))}function je(e){const t=e.opacities.length;if(e.positions.length!==t*3)throw new Error("positions length must equal count * 3.");if(e.scales.length!==t*3)throw new Error("scales length must equal count * 3.");if(e.rotations.length!==t*4)throw new Error("rotations length must equal count * 4.");if(e.sh0.length!==t*3)throw new Error("sh0 length must equal count * 3.");return t}function He(e,t,n,r){const s=1/(Math.hypot(e,t,n,r)||1);return e*=s,t*=s,n*=s,r*=s,new Float64Array([1-2*(n*n+r*r),2*(t*n-e*r),2*(t*r+e*n),2*(t*n+e*r),1-2*(t*t+r*r),2*(n*r-e*t),2*(t*r-e*n),2*(n*r+e*t),1-2*(t*t+n*n)])}function We(e,t){const n=new Float64Array(9);for(let r=0;r<3;r+=1)for(let s=0;s<3;s+=1)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n}function Ve(e){const t=e[0],n=e[4],r=e[8],s=t+n+r;let a,l,c,u;if(s>0){const o=Math.sqrt(s+1)*2;a=.25*o,l=(e[7]-e[5])/o,c=(e[2]-e[6])/o,u=(e[3]-e[1])/o}else if(t>=n&&t>=r){const o=Math.sqrt(Math.max(0,1+t-n-r))*2||1;a=(e[7]-e[5])/o,l=.25*o,c=(e[1]+e[3])/o,u=(e[2]+e[6])/o}else if(n>=r){const o=Math.sqrt(Math.max(0,1+n-t-r))*2||1;a=(e[2]-e[6])/o,l=(e[1]+e[3])/o,c=.25*o,u=(e[5]+e[7])/o}else{const o=Math.sqrt(Math.max(0,1+r-t-n))*2||1;a=(e[3]-e[1])/o,l=(e[2]+e[6])/o,c=(e[5]+e[7])/o,u=.25*o}const i=1/(Math.hypot(a,l,c,u)||1);return[a*i,l*i,c*i,u*i]}function Xe(e){const t=je(e),n=["ply","format binary_little_endian 1.0",`element vertex ${t}`,...oe.map(u=>`property float ${u}`),"end_header",""].join(` | |
| `),r=new TextEncoder().encode(n),s=oe.length*4,a=new Uint8Array(r.length+t*s);a.set(r);const l=new DataView(a.buffer);let c=r.length;for(let u=0;u<t;u+=1){const i=u*3,o=u*4,g=e.positions[i],A=e.positions[i+1],_=e.positions[i+2],f=Ve(We(ke,He(e.rotations[o],e.rotations[o+1],e.rotations[o+2],e.rotations[o+3]))),P=qe(e.opacities[u]),d=[g,-_,A,0,0,0,e.sh0[i],e.sh0[i+1],e.sh0[i+2],Math.log(P/(1-P)),Math.log(Math.max(e.scales[i],1e-12)),Math.log(Math.max(e.scales[i+1],1e-12)),Math.log(Math.max(e.scales[i+2],1e-12)),f[0],f[1],f[2],f[3]];for(const w of d)l.setFloat32(c,w,!0),c+=4}return a}const se=[1,3,1024,1024],B=[1,32,128,128],Z=[1,4101,1280],Q=[1,4101,128],C=[1,8192,16],ee=[1,1,5],ae=8192,ie=32768,D=262144;function y(e){return e.reduce((t,n)=>t*n,1)}const M=32,J=480,Je=0,Ye=96,ze=192,Ke=288,Ze=416,Qe=448,et=.75,ce=9e-4,tt=Math.log(.1/.9),nt=we(.004),rt=we(.05),ot=at();function we(e){return Math.log(Math.expm1(e))}function le(e){return e>20?e:e<-20?Math.exp(e):Math.log1p(Math.exp(e))}function st(e){if(e>=0)return 1/(1+Math.exp(-e));const t=Math.exp(e);return t/(1+t)}function de(e,t){let n=0,r=1/e,s=t;for(;s>0;)n+=s%e*r,s=Math.floor(s/e),r/=e;return n}function at(){const e=new Float32Array(M*3);for(let t=0;t<M;t+=1){const n=[t/M,de(2,t),de(3,t)];for(let r=0;r<3;r+=1)e[t*3+r]=Math.atanh((n[r]*2-1)/1.5)}return e}function it(e,t){if(e.length%3!==0)throw new Error("TripoSplat points must contain xyz triplets.");const n=e.length/3;if(t.length!==n*J)throw new Error(`TripoSplat GS feature length ${t.length} does not match ${n}x${J}.`);const r=n*M,s=new Float32Array(r*3),a=new Float32Array(r*3),l=new Float32Array(r*4),c=new Float32Array(r*3),u=new Float32Array(r);for(let i=0;i<n;i+=1){const o=i*J;for(let g=0;g<M;g+=1){const A=i*M+g,_=A*3,f=A*4,P=le(t[o+Qe+g]+rt);for(let d=0;d<3;d+=1){const w=g*3+d,b=Math.tanh(t[o+Je+w]+ot[w])*et*P;s[_+d]=e[i*3+d]+b-.5,c[_+d]=t[o+Ye+w];const v=le(t[o+ze+w]+nt);a[_+d]=Math.sqrt(v*v+ce*ce)}for(let d=0;d<4;d+=1)l[f+d]=t[o+Ke+g*4+d]*.1+(d===0?1:0);u[A]=st(t[o+Ze+g]+tt)}}return{positions:s,scales:a,rotations:l,sh0:c,opacities:u}}class ue{state;constructor(t){this.state=t>>>0}next(){this.state=this.state+1831565813>>>0;let t=this.state;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}}function X(e,t){let n=0;for(;n<e.length;){const r=Math.max(t.next(),Number.EPSILON),s=t.next(),a=Math.sqrt(-2*Math.log(r)),l=2*Math.PI*s;e[n]=a*Math.cos(l),n+=1,n<e.length&&(e[n]=a*Math.sin(l),n+=1)}return e}const I={dinov3:"triposplat/dinov3",vaeEncoder:"triposplat/vae-encoder",dit:"triposplat/dit",octree:"triposplat/octree",gaussianDecoder:"triposplat/gaussian-decoder"};function $(e,t){if(t.type==="float32")return t.data;if(t.type==="float16")return Le(t.data);throw new Error(`${e} must be float32 or float16, got ${t.type}.`)}function E(e,t,n){return e.precision==="float16"?re("float16",Ge(t),n):re("float32",t,n)}class ct{graphs;client;removeBackground;allowWasmFallback;sessions=new Map;disposed=!1;constructor(t={}){this.graphs=t.graphs??De(),this.removeBackground=t.removeBackground,this.allowWasmFallback=t.allowWasmFallback??!1,this.client=new Me({...t.worker,onStatus:t.onRuntimeStatus})}async load(){this.assertUsable();for(const t of["dinov3","vaeEncoder"])this.graphs[t]&&await this.loadGraph(t)}async encode(t,n={}){this.assertUsable(),V(n.signal);const r=this.graphs.dinov3!==void 0,s=this.graphs.vaeEncoder!==void 0;if(!r&&!s)throw new Error("TripoSplat encoder manifest contains neither DINOv3 nor Flux VAE.");n.onProgress?.({stage:"preprocessing",message:"Preparing the TripoSplat 1024px RGB composite…"});const a=await Re(t,{erodeRadius:n.erodeRadius,removeBackground:this.removeBackground,opaqueImageIsAlreadyPrepared:n.inputIsPrepared}),l=Fe(a.image);V(n.signal);const c={preparedImage:a.image,timings:{}};if(r){n.onProgress?.({stage:"encoding-dinov3",message:"Running DINOv3 on WebGPU…"});const u=this.requireGraph("dinov3");await this.loadGraph("dinov3");const i=await this.client.runSession({sessionId:I.dinov3,inputs:{pixel_values:E(u,l.dinov3.data,se)},outputs:["feature1"]}),o=i.outputs.feature1;if(!o)throw new Error("DINOv3 graph did not return feature1.");if(c.feature1=$("feature1",o),c.feature1.length!==y(Z))throw new Error(`DINOv3 returned ${c.feature1.length} values; expected ${y(Z)}.`);c.timings.dinov3=i.timings}if(s){n.onProgress?.({stage:"encoding-vae",message:"Running the Flux VAE encoder on WebGPU…"});const u=this.requireGraph("vaeEncoder");await this.loadGraph("vaeEncoder");const i=n.vaeNoise?new Float32Array(n.vaeNoise):X(new Float32Array(y(B)),new ue(n.seed??42));if(i.length!==y(B))throw new Error(`VAE epsilon contains ${i.length} values; expected ${y(B)}.`);const o=await this.client.runSession({sessionId:I.vaeEncoder,inputs:{image_rgb:E(u,l.rgb.data,se),epsilon:E(u,i,B)},outputs:["feature2"]}),g=o.outputs.feature2;if(!g)throw new Error("Flux VAE graph did not return feature2.");if(c.feature2=$("feature2",g),c.feature2.length!==y(Q))throw new Error(`Flux VAE returned ${c.feature2.length} values; expected ${y(Q)}.`);c.timings.vaeEncoder=o.timings}return V(n.signal),c}async generate(t,n={}){for(const p of["dinov3","vaeEncoder","dit","octree","gaussianDecoder"])this.requireGraph(p);const r=new ue(n.seed??42),s=n.vaeNoise?new Float32Array(n.vaeNoise):X(new Float32Array(y(B)),r);let a;try{a=await this.encode(t,{...n,vaeNoise:s})}finally{await Promise.all([this.disposeGraph("dinov3"),this.disposeGraph("vaeEncoder")])}if(!a.feature1||!a.feature2)throw new Error("TripoSplat encoding did not produce both conditioning tensors.");V(n.signal);const l={feature1:a.feature1,feature2:a.feature2},c={feature1:new Float32Array(a.feature1.length),feature2:new Float32Array(a.feature2.length)},u=n.latentNoise?new Float32Array(n.latentNoise):X(new Float32Array(y(C)),r),i=n.cameraNoise?new Float32Array(n.cameraNoise):X(new Float32Array(y(ee)),r);this.assertLength("latent noise",u,y(C)),this.assertLength("camera noise",i,y(ee));const o=this.requireGraph("dit");await this.loadGraph("dit");let g=0,A=0;const _=n.steps??20;let f;try{f=await Oe(async p=>{const h=await this.client.runSession({sessionId:I.dit,inputs:{latent:E(o,p.sample.latent,C),camera:E(o,p.sample.camera,ee),t:E(o,new Float32Array(p.timestepTensor),[1]),feature1:E(o,new Float32Array(p.condition.feature1),Z),feature2:E(o,new Float32Array(p.condition.feature2),Q)},outputs:["pred_latent","pred_camera"],tag:`flow-${p.pass}-${p.step}-of-${p.totalSteps}`});g+=h.timings.inferenceMs,A+=h.timings.readbackMs;const T=h.outputs.pred_latent,R=h.outputs.pred_camera;if(!T||!R)throw new Error("DiT graph must return pred_latent and pred_camera.");return{latent:$("pred_latent",T),camera:$("pred_camera",R)}},{latent:u,camera:i},{condition:l,negativeCondition:c,steps:_,guidanceScale:n.guidanceScale??3,shift:n.shift??3,predictionArithmetic:o.internalPrecision==="float32"?"float32":"float16",signal:n.signal,onStep:({step:p,totalSteps:h})=>{n.onProgress?.({stage:"sampling",message:`TripoSplat flow step ${p}/${h}…`,progress:p/h,step:p,totalSteps:h})}})}finally{await this.disposeGraph("dit")}const P=this.normalizeGaussianCount(n.numGaussians??D),d=P/M,w=this.requireGraph("octree");await this.loadGraph("octree");let b=0;n.onProgress?.({stage:"decoding-octree",message:"Sampling the dynamic occupancy octree…"});let v;try{v=await Ne(async p=>{const h=new Float32Array(ae*3);h.set(p.parentCenters);const T=await this.client.runSession({sessionId:I.octree,inputs:{x:E(w,h,[1,ae,3]),l:E(w,Float32Array.of(p.resolution),[1]),cond:E(w,new Float32Array(p.condition),C)},outputs:["logits"],tag:`octree-level-${p.level}`});b+=T.timings.inferenceMs;const R=T.outputs.logits;if(!R)throw new Error("Octree graph did not return logits.");const G=$("logits",R),L=p.parentCount*8;if(G.length<L)throw new Error(`Octree returned ${G.length} logits; active frontier needs ${L}.`);return{logits:G.slice(0,L)}},{condition:f.latent,numPoints:d,rng:()=>r.next(),signal:n.signal,onLevel:({level:p,totalLevels:h,occupiedVoxels:T})=>{n.onProgress?.({stage:"decoding-octree",message:`Octree level ${p}/${h}: ${T.toLocaleString()} occupied voxels…`,progress:p/h})}})}finally{await this.disposeGraph("octree")}const U=this.requireGraph("gaussianDecoder");await this.loadGraph("gaussianDecoder"),n.onProgress?.({stage:"decoding-gaussians",message:"Decoding Gaussian attributes…"});let O,k=0;try{const p=await this.client.runSession({sessionId:I.gaussianDecoder,inputs:{points:E(U,new Float32Array(v.points),[1,d,3]),cond:E(U,new Float32Array(f.latent),C)},outputs:["features"]});k=p.timings.inferenceMs;const h=p.outputs.features;if(!h)throw new Error("Gaussian decoder graph did not return features.");O=$("features",h)}finally{await this.disposeGraph("gaussianDecoder")}this.assertLength("Gaussian decoder features",O,d*J);const q=it(v.points,O);n.onProgress?.({stage:"building-ply",message:"Building browser Gaussian PLY…"});const j=Xe(q);return{model:"triposplat",count:P,totalCount:P,ply:j,gaussians:q,coordinateSystem:"triposplat-object",colorSpace:"sh0",metadata:{steps:_,guidanceScale:n.guidanceScale??3,shift:n.shift??3,seed:n.seed??42,ditInferenceMs:g,ditReadbackMs:A,octreeInferenceMs:b,gaussianInferenceMs:k}}}async dispose(){this.disposed||(this.disposed=!0,this.sessions.clear(),await this.client.dispose())}async loadGraph(t){const n=this.sessions.get(t);if(n)return n;const r=this.requireGraph(t),s=await this.client.loadSession({sessionId:I[t],manifest:r.manifest,options:{allowWasmFallback:this.allowWasmFallback,graphOptimizationLevel:"disabled"}});return this.sessions.set(t,s),s}async disposeGraph(t){this.sessions.delete(t)&&await this.client.disposeSession(I[t])}requireGraph(t){const n=this.graphs[t];if(!n)throw new Error(`TripoSplat graph '${t}' is not configured.`);return n}assertLength(t,n,r){if(n.length!==r)throw new Error(`${t} contains ${n.length} values; expected ${r}.`)}normalizeGaussianCount(t){if(!Number.isFinite(t)||t<ie||t>D)throw new Error(`numGaussians must be in [${ie}, ${D}].`);const n=Math.round(t/M)*M;if(n!==D)throw new Error(`The checked-in Gaussian decoder contract is fixed at ${D} Gaussians (8192 decoder points); requested ${n}. Export a separate fixed-shape decoder to support another count without changing full self-attention semantics.`);return n}assertUsable(){if(this.disposed)throw new Error("TripoSplatWebGPUModel has been disposed.")}}const lt="/models/triposplat/flux2_vae_encoder.onnx",dt="/fixtures/generated/flux2-vae-fp32",pe=3;async function he(e){const t=await fetch(e);if(!t.ok)throw new Error(`Could not fetch ${e}: HTTP ${t.status}`);const n=await t.arrayBuffer();if(n.byteLength%4!==0)throw new Error(`${e} is not aligned float32 data.`);return new Float32Array(n)}function fe(e){const t=[...e].sort((r,s)=>r-s),n=Math.floor(t.length/2);return t.length%2===0?(t[n-1]+t[n])/2:t[n]}function ut(e,t){if(e.length!==t.length)throw new Error(`Prepared RGB length ${t.length} does not match Python ${e.length}.`);let n=0,r=0,s=0;for(let l=0;l<e.length;l+=1){const c=Math.abs(e[l]-t[l]);c!==0&&(n+=1),r=Math.max(r,c),s+=c}const a=s/e.length;return{count:e.length,mismatched:n,maxAbsoluteError:r,meanAbsoluteError:a,passed:n===0}}async function te(){const e=performance;return e.memory?{source:"performance.memory",usedJsHeapBytes:e.memory.usedJSHeapSize,totalJsHeapBytes:e.memory.totalJSHeapSize,jsHeapLimitBytes:e.memory.jsHeapSizeLimit}:{source:"unavailable"}}async function pt(){const e=navigator.gpu,n=(e?await e.requestAdapter():null)?.info;return{userAgent:navigator.userAgent,platform:navigator.platform,crossOriginIsolated:self.crossOriginIsolated,webgpu:!!e,adapter:n?{vendor:n.vendor,architecture:n.architecture,device:n.device,description:n.description}:void 0}}async function ge(e){try{const t=await fetch(e,{method:"HEAD"});if(!t.ok)return;const n=Number(t.headers.get("content-length"));return Number.isFinite(n)&&n>=0?n:void 0}catch{return}}function ht(){const e=x.useRef(null),[t,n]=x.useState(lt),[r,s]=x.useState(dt),[a,l]=x.useState("Ready to run the recorded PyTorch fixture."),[c,u]=x.useState(!1),[i,o]=x.useState(null),[g,A]=x.useState(null);x.useEffect(()=>()=>{const f=e.current;e.current=null,f&&f.dispose()},[]);const _=async()=>{if(c)return;u(!0),A(null),o(null),delete window.__TRIPOSPLAT_ENCODER_RESULT__;let f="unknown";const P=d=>{l(d.message),d.executionProvider&&(f=d.executionProvider)};try{const d=e.current;e.current=null,d&&await d.dispose();const w=new ct({graphs:Ue(t,"float32"),allowWasmFallback:!1,onRuntimeStatus:P});e.current=w,l("Fetching the prepared image, explicit epsilon and PyTorch reference…");const[b,v,U,O,k]=await Promise.all([fetch(`${r}/source.png`),fetch(`${r}/prepared.png`),he(`${r}/epsilon.f32`),he(`${r}/feature2.f32`),pt()]);if(!b.ok)throw new Error(`Could not fetch fixture image: HTTP ${b.status}`);if(!v.ok)throw new Error(`Could not fetch prepared reference: HTTP ${v.status}`);const q=await b.blob(),j=await createImageBitmap(await v.blob()),p=(()=>{try{return Ie($e(j)).data}finally{j.close()}})(),h=w.graphs.vaeEncoder?.manifest,T=h?await Promise.all([ge(h.graphUrl),...(h.externalData??[]).map(({url:m})=>ge(m))]):[],R=T.length>0&&T.every(m=>m!==void 0)?T.reduce((m,W)=>m+(W??0),0):void 0,G=await te(),L=performance.now();await w.load();const Se=performance.now()-L,ye=await te(),F=[];let H;for(let m=1;m<=pe;m+=1){const W=await createImageBitmap(q),Te=performance.now(),N=await(async()=>{try{return await w.encode(W,{vaeNoise:U,onProgress:Pe=>l(`Run ${m}/${pe}: ${Pe.message}`)})}finally{W.close()}})(),_e=performance.now()-Te;if(!N.feature2||!N.timings.vaeEncoder)throw new Error("The VAE slice returned no feature2 tensor or runtime timings.");H||(H=new Uint8ClampedArray(N.preparedImage.data)),F.push({run:m,endToEndEncodeMs:_e,runtime:N.timings.vaeEncoder,comparison:be(O,N.feature2)})}const Ae=await te(),Y=F[F.length-1];if(!H)throw new Error("Browser preprocessing returned no prepared RGB image.");const ne=ut(p,H),z={maxAbsoluteError:.006,minimumCosineSimilarity:.99999},K={passed:ne.passed&&F.every(({comparison:m})=>m.finite&&m.maxAbsoluteError<=z.maxAbsoluteError&&m.cosineSimilarity>=z.minimumCosineSimilarity),executionProvider:f,modelLoadMs:Se,endToEndEncodeMs:Y.endToEndEncodeMs,runtime:Y.runtime,comparison:Y.comparison,preprocessing:ne,runs:F,medianInferenceMs:fe(F.map(({runtime:m})=>m.inferenceMs)),medianEndToEndEncodeMs:fe(F.map(({endToEndEncodeMs:m})=>m)),modelTransferBytes:R,memory:{beforeLoad:G,afterLoad:ye,afterRuns:Ae},environment:k,tolerance:z};window.__TRIPOSPLAT_ENCODER_RESULT__=K,o(K),l(K.passed?"PASS: WebGPU output matches the recorded PyTorch tensor.":"FAIL: tensor drift exceeds tolerance.")}catch(d){const w=d instanceof Error?d.message:String(d);A(w),l("Encoder validation failed.")}finally{u(!1)}};return S.jsxs("main",{children:[S.jsx("h1",{children:"TripoSplat Flux VAE · WebGPU parity"}),S.jsx("p",{children:"This page runs the recorded alpha-present source image through browser preprocessing, then sends the resulting 1024² tensor and explicit epsilon through ONNX Runtime WebGPU."}),S.jsxs("label",{children:["ONNX graph ",S.jsx("input",{value:t,onChange:f=>n(f.target.value)})]}),S.jsxs("label",{children:["Fixture directory ",S.jsx("input",{value:r,onChange:f=>s(f.target.value)})]}),S.jsx("button",{type:"button",disabled:c,onClick:()=>{_()},children:c?"Running…":"Run parity gate"}),S.jsx("p",{role:"status","data-testid":"encoder-status",children:a}),g?S.jsx("pre",{className:"error","data-testid":"encoder-error",children:g}):null,i?S.jsx("pre",{"data-testid":"encoder-result",children:JSON.stringify(i,null,2)}):null]})}const Ee=document.createElement("style");Ee.textContent=` | |
| :root { color: #ececf3; background: #101014; font: 15px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; } | |
| body { margin: 0; } | |
| main { max-width: 920px; margin: 0 auto; padding: 48px 24px; } | |
| h1 { font: 600 28px/1.2 system-ui, sans-serif; } | |
| label { display: grid; gap: 6px; margin: 18px 0; } | |
| input { box-sizing: border-box; width: 100%; padding: 10px; color: inherit; background: #1b1b22; border: 1px solid #3a3a48; border-radius: 6px; } | |
| button { padding: 10px 16px; color: #08080a; background: #f8cf00; border: 0; border-radius: 6px; font-weight: 700; cursor: pointer; } | |
| button:disabled { opacity: .55; cursor: wait; } | |
| pre { overflow: auto; padding: 16px; background: #18181f; border-radius: 8px; } | |
| .error { color: #ff9b9b; } | |
| `;document.head.append(Ee);ve.createRoot(document.getElementById("root")).render(S.jsx(x.StrictMode,{children:S.jsx(ht,{})})); | |