@glbforge/studio
Advanced tools
| const t={};export{t as default}; |
Sorry, the diff of this file is too big to display
| :root{--bg: #0e0f12;--panel: #16181d;--panel-2: #1c1f26;--line: #262a33;--text: #e8eaf0;--dim: #8b91a0;--accent: #ff8a3d;--accent-2: #ffb547;--good: #4ade80;--warn: #fbbf24;--bad: #f87171}*{box-sizing:border-box;margin:0}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font:13px/1.5 -apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.studio{display:flex;flex-direction:column;height:100%}.topbar{display:flex;align-items:center;gap:16px;padding:0 14px;height:46px;background:var(--panel);border-bottom:1px solid var(--line);flex:none}.brand{font-weight:700;font-size:15px;letter-spacing:.2px}.brand-mark{color:var(--accent)}.brand-sub{color:var(--dim);font-weight:400}.busy{color:var(--accent-2)}.error{color:var(--bad);cursor:pointer;margin-left:auto;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panes{display:grid;grid-template-columns:250px 1fr 330px;flex:1;min-height:0}.rail{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;overflow-y:auto}.drop{margin:10px;padding:18px 10px;border:1.5px dashed var(--line);border-radius:8px;color:var(--dim);text-align:center;cursor:pointer;transition:border-color .15s}.drop:hover,.drop.over{border-color:var(--accent);color:var(--text)}.rail-section{padding:6px 12px 2px;color:var(--dim);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.asset{display:flex;align-items:center;gap:8px;padding:7px 12px;cursor:pointer;border-left:2px solid transparent}.asset:hover{background:var(--panel-2)}.asset.selected{background:var(--panel-2);border-left-color:var(--accent)}.asset.variant{padding-left:26px}.asset-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-score{font-weight:600;font-size:11px}.asset-score.pass{color:var(--good)}.asset-score.fail{color:var(--bad)}.viewport{position:relative;min-width:0;background:radial-gradient(ellipse at 50% 40%,#191c22 0%,var(--bg) 75%)}.viewport-empty{display:flex;height:100%;align-items:center;justify-content:center;color:var(--dim);flex-direction:column;gap:8px}.compare-slider{position:absolute;left:10%;right:10%;bottom:22px;z-index:5}.compare-slider input{width:100%;accent-color:var(--accent)}.compare-labels{display:flex;justify-content:space-between;color:var(--dim);font-size:11px}.viewport-badge{position:absolute;top:10px;left:12px;color:var(--dim);font-size:11px;z-index:5}.inspector{background:var(--panel);border-left:1px solid var(--line);overflow-y:auto;padding:14px}.score-row{display:flex;align-items:center;gap:14px;margin-bottom:14px}.score-ring{position:relative;width:74px;height:74px;flex:none}.score-ring svg{transform:rotate(-90deg)}.score-num{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700}.verdict{font-weight:600}.verdict.pass{color:var(--good)}.verdict.fail{color:var(--bad)}.profile-name{color:var(--dim);font-size:12px}.budget{margin:4px 0 10px}.budget-row{margin-bottom:7px}.budget-head{display:flex;justify-content:space-between;font-size:12px;margin-bottom:2px}.budget-head .val{color:var(--dim)}.bar{height:4px;background:var(--line);border-radius:2px;overflow:hidden}.bar-fill{height:100%;border-radius:2px;background:var(--good)}.bar-fill.over{background:var(--bad)}.section-title{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim);margin:14px 0 6px}.finding{padding:7px 9px;border:1px solid var(--line);border-radius:6px;margin-bottom:6px;font-size:12px}.finding .rule{font-family:ui-monospace,monospace;font-size:11px}.finding.error .rule{color:var(--bad)}.finding.warn .rule{color:var(--warn)}.finding.info .rule{color:var(--dim)}.finding .hint{color:var(--dim);margin-top:3px}.actions{display:flex;flex-direction:column;gap:8px;margin-top:10px}.row{display:flex;gap:8px;align-items:center}select,input[type=number],input[type=text]{background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;width:100%}button{background:var(--accent);color:#1a1206;border:0;border-radius:6px;padding:8px 12px;font:inherit;font-weight:600;cursor:pointer;width:100%}button:hover{background:var(--accent-2)}button:disabled{opacity:.5;cursor:default}button.ghost{background:var(--panel-2);color:var(--text);border:1px solid var(--line)}label.check{display:flex;gap:6px;align-items:center;color:var(--dim);cursor:pointer}.delta{display:flex;justify-content:space-between;font-size:12px;padding:2px 0}.delta .to{color:var(--good);font-weight:600}.choice{margin:0 10px 10px;padding:10px;border:1px solid var(--line);border-radius:8px;display:flex;flex-direction:column;gap:7px}.choice-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.choice-sub{display:block;font-weight:400;font-size:11px;opacity:.75}.asset.task .asset-score{color:var(--accent-2);cursor:default}.mode-badge{color:var(--good);font-size:12px;border:1px solid var(--line);border-radius:999px;padding:3px 10px;cursor:help} |
| import{_ as o}from"./index-BahkaXqU.js";import{l as L,K as P}from"./local-engine-CLD2bJjW.js";async function k(){const[{execFile:r},{promisify:t},e,s,m,i]=await Promise.all([o(()=>import("node:child_process"),[]),o(()=>import("node:util"),[]),o(()=>import("node:fs/promises"),[]),o(()=>import("node:os"),[]),o(()=>import("node:path"),[]),o(()=>import("./empty-FmFgRqLi.js"),[])]);return{run:t(r),fs:e,os:s,path:m,sharp:i.default}}async function M(){const{run:r}=await k();for(const[t,e]of[["basisu",["-version"]],["toktx",["--version"]]])try{return await r(t,[...e]),t}catch{}return null}const O=/baseColor|emissive/i,S=/normal/i;async function $(r,t){var d;const e=t.encoder??await M();if(!e)throw new Error("No KTX2 encoder found. Install one: `brew install basis_universal` (preferred) or KTX-Software for `toktx`.");const s=r.getRoot().listTextures().filter(a=>a.getMimeType()!=="image/ktx2"&&a.getImage());if(s.length===0)return 0;const{run:m,fs:i,os:R,path:l,sharp:b}=await k(),_=await i.mkdtemp(l.join(R.tmpdir(),"glbforge-ktx2-"));try{for(const[a,c]of s.entries()){const p=L(c),n=p.some(h=>S.test(h)),x=!n&&p.some(h=>O.test(h)),w=b(Buffer.from(c.getImage())),u=await w.metadata(),E=Math.min(1,t.maxSize/Math.max(u.width??1,u.height??1)),T=Math.max(4,Math.floor((u.width??4)*E/4)*4),v=Math.max(4,Math.floor((u.height??4)*E/4)*4),f=l.join(_,`t${a}.png`),g=l.join(_,`t${a}.ktx2`);await i.writeFile(f,await w.resize(T,v,{fit:"fill"}).png().toBuffer());const I=e==="basisu"?[f,"-output_file",g,"-mipmap",...n?["-uastc","-uastc_level","2","-uastc_rdo_l","0.5"]:["-q","160"],...x?[]:["-linear"]]:["--genmipmap","--encode",n?"uastc":"etc1s",...n?["--uastc_quality","2","--zcmp","18"]:["--qlevel","160"],"--assign_oetf",x?"srgb":"linear",g,f];await m(e,I);const y=await i.readFile(g);c.setImage(new Uint8Array(y)).setMimeType("image/ktx2"),(d=t.log)==null||d.call(t,`ktx2 (${n?"uastc":"etc1s"}): ${c.getName()||"t"+a} ${T}x${v} -> ${(y.byteLength/1024).toFixed(0)}KB`)}return r.createExtension(P).setRequired(!0),s.length}finally{await i.rm(_,{recursive:!0,force:!0})}}export{M as detectKtx2Encoder,$ as ktx2Compress}; |
Sorry, the diff of this file is too big to display
+2
-2
@@ -7,4 +7,4 @@ <!doctype html> | ||
| <title>GLBForge Studio</title> | ||
| <script type="module" crossorigin src="/assets/index-BbdbbaKe.js"></script> | ||
| <link rel="stylesheet" crossorigin href="/assets/index-B7mOmjF7.css"> | ||
| <script type="module" crossorigin src="/assets/index-BahkaXqU.js"></script> | ||
| <link rel="stylesheet" crossorigin href="/assets/index-COhCF8Xv.css"> | ||
| </head> | ||
@@ -11,0 +11,0 @@ <body> |
+12
-8
| { | ||
| "name": "@glbforge/studio", | ||
| "version": "0.2.0", | ||
| "version": "0.3.0", | ||
| "description": "GLBForge Studio — local web UI for the GLBForge pipeline, served by `glbforge ui`.", | ||
@@ -21,9 +21,7 @@ "type": "module", | ||
| }, | ||
| "dependencies": {}, | ||
| "devDependencies": { | ||
| "react": "^18.3.0", | ||
| "react-dom": "^18.3.0", | ||
| "three": "^0.169.0", | ||
| "@gltf-transform/core": "^4.4.2", | ||
| "@gltf-transform/extensions": "^4.4.2", | ||
| "@react-three/drei": "^9.114.0", | ||
| "@react-three/fiber": "^8.18.0", | ||
| "@react-three/drei": "^9.114.0", | ||
| "@types/react": "^18.3.0", | ||
@@ -33,5 +31,10 @@ "@types/react-dom": "^18.3.0", | ||
| "@vitejs/plugin-react": "^4.3.0", | ||
| "meshoptimizer": "^0.22.0", | ||
| "react": "^18.3.0", | ||
| "react-dom": "^18.3.0", | ||
| "three": "^0.169.0", | ||
| "typescript": "^5.6.0", | ||
| "vite": "^5.4.0", | ||
| "vitest": "^2.1.0" | ||
| "vitest": "^2.1.0", | ||
| "@glbforge/core": "^0.3.0" | ||
| }, | ||
@@ -41,4 +44,5 @@ "scripts": { | ||
| "build": "node copy-basis.mjs && vite build", | ||
| "test": "vitest run --passWithNoTests" | ||
| "test": "vitest run --passWithNoTests", | ||
| "build:site": "node copy-basis.mjs && vite build --base=/studio/ --outDir ../../site/studio --emptyOutDir" | ||
| } | ||
| } |
| :root{--bg: #0e0f12;--panel: #16181d;--panel-2: #1c1f26;--line: #262a33;--text: #e8eaf0;--dim: #8b91a0;--accent: #ff8a3d;--accent-2: #ffb547;--good: #4ade80;--warn: #fbbf24;--bad: #f87171}*{box-sizing:border-box;margin:0}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font:13px/1.5 -apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.studio{display:flex;flex-direction:column;height:100%}.topbar{display:flex;align-items:center;gap:16px;padding:0 14px;height:46px;background:var(--panel);border-bottom:1px solid var(--line);flex:none}.brand{font-weight:700;font-size:15px;letter-spacing:.2px}.brand-mark{color:var(--accent)}.brand-sub{color:var(--dim);font-weight:400}.busy{color:var(--accent-2)}.error{color:var(--bad);cursor:pointer;margin-left:auto;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panes{display:grid;grid-template-columns:250px 1fr 330px;flex:1;min-height:0}.rail{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;overflow-y:auto}.drop{margin:10px;padding:18px 10px;border:1.5px dashed var(--line);border-radius:8px;color:var(--dim);text-align:center;cursor:pointer;transition:border-color .15s}.drop:hover,.drop.over{border-color:var(--accent);color:var(--text)}.rail-section{padding:6px 12px 2px;color:var(--dim);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.asset{display:flex;align-items:center;gap:8px;padding:7px 12px;cursor:pointer;border-left:2px solid transparent}.asset:hover{background:var(--panel-2)}.asset.selected{background:var(--panel-2);border-left-color:var(--accent)}.asset.variant{padding-left:26px}.asset-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-score{font-weight:600;font-size:11px}.asset-score.pass{color:var(--good)}.asset-score.fail{color:var(--bad)}.viewport{position:relative;min-width:0;background:radial-gradient(ellipse at 50% 40%,#191c22 0%,var(--bg) 75%)}.viewport-empty{display:flex;height:100%;align-items:center;justify-content:center;color:var(--dim);flex-direction:column;gap:8px}.compare-slider{position:absolute;left:10%;right:10%;bottom:22px;z-index:5}.compare-slider input{width:100%;accent-color:var(--accent)}.compare-labels{display:flex;justify-content:space-between;color:var(--dim);font-size:11px}.viewport-badge{position:absolute;top:10px;left:12px;color:var(--dim);font-size:11px;z-index:5}.inspector{background:var(--panel);border-left:1px solid var(--line);overflow-y:auto;padding:14px}.score-row{display:flex;align-items:center;gap:14px;margin-bottom:14px}.score-ring{position:relative;width:74px;height:74px;flex:none}.score-ring svg{transform:rotate(-90deg)}.score-num{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700}.verdict{font-weight:600}.verdict.pass{color:var(--good)}.verdict.fail{color:var(--bad)}.profile-name{color:var(--dim);font-size:12px}.budget{margin:4px 0 10px}.budget-row{margin-bottom:7px}.budget-head{display:flex;justify-content:space-between;font-size:12px;margin-bottom:2px}.budget-head .val{color:var(--dim)}.bar{height:4px;background:var(--line);border-radius:2px;overflow:hidden}.bar-fill{height:100%;border-radius:2px;background:var(--good)}.bar-fill.over{background:var(--bad)}.section-title{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim);margin:14px 0 6px}.finding{padding:7px 9px;border:1px solid var(--line);border-radius:6px;margin-bottom:6px;font-size:12px}.finding .rule{font-family:ui-monospace,monospace;font-size:11px}.finding.error .rule{color:var(--bad)}.finding.warn .rule{color:var(--warn)}.finding.info .rule{color:var(--dim)}.finding .hint{color:var(--dim);margin-top:3px}.actions{display:flex;flex-direction:column;gap:8px;margin-top:10px}.row{display:flex;gap:8px;align-items:center}select,input[type=number],input[type=text]{background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;width:100%}button{background:var(--accent);color:#1a1206;border:0;border-radius:6px;padding:8px 12px;font:inherit;font-weight:600;cursor:pointer;width:100%}button:hover{background:var(--accent-2)}button:disabled{opacity:.5;cursor:default}button.ghost{background:var(--panel-2);color:var(--text);border:1px solid var(--line)}label.check{display:flex;gap:6px;align-items:center;color:var(--dim);cursor:pointer}.delta{display:flex;justify-content:space-between;font-size:12px;padding:2px 0}.delta .to{color:var(--good);font-weight:600}.choice{margin:0 10px 10px;padding:10px;border:1px solid var(--line);border-radius:8px;display:flex;flex-direction:column;gap:7px}.choice-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.choice-sub{display:block;font-weight:400;font-size:11px;opacity:.75}.asset.task .asset-score{color:var(--accent-2);cursor:default} |
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
2161231
21.86%12
33.33%9610
18.48%16
33.33%4
100%7
250%11
266.67%