:root{--primary-bg: #ffffff;--secondary-bg: #f8fafc;--text-primary: #0f172a;--text-secondary: #64748b;--border-color: #e2e8f0;--accent-color: #000000;--font-main: "Inter", sans-serif;--font-mono: "Outfit", sans-serif}body{margin:0;padding:0;font-family:var(--font-main);background-color:var(--secondary-bg);color:var(--text-primary);overflow:hidden}#app{display:flex;height:100vh;height:100dvh;width:100vw}#ui-container{width:320px;background-color:var(--primary-bg);border-right:1px solid var(--border-color);display:flex;flex-direction:column;z-index:10;box-shadow:4px 0 24px #00000005}header{padding:24px;border-bottom:1px solid var(--border-color)}.logo-container{margin-bottom:0;display:flex;justify-content:center;align-items:center;width:100%}.main-logo{max-width:180px;height:auto;display:block}.version-badge{display:inline-block;margin-top:8px;font-size:.7rem;font-family:var(--font-mono);color:var(--text-secondary);text-align:center;width:100%;letter-spacing:.02em}.version-badge:empty{display:none}.version-badge .version-label{display:inline-flex;align-items:center;gap:4px;background:var(--secondary-bg);border:1px solid var(--border-color);border-radius:9999px;padding:2px 8px}.version-badge .version-label.label-dev{color:#7c3aed;border-color:#c4b5fd;background:#f5f3ff}.version-badge .version-label.label-main{color:#059669;border-color:#6ee7b7;background:#ecfdf5}h1{font-family:var(--font-mono);font-weight:700;font-size:1.5rem;margin:0;letter-spacing:-.02em}.subtitle{font-size:.875rem;color:var(--text-secondary);margin-top:4px}#controls{flex:1;padding:24px;overflow-y:auto}.control-group{margin-bottom:32px}.control-group h3{font-family:var(--font-mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);margin-bottom:16px;font-weight:700}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.skip-to-content{position:absolute;top:-100px;left:16px;z-index:9999;background-color:var(--primary-bg);color:var(--text-primary);padding:12px 24px;text-decoration:none;border-radius:4px;border:2px solid var(--text-primary);font-weight:600;transition:top .2s ease-in-out}.skip-to-content:focus{top:16px;outline:none}.skip-to-content:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.custom-file-upload{display:inline-flex;align-items:center;justify-content:center;gap:6px;background-color:#000;color:#fff;padding:10px 16px;cursor:pointer;border-radius:4px;font-family:var(--font-main);font-size:.9rem;font-weight:500;width:100%;box-sizing:border-box;text-align:center;transition:background-color .2s,transform .1s;-webkit-user-select:none;user-select:none;touch-action:manipulation}.custom-file-upload:hover{background-color:#333}.custom-file-upload:has(input:focus-visible){outline:2px solid var(--text-primary);outline-offset:2px}.download-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background-color:#2563eb;color:#fff;padding:10px 16px;cursor:pointer;border-radius:4px;font-family:var(--font-main);font-size:.9rem;font-weight:500;width:100%;box-sizing:border-box;text-align:center;border:none;transition:background-color .2s,opacity .2s,transform .1s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;touch-action:manipulation}.btn-icon{flex-shrink:0}.download-btn:hover:not(:disabled):not([aria-disabled=true]){background-color:#1d4ed8}.download-btn:disabled,.download-btn[aria-disabled=true]{background-color:#94a3b8;cursor:not-allowed;opacity:.7}.download-btn.loading{position:relative;pointer-events:none;padding-right:36px}.download-btn.loading:after{content:"";position:absolute;width:16px;height:16px;top:50%;right:12px;margin-top:-8px;border:2px solid transparent;border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.download-row{display:flex;gap:8px;align-items:stretch}.download-row .download-btn,.download-row .custom-file-upload{flex:1}.dpi-select{padding:8px 12px;border-radius:4px;border:1px solid #e2e8f0;background-color:#fff;font-family:var(--font-main);font-size:.85rem;cursor:pointer;min-width:70px;transition:border-color .2s;-webkit-user-select:none;user-select:none;touch-action:manipulation}.dpi-select:hover:not(:disabled),.results-select:hover:not(:disabled),.colormap-select:hover:not(:disabled){border-color:var(--text-secondary)}.dpi-select:disabled,.results-select:disabled,.colormap-select:disabled{background-color:var(--secondary-bg);cursor:not-allowed;opacity:.7}.dpi-select:focus-visible,.results-select:focus-visible,.colormap-select:focus-visible,.range-input:focus-visible,.download-btn:focus-visible,.menu-toggle:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}.toggle-item{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;font-family:var(--font-mono);font-size:.9rem}#point-size-control{margin-left:16px;width:calc(100% - 16px)}#point-size-control.disabled{color:var(--text-secondary)}#point-size-control input[type=range]:disabled{opacity:.4;cursor:not-allowed;filter:saturate(0)}.select-container{margin-top:10px}.results-select{width:100%;padding:8px;border-radius:4px;border:1px solid #e2e8f0;margin-top:5px;cursor:pointer;transition:border-color .2s;-webkit-user-select:none;user-select:none;touch-action:manipulation}.colormap-select{width:100px;padding:4px;border-radius:4px;border:1px solid #e2e8f0;cursor:pointer;transition:border-color .2s;-webkit-user-select:none;user-select:none;touch-action:manipulation}.toggle-label{cursor:pointer;flex-grow:1}.range-input{width:100%;cursor:pointer;accent-color:var(--accent-color)}.switch{position:relative;display:inline-block;width:44px;height:24px;-webkit-user-select:none;user-select:none;touch-action:manipulation}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#e2e8f0;transition:.3s;border-radius:24px}.switch:hover .slider{background-color:#cbd5e1}.slider:before{position:absolute;content:"";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%;box-shadow:0 2px 4px #0000001a}input:checked+.slider{background-color:#000}.switch:hover input:checked+.slider{background-color:#334155}input:checked+.slider:before{transform:translate(20px)}.switch input:focus-visible+.slider{outline:2px solid var(--text-primary);outline-offset:2px}#canvas-container{flex:1;background-color:#f1f5f9;position:relative;display:flex;justify-content:center;align-items:center}#canvas-container:focus{outline:none}#canvas-container canvas{cursor:grab}#canvas-container canvas:active{cursor:grabbing}#canvas-container canvas:focus-visible{outline:2px solid var(--text-primary);outline-offset:-2px}#canvas-container.drag-over:before{content:"Drop files to load dataset";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:var(--primary-bg);color:var(--text-primary);padding:16px 32px;border-radius:8px;font-family:var(--font-mono);font-weight:700;font-size:1.5rem;box-shadow:0 4px 24px #0000001a;z-index:101;pointer-events:none}#canvas-container.drag-over:after{content:"";position:absolute;inset:16px;border:4px dashed var(--text-secondary);border-radius:16px;background-color:#ffffff80;pointer-events:none;z-index:100;animation:pulse-border 1.5s infinite alternate}@keyframes pulse-border{0%{border-color:var(--text-secondary);background-color:#fff6}to{border-color:var(--text-primary);background-color:#fff9}}#canvas-container.drag-over .empty-state{opacity:0;transition:opacity .2s}.empty-state{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;color:var(--text-secondary);pointer-events:none;z-index:5;display:flex;flex-direction:column;align-items:center;gap:16px;background-color:#fffc;padding:32px 48px;border-radius:12px;box-shadow:0 4px 24px #0000000d;border:1px dashed var(--border-color)}.empty-state h2{font-family:var(--font-mono);font-size:1.25rem;font-weight:700;color:var(--text-primary);margin:0}.empty-state p{font-size:.95rem;margin:0;max-width:300px;line-height:1.5}.empty-state-actions{display:flex;gap:12px;margin-top:16px;width:100%;pointer-events:auto}.empty-state-actions .custom-file-upload{flex:1}.empty-icon{color:var(--text-secondary);opacity:.7}.canvas-hints{position:absolute;bottom:24px;right:24px;background-color:#ffffffe6;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:8px 12px;border-radius:6px;font-family:var(--font-mono);font-size:.75rem;color:var(--text-secondary);display:flex;align-items:center;gap:8px;box-shadow:0 2px 12px #00000014;border:1px solid var(--border-color);pointer-events:none;z-index:10;opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}#canvas-container.has-data .canvas-hints{opacity:1;transform:translateY(0)}.canvas-hints strong{color:var(--text-primary);font-weight:600}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.collapsible-heading{margin-bottom:0}.collapsible-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:8px 0;border:none;border-bottom:1px solid transparent;background:none;width:100%;text-align:left;font-family:inherit;color:inherit;transition:border-color .2s;-webkit-user-select:none;user-select:none;touch-action:manipulation}.collapsible-header:hover{border-bottom-color:var(--border-color)}.collapsible-header:active,.menu-toggle:active{transform:scale(.98);transition:transform .1s}.collapsible-header:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px;border-radius:4px}.collapsible-header span:first-child{font-family:var(--font-mono);font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--text-secondary);font-weight:700}.collapsible-header .icon{font-size:.8rem;transition:transform .3s;color:var(--text-secondary)}.collapsible-header.active .icon{transform:rotate(180deg)}.menu-toggle{display:none;position:fixed;top:50%;left:0;transform:translateY(-50%);width:20px;height:80px;background-color:var(--primary-bg);border:1px solid var(--border-color);border-left:none;border-top-right-radius:12px;border-bottom-right-radius:12px;cursor:pointer;z-index:2000;padding:0;align-items:center;justify-content:center;box-shadow:4px 0 10px #0000001a;transition:left .3s ease-in-out;-webkit-user-select:none;user-select:none;touch-action:manipulation}.arrow-icon{width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:8px solid var(--text-primary);transition:transform .3s ease}.menu-toggle.open{left:280px}.menu-toggle.open .arrow-icon{transform:rotate(180deg)}@media(max-width:768px){#ui-container{position:fixed;top:0;left:0;height:100%;height:100dvh;width:280px;transform:translate(-100%);visibility:hidden;transition:transform .3s ease-in-out,visibility 0s .3s;box-shadow:4px 0 24px #0000001a;z-index:1000}#ui-container.sidebar-open{transform:translate(0);visibility:visible;transition:transform .3s ease-in-out,visibility 0s 0s}.menu-toggle{display:flex!important}header{display:flex;justify-content:center;align-items:center}.main-logo{max-width:140px}.canvas-hints{display:none!important}}.custom-file-upload:active:not(:disabled),.download-btn:active:not(:disabled):not([aria-disabled=true]){transform:scale(.98);transition:transform .1s}.toast-container{position:fixed;bottom:24px;right:24px;display:flex;flex-direction:column;gap:8px;z-index:9999}.toast{background-color:var(--primary-bg);color:var(--text-primary);padding:12px 16px;border-radius:6px;font-family:var(--font-main);font-size:.9rem;box-shadow:0 4px 12px #00000026;border-left:4px solid var(--text-secondary);transition:opacity .3s;animation:slide-up .3s ease-out;display:flex;align-items:center;gap:8px}.toast.toast-error{border-left-color:#ef4444}.toast-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.toast.toast-error .toast-icon{color:#ef4444}.toast:not(.toast-error) .toast-icon{color:var(--text-secondary)}.toast-message{flex-grow:1;margin-right:8px}.toast-close{background:transparent;border:none;color:var(--text-secondary);cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s,color .2s;flex-shrink:0;margin-left:auto}.toast-close:hover{background-color:var(--secondary-bg);color:var(--text-primary)}.toast-close:focus-visible{outline:2px solid var(--text-primary);outline-offset:2px}@keyframes slide-up{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
