codarch 0.3.1-alpha.2 → 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/index.js +3293 -669
- package/package.json +1 -1
- package/web/assets/index-DoNheLr8.js +85 -0
- package/web/assets/index-ee4c0zCv.css +1 -0
- package/web/assets/vista-3d-C9oZ2pdB.js +79 -0
- package/web/assets/vista-3d-Dj9zzLGV.css +1 -0
- package/web/assets/{worker-BNJTRfws.js → worker-BkCQ9RP6.js} +4 -4
- package/web/index.html +2 -2
- package/web/assets/index-DJW-8Jm4.js +0 -85
- package/web/assets/index-DidrsIh-.css +0 -1
- package/web/assets/vista-3d-C4swZPgT.js +0 -3832
- package/web/assets/vista-3d-oZ9FLm3R.css +0 -1
- package/web/demo.cc.json +0 -6184
- package/web/demo.report.json +0 -1047
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--paper:#eef1f2;--panel:#f6f8f8;--ink:#121a20;--ink-soft:#35434c;--muted:#64727b;--line:#c8d1d5;--line-strong:#9fadb4;--cobalt:#2f6fed;--ochre:#d9a21b;--rust:#d95d39;--violet:#7b61ff;--patina:#3f8f7a;--debt:#d64545;--mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;--display:"Bricolage Grotesque", "IBM Plex Sans", system-ui, sans-serif;--topbar-h:64px;--band-h:52px}*{box-sizing:border-box}html,body,#root{min-height:100%}body{background:var(--paper);color:var(--ink);font:14px/1.45 var(--sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0}button,input,select{font:inherit}button{color:inherit}:focus-visible{outline:2px solid var(--rust);outline-offset:2px}#boot-error{color:#ffd7d7;font:12px/1.5 var(--mono);white-space:pre-wrap;background:#2b1111;margin:0;padding:24px}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.app{background:radial-gradient(circle at 18% 4%, #ffffff8c, transparent 34%), var(--paper);min-height:100dvh}.topbar{z-index:20;min-height:var(--topbar-h);background:var(--ink);color:#f3f6f5;border-bottom:1px solid #05090c;grid-template-columns:minmax(250px,auto) 1fr auto;align-items:center;gap:22px;padding:0 20px;display:grid;position:relative}.brand{align-items:baseline;gap:12px;min-width:0;display:flex}.brand-mark{font:750 18px/1 var(--display);letter-spacing:.16em}.brand-sub{font:500 9.5px/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:#a9b7bc;white-space:nowrap}.snapshot-meta{text-align:center;flex-direction:row;justify-content:center;align-items:center;gap:12px;min-width:0;display:flex}.snapshot-meta .mono{color:#93a2a8;white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:10px;overflow:hidden}.watch-indicator{font:500 8.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#93a2a8;align-items:center;gap:5px;display:inline-flex}.watch-indicator i{background:#7f8b90;border-radius:50%;width:5px;height:5px}.watch-live{color:#8fe3c0}.watch-live i{background:#45d6a0;box-shadow:0 0 0 3px #45d6a029}.watch-paused{color:#e7c06b}.watch-paused i{background:var(--ochre)}.refresh-notice{font:500 8.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#45d6a0;opacity:0}.refresh-notice.is-new{animation:3s ease-out both refresh-notice}@keyframes refresh-notice{0%{opacity:0}8%{opacity:1}72%{opacity:1}to{opacity:0}}.topbar-actions{justify-content:flex-end;gap:8px;display:flex}.button-label-short{display:none}.button{color:var(--ink);font:600 11px/1 var(--mono);letter-spacing:.04em;text-transform:uppercase;cursor:pointer;background:#f3f6f5;border:1px solid #f3f6f5;border-radius:2px;padding:8px 12px;transition:background .12s,color .12s}.button:hover{background:#fff}.button.ghost{color:#dbe3e4;background:0 0;border-color:#596970}.open-menu{position:relative}.open-menu>summary{cursor:pointer;align-items:center;list-style:none;display:inline-flex}.open-menu>summary::-webkit-details-marker{display:none}.open-menu[open]>summary{background:#fff}.open-menu-panel{z-index:30;border:1px solid var(--line-strong);background:var(--panel);min-width:216px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 14px 30px #121a202e}.open-menu-panel button{color:var(--ink);text-align:left;font:500 11px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;padding:8px 10px}.open-menu-panel button:hover{background:#2f6fed14}.open-menu-panel p{color:var(--muted);margin:4px 10px 6px;font-size:9.5px;line-height:1.35}.open-menu-panel button:disabled{opacity:.45;cursor:not-allowed}.open-menu-group{padding:2px 0;display:grid}.open-menu-group+.open-menu-group{border-top:1px solid var(--line);margin-top:4px;padding-top:6px}.open-menu-label{color:var(--muted);font:600 9px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;padding:4px 10px 2px}.live-row{justify-content:space-between;align-items:center;gap:10px;display:flex}.live-state{letter-spacing:.11em;text-transform:uppercase;color:var(--muted);font-size:10px}.live-state.is-live{color:var(--patina)}.button.small{margin-top:0;padding:6px 9px;font-size:9px}.button.ghost.dark-text{color:var(--ink);border-color:var(--line-strong);background:0 0}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#121a208c;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{border:1px solid var(--line-strong);background:var(--panel);flex-direction:column;width:min(660px,100%);max-height:min(780px,100dvh - 40px);padding:20px;display:flex;box-shadow:0 24px 60px #121a2047}.modal h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;margin:2px 0 5px}.folder-path{grid-template-columns:32px minmax(0,1fr) auto;gap:6px;margin:14px 0 8px;display:grid}.folder-path input{border:1px solid var(--line);min-width:0;color:var(--ink);font:11px/1.3 var(--mono);background:#fff;padding:7px 8px}.folder-up{border:1px solid var(--line);width:32px;color:var(--ink);cursor:pointer;background:#fff;font-size:16px}.folder-up:disabled{color:var(--line-strong);cursor:default}.folder-list{border:1px solid var(--line);background:#fff;min-height:120px;max-height:340px;margin-bottom:12px;overflow:auto}.folder-entry{width:100%;color:var(--ink);text-align:left;font:12px/1.3 var(--sans);cursor:pointer;background:0 0;border:0;border-bottom:1px solid #c8d1d58c;grid-template-columns:18px minmax(0,1fr);gap:5px;padding:7px 10px;display:grid}.folder-entry:hover{background:#2f6fed12}.folder-icon{color:var(--muted);font-family:var(--mono)}.folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.folder-empty{color:var(--muted);text-align:center;padding:28px 18px;font-size:11.5px}.folder-footer{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.folder-current{text-overflow:ellipsis;white-space:nowrap;max-width:52%;color:var(--muted);font-size:9.5px;overflow:hidden}.folder-actions{gap:8px;display:flex}.folder-actions .button{margin-top:0}.button.ghost:hover{background:#ffffff14}.shell{min-height:calc(100dvh - var(--topbar-h) - var(--band-h));background:var(--line);grid-template-columns:258px minmax(0,1fr) 302px;gap:1px;display:grid}.rail,.inspector{background:var(--panel);min-height:0;padding:20px 18px;overflow:auto}.rail{border-right:1px solid var(--line)}.inspector{border-left:1px solid var(--line)}.panel-block{border-bottom:1px solid var(--line);margin:0 0 17px;padding:0 0 17px}.panel-block:last-child{border-bottom:0;margin-bottom:0;padding-bottom:0}.eyebrow{font:500 9.5px/1.2 var(--mono);letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.field{margin-bottom:10px;display:block}.field>span{font:500 9.5px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:4px;display:block}.field select,.field input{appearance:none;border:1px solid var(--line);width:100%;color:var(--ink);background:#fff;border-radius:2px;padding:7px 8px;font-size:12px}.field select{background-image:linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);background-position:calc(100% - 13px) 12px,calc(100% - 9px) 12px;background-repeat:no-repeat;background-size:4px 4px,4px 4px;padding-right:24px}.search-field{margin-top:13px}.url-load{border-top:1px solid var(--line);gap:2px;margin:6px 6px 2px;padding-top:6px;display:grid}.url-load .field{margin-bottom:6px}.url-load .field input{font-family:var(--mono);font-size:10.5px}.url-load>button{border:1px solid var(--line-strong);color:var(--ink);text-align:center;font:500 10px/1.3 var(--mono);letter-spacing:.04em;text-transform:uppercase;margin-top:2px}.tiny{font-size:10.5px}.small{font-size:12px}.muted{color:var(--muted)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.strata{border:1px solid var(--line-strong);background:var(--paper);border-radius:2px;gap:1px;height:24px;padding:1px;display:flex;overflow:hidden}.strata i{min-width:2px;height:100%;display:block}.strata-legend{gap:4px;margin-top:9px;display:grid}.strata-row{color:var(--ink-soft);grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.strata-row i,.legend i,.status-chip i{border-radius:50%;width:7px;height:7px;display:inline-block}.strata-row .mono{color:var(--muted);font-size:10px}.status-row{border-top:1px solid var(--line);flex-wrap:wrap;gap:5px 10px;margin-top:11px;padding-top:9px;display:flex}.status-chip{color:var(--muted);align-items:center;gap:5px;font-size:10.5px;display:inline-flex}.status-chip b{color:var(--ink);font-weight:600}.legend{gap:6px;display:grid}.legend>div{grid-template-columns:7px 1fr auto;align-items:center;gap:7px;font-size:11px;display:grid}.legend .mono{color:var(--muted);font-size:10px}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gradient{border:1px solid var(--line);border-radius:1px;height:9px}.gradient.risk{background:linear-gradient(90deg,#ebe7df 0%,#e9cd98 35%,#d68a54 65%,#a42e2c 100%)}.gradient.metric{background:linear-gradient(90deg,#ebe7df 0%,#b9c9cf 50%,#355b6b 100%)}.gradient-labels{font:10px/1 var(--mono);color:var(--muted);justify-content:space-between;margin-top:4px;display:flex}.debt-list{gap:2px;display:grid}.debt-row{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:1px;grid-template-columns:minmax(0,1fr) 54px 34px;align-items:center;gap:7px;width:100%;padding:5px 0;display:grid}.debt-row:hover,.debt-row.is-selected{background:#2f6fed12}.debt-name{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.debt-track{background:#e0e6e8;height:5px;overflow:hidden}.debt-track i{height:100%;display:block}.debt-row .mono{text-align:right;color:var(--muted);font-size:10px}.stage{background:var(--paper);flex-direction:column;min-width:0;padding:14px 22px 12px;display:flex}.project-band{z-index:19;height:var(--band-h);color:#f3f6f5;background:#1b262e;border-top:1px solid #ffffff12;align-items:center;gap:18px;padding:0 20px;display:flex;position:relative;overflow:hidden}.project-ident{flex-direction:column;gap:1px;min-width:0;display:flex}.project-label{font:500 8px/1.1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:#93a2a8}.project-band h1{max-width:360px;font:650 17px/1.1 var(--display);letter-spacing:-.02em;text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.project-band .breadcrumb{color:#93a2a8;min-width:0;margin-top:0}.project-band .breadcrumb button{color:#f3f6f5;border-bottom-color:#5a6a72}.project-band .breadcrumb button:hover{border-bottom-color:#f3f6f5}.project-band .breadcrumb span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.project-kpis{flex:none;align-items:center;gap:0;margin-left:auto;display:flex}.project-kpis .kpi{border-left:1px solid #ffffff1f;min-width:62px;padding:0 14px}.project-kpis .kpi span{color:#93a2a8;white-space:nowrap;text-overflow:ellipsis;font-size:8px;overflow:hidden}.project-kpis .kpi b{font:600 15px/1 var(--display);color:#f3f6f5}.project-kpis .kpi-debt b{color:#ff9f9f}.kpi{flex-direction:column;gap:2px;display:flex}.kpi span{font:500 8.5px/1.1 var(--mono);letter-spacing:.11em;text-transform:uppercase;color:var(--muted)}.kpi b{font:600 20px/1 var(--display);letter-spacing:-.02em}.kpi-debt b{color:var(--debt)}.map-frame{border:1px solid var(--line-strong);background:#f8fafa;flex:1;min-height:440px;position:relative;overflow:hidden;box-shadow:inset 0 1px #fffc,0 10px 30px #121a200d}.map-inner{width:100%;height:100%}.map{width:100%;height:100%;display:block}.cell{cursor:pointer}.cell:hover{filter:brightness(1.08)}.cell:focus-visible{stroke:var(--rust);stroke-width:2.5px;outline:none}.cell.is-cursor,.folder-block.is-cursor{stroke:var(--rust);stroke-width:2px}.folder-block{cursor:zoom-in}.folder-block:hover{fill:#121a200d}.folder-block:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.folder-hit{cursor:zoom-in}.folder-hit:focus-visible{stroke:var(--rust);stroke-width:2px;outline:none}.empty{text-align:center;color:var(--muted);flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:30px;display:flex;position:absolute;inset:0}.empty.error{color:var(--debt)}.empty.error span{color:var(--muted);max-width:520px}.drop-hint{border:1px dashed var(--cobalt);color:var(--cobalt);font:600 12px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;pointer-events:none;background:#2f6fed14;justify-content:center;align-items:center;display:flex;position:absolute;inset:12px}.breadcrumb{font:10px/1.3 var(--mono);color:var(--muted);flex-wrap:wrap;align-items:center;gap:5px;margin-top:6px;display:flex}.breadcrumb button{border:0;border-bottom:1px solid var(--line-strong);color:var(--ink);font:inherit;cursor:pointer;background:0 0;padding:0}.breadcrumb button:hover{border-bottom-color:var(--ink)}.stage-foot{color:var(--muted);justify-content:space-between;gap:18px;margin-top:9px;font-size:10px;display:flex}.stage-foot .mono{text-overflow:ellipsis;white-space:nowrap;max-width:55%;overflow:hidden}.progress-cell{align-items:center;gap:10px;min-width:0;display:inline-flex}.progress-cell .detail-note{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.progress-cell .button{text-transform:none;letter-spacing:.02em;flex:none;padding:3px 9px;font-size:9px}.history-list{gap:1px;display:grid}.history-row{width:100%;color:var(--ink);text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:5px 6px;display:grid}.history-row:hover{background:#2f6fed14}.history-date{text-overflow:ellipsis;white-space:nowrap;color:var(--ink);font-size:10px;overflow:hidden}.history-count{color:var(--muted);font-size:9.5px}.inspector h2{font:650 27px/1.08 var(--display);letter-spacing:-.03em;overflow-wrap:anywhere;margin:6px 0 14px}.inspector-path{font:10.5px/1.45 var(--mono);color:var(--muted);overflow-wrap:anywhere}.inspector-empty h2{margin-top:6px}.inspector-note{border-top:1px solid var(--line);color:var(--muted);justify-content:space-between;gap:10px;margin-top:24px;padding-top:12px;font-size:10px;display:flex}.inspector-status{color:var(--ink-soft);align-items:center;gap:7px;margin-bottom:14px;font-size:11px;display:flex}.status-dot{border-radius:50%;width:8px;height:8px}.inspector-status .mono{color:var(--muted);text-transform:uppercase;margin-left:auto;font-size:10px}.metric-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;gap:0;margin-bottom:18px;display:grid}.metric{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.metric span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.metric b{font:600 18px/1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.collapsible{margin-top:14px}.collapsible-head{border:0;border-top:1px solid var(--line);text-align:left;cursor:pointer;background:0 0;align-items:center;gap:7px;width:100%;padding:7px 0;display:flex}.collapsible-head:hover .collapsible-title{color:var(--cobalt)}.collapsible-head:focus-visible{outline:2px solid var(--rust);outline-offset:1px}.collapsible-chevron{color:var(--muted);transition:transform .12s;display:inline-flex}.collapsible.is-closed .collapsible-chevron svg{transform:rotate(-90deg)}.collapsible-title{min-width:0;font:600 12px/1.2 var(--sans);letter-spacing:-.01em;color:var(--ink);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.collapsible-count{border:1px solid var(--line);font:500 8.5px/1.5 var(--mono);color:var(--muted);border-radius:999px;padding:0 5px}.collapsible-summary{max-width:55%;font:500 9.5px/1.2 var(--mono);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;overflow:hidden}.collapsible-body{padding-bottom:2px}.metrics-table{margin-top:2px}.metrics-head,.metrics-row{grid-template-columns:minmax(0,1fr) 54px 52px;align-items:center;gap:8px;display:grid}.metrics-head{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:0 4px 4px 7px}.metrics-head span:nth-child(2){text-align:center}.metrics-head span:last-child{text-align:right}.metrics-rows{gap:1px;display:grid}.metrics-row{text-align:left;width:100%;color:var(--ink-soft);cursor:pointer;background:0 0;border:0;padding:3px 4px 3px 7px;font-size:11px;box-shadow:inset 2px 0 #0000}.metrics-row:hover{background:#2f6fed0f}.metrics-row:focus-visible{outline:2px solid var(--rust);outline-offset:1px}.metrics-row.is-active{box-shadow:inset 2px 0 0 var(--cobalt);background:#2f6fed12}.metrics-label{white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:5px;min-width:0;display:flex;overflow:hidden}.metrics-area{border:1px solid var(--line-strong);font:500 8px/1.6 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-radius:2px;flex:none;padding:0 4px;font-style:normal}.metrics-bar{background:var(--line);height:4px;overflow:hidden}.metrics-bar i{background:var(--muted);height:100%;display:block}.metrics-watch .metrics-bar i{background:var(--ochre)}.metrics-debt .metrics-bar i{background:var(--debt)}.metrics-value{font:600 11px/1 var(--mono);font-variant-numeric:tabular-nums;color:var(--ink);justify-self:end;align-items:baseline;gap:2px;display:inline-flex}.metrics-value em{color:var(--muted);font-size:8.5px;font-style:normal;font-weight:500}.metrics-watch .metrics-value{color:var(--ochre)}.metrics-debt .metrics-value{color:var(--debt)}.metrics-row.is-empty .metrics-value{color:var(--muted);font-weight:500}.metrics-note{margin:7px 0 0;line-height:1.35}.live-toggle{align-items:center;gap:7px;display:inline-flex}.live-toggle i{background:var(--line-strong);border-radius:50%;width:7px;height:7px;transition:background .15s ease-out,box-shadow .15s ease-out;box-shadow:0 0 0 3px #0000}.live-toggle.is-live i{background:var(--patina);box-shadow:0 0 0 3px color-mix(in srgb, var(--patina) 22%, transparent)}.icon-button{justify-content:center;align-items:center;width:30px;padding:0;display:inline-flex}.icon-button svg{display:block}.map-controls{border:1px solid var(--line-strong);background:var(--panel);border-radius:6px;align-items:center;gap:1px;margin-right:14px;padding:2px;display:flex}.map-controls button{min-width:24px;height:22px;color:var(--ink-soft);font:500 10.5px/1 var(--mono);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 6px}.map-controls button:hover:not(:disabled){color:var(--ink);background:#121a2012}.map-controls button:disabled{opacity:.4;cursor:not-allowed}.map-controls-hint{font:400 10px/1 var(--sans);color:var(--muted);white-space:nowrap;padding:0 9px}.map-zoom-level{text-align:center;min-width:40px;font:500 10px/1 var(--mono);color:var(--muted)}.stage-tabs{border-bottom:1px solid var(--line);gap:18px;margin:0 0 12px;display:flex}.stage-tab{color:var(--muted);font:500 9.5px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:0 0 9px;display:inline-flex}.stage-tab:hover{color:var(--ink-soft)}.stage-tab.is-active{color:var(--ink);border-bottom-color:var(--ink)}.plugin-stage{width:100%;height:100%;padding:18px;overflow:auto}.plugin-view{gap:10px;max-width:640px;display:grid}.plugin-view h2{color:var(--ink);margin:0;font-size:15px}.plugin-list{gap:1px;display:grid}.plugin-row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 0;display:grid}.plugin-text{gap:2px;display:grid}.plugin-title{color:var(--ink);font-size:12.5px}.plugin-version{color:var(--muted);font-size:10px}.plugin-warning{color:var(--rust,#be3c28);font-size:10.5px}.plugin-summary{color:var(--ink-soft);margin:0 0 8px;font-size:11px}.plugin-summary b{font:600 12.5px/1 var(--sans)}.plugin-meta{font:500 9.5px/1 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.plugin-more summary{color:var(--muted);cursor:pointer;width:-moz-fit-content;width:fit-content;font-size:10.5px;list-style:none}.plugin-more summary::-webkit-details-marker{display:none}.plugin-more summary:before{content:"▸ "}.plugin-more[open] summary:before{content:"▾ "}.plugin-more p{color:var(--muted);margin:5px 0 0;font-size:10.5px}.plugin-more code{font-size:10px}.plugin-switch{border:1px solid var(--line);cursor:pointer;background:#ffffff0d;border-radius:10px;width:34px;height:19px;padding:0;position:relative}.plugin-switch i{background:var(--muted);border-radius:50%;width:13px;height:13px;transition:transform .12s ease-out,background .12s ease-out;position:absolute;top:2px;left:2px}.plugin-switch.is-on{background:#2f6fed47;border-color:#2f6fed80}.plugin-switch.is-on i{background:#7aa2f7;transform:translate(15px)}.plugin-switch:disabled{opacity:.45;cursor:not-allowed}.map-label{box-sizing:border-box;overflow-wrap:anywhere;word-break:break-word;-webkit-hyphens:auto;hyphens:auto;width:100%;height:100%;line-height:1.05;font-family:var(--sans);pointer-events:none;-webkit-user-select:none;user-select:none;margin:0;padding:0;overflow:hidden}.map-label.is-vertical{writing-mode:vertical-rl;text-orientation:mixed}.map-label.is-folder{font-family:var(--mono);letter-spacing:.06em;text-transform:uppercase;color:#121a209e}.rail-settings{border:1px solid var(--line);width:26px;height:26px;color:var(--muted);cursor:pointer;background:0 0;border-radius:6px;align-self:flex-end;padding:0;font-size:13px;line-height:1}.rail-settings:hover{color:var(--ink);border-color:var(--ink-soft)}.settings-overlay{z-index:40;background:#080c1099;position:fixed;inset:0}.settings-panel{z-index:41;background:var(--panel,#151d24);border:1px solid var(--line);border-radius:10px;flex-direction:column;width:min(620px,100vw - 48px);max-height:min(560px,100vh - 64px);display:flex;position:fixed;top:50%;left:50%;overflow:hidden;transform:translate(-50%,-50%);box-shadow:0 24px 64px #00000080}.settings-head{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:14px 16px;display:flex}.settings-title{font:500 13px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);margin:0}.settings-close{width:24px;height:24px;color:var(--muted);cursor:pointer;background:0 0;border:0;padding:0;font-size:12px}.settings-close:hover{color:var(--ink)}.settings-body{grid-template-columns:148px minmax(0,1fr);min-height:0;display:grid}.settings-sections{border-right:1px solid var(--line);background:#00000024;flex-direction:column;gap:1px;padding:10px 8px;display:flex}.settings-section{color:var(--ink-soft);font:500 11.5px/1.3 var(--sans);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:7px 10px}.settings-section:hover{color:var(--ink);background:#ffffff0a}.settings-section.is-active{color:var(--ink);background:#2f6fed29}.settings-content{align-content:start;gap:14px;padding:16px;display:grid;overflow-y:auto}.settings-row{color:var(--ink-soft);border-bottom:1px solid var(--line);justify-content:space-between;gap:12px;padding:4px 0;font-size:12px;display:flex}.settings-row b{color:var(--ink);font-weight:500}.component-list{gap:8px;display:grid}.component-row{border-bottom:1px solid var(--line);padding:8px 0}.component-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.component-name{font:600 12px/1.2 var(--sans);color:var(--ink)}.component-row p{margin:3px 0 0}.symbol-list{padding-top:2px}.symbol-group+.symbol-group{margin-top:7px}.symbol-group-head{font:500 8.5px/1.2 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);align-items:center;gap:6px;padding:3px 0 2px;display:flex}.symbol-group-line{background:var(--line);flex:1;height:1px}.symbol-group-count{color:var(--muted)}.symbol-file{border-bottom:1px solid var(--line);padding:6px 0}.symbol-file-path{width:100%;color:var(--ink);font:500 11px/1.4 var(--mono);text-align:left;cursor:pointer;background:0 0;border:0;margin-bottom:4px;padding:0;display:block}.symbol-file-path:hover{color:var(--accent,#2f6fed);text-decoration:underline}.symbol-change{color:var(--ink-soft);grid-template-columns:34px minmax(0,1fr) auto;align-items:center;gap:8px;padding:2px 0 2px 4px;font-size:11px;display:grid}.symbol-row{color:var(--ink-soft);text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:34px minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;padding:3px 0;font-size:11px;display:grid}.symbol-row:hover{background:#2f6fed14}.symbol-row.is-selected{background:#2f6fed24}.chain-list{padding-top:2px}.chain-row{color:var(--ink-soft);grid-template-columns:74px auto minmax(0,1fr);align-items:center;gap:8px;padding:3px 0;font-size:10.5px;display:grid}.chain-date{color:var(--muted);font-size:10px}.chain-events{flex-wrap:wrap;gap:3px;display:flex}.chain-event{font:500 8.5px/1.5 var(--mono);letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--line);color:var(--muted);white-space:nowrap;border-radius:3px;padding:0 4px}.chain-created{color:#0f766e;border-color:#0f766e66}.chain-changed{color:#c2410c;border-color:#c2410c66}.chain-renamed,.chain-moved{color:#2f6fed;border-color:#2f6fed66}.chain-removed{color:var(--rust);border-color:#be3c2866}.chain-path{text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);color:var(--muted);font-size:10px;overflow:hidden}.symbol-kind{font:500 8.5px/1.5 var(--mono);letter-spacing:.08em;text-transform:uppercase;text-align:center;color:var(--muted);border:1px solid var(--line);border-radius:3px}.symbol-function{color:#2f6fed;border-color:#2f6fed66}.symbol-class{color:#c2410c;border-color:#c2410c59}.symbol-interface,.symbol-type{color:#0f766e;border-color:#0f766e59}.symbol-enum{color:#6d28d9;border-color:#6d28d959}.symbol-variable{color:#64748b;border-color:#64748b66}.surface-list,.member-list{padding-top:2px}.surface-group+.surface-group,.member-group+.member-group{margin-top:7px}.surface-row{color:var(--ink-soft);flex-wrap:wrap;align-items:baseline;gap:4px 8px;padding:3px 0;font-size:11px;display:flex}.surface-source{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);flex:40%;font-size:10px;overflow:hidden}.surface-names{flex-wrap:wrap;flex:55%;gap:4px;min-width:0;display:flex}.surface-name{border:1px solid var(--line);max-width:100%;font:500 10px/1.5 var(--mono);color:var(--ink-soft);text-overflow:ellipsis;white-space:nowrap;border-radius:3px;padding:0 4px;overflow:hidden}.surface-badge{font:500 8.5px/1.5 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.member-row{color:var(--ink-soft);grid-template-columns:34px minmax(0,1fr);align-items:center;gap:8px;padding:3px 0;font-size:11px;display:grid}.member-kind{font-size:8px}.symbol-name{text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:10.5px;overflow:hidden}.symbol-complexity{color:var(--ink)}.symbol-note{margin:7px 0 0;line-height:1.35}.tabs{border-bottom:1px solid var(--line);gap:18px;margin:-2px 0 16px;display:flex}.tab{color:var(--muted);font:500 9.5px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:0 0 9px;display:inline-flex}.tab.is-active{color:var(--ink);border-bottom-color:var(--ink)}.tab-dot{background:var(--rust);border-radius:50%;width:5px;height:5px;display:inline-block}.button.dark{background:var(--ink);color:var(--paper);border-color:var(--ink);margin-top:12px}.button.dark:hover{background:#26333b}.change-panel h2{margin-bottom:4px}.change-checksums{color:var(--muted);margin-bottom:14px;font-size:10px}.change-grid{border-top:1px solid var(--line);border-left:1px solid var(--line);grid-template-columns:1fr 1fr;margin-bottom:16px;display:grid}.change-stat{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:9px 10px}.change-stat span{font:500 8.5px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);display:block}.change-stat b{font:600 15px/1.1 var(--display);letter-spacing:-.02em;margin-top:3px;display:block}.change-stat-bad b{color:var(--debt)}.change-stat-good b{color:var(--patina)}.change-delta.is-worse{color:var(--debt)}.change-delta.is-better{color:var(--patina)}.change-section{border-top:1px solid var(--line);margin-top:13px;padding-top:12px}.change-summary{color:var(--muted);flex-wrap:wrap;gap:4px 13px;margin-bottom:7px;font-size:10.5px;display:flex}.change-summary b{color:var(--ink)}.violation-list{gap:4px;display:grid}.violation{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:6px 1fr;gap:8px;width:100%;padding:5px 0;display:grid}.violation:hover{background:#d645450f}.violation i{background:var(--muted);border-radius:50%;width:6px;height:6px;margin-top:5px}.violation-error i{background:var(--debt)}.violation-warn i{background:var(--ochre)}.violation-info i{background:var(--cobalt)}.violation b{font:600 11px/1.3 var(--sans);display:block}.violation>span{min-width:0}.violation small{color:var(--muted);overflow-wrap:anywhere;font-size:10.5px;line-height:1.35;display:block}.violation-source{border:1px solid var(--line-strong);font:500 8.5px/1.4 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);vertical-align:1px;border-radius:2px;margin-left:6px;padding:1px 5px;font-style:normal}.lens-section{margin-top:18px}.lens-section+.lens-section{border-top:1px solid var(--line);padding-top:16px}.lens-risk-head{align-items:baseline;gap:4px;margin-bottom:12px;display:flex}.lens-risk-value{font:600 32px/1 var(--display);letter-spacing:-.04em}.lens-risk-unit{font:10px/1 var(--mono);color:var(--muted)}.lens-bars{gap:7px;display:grid}.lens-bar-row{color:var(--ink-soft);grid-template-columns:70px minmax(0,1fr) 38px 30px;align-items:center;gap:6px;font-size:10.5px;display:grid}.lens-bar-row>.mono{text-align:right;font-size:10px}.lens-weight{font:9px/1 var(--mono);color:var(--muted);text-align:right}.lens-bar{background:var(--line);height:5px;overflow:hidden}.lens-bar i{background:var(--rust);height:100%;display:block}.lens-section .tiny{margin:9px 0 0;line-height:1.4}.lens-counts{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lens-chip{border:1px solid var(--line-strong);font:500 8.5px/1.4 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-radius:2px;padding:2px 6px}.lens-chip-new,.lens-new{color:var(--debt);border-color:var(--debt)}.lens-edges{gap:3px;margin-top:10px;display:grid}.lens-edge{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:8px;width:100%;padding:3px 0;display:grid}.lens-edge:hover .lens-edge-path{color:var(--ink)}.lens-flag{font:500 8.5px/1.4 var(--mono);letter-spacing:.06em;text-transform:uppercase;border-radius:2px;padding:1px 5px}.lens-wasm{color:var(--cobalt);border:1px solid var(--cobalt)}.lens-native{color:var(--ochre);border:1px solid var(--ochre)}.lens-edge-path{font:10.5px/1.4 var(--mono);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lens-symbol{font-weight:600}.lens-index{border-top:1px solid var(--line);gap:10px;margin-top:20px;padding-top:14px;display:grid}.lens-index>div{justify-content:space-between;gap:12px;font-size:10.5px;display:flex}.lens-index b{font-weight:600}.lens-index span{color:var(--muted);text-align:right}.rules-panel h2{margin-bottom:4px}.rules-hint{margin-top:8px}.rules-hint .lens-index{margin-top:14px}.rules-file>.lens-section:first-child{margin-top:12px}.rules-change{border-top:1px solid var(--line);margin-top:18px;padding-top:14px}.rules-change>.eyebrow{margin-bottom:8px}.rules-empty-title{font:600 13px/1.2 var(--sans);margin:10px 0 2px}.rules-meta{color:var(--muted);margin:-6px 0 10px;font-size:10.5px}.rules-meta b{color:var(--ink)}.rules-sources{flex-wrap:wrap;gap:6px;margin-bottom:12px;display:flex}.rules-chip{border:1px solid var(--line-strong);font:500 8.5px/1.4 var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-radius:2px;align-items:baseline;gap:4px;padding:2px 6px;display:inline-flex}.rules-chip b{color:var(--ink);font-size:10px}.rules-group{border-top:1px solid var(--line);margin-top:13px;padding-top:12px}.rules-group-head{justify-content:space-between;align-items:center;gap:8px;margin-bottom:7px;display:flex}.rules-group-head .eyebrow{margin:0}.rules-count{border:1px solid var(--line-strong);min-width:18px;font:500 9px/1.4 var(--mono);text-align:center;color:var(--muted);border-radius:2px;padding:1px 5px}.rules-count-introduced{color:var(--debt);border-color:var(--debt)}.rules-count-resolved{color:var(--patina);border-color:var(--patina)}.rules-rule-resolved{opacity:.72}.rules-detail{font:9.5px/1.4 var(--mono);color:var(--muted);overflow-wrap:anywhere;margin-top:2px;display:block}.tab-dot-alert{background:var(--debt)}.change-rows{gap:1px;display:grid}.change-row{text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;padding:5px 0;display:grid}.change-row:hover{background:#2f6fed0f}.change-path{text-overflow:ellipsis;white-space:nowrap;color:var(--ink-soft);font-size:10.5px;overflow:hidden}.change-delta{color:var(--muted);font-size:9.5px}.change-cycle{grid-template-columns:22px minmax(0,1fr);gap:6px;padding:4px 0;font-size:10.5px;display:grid}.panel-error{color:var(--debt);margin-top:10px;font-size:11px}code{font-family:var(--mono);background:#64727b1f;border-radius:2px;padding:1px 3px;font-size:10px}@media (min-width:1181px){.app{height:100dvh;overflow:hidden}.shell{height:calc(100dvh - var(--topbar-h) - var(--band-h));min-height:0}.rail,.inspector{min-height:0}.stage{min-height:0;overflow:hidden}.map-frame{min-height:0}}@media (max-width:1180px){.shell{grid-template-columns:226px minmax(0,1fr)}.stage{height:calc(100dvh - var(--topbar-h) - var(--band-h))}.rail{max-height:calc(100dvh - var(--topbar-h) - var(--band-h))}.map-frame{min-height:0}.inspector{border-left:0;border-top:1px solid var(--line);grid-column:1/-1;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:30px;display:grid}}@media (max-width:820px){.topbar{grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:10px 14px}.snapshot-meta,.brand-sub,.button-label-long{display:none}.button-label-short{display:inline}.topbar-actions{flex-wrap:nowrap}.topbar-actions .button{padding:7px 9px;font-size:9.5px}.shell{flex-direction:column;min-height:0;display:flex}.stage{order:1;padding:16px 12px 12px}.rail{border-right:0;border-top:1px solid var(--line);order:2;grid-template-columns:1fr 1fr;gap:18px;display:grid}.inspector{order:3;display:block}.project-band{gap:12px;padding:0 14px}.project-band h1{max-width:190px}.project-kpis .kpi{min-width:0;padding:0 9px}.project-kpis .kpi b{font-size:14px}.map-frame,.map{min-height:360px}}@media (max-width:560px){.rail{grid-template-columns:1fr}.project-band{gap:8px}.project-band h1{max-width:104px;font-size:15px}.project-ident{flex:auto}.project-kpis{flex:auto;justify-content:flex-end}.project-kpis .kpi{flex:1 1 0;padding:0 5px}.project-kpis .kpi span{max-width:100%;font-size:7px}.project-kpis .kpi b{font-size:13px}.stage-foot{flex-direction:column;gap:3px}.stage-foot .mono{max-width:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.refresh-notice.is-new{opacity:1;animation:none!important}}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import{a as e,i as t,n,r,t as i}from"./index-DoNheLr8.js";var a=e(t(),1),o={minDistance:60,maxDistance:1600,minPolar:.12,maxPolar:Math.PI/2.05},s={azimuth:-.6018,polar:.9813,distance:467.3};function c(e,t,n,r=1.08){let i=Math.max(1,e),a=Math.min(Math.max(t,.2),Math.PI-.2),o=Math.max(.2,n),s=i/Math.sin(a/2),c=2*Math.atan(Math.tan(a/2)*o),l=i/Math.sin(Math.min(c,Math.PI-.2)/2);return Math.max(s,l)*r}function l(e,t){let n=Math.sin(e.polar)*e.distance;return{x:t.x+n*Math.sin(e.azimuth),y:t.y+Math.cos(e.polar)*e.distance,z:t.z+n*Math.cos(e.azimuth)}}function u(e,t=o){return{azimuth:e.azimuth,polar:Math.min(Math.max(e.polar,t.minPolar),t.maxPolar),distance:Math.min(Math.max(e.distance,t.minDistance),t.maxDistance)}}function d(e,t,n){let r=Math.min(Math.max(n,0),1);return{azimuth:e.azimuth+(t.azimuth-e.azimuth)*r,polar:e.polar+(t.polar-e.polar)*r,distance:e.distance+(t.distance-e.distance)*r}}var f=.005,p=5,m=.0015;function h(e,t={}){let n=t.target??{x:0,y:0,z:0},r=t.limits??o,i={...t.start??s},a={...i},c=t.damping??.18,h=new Map,g=0,_=null,v=0,y=()=>{let[e,t]=[...h.values()];return!e||!t?0:Math.hypot(e.x-t.x,e.y-t.y)},b=t=>{if(t.pointerType!==`mouse`||t.button===0){h.set(t.pointerId,{x:t.clientX,y:t.clientY});try{e.setPointerCapture(t.pointerId)}catch{}h.size===1?(_={x:t.clientX,y:t.clientY},v=0):(_=null,g=y())}},x=e=>{let n=h.get(e.pointerId);if(!n)return;let a=e.clientX-n.x,o=e.clientY-n.y;if(h.set(e.pointerId,{x:e.clientX,y:e.clientY}),h.size===1)i.azimuth-=a*f,i.polar=u({...i,polar:i.polar-o*f},r).polar,v+=Math.abs(a)+Math.abs(o),t.onChange?.();else if(h.size===2){let e=y();g>0&&e>0&&(i.distance=u({...i,distance:i.distance*(g/e)},r).distance),g=e,t.onChange?.()}},S=e=>{h.delete(e.pointerId),h.size===0?(_&&v<=p&&t.onTap?.(e.clientX,e.clientY),_=null,g=0):g=h.size===2?y():0},C=e=>{e.preventDefault();let n=e.deltaMode===1?e.deltaY*16:e.deltaMode===2?e.deltaY*400:e.deltaY;i.distance=u({...i,distance:i.distance*Math.exp(n*m)},r).distance,t.onChange?.()};return e.addEventListener(`pointerdown`,b),e.addEventListener(`pointermove`,x),e.addEventListener(`pointerup`,S),e.addEventListener(`pointercancel`,S),e.addEventListener(`wheel`,C,{passive:!1}),{update(){let e=a;return a=d(a,i,c),Math.abs(a.azimuth-e.azimuth)>1e-5||Math.abs(a.polar-e.polar)>1e-5||Math.abs(a.distance-e.distance)>1e-4},pose(){return{position:l(a,n),target:{...n}}},dispose(){e.removeEventListener(`pointerdown`,b),e.removeEventListener(`pointermove`,x),e.removeEventListener(`pointerup`,S),e.removeEventListener(`pointercancel`,S),e.removeEventListener(`wheel`,C)}}}var g=(e,t)=>({x:e.x-t.x,y:e.y-t.y,z:e.z-t.z}),_=(e,t)=>e.x*t.x+e.y*t.y+e.z*t.z,v=(e,t)=>({x:e.y*t.z-e.z*t.y,y:e.z*t.x-e.x*t.z,z:e.x*t.y-e.y*t.x});function y(e){let t=Math.hypot(e.x,e.y,e.z);return t===0||!Number.isFinite(t)?{...e}:{x:e.x/t,y:e.y/t,z:e.z/t}}function b(e,t,n,r){let i=1/Math.tan(Math.max(.01,e)/2),a=Math.max(.01,t),o=n-r,s=new Float32Array(16);return s[0]=i/a,s[5]=i,s[10]=(r+n)/o,s[11]=-1,s[14]=2*r*n/o,s}function x(e,t,n={x:0,y:1,z:0}){let r=y(g(e,t)),i=y(v(n,r));i.x===0&&i.y===0&&i.z===0&&(i=y(v({x:0,y:0,z:1},r)));let a=v(r,i),o=new Float32Array(16);return o[0]=i.x,o[1]=a.x,o[2]=r.x,o[3]=0,o[4]=i.y,o[5]=a.y,o[6]=r.y,o[7]=0,o[8]=i.z,o[9]=a.z,o[10]=r.z,o[11]=0,o[12]=-_(i,e),o[13]=-_(a,e),o[14]=-_(r,e),o[15]=1,o}function S(e,t,n,r,i,a){let o=y(g(t,e)),s=y(v(o,{x:0,y:1,z:0})),c=v(s,o),l=Math.tan(Math.max(.01,i)/2),u=y({x:o.x+s.x*n*l*a+c.x*r*l,y:o.y+s.y*n*l*a+c.y*r*l,z:o.z+s.z*n*l*a+c.z*r*l});return{origin:{...e},direction:u}}function C(e){return{min:{x:e.x,y:e.y,z:e.z},max:{x:e.x+Math.max(e.width,.001),y:e.y+Math.max(e.height,.001),z:e.z+Math.max(e.depth,.001)}}}function w(e,t){let{min:n,max:r}=C(t),i=-1/0,a=1/0;for(let t of[`x`,`y`,`z`]){let o=e.origin[t],s=e.direction[t];if(Math.abs(s)<1e-9){if(o<n[t]||o>r[t])return null;continue}let c=(n[t]-o)/s,l=(r[t]-o)/s;if(c>l&&([c,l]=[l,c]),i=Math.max(i,c),a=Math.min(a,l),i>a)return null}return a<0?null:i>=0?i:a}function ee(e,t){let n=null,r=1/0;for(let i=0;i<t.length;i++){let a=w(e,t[i]);a!==null&&a<r&&(r=a,n=i)}return n}var T=2,E=90,D=1.4;function O(e){return n(e.roots,e.width,e.height).map(t=>k(t,e))}function k(e,t){let{node:n,rect:r}=e,i=Math.max(1,r.w*r.h),a=(e.children??[]).map(e=>k(e,t)).sort((e,t)=>t.area-e.area||e.path.localeCompare(t.path));if(n.kind===`file`&&n.fileIndex!==void 0){let e=t.files[n.fileIndex];return{path:n.path,kind:`file`,x:r.x,z:r.y,width:r.w,depth:r.h,height:T+(e?.risk??0)*E,color:t.colorFor(n.fileIndex),area:i,children:[]}}let o=a.reduce((e,t)=>Math.max(e,t.height),0);return{path:n.path,kind:`folder`,x:r.x,z:r.y,width:r.w,depth:r.h,height:o>0?Math.max(D*2,o):Math.max(6,Math.log2(n.fileCount+1)*4),color:a[0]?.color??t.fallbackColor,area:i,children:a}}function te(e){let t=1/0,n=1/0,r=-1/0,i=-1/0,a=0,o=e=>{t=Math.min(t,e.x),n=Math.min(n,e.z),r=Math.max(r,e.x+e.width),i=Math.max(i,e.z+e.depth),a=Math.max(a,e.height);for(let t of e.children)o(t)};for(let t of e)o(t);if(!Number.isFinite(t))return{cx:0,cz:0,radius:1,maxHeight:0};let s=Math.max(1,r-t),c=Math.max(1,i-n);return{cx:(t+r)/2,cz:(n+i)/2,radius:Math.hypot(s,c,a)/2,maxHeight:a}}var A=1200,j=22;function ne(e,t){let n=[],r=Math.max(1,t.budget??A),i=Math.max(0,t.minPixels??j),a=Math.tan(Math.max(.01,t.fov)/2),o=Math.max(1,t.viewportHeight),s=e=>{if(!(e.kind===`folder`&&e.children.length>0)){n.push(M(e,!1,e.height));return}let c=Math.max(1,Math.hypot(e.x+e.width/2-t.camera.x,e.height/2-t.camera.y,e.z+e.depth/2-t.camera.z)),l=Math.sqrt(e.area)*o/(2*c*a),u=r-n.length;if(l<i||u<e.children.length+1)n.push(M(e,!0,0));else{n.push(M(e,!1,D));for(let t of e.children)s(t)}};for(let t of e)s(t);return n}function M(e,t,n){return{path:e.path,kind:e.kind,x:e.x,y:0,z:e.z,width:e.width,depth:e.depth,height:t?e.height:n,color:e.color,collapsed:t}}var N=50,P=4e3,F=22,re=120,I=`#2f6fed`,L=.6,R=8e6,ie=36,z=9,B=`#version 300 es
|
|
2
|
+
precision highp float;
|
|
3
|
+
|
|
4
|
+
layout(location = 0) in vec3 aOffset;
|
|
5
|
+
layout(location = 1) in vec3 aScale;
|
|
6
|
+
layout(location = 2) in vec3 aColor;
|
|
7
|
+
|
|
8
|
+
uniform mat4 uView;
|
|
9
|
+
uniform mat4 uProjection;
|
|
10
|
+
|
|
11
|
+
out vec3 vColor;
|
|
12
|
+
out vec3 vNormal;
|
|
13
|
+
out float vDepth;
|
|
14
|
+
|
|
15
|
+
const vec3 CORNERS[8] = vec3[8](
|
|
16
|
+
vec3(-0.5, -0.5, -0.5),
|
|
17
|
+
vec3( 0.5, -0.5, -0.5),
|
|
18
|
+
vec3( 0.5, 0.5, -0.5),
|
|
19
|
+
vec3(-0.5, 0.5, -0.5),
|
|
20
|
+
vec3(-0.5, -0.5, 0.5),
|
|
21
|
+
vec3( 0.5, -0.5, 0.5),
|
|
22
|
+
vec3( 0.5, 0.5, 0.5),
|
|
23
|
+
vec3(-0.5, 0.5, 0.5)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const int FACES[36] = int[36](
|
|
27
|
+
0, 1, 2, 0, 2, 3,
|
|
28
|
+
4, 6, 5, 4, 7, 6,
|
|
29
|
+
0, 4, 5, 0, 5, 1,
|
|
30
|
+
3, 2, 6, 3, 6, 7,
|
|
31
|
+
0, 3, 7, 0, 7, 4,
|
|
32
|
+
1, 5, 6, 1, 6, 2
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const vec3 NORMALS[6] = vec3[6](
|
|
36
|
+
vec3( 0.0, 0.0, -1.0),
|
|
37
|
+
vec3( 0.0, 0.0, 1.0),
|
|
38
|
+
vec3( 0.0, -1.0, 0.0),
|
|
39
|
+
vec3( 0.0, 1.0, 0.0),
|
|
40
|
+
vec3(-1.0, 0.0, 0.0),
|
|
41
|
+
vec3( 1.0, 0.0, 0.0)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
void main() {
|
|
45
|
+
vec3 local = CORNERS[FACES[gl_VertexID]];
|
|
46
|
+
vec3 world = aOffset + local * aScale;
|
|
47
|
+
vec4 view = uView * vec4(world, 1.0);
|
|
48
|
+
vColor = aColor;
|
|
49
|
+
vNormal = NORMALS[gl_VertexID / 6];
|
|
50
|
+
vDepth = -view.z;
|
|
51
|
+
gl_Position = uProjection * view;
|
|
52
|
+
}
|
|
53
|
+
`,V=`#version 300 es
|
|
54
|
+
precision highp float;
|
|
55
|
+
|
|
56
|
+
in vec3 vColor;
|
|
57
|
+
in vec3 vNormal;
|
|
58
|
+
in float vDepth;
|
|
59
|
+
|
|
60
|
+
uniform vec3 uLight;
|
|
61
|
+
uniform vec3 uFill;
|
|
62
|
+
uniform vec3 uFog;
|
|
63
|
+
uniform float uFogNear;
|
|
64
|
+
uniform float uFogFar;
|
|
65
|
+
|
|
66
|
+
out vec4 outColor;
|
|
67
|
+
|
|
68
|
+
void main() {
|
|
69
|
+
vec3 normal = normalize(vNormal);
|
|
70
|
+
float key = max(dot(normal, uLight), 0.0);
|
|
71
|
+
float fill = max(dot(normal, uFill), 0.0);
|
|
72
|
+
// El ambiente mantiene el color de la caja y las dos direcciones dan volumen:
|
|
73
|
+
// el techo y los costados no se confunden aunque no haya luces.
|
|
74
|
+
float shade = 0.46 + key * 0.46 + fill * 0.18;
|
|
75
|
+
vec3 color = vColor * shade;
|
|
76
|
+
float fog = smoothstep(uFogNear, uFogFar, vDepth);
|
|
77
|
+
outColor = vec4(mix(color, uFog, fog * 0.9), 1.0);
|
|
78
|
+
}
|
|
79
|
+
`;function H(e,t,n){let r=e.createShader(t);if(!r)throw Error(`No se pudo crear el shader`);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r)??`shader roto`;throw e.deleteShader(r),Error(t)}return r}function ae(e){let t=e.createProgram();if(!t)throw Error(`No se pudo crear el programa`);let n=H(e,e.VERTEX_SHADER,B),r=H(e,e.FRAGMENT_SHADER,V);if(e.attachShader(t,n),e.attachShader(t,r),e.linkProgram(t),e.deleteShader(n),e.deleteShader(r),!e.getProgramParameter(t,e.LINK_STATUS)){let n=e.getProgramInfoLog(t)??`programa roto`;throw e.deleteProgram(t),Error(n)}return t}function U(e,t=[.5,.5,.5]){let n=e.trim().toLowerCase(),r=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(n);if(r){let e=r[1],t=e.length===3?e.split(``).map(e=>e+e).join(``):e;return[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255]}let i=/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/.exec(n);return i?[Math.min(255,Number(i[1]))/255,Math.min(255,Number(i[2]))/255,Math.min(255,Number(i[3]))/255]:t}function oe(e,t){let n=U(e.color);if(e.path!==t)return n;let r=U(I);return[n[0]+(r[0]-n[0])*L,n[1]+(r[1]-n[1])*L,n[2]+(r[2]-n[2])*L]}function W(e,t){let n=e.getContext(`webgl2`,{antialias:!0,alpha:!1,depth:!0,powerPreference:`high-performance`});if(!n)return t.onError?.(),{setSelected:()=>void 0,dispose:()=>void 0};let r=te(t.roots),i=N*Math.PI/180,a=(e.clientWidth||1)/(e.clientHeight||1),l=c(r.radius,i,a),u={x:r.cx,y:0,z:r.cz},d=Math.max(1,l*.01),f=l*4+2e3,p=U(t.background,[.93,.94,.95]),m=new Float32Array(4257*z),g=null,_=null,v=null,y={view:null,projection:null,light:null,fill:null,fog:null,fogNear:null,fogFar:null},C=()=>{try{if(g=ae(n),_=n.createVertexArray(),v=n.createBuffer(),!_||!v)throw Error(`Sin VAO o sin búfer`);n.bindVertexArray(_),n.bindBuffer(n.ARRAY_BUFFER,v),n.bufferData(n.ARRAY_BUFFER,m.byteLength,n.DYNAMIC_DRAW);for(let e=0;e<3;e++)n.enableVertexAttribArray(e),n.vertexAttribPointer(e,3,n.FLOAT,!1,36,e*3*4),n.vertexAttribDivisor(e,1);y={view:n.getUniformLocation(g,`uView`),projection:n.getUniformLocation(g,`uProjection`),light:n.getUniformLocation(g,`uLight`),fill:n.getUniformLocation(g,`uFill`),fog:n.getUniformLocation(g,`uFog`),fogNear:n.getUniformLocation(g,`uFogNear`),fogFar:n.getUniformLocation(g,`uFogFar`)};let e=Math.max(200,r.radius*4);return m[0]=r.cx,m[1]=-.17,m[2]=r.cz,m[3]=e,m[4]=.3,m[5]=e,m[6]=p[0]*.92,m[7]=p[1]*.92,m[8]=p[2]*.92,n.bufferSubData(n.ARRAY_BUFFER,0,m,0,z),n.enable(n.DEPTH_TEST),n.depthFunc(n.LEQUAL),n.disable(n.CULL_FACE),n.clearColor(p[0],p[1],p[2],1),!0}catch{return!1}},w=[],T=t.selected,E=``,D=1,O=!1,k=!1,A=!1,j=0,M=0,I=null,L=b(i,a,d,f),B=h(e,{onTap:(n,r)=>{let a=e.getBoundingClientRect(),o=(n-a.left)/Math.max(1,a.width)*2-1,s=-((r-a.top)/Math.max(1,a.height))*2+1,c=B.pose(),l=ee(S(c.position,c.target,o,s,i,a.width/Math.max(1,a.height)),w),u=l===null?void 0:w[l];u&&(u.kind===`folder`&&u.collapsed?t.onFocus?.(u.path):u.kind===`file`&&t.onSelect(u.path))},start:{...s,distance:l},target:u,onChange:()=>q(),limits:{...o,minDistance:Math.max(20,l*.05),maxDistance:Math.max(o.maxDistance,l*2.4)}}),V=()=>{n&&v&&(n.bindBuffer(n.ARRAY_BUFFER,v),n.bufferSubData(n.ARRAY_BUFFER,36,m,z,Math.max(0,D-1)*z))},H=(e,t)=>{let n=e*z,r=Math.max(1,t.height);m[n]=t.x+t.width/2,m[n+1]=t.y+r/2,m[n+2]=t.z+t.depth/2,m[n+3]=Math.max(1,t.width-1),m[n+4]=r,m[n+5]=Math.max(1,t.depth-1);let i=oe(t,T);m[n+6]=i[0],m[n+7]=i[1],m[n+8]=i[2]},W=e=>{let n=Math.min(e.length,4256);for(let t=0;t<n;t++)H(t+1,e[t]);w=e.slice(0,n),D=n+1,V(),t.onBoxes?.(n),q()},G=()=>{for(let e=0;e<w.length;e++)H(e+1,w[e]);V(),q()},K=(n,r=!1)=>{if(!r&&I&&Math.hypot(n.x-I.x,n.y-I.y,n.z-I.z)<Math.hypot(n.x,n.y,n.z)*.005)return;I={...n};let a=ne(t.roots,{camera:n,viewportHeight:e.clientHeight||1,fov:i,minPixels:F,budget:P}),o=a.map(e=>e.collapsed?`+${e.path}`:e.path).join(`|`);(r||o!==E)&&(E=o,W(a))};function q(){O||A||!k||j||(j=requestAnimationFrame(Y))}let J=e=>{n&&g&&(n.clearColor(p[0],p[1],p[2],1),n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT),n.useProgram(g),n.uniformMatrix4fv(y.view,!1,x(e.position,e.target)),n.uniformMatrix4fv(y.projection,!1,L),n.uniform3f(y.light,-.38,.85,.36),n.uniform3f(y.fill,.48,.18,-.86),n.uniform3f(y.fog,p[0],p[1],p[2]),n.uniform1f(y.fogNear,l*1.4),n.uniform1f(y.fogFar,l*5),n.bindVertexArray(_),n.drawArraysInstanced(n.TRIANGLES,0,ie,D),n.bindVertexArray(null))},Y=()=>{if(j=0,O||A||!n)return;let e=B.update(),t=performance.now(),r=B.pose();e&&(t-M>=re&&(M=t,K(r.position)),q()),J(r)},X=()=>{if(!n||O||A)return;let t=e.clientWidth||1,r=e.clientHeight||1,a=Math.min(window.devicePixelRatio||1,2),o=t*r*a*a,s=o>R?a*Math.sqrt(R/o):a,c=Math.max(1,Math.round(t*s)),l=Math.max(1,Math.round(r*s));(e.width!==c||e.height!==l)&&(e.width=c,e.height=l),L=b(i,t/r,d,f),n.viewport(0,0,e.width,e.height),K(B.pose().position,!0),q()},Z=e=>{e.preventDefault(),A=!0,cancelAnimationFrame(j),j=0},Q=()=>{O||(A=!1,C()?(X(),t.onBackend?.(`webgl2`),q()):t.onError?.())};e.addEventListener(`webglcontextlost`,Z),e.addEventListener(`webglcontextrestored`,Q);let $=new ResizeObserver(X);return $.observe(e),window.addEventListener(`resize`,X),C()?(k=!0,t.onBackend?.(`webgl2`),X()):t.onError?.(),{setSelected(e){e!==T&&(T=e,G())},dispose(){O=!0,cancelAnimationFrame(j),$.disconnect(),window.removeEventListener(`resize`,X),e.removeEventListener(`webglcontextlost`,Z),e.removeEventListener(`webglcontextrestored`,Q),B.dispose(),n&&(v&&n.deleteBuffer(v),_&&n.deleteVertexArray(_),g&&n.deleteProgram(g))}}}var G=r();function K(e,t){if(typeof window>`u`)return t;let n=getComputedStyle(document.documentElement).getPropertyValue(e).trim();return n===``?t:n}function q(e){return e===`webgl2`?`WebGL2`:e===`error`?`sin GPU`:`arrancando la GPU`}function J({context:e}){let t=(0,a.useRef)(null),n=(0,a.useRef)(null),[r,o]=(0,a.useState)(`pending`),[s,c]=(0,a.useState)(0),l=(0,a.useRef)(e);l.current=e;let u=e.model,d=e.preferences.colorMode,f=(0,a.useMemo)(()=>u?O({roots:u.roots,files:u.files,colorFor:e=>l.current.colorFor(e),fallbackColor:K(`--muted`,`#98a2ad`),width:i,height:900}):[],[u,d]),p=e.selection;return(0,a.useEffect)(()=>{let e=t.current;if(!e||f.length===0)return;o(`pending`);let r=W(e,{roots:f,selected:l.current.selection,background:K(`--paper`,`#eef1f2`),onSelect:e=>l.current.actions.select(e),onFocus:e=>l.current.actions.focus(e),onBackend:e=>o(e),onError:()=>o(`error`),onBoxes:e=>c(e)});return n.current=r,()=>{r.dispose(),n.current=null}},[f]),(0,a.useEffect)(()=>{n.current?.setSelected(p)},[p]),u?(0,G.jsxs)(`div`,{className:`vista3d`,children:[(0,G.jsx)(`canvas`,{ref:t,className:`vista3d-canvas`}),(0,G.jsxs)(`div`,{className:`vista3d-hud`,children:[(0,G.jsx)(`strong`,{children:u.fileCount}),` ficheros ·`,` `,(0,G.jsx)(`strong`,{children:s}),` cajas ·`,` `,(0,G.jsx)(`span`,{className:`vista3d-runtime`,children:q(r)}),` · orbita con el ratón · pulsa una caja (o una carpeta) para entrar`]})]}):(0,G.jsx)(`div`,{className:`plugin-view`,children:`Sin mapa que dibujar.`})}var Y={views:[{id:`vista-3d`,label:`3D`,render:e=>(0,G.jsx)(J,{context:e})}]};export{Y as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.vista3d{border:1px solid var(--line);background:var(--paper);border-radius:8px;width:100%;height:100%;min-height:420px;position:relative;overflow:hidden}.vista3d-canvas{cursor:grab;touch-action:none;width:100%;height:100%;display:block}.vista3d-canvas:active{cursor:grabbing}.vista3d-hud{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 88%, transparent);color:var(--muted);font:400 11px/1.4 var(--sans);pointer-events:none;border-radius:6px;padding:6px 10px;position:absolute;bottom:12px;left:12px}.vista3d-hud strong{color:var(--ink);font-weight:600}.vista3d-runtime{color:var(--ink)}
|