:root { color-scheme: dark; --app-bg: #11141a; --app-surface: #171b23; --app-surface-2: #1d2430; --app-text: #e7ebf0; --app-muted: #9aa7b6; --app-border: #303947; --app-primary: #1a9cdb; --app-primary-strong: #147fb6; --app-primary-soft: rgba(26, 156, 219, 0.22); --app-warning: #e0ac34; --app-warning-soft: rgba(224, 172, 52, 0.14); --app-error: #d9534f; --app-error-soft: rgba(217, 83, 79, 0.14); --app-radius: 8px; --app-radius-sm: 4px; --app-space: 1rem; --app-container: 980px; --control-height: 42px; --button-min-width: 7.25rem; --app-font: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --app-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; background: var(--app-bg); color: var(--app-text); font-family: var(--app-font); } * { box-sizing: border-box; } html, body, #root { min-height: 100%; } body { margin: 0; background: var(--app-bg); color: var(--app-text); font-family: var(--app-font); line-height: 1.5; } button, input, select, pre { font: inherit; } button, input, select, .panel, .callout, .definition-card, .log-panel, .layer-card, .parameter, .shader-picker__popover, .shader-picker__list, .shader-picker__trigger, .shader-picker__option { border-radius: var(--app-radius); } h1, h2, h3, p { margin-top: 0; } h2 { margin-bottom: 0.25rem; font-size: 1.5rem; font-weight: 720; letter-spacing: 0; } h3, label { margin-bottom: 0; font-size: 0.95rem; font-weight: 680; letter-spacing: 0; } h4 { margin: 0; color: var(--app-muted); font-size: 0.78rem; font-weight: 720; letter-spacing: 0; text-transform: uppercase; } input[type="number"], input[type="text"], select { width: 100%; min-height: var(--control-height); border: 1px solid var(--app-border); background: var(--app-surface-2); color: inherit; padding: 0.65rem 0.75rem; outline: none; } input[type="range"] { width: 100%; accent-color: var(--app-primary); } input[type="checkbox"] { accent-color: var(--app-primary); } input[type="color"] { width: 100%; min-height: 38px; border: 1px solid var(--app-border); border-radius: var(--app-radius-sm); background: var(--app-surface-2); padding: 4px; } input:focus, select:focus, button:focus-visible { border-color: var(--app-primary); box-shadow: 0 0 0 3px var(--app-primary-soft); } button { width: auto; min-width: var(--button-min-width); min-height: var(--control-height); padding: 0.65rem 1rem; border: 1px solid transparent; border-color: transparent; background: var(--app-primary); color: #fff; cursor: pointer; transition: background 120ms ease, border-color 120ms ease, transform 120ms ease; } button:hover:not(:disabled) { background: var(--app-primary-strong); } button:active:not(:disabled) { transform: translateY(1px); } .button-with-icon { display: inline-flex; align-items: center; justify-content: center; gap: 0.45rem; } .button-with-icon svg { flex: 0 0 auto; } button:disabled, input:disabled, select:disabled { cursor: not-allowed; opacity: 0.55; } pre { margin: 0; white-space: pre-wrap; } .layout { width: min(100% - 2rem, var(--app-container)); margin: 0 auto; padding: 21px 0 24px; display: grid; gap: var(--app-space); } .app-header { display: flex; align-items: center; justify-content: space-between; gap: var(--app-space); margin-bottom: 0; } .muted, .section-note { margin-bottom: 0; color: var(--app-muted); } .panel { margin: 0; padding: var(--app-space); border: 1px solid var(--app-border); background: var(--app-surface); } .panel__header { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.85rem; margin-bottom: 0.9rem; } .panel__header button { width: auto; min-width: var(--button-min-width); } .dashboard-grid, .stack-panel__grid, .definition-grid, .summary-grid, .parameter-grid, .toolbar__inline { display: grid; gap: var(--app-space); } .dashboard-grid, .stack-panel__grid { grid-template-columns: 1fr 1fr; align-items: stretch; } .panel--compiler, .panel--telemetry, .stack-panel { grid-column: 1 / -1; } .definition-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); margin: var(--app-space) 0 0; padding: 0; } .definition-grid.compact { gap: 0.75rem; } .definition-card { min-width: 0; padding: 0.75rem 1rem; border: 1px solid var(--app-border); background: rgba(255, 255, 255, 0.025); } .definition-card dt { color: var(--app-muted); font-size: 0.82rem; } .definition-card dd { margin: 0.15rem 0 0; overflow-wrap: anywhere; } .telemetry-header { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; margin-bottom: 0.9rem; } .status-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.5rem; } .telemetry-sections { display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.8fr); gap: 1.25rem; } .telemetry-section { min-width: 0; display: grid; align-content: start; gap: 0.55rem; } .mini-status { display: inline-flex; align-items: center; justify-content: center; min-height: 1.75rem; padding: 0.2rem 0.55rem; border: 1px solid var(--app-border); border-radius: var(--app-radius-sm); background: var(--app-surface-2); font-size: 0.76rem; font-weight: 700; white-space: nowrap; } .mini-status--ready { color: #c5efd3; border-color: rgba(94, 178, 121, 0.45); background: rgba(67, 135, 89, 0.18); } .mini-status--error { color: #ffd0cf; border-color: rgba(217, 83, 79, 0.45); background: var(--app-error-soft); } .kv-rows { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); gap: 0; margin: 0; padding: 0; border-top: 1px solid var(--app-border); } .kv-row { min-width: 0; display: grid; grid-template-columns: minmax(6.25rem, 0.75fr) minmax(0, 1fr); gap: 0.65rem; align-items: baseline; padding: 0.55rem 0.75rem 0.55rem 0; border-bottom: 1px solid rgba(48, 57, 71, 0.7); } .kv-row dt { color: var(--app-muted); font-size: 0.86rem; } .kv-row dd { min-width: 0; margin: 0; overflow-wrap: break-word; color: #f2f6fb; font-size: 1rem; font-weight: 650; line-height: 1.35; } .meter-row { display: grid; grid-template-columns: auto minmax(8rem, 1fr) auto; gap: 0.75rem; align-items: center; margin-top: 0.75rem; color: var(--app-muted); font-size: 0.82rem; } .meter-row strong { color: var(--app-text); font-size: 0.95rem; } .app-summary { padding: 0.75rem 1rem; } .summary-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.75rem; margin: 0; } .summary-item { min-width: 0; display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; padding-right: 0.75rem; border-right: 1px solid var(--app-border); } .summary-item:last-child { padding-right: 0; border-right: 0; } .summary-item dt { color: var(--app-muted); font-size: 0.82rem; } .summary-item dd { margin: 0; overflow-wrap: anywhere; font-weight: 700; } .status-pill { display: inline-flex; align-items: center; justify-content: center; width: auto; min-width: 7rem; min-height: 34px; padding: 0.35rem 0.7rem; border: 1px solid var(--app-border); border-radius: var(--app-radius); background: var(--app-surface-2); font-size: 0.82rem; font-weight: 700; white-space: nowrap; } .status-pill--ready { color: #c5efd3; border-color: rgba(94, 178, 121, 0.45); background: rgba(67, 135, 89, 0.22); } .status-pill--error { color: #ffd0cf; border-color: rgba(217, 83, 79, 0.45); background: var(--app-error-soft); } .app-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.25rem 0 0.5rem; color: var(--app-muted); font-size: 0.82rem; text-align: center; } .app-footer a { color: #b9def1; text-decoration: none; } .app-footer a:hover, .app-footer a:focus-visible { color: #e7f6ff; text-decoration: underline; } .progress-track { height: 0.5rem; overflow: hidden; border-radius: 999px; background: rgba(255, 255, 255, 0.08); } .progress-bar { height: 100%; border-radius: inherit; background: var(--app-primary); transition: width 180ms ease-out; } .progress-bar.is-indeterminate { width: 35%; animation: app-look-loading-slide 1.4s ease-in-out infinite; } .log-panel { max-height: 15rem; margin-top: var(--app-space); overflow: auto; padding: 0.9rem 1rem; border: 1px solid var(--app-border); background: var(--app-surface-2); color: #cbd7ea; font-family: var(--app-mono); font-size: 0.875rem; line-height: 1.45; overflow-wrap: anywhere; } .stack-panel { display: grid; align-content: start; } .stack-panel__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.5rem; } .stack-panel__reload { min-width: 8.75rem; } .stack-panel__screenshot { min-width: 8.75rem; } .toolbar__group { display: grid; gap: 0.5rem; min-width: 0; } .toolbar__inline { grid-template-columns: minmax(0, 1fr) auto; align-items: stretch; gap: 0.5rem; } .toolbar__inline button { width: auto; min-width: var(--button-min-width); } .layer-stack { display: grid; gap: 0.75rem; } .layer-card { display: grid; gap: 0.9rem; padding: 0.875rem; border: 1px solid var(--app-border); background: var(--app-surface-2); transition: border-color 120ms ease, background 120ms ease; } .layer-card:hover { border-color: rgba(26, 156, 219, 0.45); } .layer-card--expanded { border-color: var(--app-primary); background: #182232; box-shadow: inset 0 0 0 1px var(--app-primary-soft); } .layer-card--dragging { opacity: 0.55; } .layer-card--drop-target { border-color: #9ecff0; box-shadow: 0 0 0 2px rgba(26, 156, 219, 0.2); } .layer-card--add { border-style: dashed; } .layer-card__header, .layer-card__meta, .layer-card__actions, .layer-card__subheader { display: flex; align-items: center; gap: 0.625rem; } .layer-card__header, .layer-card__subheader { justify-content: space-between; } .layer-card__meta, .layer-card__actions { min-width: 0; flex-wrap: wrap; } .layer-card__actions { justify-content: flex-end; align-self: flex-start; } .layer-card__actions button, .layer-card__subheader button { width: auto; min-width: var(--button-min-width); height: var(--control-height); } .icon-button { width: var(--control-height); min-width: var(--control-height); height: var(--control-height); min-height: var(--control-height); padding: 0; display: inline-flex; align-items: center; justify-content: center; } .layer-card__index { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: var(--app-radius-sm); background: rgba(26, 156, 219, 0.18); color: #dff2fc; font-size: 0.75rem; font-weight: 750; } .layer-card__title { width: auto; min-width: 0; flex: 1 1 auto; text-align: left; background: #203047; border-color: #34465d; } .layer-card__title--static { cursor: default; } .layer-card__drag-handle { color: var(--app-muted); cursor: grab; user-select: none; display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; min-width: 34px; min-height: 34px; padding: 0; border-color: transparent; background: transparent; } .layer-card__drag-handle:hover:not(:disabled), .parameter__osc:hover:not(:disabled), .parameter__reset:hover:not(:disabled) { background: transparent; color: var(--app-text); } .layer-card__body, .layer-card__field, .shader-picker, .parameter { display: grid; gap: 0.75rem; } .shader-description { padding: 0.75rem; border: 1px solid var(--app-border); border-radius: var(--app-radius); background: rgba(255, 255, 255, 0.025); user-select: text; } .shader-description__meta { margin-bottom: 0.25rem; color: var(--app-muted); font-size: 0.78rem; font-weight: 700; text-transform: uppercase; } .shader-description p { margin: 0; color: var(--app-text); overflow-wrap: anywhere; } .shader-picker__topline { display: flex; align-items: baseline; justify-content: space-between; gap: 0.625rem; min-width: 0; } .shader-picker__selected, .shader-picker__meta, .shader-picker__empty, .parameter__value, .parameter__osc, .parameter__reset { color: var(--app-muted); font-size: 0.78rem; } .shader-picker__selected { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .shader-picker__trigger { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 0.625rem; min-height: 50px; padding: 0.55rem 0.7rem; text-align: left; background: #182232; border-color: var(--app-border); } .shader-picker__trigger > span { display: grid; gap: 0.2rem; min-width: 0; } .shader-picker__trigger svg, .shader-picker__search svg { flex: 0 0 auto; color: var(--app-muted); } .shader-picker__popover { display: grid; gap: 0.45rem; padding: 0.45rem; border: 1px solid var(--app-border); background: #121821; } .shader-picker__search { position: relative; display: flex; align-items: center; } .shader-picker__search svg { position: absolute; left: 0.625rem; pointer-events: none; } .shader-picker__search input { padding-left: 2.125rem; min-height: 34px; } .shader-picker__list { display: grid; gap: 0.45rem; max-height: min(52vh, 520px); overflow-y: auto; padding: 0.5rem; border: 1px solid var(--app-border); background: #10151d; } .shader-picker__option { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.25rem; align-items: center; min-height: 4.25rem; padding: 0.65rem 0.75rem; border: 1px solid var(--app-border); text-align: left; background: #182232; line-height: 1.25; } .shader-picker__option-copy { display: grid; gap: 0.25rem; min-width: 0; } .shader-picker__option--unavailable { border-color: rgba(217, 83, 79, 0.45); background: rgba(217, 83, 79, 0.08); opacity: 1; } .shader-picker__option--unavailable .shader-picker__name, .shader-picker__option--unavailable .shader-picker__meta { color: #ffd0cf; } .shader-picker__add { flex: 0 0 auto; margin-left: 0.5rem; } .shader-picker__name, .shader-picker__meta { min-width: 0; overflow-wrap: anywhere; } .shader-picker__option-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.5rem; min-width: 0; } .shader-picker__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 700; } .shader-picker__category { flex: 0 0 auto; max-width: 8rem; overflow: hidden; margin-top: 0.05rem; padding: 0.14rem 0.42rem; border: 1px solid rgba(26, 156, 219, 0.35); border-radius: var(--app-radius-sm); background: rgba(26, 156, 219, 0.12); color: #b9def1; font-size: 0.68rem; font-weight: 700; text-overflow: ellipsis; text-transform: uppercase; white-space: nowrap; } .shader-picker__category--error { border-color: rgba(217, 83, 79, 0.45); background: var(--app-error-soft); color: #ffd0cf; } .shader-picker__meta { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; line-height: 1.3; min-height: 2.05em; } .shader-picker__trigger .shader-picker__meta { -webkit-line-clamp: 1; line-clamp: 1; min-height: 0; } .shader-picker__empty { padding: 0.625rem; } .parameter-grid { grid-template-columns: repeat(auto-fit, minmax(min(100%, 32rem), 1fr)); gap: 0.5rem; align-items: start; } .parameter { position: relative; grid-template-columns: minmax(16rem, 0.9fr) minmax(18rem, 1.35fr); gap: 0.625rem; align-items: center; padding: 0.55rem 0.65rem; border: 1px solid var(--app-border); background: #141a23; } .parameter__header { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 0.35rem; align-items: center; min-width: 0; } .parameter__title { min-width: 0; } .parameter__title label { display: block; overflow: hidden; font-size: 0.9rem; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; } .parameter__title p { margin: 0.12rem 0 0; overflow: hidden; color: var(--app-muted); font-size: 0.76rem; line-height: 1.25; text-overflow: ellipsis; white-space: nowrap; } .parameter__osc, .parameter__reset { display: inline-flex; align-items: center; justify-content: center; width: 24px; min-width: 24px; min-height: 24px; padding: 0; border: 0; background: transparent; font-weight: 500; } .parameter__osc { width: 34px; min-width: 34px; font-size: 0.66rem; font-weight: 800; letter-spacing: 0.02em; } .parameter__reset { color: var(--app-muted); } .parameter__osc svg, .parameter__reset svg { flex: 0 0 auto; } .parameter__value--pending { color: var(--app-warning); } .parameter__control { position: relative; min-width: 0; } .parameter__pair { display: grid; grid-template-columns: minmax(8rem, 1fr) minmax(5.25rem, 7rem); gap: 0.5rem; align-items: center; } .parameter__pair--vec2 { grid-template-columns: repeat(2, minmax(5.25rem, 1fr)); } .parameter__pair input[type="range"] { min-width: 7.5rem; } .parameter__color-compact { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0.5rem; align-items: end; } .parameter__swatch-button { width: 42px; min-width: 42px; height: 42px; min-height: 42px; padding: 0.25rem; border-color: var(--app-border); background: var(--app-surface-2); } .parameter__swatch-button:hover:not(:disabled) { background: var(--app-surface-2); border-color: rgba(26, 156, 219, 0.55); } .parameter__swatch { display: block; width: 100%; min-height: 100%; border: 1px solid rgba(255, 255, 255, 0.28); border-radius: var(--app-radius-sm); } .parameter__rgba-grid { display: grid; grid-template-columns: repeat(4, minmax(3.5rem, 1fr)); gap: 0.35rem; } .parameter__rgba-field { display: grid; gap: 0.15rem; color: var(--app-muted); font-size: 0.68rem; font-weight: 700; } .parameter__rgba-field input { min-height: 32px; padding: 0.35rem 0.45rem; font-size: 0.82rem; } .parameter__color-popover { position: absolute; z-index: 20; top: calc(100% + 0.45rem); left: 0; display: grid; gap: 0.625rem; width: 224px; padding: 0.75rem; border: 1px solid var(--app-border); border-radius: var(--app-radius); background: #10151d; box-shadow: 0 12px 30px rgba(0, 0, 0, 0.45); } .parameter__wheel { width: 196px; height: 196px; overflow: hidden; border-radius: 50%; } .parameter__wheel [class*="react-colorful"], .parameter__wheel > div { max-width: 100%; } .parameter__wheel svg, .parameter__wheel canvas { display: block; } .parameter__value-slider { display: grid; gap: 0.25rem; width: 196px; color: var(--app-muted); font-size: 0.72rem; font-weight: 700; } .parameter__value-slider input[type="range"] { --value-thumb-size: 18px; display: block; width: 196px; height: 22px; margin: 0; accent-color: #f2f6fb; background: linear-gradient(90deg, #000 0%, #fff 100%); border-radius: 999px; cursor: pointer; appearance: none; -webkit-appearance: none; } .parameter__value-slider input[type="range"]::-webkit-slider-runnable-track { height: 0.75rem; border: 1px solid rgba(255, 255, 255, 0.28); border-radius: 999px; background: linear-gradient(90deg, #000 0%, #fff 100%); } .parameter__value-slider input[type="range"]::-webkit-slider-thumb { width: var(--value-thumb-size); height: var(--value-thumb-size); margin-top: calc((0.75rem - var(--value-thumb-size)) / 2); border: 2px solid #f7fbff; border-radius: 999px; background: #f7fbff; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.65), 0 1px 4px rgba(0, 0, 0, 0.45); -webkit-appearance: none; } .parameter__value-slider input[type="range"]::-moz-range-track { height: 0.75rem; border: 1px solid rgba(255, 255, 255, 0.28); border-radius: 999px; background: linear-gradient(90deg, #000 0%, #fff 100%); } .parameter__value-slider input[type="range"]::-moz-range-thumb { width: var(--value-thumb-size); height: var(--value-thumb-size); border: 2px solid #f7fbff; border-radius: 999px; background: #f7fbff; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.65), 0 1px 4px rgba(0, 0, 0, 0.45); } .parameter__value-slider strong { text-align: right; min-height: 1rem; color: var(--app-text); font-size: 0.74rem; line-height: 1; } .parameter__trigger { min-width: 7rem; } .toggle { display: inline-flex; align-items: center; gap: 0.625rem; min-height: 36px; } .toggle svg { flex: 0 0 auto; color: var(--app-muted); } .toggle--compact { min-height: auto; } .toggle--field { justify-content: flex-start; } @keyframes app-look-loading-slide { 0% { transform: translateX(-120%); } 100% { transform: translateX(340%); } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: 0.01ms !important; } } @media (max-width: 900px) { .app-header, .panel__header, .layer-card__header, .layer-card__subheader { align-items: flex-start; flex-direction: column; } .dashboard-grid, .stack-panel__grid { grid-template-columns: 1fr; } .telemetry-sections { grid-template-columns: 1fr; } .panel__header button, .stack-panel__reload, .layer-card__actions button { width: auto; } .layer-card__actions { width: auto; align-self: flex-end; justify-content: flex-end; } .layer-card__field select { width: 100%; } } @media (max-width: 560px) { .layout { width: min(100% - 1rem, var(--app-container)); padding-top: 14px; } .definition-grid, .summary-grid, .kv-rows, .parameter-grid, .parameter, .parameter__header { grid-template-columns: 1fr; } .toolbar__inline { grid-template-columns: minmax(0, 1fr) auto; } .parameter__reset { width: 24px; } .parameter__pair, .parameter__color-compact { grid-template-columns: 1fr; } .parameter__rgba-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .parameter__swatch-button { width: 100%; } .parameter__color-popover, .parameter__value-slider, .parameter__value-slider input[type="range"] { width: 100%; } .kv-row { grid-template-columns: minmax(6.25rem, 0.6fr) minmax(0, 1fr); } .meter-row { grid-template-columns: 1fr auto; } .meter-row .progress-track { grid-column: 1 / -1; grid-row: 2; } .summary-item { padding-right: 0; padding-bottom: 0.5rem; border-right: 0; border-bottom: 1px solid var(--app-border); } .summary-item:last-child { padding-bottom: 0; border-bottom: 0; } }